Example #1
0
async def run():
    drone = System()
    # await drone.connect("serial:///dev/tty.usbmodem01:57600")
    await drone.connect(system_address="udp://:14540")

    destinations = []
    proceed = "Y"
    while (proceed == "Y" or proceed == "y"):
        situation_type = get_situation_category()
        drone_type = get_drone_type_from_choice(situation_type)
        lat, lng = get_destination_latitude_longitude()
        destinations.append([situation_type, drone_type, [lat, lng]])
        proceed = input("\nDo you need to add more destinations? (Y/N): ")

    # print("\nDispatching the following drones for the corresponding situations:")
    # for dest in destinations:
    #     print(dest)

    print("Waiting for drone to connect...")
    async for state in drone.core.connection_state():
        if state.is_connected:
            print(f"Drone discovered with UUID: {state.uuid}")
            break

    print_mission_progress_task = asyncio.ensure_future(
        print_mission_progress(drone))

    running_tasks = [print_mission_progress_task]
    termination_task = asyncio.ensure_future(
        observe_is_in_air(drone, running_tasks))

    mission_items = []
    print(
        "\nDispatching the following drones for the corresponding situations:")
    for destination in destinations:
        print(destination)
        lat, lng = destination[2][0], destination[2][1]
        mission_items.append(
            MissionItem(lat, lng, 25, 10, True, float('nan'), float('nan'),
                        MissionItem.CameraAction.NONE, float('nan'),
                        float('nan')))

    mission_plan = MissionPlan(mission_items)

    await drone.mission.set_return_to_launch_after_mission(True)

    # print("-- Clearing previous missions")
    # await drone.mission.clear_mission()

    print("-- Uploading mission")
    await drone.mission.upload_mission(mission_plan)

    print("-- Arming")
    await drone.action.arm()

    print("-- Starting mission")
    await drone.mission.start_mission()

    await termination_task
async def run():

    drone = System()
    await drone.connect()

    print("Waiting for drone to connect...")
    async for state in drone.core.connection_state():
        if state.is_connected:
            print(f"Drone discovered with UUID: {state.uuid}")
            break

    with open('waypoints_test.json', 'r') as f:
        waypoints = json.load(f)

    print_mission_progress_task = asyncio.ensure_future(
        print_mission_progress(drone))

    running_tasks = [print_mission_progress_task]

    termination_task = asyncio.ensure_future(
        observe_is_in_air(drone, running_tasks))

    new_mission = CompMission(waypoints, "infil")
    new_mission.generate_intermediate_waypoints()

    print(len(new_mission.primary_route))

    mission_plan = MissionPlan(new_mission.primary_route)

    print("Waiting for drone to have a global position estimate...")
    async for health in drone.telemetry.health():
        if health.is_global_position_ok:
            print("Global position estimate ok")
            break

    await drone.mission.set_return_to_launch_after_mission(True)

    print("-- Uploading mission")
    await drone.mission.upload_mission(mission_plan)

    print("-- Arming")
    await drone.action.arm()

    print("-- Taking off")
    await drone.action.takeoff()

    print("-- Starting mission")
    await drone.mission.start_mission()

    await termination_task

    print("-- Landing")
    await drone.action.land()
Example #3
0
async def run(lat, lon):
    drone = System()
    await drone.connect(system_address="udp://:14540")

    await drone.param.set_param_float("MIS_DIST_1WP", 10000)
    await drone.param.set_param_float("MIS_DIST_WPS", 10000)
    # await drone.param.set_param_float("MPC_JERK_MAX", 30)

    # await drone.action.set_maximum_speed(20)

    print("Waiting for drone to connect...")
    async for state in drone.core.connection_state():
        if state.is_connected:
            print(f"Drone discovered with UUID: {state.uuid}")
            break

    print_mission_progress_task = asyncio.ensure_future(print_mission_progress(drone))

    running_tasks = [print_mission_progress_task]
    termination_task = asyncio.ensure_future(observe_is_in_air(drone, running_tasks))

    mission_items = []
    mission_items.append(MissionItem(Decimal(lat),
                                     Decimal(lon),
                                     25,
                                     10,
                                     True,
                                     float('nan'),
                                     float('nan'),
                                     MissionItem.CameraAction.NONE,
                                     float('nan'),
                                     float('nan')))

    mission_plan = MissionPlan(mission_items)

    await drone.mission.set_return_to_launch_after_mission(True)

    print("-- Uploading mission")
    await drone.mission.upload_mission(mission_plan)

    print("-- Arming")
    await drone.action.arm()

    print("-- Starting mission")
    await drone.mission.start_mission()

    #await drone.mission.is_mission_finished()

    # print("-- Landing")
    #await drone.action.land()

    await termination_task
