云台管理
概述
PSDK 的云台管理功能支持同时管理挂载在无人机上不同位置的云台负载设备,其中包括设置云台模式、云台回中和控制云台旋转等。开发者可基于云台管理的接口,设计控制逻辑,从而实现在无人机飞行的过程中控制指定的云台旋转对应角度的功能。
基础概念
云台角度
云台关节与云台关节角
云台的关节如图1.云台关节 所示,云台关节是云台上带动负载设备转动的结构件:云台电机,云台关节角即云台电机转动的角度。本教程使用机体坐标系描述云台的关节角。
图1.云台关节
云台姿态与云台姿态角
云台的姿态如 图2.云台姿态 所示,根据用户的控制指令,云台能够调整姿态。云台姿态角即使用大地坐标系(NED,北东地坐标系)描述云台上负载设备的角度,该角度也称为欧拉角。
图2.云台姿态
云台限位角度说明
注意:
- 当PSDK以绝对角度(设置的角度基于大地坐标系,0度为正北方向)控制云台的yaw轴转动n度时,如果 n > 0,云台将转动到正北方向顺时针n度的位置,如果 n < 0,云台将转动到正北方向逆时针n度的位置。
- 当PSDK以相对角度(设置的角度基于当前角度)控制云台的yaw轴转动n度时,如果 n > 0,云台将转动到当前角度顺时针n度的位置,如果 n < 0,云台将转动到当前角度逆时针n度的位置。
机型 | 云台挂载类型 | Pitch | Yaw | Roll |
M300 RTK / M350 RTK | H30 | 正向: (-120, 60) 颠倒: (-60, 120) | (-310, 310) | (-45, 45) |
H30T | 正向: (-120, 60) 颠倒: (-60, 120) | (-310, 310) | (-45, 45) | |
H20 | 正向: (-120, 45) 颠倒: (-45, 120) | (-310, 310) | (-45, 45) | |
H20T | 正向: (-120, 30) 颠倒: (-30, 120) 开启云台俯仰限位 正向: (-120, 45) 颠倒: (-45, 120) | (-310, 310) | (-45, 45) | |
H20N | 正向: (-120, 30) 颠倒: (-30, 120) | (-310, 310) | (-50, 50) | |
L1/L2 | 正向: (-120, 30) 颠倒: (-30, 120) | (-310, 310) | (-50, 50) | |
P1 | 正向: (-120, 30) 颠倒: (-30, 120) | (-310, 310) | (-50, 50) | |
PSDK(X-Port) | 正向: (-120, 30) 颠倒: (-30, 120) | (-310, 310) | (-50, 50) | |
PSDK(Skyport 2.0) | 联系第三方开发商获取 | 联系第三方开发商获取 | 联系第三方开发商获取 | |
M300 RTK | Z30 | 正向: (-120, 30) 颠倒: (-30, 120) | (-310, 310) | (-40, 40) |
XTS | 正向: (-120, 30) 颠倒: (-30, 120) | (-320, 320) | (-40, 40) | |
XT2 | 正向: (-90, 30) 颠倒: (-30, 90) | (-310, 310) | (-40, 40) | |
M30 | (-120, 45) | (-310, 310) | (-50, 50) | |
M30T | (-120, 45) | (-310, 310) | (-50, 50) | |
M3E | (-90, 35) | (-40, 40) | (-20, 20) | |
M3T | (-90, 35) | (-40, 40) | (-20, 20) | |
M3D | (-90, 35) | (-40, 40) | (-20, 20) | |
M3TD | (-90, 35) | (-40, 40) | (-20, 20) | |
Matrice 4E | 不支持 | 不支持 | 不支持 | |
Matrice 4T | 不支持 | 不支持 | 不支持 |
云台控制
控制方式
- 绝对角度控制:使用PSDK 开发的云台根据用户的指令,在规定的时间内,从当前的位置转动到指定的位置。
- 速度控制:用户可控制使用PSDK 开发的云台的转动速度。
说明
- 在角度控制模式下,云台转动的时间受云台最大旋转速度和最大加速度限制,实际的转动角度受云台限位角度的限制。
- 在速度控制模式下,云台根据用户指定的速度转动0.5s,当云台转动到限位角时,将会停止转动。
云台模式:目前PSDK 的云台控制功能仅支持自由模式,在该模式下,当无人机的姿态改变时,云台将不会转动。
云台状态信息
使用PSDK 开发的应用程序能够获取指定云台当前的信息,详细信息请参见PSDK API 文档。
使用云台管理功能
1. 云台管理模块初始化
使用PSDK 开发的负载设备如需控制云台,需要先调用DjiGimbalManager_Init()
接口初始化云台管理模块。
returnCode = DjiGimbalManager_Init();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Init gimbal manager failed, error code: 0x%08X", returnCode);
goto out;
}
2. 设置云台模式
在控制云台之前,需要调用DjiGimbalManager_SetMode
接口设置云台的工作模式。
returnCode = DjiGimbalManager_SetMode(mountPosition, gimbalMode);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set gimbal mode failed, error code: 0x%08X", returnCode);
goto out;
}
3. 控制云台旋转
通过调用DjiGimbalManager_Rotate
接口来控制云台按照预期的角度和速度进行旋转。
USER_LOG_INFO("Target gimbal pry = (30, 0, 0) in the body coordinate system");
rotation = (T_DjiGimbalManagerRotation) {DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 30, 0, 0, 0.5};
returnCode = DjiGimbalManager_Rotate(mountPosition, rotation);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Target gimbal pry = (30, 0, 0) failed, error code: 0x%08X", returnCode);
goto out;
}
osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("Target gimbal pry = (0, 30, 0) in the body coordinate system");
rotation = (T_DjiGimbalManagerRotation) {DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 0, 30, 0, 0.5};
returnCode = DjiGimbalManager_Rotate(mountPosition, rotation);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Target gimbal pry = (0, 30, 0) failed, error code: 0x%08X", returnCode);
goto out;
}
osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("Target gimbal pry = (0, 0, 30) in the body coordinate system");
rotation = (T_DjiGimbalManagerRotation) {DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 0, 0, 30, 0.5};
returnCode = DjiGimbalManager_Rotate(mountPosition, rotation);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Target gimbal pry = (0, 0, 30) failed, error code: 0x%08X", returnCode);
goto out;
}
osalHandler->TaskSleepMs(1000);
4.控制云台回中
使用PSDK 开发的应用程序支持通过调用DjiGimbalManager_Reset
接口将云台的俯仰轴和偏航轴转动至中位。
USER_LOG_INFO("Target gimbal reset.\r\n");
returnCode = DjiGimbalManager_Reset(mountPosition);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Reset gimbal failed, error code: 0x%08X", returnCode);
goto out;
}
5.获取云台状态
开发者可使用订阅数据项DJI_FC_SUBSCRIPTION_TOPIC_GIMBAL_ANGLES
和DJI_FC_SUBSCRIPTION_TOPIC_GIMBAL_STATUS
获取到不同位置云台的姿态角和状态。