from pymavlink import mavutil
import pymavlink.dialects.v20.all as dialect
vehicle = mavutil.mavlink_connection("localhost:14550")
vehicle.wait_heartbeat()
print("Heartbeat from system (system %u component %u)" % (vehicle.target_system, vehicle.target_component))
fence_list = ([51.119594, 6.484470, dialect.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION],
[51.080141, 7.678193, dialect.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION],
[50.472869, 7.687169, dialect.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION],
[50.358485, 6.556273, dialect.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION]
)
message = dialect.MAVLink_mission_count_message(target_system=vehicle.target_system,
target_component=vehicle.target_component,
count=len(fence_list),
mission_type=dialect.MAV_MISSION_TYPE_FENCE)
# send mission count message to the vehicle
vehicle.mav.send(message)
message = vehicle.recv_match(blocking=True)
print(message)
# this loop will run until receive a valid MISSION_ACK message
while True:
# catch a message
message = vehicle.recv_match(blocking=True)
# convert this message to dictionary
message = message.to_dict()
# check if this message is MISSION_REQUEST
if message["mavpackettype"] == dialect.MAVLink_mission_request_message.msgname:
# check if this request is for mission items
if message["mission_type"] == dialect.MAV_MISSION_TYPE_FENCE:
# get the sequence number of requested mission item
seq = message["seq"]
print(message)
# create mission item int message that contains the home location (0th mission item)
coord = fence_list[seq]
lat = coord[0]
lon = coord[1]
message = dialect.MAVLink_mission_item_int_message(target_system=vehicle.target_system,
target_component=vehicle.target_component,
seq=seq,
frame=dialect.MAV_FRAME_GLOBAL,
command=coord[2],
current=0,
autocontinue=0,
param1=len(fence_list),
param2=0,
param3=0,
param4=0,
x=int(lat*1e7), # x (latitude)
y=int(lon*1e7), # y (longitude)
z=0,
mission_type=dialect.MAV_MISSION_TYPE_FENCE)
# send the mission item int message to the vehicle
vehicle.mav.send(message)
# check if this message is MISSION_ACK
elif message["mavpackettype"] == dialect.MAVLink_mission_ack_message.msgname:
# check if this acknowledgement is for mission and it is accepted
if message["mission_type"] == dialect.MAV_MISSION_TYPE_FENCE and \
message["type"] == dialect.MAV_MISSION_ACCEPTED:
# break the loop since the upload is successful
print("Mission upload successful")
break
elif message["mission_type"] == dialect.MAV_MISSION_TYPE_FENCE:
print (message)
Thanks in advance
from pymavlink import mavutil, mavwp
import pymavlink.dialects.v20.all as dialect
vehicle = mavutil.mavlink_connection("localhost:14550")
vehicle.wait_heartbeat()
print("Heartbeat from system (system %u component %u)" % (vehicle.target_system, vehicle.target_component))
fence_items = [[[51.080141, 7.678193, dialect.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, 0],[50.472869, 7.687169, dialect.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, 0],[50.358485, 6.556273, dialect.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, 0],[51.119594, 6.484470, dialect.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, 0]], [[50.8561802, 7.333573, dialect.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, 0],[50.8564579, 7.3358493, dialect.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, 0],[50.8550949, 7.3360746, dialect.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, 0],[50.8554064, 7.3345064, dialect.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, 0]]]
class Fence():
def set_fence(self, polygons):
seq = 0
poly_index = []
# polygons = polygons[0]
for polygon in polygons:
count = len(polygon)
for point in polygon:
poly_index.append([count, point])
seq+=1
message = dialect.MAVLink_mission_count_message(target_system=vehicle.target_system,
target_component=vehicle.target_component,
count=len(poly_index),
mission_type=dialect.MAV_MISSION_TYPE_FENCE)
# send mission count message to the vehicle
vehicle.mav.send(message)
message = vehicle.recv_match(blocking=True)
print(message)
while True:
# catch a message
message = vehicle.recv_match(blocking=True)
# convert this message to dictionary
message = message.to_dict()
# check this message is MISSION_REQUEST
if message["mavpackettype"] == dialect.MAVLink_mission_request_message.msgname:
# check this request is for mission items
if message["mission_type"] == dialect.MAV_MISSION_TYPE_FENCE:
# get the sequence number of requested mission item
seq = message["seq"]
print(message)
# create mission item int message that contains the home location (0th mission item)
coord = poly_index[seq][1]
vertex_count = poly_index[seq][0]
lat = coord[0]
lon = coord[1]
message = dialect.MAVLink_mission_item_int_message(target_system=vehicle.target_system,
target_component=vehicle.target_component,
seq=seq,
frame=dialect.MAV_FRAME_GLOBAL,
command=coord[2],
current=0,
autocontinue=0,
param1=vertex_count,
param2=0,
param3=0,
param4=0,
x=int(lat*1e7), # x (latitude)
y=int(lon*1e7), # y (longitude)
z=0,
mission_type=dialect.MAV_MISSION_TYPE_FENCE)
# send the mission item int message to the vehicle
vehicle.mav.send(message)
# check this message is MISSION_ACK
elif message["mavpackettype"] == dialect.MAVLink_mission_ack_message.msgname:
# check this acknowledgement is for mission and it is accepted
if message["mission_type"] == dialect.MAV_MISSION_TYPE_FENCE and \
message["type"] == dialect.MAV_MISSION_ACCEPTED:
# break the loop since the upload is successful
print("Mission upload is successful")
break
elif message["mission_type"] == dialect.MAV_MISSION_TYPE_FENCE:
print (message)
fence = Fence()
fence.set_fence(fence_items)