98 lines
2.7 KiB
Python
Executable File
98 lines
2.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
UAV Client for AERPAW Target Location Protocol
|
|
|
|
Protocol:
|
|
Server sends: TARGET:x,y,z
|
|
Client sends: ACK:TARGET
|
|
Client (after moving): READY
|
|
"""
|
|
|
|
import socket
|
|
import sys
|
|
import time
|
|
|
|
SERVER_IP = "127.0.0.1"
|
|
SERVER_PORT = 5000
|
|
|
|
|
|
def parse_target(message: str) -> tuple:
|
|
"""Parse TARGET:x,y,z message and return (x, y, z) coordinates."""
|
|
if not message.startswith("TARGET:"):
|
|
raise ValueError(f"Invalid message format: {message}")
|
|
|
|
coords_str = message[7:] # Remove "TARGET:" prefix
|
|
parts = coords_str.split(",")
|
|
if len(parts) != 3:
|
|
raise ValueError(f"Expected 3 coordinates, got {len(parts)}")
|
|
|
|
x, y, z = float(parts[0]), float(parts[1]), float(parts[2])
|
|
return (x, y, z)
|
|
|
|
|
|
def move_to_target(x: float, y: float, z: float):
|
|
"""
|
|
Placeholder for AERPAW API integration.
|
|
In the future, this will command the UAV to move to (x, y, z).
|
|
"""
|
|
print(f" [PLACEHOLDER] Moving to target: ({x}, {y}, {z})")
|
|
# Simulate movement time
|
|
time.sleep(1.0)
|
|
print(f" [PLACEHOLDER] Arrived at target: ({x}, {y}, {z})")
|
|
|
|
|
|
def run_uav_client(client_id: int):
|
|
"""Run a single UAV client."""
|
|
print(f"UAV {client_id}: Connecting to {SERVER_IP}:{SERVER_PORT}")
|
|
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
s.connect((SERVER_IP, SERVER_PORT))
|
|
|
|
try:
|
|
# Receive TARGET command
|
|
data = s.recv(1024).decode().strip()
|
|
print(f"UAV {client_id}: Received: {data}")
|
|
|
|
# Parse target coordinates
|
|
x, y, z = parse_target(data)
|
|
print(f"UAV {client_id}: Parsed target: x={x}, y={y}, z={z}")
|
|
|
|
# Send acknowledgment
|
|
s.sendall(b"ACK:TARGET")
|
|
print(f"UAV {client_id}: Sent ACK:TARGET")
|
|
|
|
# Move to target (placeholder)
|
|
move_to_target(x, y, z)
|
|
|
|
# Signal ready
|
|
s.sendall(b"READY")
|
|
print(f"UAV {client_id}: Sent READY")
|
|
|
|
# Wait for FINISHED signal from server
|
|
data = s.recv(1024).decode().strip()
|
|
if data == "FINISHED":
|
|
print(f"UAV {client_id}: Received FINISHED - session ended normally")
|
|
else:
|
|
print(f"UAV {client_id}: Unexpected message: {data}")
|
|
|
|
except ValueError as e:
|
|
error_msg = f"ERROR:{str(e)}"
|
|
s.sendall(error_msg.encode())
|
|
print(f"UAV {client_id}: Error - {e}")
|
|
|
|
finally:
|
|
s.close()
|
|
print(f"UAV {client_id}: Connection closed")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if len(sys.argv) != 2:
|
|
print(f"Usage: {sys.argv[0]} <client_id>")
|
|
print(" Run one instance per UAV, e.g.:")
|
|
print(" Terminal 1: ./uav.py 1")
|
|
print(" Terminal 2: ./uav.py 2")
|
|
sys.exit(1)
|
|
|
|
client_id = int(sys.argv[1])
|
|
run_uav_client(client_id)
|