大疆无人机如何通过MQTT获取实时位置?
要通过 MQTT 获取大疆无人机的实时位置,核心流程是:无人机数据经由 Pilot 2 或机场网关,通过上云 API 的 OSD 主题上报,您的云平台订阅该主题即可获取位置信息。
以下是基于大疆上云 API 的具体实现步骤。
🚀 1. 前提条件
-
适用设备:行业无人机(如 M30/M300/M4 系列)及大疆机场,并搭配支持上云 API 的遥控器(如 RC Plus)或机场固件。
-
平台部署:已部署大疆上云 API 后端服务,并配置好 MQTT Broker(如 EMQX)。
-
设备连接:在 Pilot 2 的“云服务”中配置您的云平台地址,使遥控器和无人机成功连接并上报数据。
📡 2. MQTT 订阅:获取 OSD 数据
位置信息包含在无人机(Aircraft)的 OSD(On-Screen Display)数据中。您需要订阅其专属的 OSD 主题。
-
订阅主题
thing/product/{aircraft_sn}/osd-
说明:
{aircraft_sn}是无人机的序列号。您可以在 Pilot 2 的设备信息页面或上云 API 的后台管理界面找到它。
-
-
MQTT 示例 (使用 paho.mqtt.python)
python
import paho.mqtt.client as mqtt
import json
def on_connect(client, userdata, flags, rc):
print("Connected with result code " + str(rc))
# 订阅无人机OSD主题,QoS可根据需求选择
client.subscribe("thing/product/YOUR_AIRCRAFT_SN/osd", qos=0)
def on_message(client, userdata, msg):
payload = json.loads(msg.payload)
data = payload.get("data", {})
# 提取位置信息
latitude = data.get("latitude")
longitude = data.get("longitude")
height = data.get("height") # 相对起飞点高度 (米)
elevation = data.get("elevation") # 海拔高度 (米)
if latitude is not None and longitude is not None:
print(f"实时位置: 经度={longitude}, 纬度={latitude}, 高度={height}, 海拔={elevation}")
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
使用上云API配置的MQTT连接信息
client.username_pw_set("admin", "public")
client.connect("your-emqx-host", 1883, 60)
client.loop_forever()
📊 3. 解析位置数据
订阅 osd主题后,您将收到包含实时遥测数据的 JSON 报文。关键字段如下:
json
{
"bid": "00000000-0000-0000-0000-000000000000",
"data": {
"latitude": 31.2304, // 纬度 (度)
"longitude": 121.4737, // 经度 (度)
"height": 120.5, // 相对起飞点高度 (米)
"elevation": 15.3, // 海拔高度 (米)
"attitude_head": -79, // 航向角 (度)
"attitude_pitch": 4.3, // 俯仰角 (度)
"attitude_roll": 0, // 横滚角 (度)
"horizontal_speed": 5.2, // 水平速度 (m/s)
"vertical_speed": 0.1, // 垂直速度 (m/s)
"home_distance": 350.7, // 距返航点距离 (米)
"position_state": { // 定位状态
"gps_number": 12,
"is_fixed": 1,
"quality": 2,
"rtk_number": 0
},
// ... 其他字段
},
"timestamp": 1736411578239,
"gateway": "5YSZKCC00212VA"
}
核心定位字段说明:
|
字段 (Field) |
含义 |
单位 |
说明 |
|---|---|---|---|
|
|
纬度 |
度 (°) |
WGS84 坐标系 |
|
|
经度 |
度 (°) |
WGS84 坐标系 |
|
|
相对高度 |
米 (m) |
相对于起飞点的高度 |
|
|
海拔高度 |
米 (m) |
基于海平面的高度 |
|
|
定位状态 |
- |
|
💡 4. 注意事项
-
定位状态校验:使用前务必检查
position_state字段,确保is_fixed为1且gps_number足够(如 > 6),以保证定位精度。 -
数据更新频率:OSD 数据上报频率通常为 1-5 秒/次,具体取决于设备型号和设置,适用于监控大屏和轨迹回放,但不适合厘米级精确定位。
-
机场场景:对于大疆机场,无人机的 OSD 主题同样为
thing/product/{aircraft_sn}/osd。机场本身的位置通常在拓扑信息中上报。 -
坐标系转换:获取到的经纬度是 WGS84 坐标系,如需在地图上展示或进行距离计算,请使用高德、百度等地图 SDK 提供的转换工具将其转换为平面坐标。
更多推荐


所有评论(0)