Skip to main content

信息管理

概述

具有消息订阅功能的负载设备,能够订阅无人机的飞行状态数据信息,方便用户实现广泛的应用。

基础概念

消息订阅

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

订阅流程

订阅数据项后,负载设备即可获得订阅的信息。

订阅项

使用 PSDK 消息订阅功能可订阅的数据信息如下表所示:

注意:

  • 如果需要在代码工程中搜索订阅项,请替换下的 *_ UAV_SUBSCRIPTION_TOPIC_,譬如 *_QUATERNION 拓展为 UAV_SUBSCRIPTION_TOPIC_QUATERNION
数据订阅 TOPIC EVO Max 系列
姿态四元数
*_QUATERNION
最大100Hz
相对地面加速度
*_ACCELERATION_GROUND
最大 5Hz
相对机体加速度
*_ACCELERATION_BODY
最大 5Hz
原始加速度
*_ACCELERATION_RAW
最大 100Hz
速度
*_VELOCITY
最大 100Hz
融合角速度
*_ANGULAR_RATE_FUSIONED
最大 100Hz
原始角速度
*_ANGULAR_RATE_RAW
最大 100Hz
融合高度
*_ALTITUDE_FUSED
最大 20Hz
气压计高度
*_ALTITUDE_BAROMETER
最大 5Hz
Home 点高度
*_ALTITUDE_OF_HOMEPOINT
最大 10Hz
融合相对地面高度
*_HEIGHT_FUSION
最大 1Hz
相对地面高度
*_HEIGHT_RELATIVE
最大 20Hz
融合位置坐标
*_POSITION_FUSED
最大 20Hz
GPS 日期(年月日)
*_GPS_DATE
最大 10Hz
GPS 时间(时分秒)
*_GPS_TIME
最大 10Hz
GPS 位置
*_GPS_POSITION
最大 10Hz
GPS 速度
*_GPS_VELOCITY
最大 10Hz
GPS 信息
*_GPS_DETAILS
最大 10Hz
GPS 信号强度
*_GPS_SIGNAL_LEVEL
最大 10Hz
RTK 位置
*_RTK_POSITION
最大 10Hz
RTK 速度
*_RTK_VELOCITY
最大 5Hz
RTK 航向角
*_RTK_YAW
最大 5Hz
RTK 位置信息
*_RTK_POSITION_INFO
最大 10Hz
RTK 航向信息
*_RTK_YAW_INFO
最大 5Hz
指南针信息
*_COMPASS
最大 5Hz
遥控摇杆信息
*_RC
最大 50Hz
云台角度
*_GIMBAL_ANGLES
最大 100Hz
云台状态
*_GIMBAL_STATUS
最大 100Hz
飞行状态
*_STATUS_FLIGHT
最大 2Hz
飞行模式状态
*_STATUS_DISPLAYMODE
最大 2Hz
电机启动错误码
*_STATUS_MOTOR_START_ERROR
最大 5Hz
电池信息
*_BATTERY_INFO
最大 1Hz
硬件时钟同步
*_HARD_SYNC
最大 100Hz
GPS 控制等级
*_GPS_CONTROL_LEVEL
最大 10Hz
带标记遥控遥感信息
*_RC_WITH_FLAG_DATA
最大 50Hz
电调数据
*_ESC_DATA
最大 5Hz
云台控制模式
*_GIMBAL_CONTROL_MODE
控制触发
笛卡尔坐标位置
*_POSITION_VO
最大 100Hz
避障数据
*_AVOID_DATA
最大 20Hz
返航点设置状态
*_HOME_POINT_SET_STATUS
最大 1Hz
返航点信息
*_HOME_POINT_INFO
最大 1Hz
1 号电池信息
*_BATTERY_SINGLE_INDEX1
最大 1Hz
2 号电池信息
*_BATTERY_SINGLE_INDEX2
最大 1Hz
带时间戳的飞行姿态信息
*_IMU_ATTI_NAVI_WITH_TIMESTAMP
最大 20Hz

使用消息订阅功能

PSDK 支持通过注册回调方式订阅无人机对外推送的数据信息。

消息订阅功能模块初始化

使用 PSDK 开发的负载设备如需订阅无人机上的状态信息,需要先调用 UAV_Subscription_Init() 初始化消息订阅模块。

uavStat = UAV_Subscription_Init();
if (uavStat != UAV_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("init data subscription module error.");
return UAV_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}

uavStat = UAV_Subscribe_Topic(UAV_SUBSCRIPTION_TOPIC_QUATERNION, UAV_DATA_SUBSCRIPTION_TOPIC_1_HZ,
UAV_FcSubscription_ReceiveQuaternionCallback);
if (uavStat != UAV_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
UAV_LOG_ERROR("Subscribe topic quaternion info error.");
return UAV_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
} else {
UAV_LOG_INFO("Subscribe topic quaternion info success.");
}

通过构造回调函数获取无人机上的信息

  • 构造回调函数
    通过构造回调函数接收无人机推送的信息。

    注意:

    • 为避免出现内存踩踏事件,须将数据地址的类型强制转换为订阅项数据结构中的指针类型。
static T_UAVReturnCode UAV_FcSubscription_ReceiveQuaternionCallback(const uint8_t *data, uint16_t dataSize)
{
T_UAVSubscriptionQuaternion *quaternion = (T_UAVSubscriptionQuaternion *) data;
double pitch, yaw, roll;

USER_UTIL_UNUSED(dataSize);

pitch = (double) asinf(-2 * quaternion->q1 * quaternion->q3 + 2 * quaternion->q0 * quaternion->q2) * 57.3;
roll = (double) 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 = (double) 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("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);
UAV_Test_WidgetLogAppend("pitch = %.2f roll = %.2f yaw = %.2f.", pitch, yaw, roll);
}

return UAV_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}