async def run():
    drone = System()
    await drone.connect(system_address="udp://:14540")

    # Start the tasks

    asyncio.ensure_future(print_in_air(drone))
    asyncio.ensure_future(print_position(drone))
    await asyncio.sleep(5)

    print("Waiting for drone to connect...")
    async for state in drone.core.connection_state():
        if state.is_connected:
            print(f"Drone discovered with UUID: {state.uuid}")
            break

    print_mission_progress_task = asyncio.ensure_future(
        print_mission_progress(drone))

    running_tasks = [print_mission_progress_task]
    termination_task = asyncio.ensure_future(
        observe_is_in_air(drone, running_tasks))

    mission_items = []
    mission_items.append(
        MissionItem(21.006725, 105.841980, 5, 10, True, float('nan'),
                    float('nan'), MissionItem.CameraAction.NONE, float('nan'),
                    float('nan')))
    mission_items.append(
        MissionItem(21.006751, 105.843446, 5, 10, True, float('nan'),
                    float('nan'), MissionItem.CameraAction.NONE, float('nan'),
                    float('nan')))
    mission_items.append(
        MissionItem(21.005793, 105.843339, 5, 10, True, float('nan'),
                    float('nan'), MissionItem.CameraAction.NONE, float('nan'),
                    float('nan')))

    mission_plan = MissionPlan(mission_items)

    await drone.mission.set_return_to_launch_after_mission(True)

    print("-- Uploading mission")
    await drone.mission.upload_mission(mission_plan)

    print("-- Arming")
    await drone.action.arm()

    print("-- Starting mission")
    await drone.mission.start_mission()

    await termination_task
Example #5
0
async def run():
    drone = System()
    await drone.connect(system_address="udp://:14540")

    print("Waiting for drone to connect...")
    async for state in drone.core.connection_state():
        if state.is_connected:
            print("Drone discovered!")
            break

    print_mission_progress_task = asyncio.ensure_future(
        print_mission_progress(drone))

    running_tasks = [print_mission_progress_task]
    termination_task = asyncio.ensure_future(
        observe_is_in_air(drone, running_tasks))

    mission_items = []
    mission_items.append(
        MissionItem(47.398039859999997, 8.5455725400000002, 25, 10, True,
                    float('nan'), float('nan'), MissionItem.CameraAction.NONE,
                    float('nan'), float('nan'), float('nan'), float('nan'),
                    float('nan')))
    mission_items.append(
        MissionItem(47.398036222362471, 8.5450146439425509, 25, 10, True,
                    float('nan'), float('nan'), MissionItem.CameraAction.NONE,
                    float('nan'), float('nan'), float('nan'), float('nan'),
                    float('nan')))
    mission_items.append(
        MissionItem(47.397825620791885, 8.5450092830163271, 25, 10, True,
                    float('nan'), float('nan'), MissionItem.CameraAction.NONE,
                    float('nan'), float('nan'), float('nan'), float('nan'),
                    float('nan')))

    mission_plan = MissionPlan(mission_items)

    await drone.mission.set_return_to_launch_after_mission(True)

    print("-- Uploading mission")
    await drone.mission.upload_mission(mission_plan)

    print("-- Arming")
    await drone.action.arm()

    print("-- Starting mission")
    await drone.mission.start_mission()

    await termination_task
