我正在努力寻找有关如何使用python创建MAVlink命令的清晰文档。

我正在寻找创建自主滑翔机并需要一些基本功能


检索GPS数据并将其存储到文件中
在Python函数中导入GPS数据
将航点lat,long,alt发送到自动驾驶仪(APM)

我当前正在使用MAVProxy作为我的GCS和ErleBrain 3作为我的自动驾驶仪硬件,但目标是不需要GCS,而只是使用python脚本根据接收到的GPS数据自动添加和删除航路点

#1 楼

有几个库可以做您想做的事情,第一个是pyMAVlink,第二个是dronekit-python,使用dronekit会最容易,因为它可以处理许多较低层的东西,例如处理传入数据包和连接您的首选界面会自动出现。我假设您想从文件中加载航路点并让您的无人机驾驶它们?在这种情况下,您可能希望将无人机设置为引导模式(有关Ardupilot上的模式的说明,请参见此处的文档),这将告诉Ardupilot您将逐步命令它做什么。

这里是wiki的一些示例代码,它可以执行您想要的操作,您只需要加载文件并将坐标转换为纬度点即可:

def arm_and_takeoff(aTargetAltitude):
    while not vehicle.is_armable:
        print " Waiting for vehicle to initialise..."
        time.sleep(1)
    vehicle.mode = VehicleMode("GUIDED")
    vehicle.armed = True

    while not vehicle.armed:      
        print " Waiting for arming..."
        time.sleep(1)

    print "Taking off!"
    vehicle.simple_takeoff(aTargetAltitude)
    # Wait for takeoff to finish
    while True:
        print " Altitude: ", vehicle.location.global_relative_frame.alt      
        if vehicle.location.global_relative_frame.alt>=aTargetAltitude*0.95: #Trigger just below target alt.
            print "Reached target altitude"
            break
        time.sleep(1)

def get_distance_metres(aLocation1, aLocation2):
    dlat = aLocation2.lat - aLocation1.lat
    dlong = aLocation2.lon - aLocation1.lon
    return math.sqrt((dlat*dlat) + (dlong*dlong)) * 1.113195e5

# define connection method 
# see all the methods at http://python.dronekit.io/guide/connecting_vehicle.html
connection_string = "127.0.0.1:14550"

# Connect
vehicle = connect(connection_string, wait_ready=True)
# arm and takeooff to 10m
arm_and_takeoff(10)
# set airspeed to 3 m/s
vehicle.airspeed = 3

point1 = LocationGlobalRelative(-35.361354, 149.165218, 20)
vehicle.simple_goto(point1)

while vehicle.mode.name=="GUIDED": #Stop action if we are no longer in guided mode.
        remainingDistance=get_distance_metres(vehicle.location.global_frame, point1)
        print "Distance to target: ", remainingDistance
        if remainingDistance<=targetDistance*0.01: #Just below target, in case of undershoot.
            print "Reached target"
            break;
        time.sleep(2)


每个请求我都有一些pymavlink代码示例,您可以在此处看到更多示例,发送消息很麻烦,您需要确定需要发送哪种类型的数据包,并按照标准填充其参数

from pymavlink import mavutil

data = mavutil.mavlink_connection('udp:localhost:14551', planner_format=False,
                                  notimestamps=True,
                                  robust_parsing=True)

while True:
    msg = data.recv_match();
    #If we have a valid message
    if msg is not None:
        #print msg.get_type()
        if msg.get_type() is "HEARTBEAT":
            print msg.autopilot
        elif msg.get_type() is "NAV_CONTROLLER_OUTPUT":
            print msg


评论


$ \ begingroup $
马克,您好,谢谢您的答复。不幸的是,我必须使用pymavlink。有没有任何示例代码可以帮助我掌握方向。
$ \ endgroup $
–car12398
17 Mar 2 '17 at 15:05

$ \ begingroup $
为什么必须使用pymavlink?我可以在一分钟内发布一些示例,但是您必须实时提取所需的数据,知道其中包含哪些数据包,等等...如果可以使用,我强烈建议DroneKit。
$ \ endgroup $
– Mark Omo
17年3月2日在15:07

$ \ begingroup $
我使用的是Erle-brain,显然与Dronekit不兼容。您知道有任何指导您学习的基于教程的网站吗?
$ \ endgroup $
–car12398
17 Mar 2 '17 at 18:34

$ \ begingroup $
这是错误的,Erle-brain运行ardupilot,它使用mavlink,Dronekit和pymavlink都只是mavlink接口,可用于从Navio2到Erle-brain到Parrot bebop的任何平台
$ \ endgroup $
– Mark Omo
17 Mar 2 '17 at 18:43

$ \ begingroup $
谢谢您的帮助马克,如果Erle Brain清楚一点,那就容易多了!
$ \ endgroup $
–car12398
17 Mar 9 '17 at 14:25