数据订阅

2024-12-10
暂无评分

概述

PSDK 的信息管理功能包含信息获取和消息订阅功能,基于 PSDK 开发的负载设备具有信息获取功能,能够主动获取到飞行器的型号、负载设备挂载的位置以及用户使用的移动端 App 等信息,加载不同的配置文件,方便用户使用负载设备。具有消息订阅功能的负载设备,能够记录用户订阅的数据信息,方便用户实现更广泛的应用。

基础概念

信息获取

信息获取是指负载设备能够主动获取并记录飞行器上如飞行器型号、硬件平台类型和负载设备挂载位置等数据信息。

说明: 将使用 PSDK 开发的负载设备安装到飞行器上,在开机初始化 5s 后才能够获取到飞行器正确的数据信息。

使用 PSDK 开发的负载设备在初始化后,即可获取到如下信息:

  • 基本信息:飞行器型号、硬件平台类型和负载挂载位置
  • 移动端 App 信息:App 的系统语言和 App 的屏幕类型

消息订阅

飞行器上的各个部件根据飞行器实际的飞行状况,会实时产生大量的数据信息并被飞行器推送给其他模块,用户使用具有消息订阅功能的负载设备,能够指定所需订阅的数据信息。

下图展示了部分飞行器上 RTK 和 GPS 模块的位置,左侧为 Matrice 300 RTK,右侧为 Matrice 350 RTK。

M300M350

订阅流程

订阅数据项后,负载设备即可获得订阅的信息,具体流程如 图. 消息订阅 所示。

图. 消息订阅

订阅项

使用 PSDK 消息订阅功能可订阅的数据信息如 表. 飞行器订阅项 所示。

注意:如果需要在代码工程中搜索订阅项,请替换下的*_DJI_FC_SUBSCRIPTION_TOPIC_,譬如*_QUATERNION拓展为DJI_FC_SUBSCRIPTION_TOPIC_QUATERNION

表. 飞行器订阅项

数据订阅 TOPICM300 RTKMatrice 30/30TMavic 3E/3TMatrice 3D/3TDFlycart 30M350 RTKMatrice 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最大 50Hz200Hz最大 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;
}

通过构造回调函数获取飞行器上的信息

  1. 构造回调函数
    通过构造回调函数接收飞行器推送的信息。

注意: 为避免出现内存踩踏事件,须将数据地址的类型强制转换为订阅项数据结构中的指针类型。

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;
}
  1. 注册回调函数
    注册回调函数接收无人机产生并对外推送的数据信息,下述代码以 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),
                                                  &timestamp);
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),
                                                  &timestamp);
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)

若您对文档有意见或疑惑,点击可快速反馈,我们会与您联系。