Example #6
0
async def inject_pt(drone, mission_items, home_alt, home_lat, home_lon):
    pt_injected = False
    async for mission_progress in drone.mission.mission_progress():
        if(not mission_progress.current == -1):
            print(f"Mission progress: "
                f"{mission_progress.current}/"
                f"{mission_progress.total}")

            if(mission_progress.current == mission_progress.total and not pt_injected):
                mission_item_idx = mission_progress.current
                print("-- Pausing mission")
                await drone.mission.pause_mission()
                await drone.mission.clear_mission()

                print(f"-- Injecting waypoint at "
                f"{mission_item_idx}")

                mission_items.insert(mission_progress.current, MissionItem(home_lat,
                                     home_lon,
                                     home_alt,
                                     10,
                                     True,
                                     float('nan'),
                                     float('nan'),
                                     MissionItem.CameraAction.NONE,
                                     float('nan'),
                                     float('nan')))
                mission_plan = MissionPlan(mission_items)
                await drone.mission.set_return_to_launch_after_mission(True)

                print("-- Uploading updated mission")
                await drone.mission.upload_mission(mission_plan)

                print("-- Resuming mission")
                await drone.mission.set_current_mission_item(mission_item_idx)
                await drone.mission.start_mission()

                pt_injected = True
        if(mission_progress.current == mission_progress.total):
            print("-- Landing")
            await drone.action.land()
Example #7
0
async def run():
    drone = System()
    await drone.connect(system_address="udp://:14540")
    print("Waiting for drone connection...")
    async for state in drone.core.connection_state():
        if state.is_connected:
            print("Drone discovered with UUID: {}".format(state.uuid))
            break

    location = drone.telemetry.position()

    async for position in location:
        init_latitude = position.latitude_deg
        init_longitude = position.longitude_deg
        break

    print("-- Arming")
    await drone.action.arm()

    square_coordinates = calculate_square(init_latitude, init_longitude, .0001)

    mission_items = []
    mission_items.append(
        MissionItem(init_latitude, init_longitude, 100, 5, True, float('nan'),
                    float('nan'), MissionItem.CameraAction.NONE, float('nan'),
                    float('nan')))
    for key in square_coordinates.keys():
        latitude = square_coordinates[key][0]
        longitude = square_coordinates[key][1]
        mission_items.append(
            MissionItem(latitude, longitude, 100, 5, False, float('nan'),
                        float('nan'), MissionItem.CameraAction.TAKE_PHOTO,
                        float('nan'), float('nan')))

    mission_plan = MissionPlan(mission_items)
    await drone.mission.set_return_to_launch_after_mission(True)
    await drone.mission.upload_mission(mission_plan)
    await drone.mission.start_mission()

    return init_latitude, init_longitude, drone
Example #8
0
async def run():
    drone = System()
    await drone.connect(system_address="serial:///dev/ttyUSB0")

    print("Waiting for drone to connect...")
    async for state in drone.core.connection_state():
        if state.is_connected:
            print(f"Drone discovered with UUID: {state.uuid}")
            break
    
    # print("Fetching amsl altitude at home location....")
    # async for terrain_info in drone.telemetry.home():
    #     global absolute_altitude
    #     absolute_altitude = terrain_info.absolute_altitude_m
    #     break

    print_mission_progress_task = asyncio.ensure_future(print_mission_progress(drone))

    running_tasks = [print_mission_progress_task]
    termination_task = asyncio.ensure_future(observe_is_in_air(drone, running_tasks))

    flying_alt = absolute_altitude + 2.5 #To fly drone 3m above the ground plane
    #goto_location() takes Absolute MSL altitude 

    mission_items = []
    #parameters = (latitude_deg, longitude_deg, relative_altitude_m, speed_m_s, is_flying_through
    #               gimbal_pitch, gimbal_yaw, camera_action, loiter_time_s, camera_photo_interval_s)
    mission_items.append(MissionItem(37.xxxxx,
                                     126.xxxxxx,
                                     1,
                                     2,
                                     True,
                                     float('nan'),
                                     float('nan'),
                                     MissionItem.CameraAction.NONE,
                                     float('nan'),
                                     float('nan')))
    mission_items.append(MissionItem(37.xxxxx,
                                     126.xxxxxx,
                                     1,
                                     2,
                                     True,
                                     float('nan'),
                                     float('nan'),
                                     MissionItem.CameraAction.NONE,
                                     float('nan'),
                                     float('nan')))
    mission_items.append(MissionItem(target_gps.latitude,
                                     target_gps.longitude,
                                     1,
                                     2,
                                     True,
                                     float('nan'),
                                     float('nan'),
                                     MissionItem.CameraAction.NONE,
                                     float('nan'),
                                     float('nan')))

    mission_plan = MissionPlan(mission_items)

    await drone.mission.set_return_to_launch_after_mission(True)

    print("-- Uploading mission")
    await drone.mission.upload_mission(mission_plan)

    print("-- Arming")
    await drone.action.arm()

    print("-- Starting mission")
    await drone.mission.start_mission()

    await termination_task
