PX4与Python之间的MAVLink/UDP通信

  在使用python+pymavlink控制PX4时候,遇到了一个容易混淆的端口问题,在此记录一下。

PX4的UDP端口

  我当前使用的PX4 v1.12.3 SITL 有如下配置:

mavlink start -x -u 14580 -r 4000000 -f -m onboard -o 14540

  该配置中,PX4这个MAVLink实例绑定的是14580这个本地UDP端口。同时,14540为远端的UDP端口,Python程序能够通过此端口获取PX4发来的MAVLink数据。

graph LR
    A(PX4\n14580) <--> |MAVLink/UDP| B(Python\n14540)

  做一个形象一点的比喻:ubuntu系统是一个大楼,PX4程序在14580这个房间里面工作,它会让UDP这个传话员通过MAVLink这个协议给14540号房间发送数据,而Python程序就要监听14540这个房间里面的数据。

Python如何监听PX4发来的数据

  Python中使用如下代码:

master = mavutil.mavlink_connection(
    "udpin:0.0.0.0:14540",
    source_system=255,
    source_component=190
)

  其中udpin表示使用UDP接收模式,并通过0.0.0.0监听本机所有网络接口,14540指明监听的UDP端口。这段代码的主要作用就是让python在本地14540端口等待MAVLink的数据。

  当PX4发送心跳、姿态、位置等MAVLink消息时候,Python可以通过:

master.wait_heartbeat()

  或者其它recv_match()等方法收到这些数据。

Python如何发送控制数据

  控制代码中会看到master.mav.send_postition_target_local_ned_send(...)这类发送数据的函数,但是函数中并没有指明目标的UDP端口。

  这个函数的作用是生成并发送一条MAVLink消息,实际上它并不需要每次都指定UDP端口。master已经包含了底层的UDP通信建立,Python收到PX4的LAVLink数据后,可以根据UDP通信的对端信息向PX4返回数据。

总结一下就是: > Python 使用 pymavlink 构造 MAVLink 控制消息 → 通过 UDP 网络发送 → PX4 的 MAVLink 模块接收 → PX4 解析消息 → 根据消息执行相应的飞控操作。