deepdrone / tests /test_mission.py
evangelosmeklis's picture
Initial commit with clean project structure
bd61f34
#!/usr/bin/env python3
"""
DroneKit-Python Mission Test Script
This script demonstrates how to connect to the ArduPilot SITL simulator,
create a simple mission (square pattern), and execute it.
"""
import time
import math
import sys
import argparse
from drone import compatibility_fix # Import the compatibility fix for Python 3.10+
from drone.drone_control import DroneController
from dronekit import connect, VehicleMode, LocationGlobalRelative
def get_args():
"""Parse command line arguments."""
parser = argparse.ArgumentParser(description='Test mission script for DeepDrone')
parser.add_argument('--connect',
help="Vehicle connection target string. If not specified, SITL automatically started.",
default='udp:127.0.0.1:14550')
return parser.parse_args()
def main():
# Parse connection string
args = get_args()
connection_string = args.connect
print(f"Connecting to vehicle on: {connection_string}")
try:
# Connect to the Vehicle
print("Connecting to vehicle on %s" % connection_string)
vehicle = connect(connection_string, wait_ready=True, timeout=60)
# Get some vehicle attributes (state)
print("Get some vehicle attribute values:")
print(" GPS: %s" % vehicle.gps_0)
print(" Battery: %s" % vehicle.battery)
print(" Last Heartbeat: %s" % vehicle.last_heartbeat)
print(" Is Armable?: %s" % vehicle.is_armable)
print(" System status: %s" % vehicle.system_status.state)
print(" Mode: %s" % vehicle.mode.name)
# Define the home position (current position where script is run)
home_position = vehicle.location.global_relative_frame
print("Home position: %s" % home_position)
# Define a square mission
offset = 0.0001 # Approximately 11 meters at the equator
# Create a mission with a square pattern
print("Creating mission waypoints...")
waypoints = [
# North
LocationGlobalRelative(home_position.lat + offset, home_position.lon, 20),
# Northeast
LocationGlobalRelative(home_position.lat + offset, home_position.lon + offset, 20),
# East
LocationGlobalRelative(home_position.lat, home_position.lon + offset, 20),
# Return to Launch
LocationGlobalRelative(home_position.lat, home_position.lon, 20),
]
# Arm the vehicle
print("Arming motors")
vehicle.mode = VehicleMode("GUIDED")
vehicle.armed = True
# Wait until armed
while not vehicle.armed:
print("Waiting for arming...")
time.sleep(1)
print("Taking off to 20 meters")
vehicle.simple_takeoff(20) # Take off to 20m
# Wait until the vehicle reaches a safe height
while True:
print("Altitude: %s" % vehicle.location.global_relative_frame.alt)
# Break and return when we reach target altitude or close to it
if vehicle.location.global_relative_frame.alt >= 19:
print("Reached target altitude")
break
time.sleep(1)
# Fly through the waypoints
for i, waypoint in enumerate(waypoints):
print(f"Flying to waypoint {i+1}")
vehicle.simple_goto(waypoint)
# Start timer for waypoint timeout
start_time = time.time()
# Wait until we reach the waypoint
while True:
# Calculate distance to waypoint
current = vehicle.location.global_relative_frame
distance_to_waypoint = math.sqrt(
(waypoint.lat - current.lat)**2 +
(waypoint.lon - current.lon)**2) * 1.113195e5
print(f"Distance to waypoint: {distance_to_waypoint:.2f} meters")
# Break if we're within 3 meters of the waypoint
if distance_to_waypoint < 3:
print(f"Reached waypoint {i+1}")
break
# Break if we've been flying to this waypoint for more than 60 seconds
if time.time() - start_time > 60:
print(f"Timed out reaching waypoint {i+1}, continuing to next waypoint")
break
time.sleep(2)
# Return to home
print("Returning to home")
vehicle.mode = VehicleMode("RTL")
# Wait for the vehicle to land
while vehicle.armed:
print("Waiting for landing and disarm...")
time.sleep(2)
print("Mission complete!")
# Close vehicle object
vehicle.close()
except Exception as e:
print(f"Error: {str(e)}")
if __name__ == "__main__":
main()