Example #9
0
async def run():
    drone = System()
    await drone.connect(system_address="udp://:14540")

    print("Waiting for drone to connect...")
    async for state in drone.core.connection_state():
        if state.is_connected:
            print(f"Drone discovered with UUID: {state.uuid}")
            break

    print("Waiting for drone to have a global position estimate...")
    async for health in drone.telemetry.health():
        if health.is_global_position_ok:
            print("Global position estimate ok")
            break

    print("Fetching amsl altitude at home location....")
    async for terrain_info in drone.telemetry.home():
        home_alt = terrain_info.relative_altitude_m
        home_lat = terrain_info.latitude_deg
        home_lon = terrain_info.longitude_deg
        break


    mission_items = []
    mission_items.append(MissionItem(home_lat + 0.0001,
                                     home_lon + 0.0000,
                                     home_alt + 3,
                                     10,
                                     True,
                                     float('nan'),
                                     float('nan'),
                                     MissionItem.CameraAction.NONE,
                                     float('nan'),
                                     float('nan')))
    mission_items.append(MissionItem(home_lat + 0.0001,
                                     home_lon + 0.0001,
                                     home_alt + 4,
                                     10,
                                     True,
                                     float('nan'),
                                     float('nan'),
                                     MissionItem.CameraAction.NONE,
                                     float('nan'),
                                     float('nan')))
    mission_items.append(MissionItem(home_lat + 0.0000,
                                     home_lon + 0.0001,
                                     home_alt + 3,
                                     10,
                                     True,
                                     float('nan'),
                                     float('nan'),
                                     MissionItem.CameraAction.NONE,
                                     float('nan'),
                                     float('nan')))
    mission_items.append(MissionItem(home_lat - 0.0001,
                                     home_lon + 0.0001,
                                     home_alt + 5,
                                     10,
                                     True,
                                     float('nan'),
                                     float('nan'),
                                     MissionItem.CameraAction.NONE,
                                     float('nan'),
                                     float('nan')))

    
    inject_pt_task = asyncio.ensure_future(inject_pt(drone, mission_items, home_alt, home_lat, home_lon))
    running_tasks = [inject_pt_task]


    
    termination_task = asyncio.ensure_future(observe_is_in_air(drone, running_tasks))
    
    mission_plan = MissionPlan(mission_items)
    
    print("-- Arming")
    await drone.action.arm()

    print("awaiting")
    await asyncio.sleep(1)
    print("awaiting done")

    print("-- Uploading mission")
    await drone.mission.upload_mission(mission_plan)

    print("awaiting")
    await asyncio.sleep(1)
    print("awaiting done")

    print("-- Starting mission")
    await drone.mission.start_mission()

    await termination_task
