数据订阅
概述
PSDK 的信息管理功能包含信息获取和消息订阅功能,基于 PSDK 开发的负载设备具有信息获取功能,能够主动获取到飞行器的型号、负载设备挂载的位置以及用户使用的移动端 App 等信息,加载不同的配置文件,方便用户使用负载设备。具有消息订阅功能的负载设备,能够记录用户订阅的数据信息,方便用户实现更广泛的应用。
基础概念
信息获取
信息获取是指负载设备能够主动获取并记录飞行器上如飞行器型号、硬件平台类型和负载设备挂载位置等数据信息。
说明: 将使用 PSDK 开发的负载设备安装到飞行器上,在开机初始化 5s 后才能够获取到飞行器正确的数据信息。
使用 PSDK 开发的负载设备在初始化后,即可获取到如下信息:
- 基本信息:飞行器型号、硬件平台类型和负载挂载位置
- 移动端 App 信息:App 的系统语言和 App 的屏幕类型
消息订阅
飞行器上的各个部件根据飞行器实际的飞行状况,会实时产生大量的数据信息并被飞行器推送给其他模块,用户使用具有消息订阅功能的负载设备,能够指定所需订阅的数据信息。
下图展示了部分飞行器上 RTK 和 GPS 模块的位置,左侧为 Matrice 300 RTK,右侧为 Matrice 350 RTK。
![]() | ![]() |
订阅流程
订阅数据项后,负载设备即可获得订阅的信息,具体流程如 图. 消息订阅 所示。
图. 消息订阅

订阅项
使用 PSDK 消息订阅功能可订阅的数据信息如 表. 飞行器订阅项 所示。
注意:如果需要在代码工程中搜索订阅项,请替换下的*_
为DJI_FC_SUBSCRIPTION_TOPIC_
,譬如*_QUATERNION
拓展为DJI_FC_SUBSCRIPTION_TOPIC_QUATERNION
。
表. 飞行器订阅项
数据订阅 TOPIC | M300 RTK | Matrice 30/30T | Mavic 3E/3T | Matrice 3D/3TD | Flycart 30 | M350 RTK | Matrice 4E/4T |
---|---|---|---|---|---|---|---|
姿态四元数 *_QUATERNION | 最大 200Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 200Hz | 最大 50Hz |
相对地面加速度 *_ACCELERATION_GROUND | 最大 200Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 200Hz | 最大 50Hz |
相对机体加速度 *_ACCELERATION_BODY | 最大 200Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 200Hz | 最大 50Hz |
原始加速度 *_ACCELERATION_RAW | 最大 400Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 400Hz | 最大 50Hz |
速度 *_VELOCITY | 最大 200Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 200Hz | 最大 50Hz |
融合角速度 *_ANGULAR_RATE_FUSIONED | 最大 200Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 200Hz | 最大 50Hz |
原始角速度 *_ANGULAR_RATE_RAW | 最大 400Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 400Hz | 最大 50Hz |
融合高度 *_ALTITUDE_FUSED | 最大 200Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 200Hz | 最大 50Hz |
气压计高度 *_ALTITUDE_BAROMETER | 最大 200Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 200Hz | 最大 50Hz |
Home 点高度 *_ALTITUDE_OF_HOMEPOINT | 最大 1Hz | 最大 50Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz | 最大 1Hz | 最大 5Hz |
融合相对地面高度 *_HEIGHT_FUSION | 最大 100Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 100Hz | 最大 50Hz |
相对地面高度 *_HEIGHT_RELATIVE | 最大 200Hz | - | - | - | - | 最大 200Hz | - |
融合位置坐标 *_POSITION_FUSED | 最大 200Hz | - | - | - | - | 最大 200Hz | - |
GPS 日期(年月日) *_GPS_DATE | 最大 5Hz | 最大 50Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz |
GPS 时间(时分秒) *_GPS_TIME | 最大 5Hz | 最大 50Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz |
GPS 位置 *_GPS_POSITION | 最大 5Hz | 最大 50Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz |
GPS 速度 *_GPS_VELOCITY | 最大 5Hz | 最大 50Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz |
GPS 信息 *_GPS_DETAILS | 最大 5Hz | 最大 50Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz |
GPS 信号强度 *_GPS_SIGNAL_LEVEL | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz |
RTK 位置 *_RTK_POSITION | 最大 5Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 5Hz | 最大 50Hz |
RTK 速度 *_RTK_VELOCITY | 最大 5Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 5Hz | 最大 50Hz |
RTK 航向角 *_RTK_YAW | 最大 5Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 5Hz | 最大 50Hz |
RTK 位置信息 *_RTK_POSITION_INFO | 最大 5Hz | 最大 50Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz |
RTK 航向信息 *_RTK_YAW_INFO | 最大 5Hz | 最大 50Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz |
指南针信息 *_COMPASS | 最大 100Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 100Hz | 最大 50Hz |
遥控摇杆信息 *_RC | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz |
云台角度 *_GIMBAL_ANGLES | 最大 50Hz | 仅支持 50Hz | 仅支持 50Hz | 仅支持 50Hz | 仅支持 50Hz | 最大 50Hz | 仅支持 50Hz |
云台状态 *_GIMBAL_STATUS | 最大 50Hz | - | - | - | - | 最大 50Hz | - |
飞行状态 *_STATUS_FLIGHT | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz |
飞行模式状态 *_STATUS_DISPLAYMODE | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz |
起落架状态 *_STATUS_LANDINGGEAR | 最大 50Hz | - | - | - | - | 最大 50Hz | - |
电机启动错误码 *_STATUS_MOTOR_START_ERROR | 最大 50Hz | - | 最大 5Hz | 最大 5Hz | 最大 5Hz | 最大 50Hz | 最大 5Hz |
电池信息 *_BATTERY_INFO | 最大 50Hz | - | - | - | - | 最大 50Hz | - |
设备控制信息 *_CONTROL_DEVICE | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz |
硬件时钟同步 *_HARD_SYNC | 400Hz | 最大 50Hz | - | - | - | 400Hz | - |
GPS 控制等级 *_GPS_CONTROL_LEVEL | 最大 50Hz | 最大 50Hz | - | - | - | 最大 50Hz | - |
带标记遥控遥感信息 *_RC_WITH_FLAG_DATA | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz |
电调数据 *_ESC_DATA | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz |
RTK 连接状态 *_RTK_CONNECT_STATUS | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz |
云台控制模式 *_GIMBAL_CONTROL_MODE | 最大 50Hz | - | - | - | - | 最大 50Hz | - |
飞行异常信息 *_FLIGHT_ANOMALY | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz |
笛卡尔坐标位置 *_POSITION_VO | 200Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 200Hz | 最大 50Hz |
避障数据 *_AVOID_DATA | 最大 100Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 100Hz | 最大 50Hz |
返航点设置状态 *_HOME_POINT_SET_STATUS | 最大 50Hz | 最大 50Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz | 最大 50Hz | 最大 5Hz |
返航点信息 *_HOME_POINT_INFO | 最大 50Hz | 最大 50Hz | 最大 5Hz | 最大 5Hz | 最大 5Hz | 最大 50Hz | 最大 5Hz |
三云台信息 (适用M300 RTK与M350 RTK,上下三个云台的信息) *_THREE_GIMBAL_DATA | 最大 50Hz | - | - | - | - | 最大 50Hz | - |
1 号电池信息 *_BATTERY_SINGLE_INFO_INDEX1 | 最大 50Hz | 最大 50Hz | 最大 50Hz | 最大 50Hz | - | 最大 50Hz | 最大 50Hz |
2 号电池信息 *_BATTERY_SINGLE_INFO_INDEX2 | 最大 50Hz | 最大 50Hz | - | - | - | 最大 50Hz | - |
订阅规则
- 订阅项(Topic)支持的数据订阅频率范围有:1Hz,5Hz,10Hz,50Hz,100Hz,200Hz,400Hz,每个订阅项的订阅频率范围不完全相同,每个订阅项支持重复订阅。
- 指定订阅频率时,任何参数的订阅频率不能小于或等于 0 ,相同订阅频率的主题的数据长度总和须小于或等于 242。
注意: 在 DJI Assistant 2 中使用模拟器模拟负载设备的工作状态时,模拟器将 无法获取 GPS 信息和 RTK 信息等传感器原始数据,但开发者可订阅如融合位置、融合海拔高度或相对高度等融合数据。
使用消息订阅功能
PSDK 支持通过注册回调和接口调用两种方式订阅飞行器对外推送的数据信息:
- 通过调用
DjiFcSubscription_GetLatestValueOfTopic()
获取飞行器最新产生的订阅项的数据信息及其对应的时间。 - 通过调用
DjiFcSubscription_SubscribeTopic()
接口指定订阅频率和订阅项,通过构造并注册回调函数,获取飞行器最新产生的订阅项的数据信息及其对应的时间。
说明: 使用订阅功能将接收到订阅项的数据与该数据产生时飞行器系统的时间,该时间暂不支持与负载设备上的时间实现同步。M300 和 M350 机型得到的是飞行器时间,其它机型得到的是 PSDK 本地时间。
消息订阅功能模块初始化
使用 PSDK 开发的负载设备如需订阅飞行器上的状态信息,需要先调用DjiFcSubscription_Init()
初始化消息订阅模块。
djiStat = DjiFcSubscription_Init();
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("init data subscription module error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
通过构造回调函数获取飞行器上的信息
- 构造回调函数
通过构造回调函数接收飞行器推送的信息。
注意: 为避免出现内存踩踏事件,须将数据地址的类型强制转换为订阅项数据结构中的指针类型。
static T_DjiReturnCode DjiTest_FcSubscriptionReceiveQuaternionCallback(const uint8_t *data, uint16_t dataSize, const T_DjiDataTimestamp *timestamp)
{
T_DjiFcSubscriptionQuaternion *quaternion = (T_DjiFcSubscriptionQuaternion *) data;
dji_f64_t pitch, yaw, roll;
USER_UTIL_UNUSED(dataSize);
pitch = (dji_f64_t) asinf(-2 * quaternion->q1 * quaternion->q3 + 2 * quaternion->q0 * quaternion->q2) * 57.3;
roll = (dji_f64_t) atan2f(2 * quaternion->q2 * quaternion->q3 + 2 * quaternion->q0 * quaternion->q1, -2 * quaternion->q1 * quaternion->q1 - 2 * quaternion->q2 * quaternion->q2 + 1) * 57.3;
yaw = (dji_f64_t) atan2f(2 * quaternion->q1 * quaternion->q2 + 2 * quaternion->q0 * quaternion->q3, -2 * quaternion->q2 * quaternion->q2 - 2 * quaternion->q3 * quaternion->q3 + 1) * 57.3;
if (s_userFcSubscriptionDataShow == true) {
USER_LOG_INFO("receive quaternion data.");
USER_LOG_INFO("timestamp: millisecond %u microsecond %u.", timestamp->millisecond,
timestamp->microsecond);
USER_LOG_INFO("quaternion: %f %f %f %f.\r\n", quaternion->q0, quaternion->q1, quaternion->q2, quaternion->q3);
USER_LOG_INFO("euler angles: pitch = %.2f roll = %.2f yaw = %.2f.", pitch, yaw, roll);
DjiTest_WidgetLogAppend("pitch = %.2f roll = %.2f yaw = %.2f.", pitch, yaw, roll);
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
- 注册回调函数
注册回调函数接收无人机产生并对外推送的数据信息,下述代码以 1Hz 的频率订阅无人机 “无人机飞行速度” 和 “无人机 GPS 坐标”,如 图. 订阅结果(1) 所示。
说明: 使用订阅功能订阅无人机上的数据信息时,订阅频率只能为” 最大订阅频率 “的约数。
djiStat = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_QUATERNION, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ,
DjiTest_FcSubscriptionReceiveQuaternionCallback);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Subscribe topic quaternion error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
图. 订阅结果(1)

在线程函数中获取无人机上的信息
非回调方式发起订阅,回调参数设置成NULL。
djiStat = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_VELOCITY, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ,
NULL);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Subscribe topic velocity error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
djiStat = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_POSITION, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ,
NULL);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Subscribe topic gps position error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
通过数据订阅线程函数获取飞行器推送的信息并打印在终端上。下述代码以 1Hz 的频率,订阅飞行器最新产生的飞行器飞行速度和飞行器 GPS 坐标,以及该数据对应的时间,如 图. 订阅结果(2) 所示。
djiStat = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_VELOCITY,
(uint8_t *) &velocity,
sizeof(T_DjiFcSubscriptionVelocity),
×tamp);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("get value of topic velocity error.");
} else {
USER_LOG_INFO("velocity: x = %f y = %f z = %f healthFlag = %d.", velocity.data.x, velocity.data.y,
velocity.data.z, velocity.health);
}
djiStat = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_POSITION,
(uint8_t *) &gpsPosition,
sizeof(T_DjiFcSubscriptionGpsPosition),
×tamp);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("get value of topic gps position error.");
} else {
USER_LOG_INFO("gps position: x = %d y = %d z = %d.", gpsPosition.x, gpsPosition.y, gpsPosition.z);
}
图. 订阅结果(2)