Example #10
0
async def run():
    drone = System()
    await drone.connect(system_address="serial:///dev/ttyUSB0")

    print("Waiting for drone to connect...")
    async for state in drone.core.connection_state():
        if state.is_connected:
            print(f"Drone discovered with UUID: {state.uuid}")
            break

    print_mission_progress_task = asyncio.ensure_future(
        print_mission_progress(drone))

    running_tasks = [print_mission_progress_task]
    termination_task = asyncio.ensure_future(
        observe_is_in_air(drone, running_tasks))

    mission_items = []
    #parameters = (latitude_deg, longitude_deg, relative_altitude_m, speed_m_s, is_flying_through
    #               gimbal_pitch, gimbal_yaw, camera_action, loiter_time_s, camera_photo_interval_s)
    # Waypoint1
    mission_items.append(
        MissionItem(37.4539753, 126.9518641, 1, 2, True, float('nan'),
                    float('nan'), MissionItem.CameraAction.NONE, float('nan'),
                    float('nan')))
    # Waypoint2
    mission_items.append(
        MissionItem(37.4540048, 126.9518121, 1, 2, True, float('nan'),
                    float('nan'), MissionItem.CameraAction.NONE, float('nan'),
                    float('nan')))
    # Waypoint3
    mission_items.append(
        MissionItem(37.454065, 126.9518092, 1, 2, True, float('nan'),
                    float('nan'), MissionItem.CameraAction.NONE, float('nan'),
                    float('nan')))

    mission_plan = MissionPlan(mission_items)

    await drone.mission.set_return_to_launch_after_mission(False)

    print("-- Uploading mission")
    await drone.mission.upload_mission(mission_plan)
    await asyncio.sleep(1)

    print("-- Arming")
    await drone.action.arm()

    ##########################################
    ### Departing a Truck & Mission Starts ###
    ##########################################

    print("-- Starting mission")
    await drone.mission.start_mission()

    await termination_task

    ##########################################
    ### Mission Ends  & Go back to a Truck ###
    ##########################################
    while True:
        # if the target is not within the camera yet
        if not target_coord.is_detected:
            await drone.action.goto_location(target_gps.latitude,
                                             target_gps.longitude, flying_alt,
                                             0)

        # if the target is detected within the camera, chanage to offboard mode to finetune the drone's position
        else:
            if not drone.offboard.is_active:
                print("-- Setting initial setpoint")
                await drone.offboard.set_position_ned(
                    PositionNedYaw(0.0, 0.0, 0.0, 0.0))

                print("-- Starting offboard")
                try:
                    await drone.offboard.start()
                except OffboardError as error:
                    print(
                        f"Starting offboard mode failed with error code: {error._result.result}"
                    )
                    print("-- Disarming")
                    await drone.action.disarm()
                    return
            else:
                print(
                    f"-- Go {target_coord.del_north}m North, {target_coord.del_east}m East, within local coordinate system"
                )
                await drone.offboard.set_position_ned(
                    PositionNedYaw(target_coord.del_north,
                                   target_coord.del_east, 0.0, 0.0))
async def run():
    # Some of the values are inf and numpy complains when doing math with them, so turn off warnings
    np.seterr(all='ignore')
    np.set_printoptions(suppress=True)

    # Make the Gazebo subscriber object
    gz_sub = GazeboMessageSubscriber(HOST, PORT)

    # Actually do the subscription
    gz_task = asyncio.ensure_future(gz_sub.connect())

    # Get a test message - this will speed up all of the subsequent requests
    await gz_sub.get_LaserScanStamped()

    # Initialize drone and connect
    drone = System()
    await drone.connect(system_address="udp://:14540")

    print("Waiting for drone to connect...")
    async for state in drone.core.connection_state():
        if state.is_connected:
            print(f"Drone discovered with UUID: {state.uuid}")
            break

    # Make sure telemetry is good so that we know we can trust the position and orientation values
    print("Waiting for drone to have a global position estimate...")
    async for health in drone.telemetry.health():
        if health.is_global_position_ok:
            print("Global position estimate ok")
            break

    # Get our starting position and use that as reference for conversions between lla and ned
    print("Fetching amsl altitude at home location....")
    lla_ref = []
    async for terrain_info in drone.telemetry.position():
        lla_ref = [
            terrain_info.latitude_deg, terrain_info.longitude_deg,
            terrain_info.absolute_altitude_m
        ]
        print(lla_ref)
        break

    # First mission item is to takeoff to just above our starting location
    mission_items = []
    mission_items.append(
        MissionItem(lla_ref[0], lla_ref[1], lla_ref[2] + 1, 1, True,
                    float('nan'), float('nan'), MissionItem.CameraAction.NONE,
                    float('nan'), float('nan')))

    # Last mission item is at the end of the terrain, just above the terrain
    # All of your mission items go between the the start point above and the end point below
    [lat, lon, alt] = navpy.ned2lla([0, 40, -1], lla_ref[0], lla_ref[1],
                                    lla_ref[2])
    mission_items.append(
        MissionItem(lat, lon, alt, 1, True, float('nan'), float('nan'),
                    MissionItem.CameraAction.NONE, float('nan'), float('nan')))

    mission_plan = MissionPlan(mission_items)

    # Spool up the mission and mission monitor
    mission_task = asyncio.ensure_future(
        run_mission(drone, mission_items, lla_ref, gz_sub))
    termination_task = asyncio.ensure_future(
        observe_is_in_air(drone, [mission_task, gz_task]))

    # Make the drone dangerous (arm it)
    print("-- Arming")
    await drone.action.arm()
    await asyncio.sleep(1)

    # Upload mission with our first item (more will be added in the mission)
    print("-- Uploading mission")
    await drone.mission.upload_mission(mission_plan)
    await asyncio.sleep(1)

    await drone.action.set_takeoff_altitude(lla_ref[2] + 1)
    # Start running through the mission
    # The mission task will watch the progression and add new points as we reach the old ones
    # Once the end condition is met, the drone will land
    print("-- Starting mission")
    await drone.mission.start_mission()

    await termination_task
async def run_mission(drone, mission_items, lla_ref, gz_sub):
    max_speed = 2  # m/s
    done = False  # Flag to signal when we're done with our mission

    # The ned values are slightly skewed because the lla reference is at the start location, not world origin
    # lla_ref_off = navpy.lla2ned(0, 0, 0, lla_ref[0], lla_ref[1], lla_ref[2])
    lla_ref_off = [0, 0, 0]

    [lat, lon, alt] = lla_ref  # Set default mission item to start location

    mission_item_idx = 0  # Keep track which mission item we're currently on

    async for mission_progress in drone.mission.mission_progress():
        if (not mission_progress.current == -1):
            print(f"Mission progress: "
                  f"{mission_progress.current}/"
                  f"{mission_progress.total}")

            # Processing one point at a time, when have reached the end of the current set of waypoints
            if (mission_progress.current == mission_progress.total - 1
                    and not done):

                print("-- Pause and clear mission")
                # Pause mission while calculating
                await drone.mission.pause_mission()
                await drone.mission.clear_mission()

                # Get current mission item index
                mission_item_idx = mission_progress.current

                print("-- Get Lidar Readings")
                # Get Lidar readings
                lsr_val = await gz_sub.get_LaserScanStamped()
                print("-- Register readings")
                registered_scans = get_world_obst(lsr_val, lla_ref_off)
                print(registered_scans)

                print("-- Get new lla")
                ####### Replace this code with your algorithm
                if (mission_item_idx == 0):
                    [lat, lon, alt] = navpy.ned2lla([0, 0, -1], lla_ref[0],
                                                    lla_ref[1], lla_ref[2])
                elif (mission_item_idx == 1):
                    [lat, lon, alt] = navpy.ned2lla([0, 10, -3], lla_ref[0],
                                                    lla_ref[1], lla_ref[2])
                elif (mission_item_idx == 2):
                    [lat, lon, alt] = navpy.ned2lla([0, 15, -5.5], lla_ref[0],
                                                    lla_ref[1], lla_ref[2])
                elif (mission_item_idx == 3):
                    [lat, lon, alt] = navpy.ned2lla([0, 30, -5.5], lla_ref[0],
                                                    lla_ref[1], lla_ref[2])
                ####### Replace this code with your algorithm
                else:
                    # Make sure that you set done to True when your algorithm has reached the endpoint
                    # and the drone is ready to land
                    done = True

                # Insert the mission item created into the overall mission
                print("-- Making mission plan")
                mission_items.insert(
                    mission_item_idx,
                    MissionItem(lat, lon, alt, max_speed, True, float('nan'),
                                float('nan'), MissionItem.CameraAction.NONE,
                                float('nan'), float('nan')))
                mission_plan = MissionPlan(mission_items)

                # Upload updated mission to the drone
                print("-- Uploading updated mission")
                await drone.mission.upload_mission(mission_plan)

                # Wait for the upload to finish, otherwise it can't resume
                await asyncio.sleep(1)

                # Start the mission from the item that we just added
                print("-- Resuming mission")
                await drone.mission.set_current_mission_item(mission_item_idx)
                await drone.mission.start_mission()

        # Land the drone at the end location
        if (mission_progress.current == mission_progress.total and done):
            # Get Lidar readings
            lsr_val = await gz_sub.get_LaserScanStamped()
            registered_scans = get_world_obst(lsr_val, lla_ref_off)
            print(registered_scans)
            print("-- Returning Home and Landing")
            await drone.action.land()
Example #13
0
async def run():
    drone = System()
    await drone.connect(system_address="serial:///dev/ttyUSB0")

    print("Waiting for drone to connect...")
    async for state in drone.core.connection_state():
        if state.is_connected:
            print(f"Drone discovered with UUID: {state.uuid}")
            break
    
    # print("Waiting for drone to have a global position estimate...")
    # async for health in drone.telemetry.health():
    #     if health.is_global_position_ok:
    #         print("Global position estimate ok")
    #         break

    # print("Fetching amsl altitude at home location....")
    # async for terrain_info in drone.telemetry.home():
    #     absolute_altitude = terrain_info.absolute_altitude_m
    #     break

    ##########################
    ### Mission Mode Start ###
    ##########################
    print(target_gps)
    print_mission_progress_task = asyncio.ensure_future(print_mission_progress(drone))

    running_tasks = [print_mission_progress_task]
    termination_task = asyncio.ensure_future(observe_is_in_air(drone, running_tasks))
    del_lat = 37.4540519714 - 37.4540088
    del_long = 126.951881409 - 126.9517901
    mission_items = []
    #parameters = (latitude_deg, longitude_deg, relative_altitude_m, speed_m_s, is_flying_through
    #               gimbal_pitch, gimbal_yaw, camera_action, loiter_time_s, camera_photo_interval_s)
    mission_items.append(MissionItem(37.4539909,
                                     126.9518325,
                                     1,
                                     2,
                                     True,
                                     float('nan'),
                                     float('nan'),
                                     MissionItem.CameraAction.NONE,
                                     float('nan'),
                                     float('nan')))
    mission_items.append(MissionItem(37.4540505,
                                     126.9518383,
                                     1,
                                     2,
                                     True,
                                     float('nan'),
                                     float('nan'),
                                     MissionItem.CameraAction.NONE,
                                     float('nan'),
                                     float('nan')))
    mission_items.append(MissionItem(target_gps.latitude - del_lat,
                                     target_gps.longitude - del_long,
                                     1,
                                     2,
                                     True,
                                     float('nan'),
                                     float('nan'),
                                     MissionItem.CameraAction.NONE,
                                     float('nan'),
                                     float('nan')))

    mission_plan = MissionPlan(mission_items)

    await drone.mission.set_return_to_launch_after_mission(False)

    print("-- Uploading mission")
    await drone.mission.upload_mission(mission_plan)
    await asyncio.sleep(1)

    print("-- Arming")
    await drone.action.arm()

    print("-- Starting mission")
    await drone.mission.start_mission()

    await termination_task
Example #14
0
async def run():
    drone = System()
    # await drone.connect("serial:///dev/tty.usbmodem01:57600")
    await drone.connect(system_address="udp://:14540")

    deliveries = []
    proceed = "Y"
    while (proceed == "Y" or proceed == "y"):
        delivery_priority = get_delivery_priority()
        lat, lng = get_delivery_latitude_longitude()
        deliveries.append([delivery_priority, [lat, lng]])
        proceed = input("\nDo you wish to add more deliveries? (Y/N): ")

    # print("\nDelivery information:")
    # for delivery in deliveries:
    #     print(delivery)

    print("Waiting for drone to connect...")
    async for state in drone.core.connection_state():
        if state.is_connected:
            print(f"Drone discovered with UUID: {state.uuid}")
            break

    print_mission_progress_task = asyncio.ensure_future(
        print_mission_progress(drone))

    running_tasks = [print_mission_progress_task]
    termination_task = asyncio.ensure_future(
        observe_is_in_air(drone, running_tasks))

    high = [delivery for delivery in deliveries if delivery[0] == "High"]
    moderate = [
        delivery for delivery in deliveries if delivery[0] == "Moderate"
    ]
    low = [delivery for delivery in deliveries if delivery[0] == "Low"]
    deliveries = high + moderate + low
    deliveries = list(filter(None, deliveries))

    mission_items = []
    for destination in deliveries:
        print(destination)
        lat, lng = destination[1][0], destination[1][1]
        mission_items.append(
            MissionItem(lat, lng, 25, 10, True, float('nan'), float('nan'),
                        MissionItem.CameraAction.NONE, float('nan'),
                        float('nan')))

    mission_plan = MissionPlan(mission_items)

    await drone.mission.set_return_to_launch_after_mission(True)

    # print("-- Clearing previous missions")
    # await drone.mission.clear_mission()
    await asyncio.sleep(2)
    print("-- Uploading mission")
    await drone.mission.upload_mission(mission_plan)

    print("-- Arming")
    await drone.action.arm()

    print("-- Starting mission")
    await drone.mission.start_mission()

    await termination_task
Example #15
0
async def run_mission(drone, mission_items, lla_ref, gz_sub):
    done = False  # Flag to signal when we're done with our mission

    # The ned values are slightly skewed because the lla reference is at the start location, not world origin
    # lla_ref_off = navpy.lla2ned(0, 0, 0, lla_ref[0], lla_ref[1], lla_ref[2])
    lla_ref_off = [0, 0, 0]

    [lat, lon, alt] = lla_ref  # Set default mission item to start location

    mission_item_idx = 0  # Keep track which mission item we're currently on

    async for mission_progress in drone.mission.mission_progress():
        if (not mission_progress.current == -1):
            print(f"Mission progress: "
                  f"{mission_progress.current}/"
                  f"{mission_progress.total}")

            # Processing one point at a time, when have reached the end of the current set of waypoints
            if (mission_progress.current == mission_progress.total - 1
                    and not done):

                print("-- Pause and clear mission")
                # Pause mission while calculating
                await drone.mission.pause_mission()
                await drone.mission.clear_mission()

                # Get current mission item index
                mission_item_idx = mission_progress.current

                print("-- Get Lidar Readings")
                # Get Lidar readings
                lsr_val = await gz_sub.get_LaserScanStamped()

                # Get next wp and determine if done
                print("-- Getting next wp")
                [x, y, z, speed] = get_next_wp(lsr_val, lla_ref_off)
                if (not np.isnan(x)):
                    [lat, lon, alt] = navpy.ned2lla([y, x, -z], lla_ref[0],
                                                    lla_ref[1], lla_ref[2])
                else:
                    print("-- Mission is done")
                    done = True

                # Insert the mission item created into the overall mission
                print("-- Making mission plan")
                mission_items.insert(
                    mission_item_idx,
                    MissionItem(lat, lon, alt, speed, True, float('nan'),
                                float('nan'), MissionItem.CameraAction.NONE,
                                float('nan'), float('nan')))
                mission_plan = MissionPlan(mission_items)

                # Upload updated mission to the drone
                print("-- Uploading updated mission")
                await drone.mission.upload_mission(mission_plan)

                # Wait for the upload to finish, otherwise it can't resume
                await asyncio.sleep(1)

                # Start the mission from the item that we just added
                print("-- Resuming mission")
                await drone.mission.set_current_mission_item(mission_item_idx)
                await drone.mission.start_mission()

        # Land the drone at the end location
        if (mission_progress.current == mission_progress.total and done):
            print("-- Landing")
            await drone.action.land()
Example #16
0
async def run():
    drone = System()
    await drone.connect(system_address="serial:///dev/ttyUSB0")

    print("Waiting for drone to connect...")
    async for state in drone.core.connection_state():
        if state.is_connected:
            print(f"Drone discovered with UUID: {state.uuid}")
            break
    
    ##########################
    ### Mission Mode Start ###
    ##########################

    print_mission_progress_task = asyncio.ensure_future(print_mission_progress(drone))

    running_tasks = [print_mission_progress_task]
    termination_task = asyncio.ensure_future(observe_is_in_air(drone, running_tasks))

    mission_items = []
    #parameters = (latitude_deg, longitude_deg, relative_altitude_m, speed_m_s, is_flying_through
    #               gimbal_pitch, gimbal_yaw, camera_action, loiter_time_s, camera_photo_interval_s)
    mission_items.append(MissionItem(37.4539753,
                                     126.9518641,
                                     1,
                                     2,
                                     True,
                                     float('nan'),
                                     float('nan'),
                                     MissionItem.CameraAction.NONE,
                                     float('nan'),
                                     float('nan')))
    mission_items.append(MissionItem(37.4540048,
                                     126.9518121,
                                     1,
                                     2,
                                     True,
                                     float('nan'),
                                     float('nan'),
                                     MissionItem.CameraAction.NONE,
                                     float('nan'),
                                     float('nan')))
    mission_items.append(MissionItem(target_gps.latitude,
                                     target_gps.longitude,
                                     1,
                                     2,
                                     True,
                                     float('nan'),
                                     float('nan'),
                                     MissionItem.CameraAction.NONE,
                                     float('nan'),
                                     float('nan')))

    mission_plan = MissionPlan(mission_items)

    await drone.mission.set_return_to_launch_after_mission(True)

    print("-- Uploading mission")
    await drone.mission.upload_mission(mission_plan)
    await asyncio.sleep(1)

    print("-- Arming")
    await drone.action.arm()

    print("-- Starting mission")
    await drone.mission.start_mission()

    await termination_task