1. 基础
1.1 云台对象(Gimbal)
在大疆的产品中,云台是一个很重要的部分,除了无人机自带的云台外,还有灵眸(Osmo),禅思(Zenmuse),如影(Ronin)等系列产品。
在 DJISDK 中,可以通过 DJIBaseProduct 的子类: DJIAircraft 和 DJIHandheld 来获取 gimbal 对象(Aircraft 对应的是无人机,Handheld 对应的则是手持设备)。获取到 Gimbal 对象后,则可以进行后续的相关操作。
(DJISDKManager.product() as? DJIAircraft)?.gimbal(DJISDKManager.product() as? DJIHandheld)?.gimbal
1.2 云台能力范围(Gimbal Capabilities)
正如上面所说,云台贯穿着大疆各种产品线,因此 DJISDK 中开放的云台相关 API 并不是所有的产品都适用。
在 DJISDK 中,Gimbal 对象有一个 capabilities 的属性,可用于判断云台的某个属性在该设备上是否可用,该属性是一个字典值:
- 每一个 Key 值都代表云台的能力,可以在 
DJIGimbalKey.h中找到这些以DJIGimbalParam作为前缀的字符常量。 - 而相对应的 Value 值则是一个 
DJIParamCapability对象,该对象有isSupported的属性来判断设备是否支持该功能。同时这个值也可能会是继承于DJIParamCapability的DJIParamCapabilityMinMax对象,这个对象有min和max的属性,用于查看此云台配置属性值的边界范围。 
DJIParamCapability 只有一个属性:
- isSupported:布尔类型,表示当前设备的云台是否支持该属性值
 
DJIParamCapabilityMinMax (继承于DJIParamCapability),它包含两个属性:
- min:属性值的最小值
 - max:属性值的最大值
 
// 例子guard let gimbal = (DJISDKManager.product() as? DJIAircraft)?.gimbal else { return }if let ajustPitchCapability = gimbal.capabilities[DJIGimbalParamAdjustPitch] as? DJIParamCapability {print("ajustPitch isSupported: \(ajustPitchCapability.isSupported)")}if let ajustPitchCapability = gimbal.capabilities[DJIGimbalParamAdjustPitch] as? DJIParamCapabilityMinMax {print("ajustPitch isSupported: \(ajustPitchCapability.isSupported)")print("ajustPitch Max: \(String(describing: ajustPitchCapability.max))")print("ajustPitch Min: \(String(describing: ajustPitchCapability.min))")}/*输出:ajustPitch isSupported: trueajustPitch isSupported: trueajustPitch Max: Optional(17)ajustPitch Min: Optional(-90)*/
下面是 capabilities  的部分 Key 值,以及所代表的云台属性,还有 Osmo 等手持系列的更多内容请查看 DJI-SDK 文档 
| DJIGimbalParamAdjustPitch | 调整云台 Pitch 值 | 
|---|---|
| DJIGimbalParamAdjustYaw | 调整云台 Yaw 值 | 
| DJIGimbalParamAdjustRoll | 调整云台 Roll 值 | 
| DJIGimbalParamMovementSettingsProfile | 云台运动模式设定 | 
| DJIGimbalParamPitchRangeExtensionEnabled | 扩展云台上仰角度 | 
| DJIGimbalParamPitchControllerSpeedCoefficient | Pitch 速度系数 | 
| DJIGimbalParamYawControllerSpeedCoefficient | Yaw 速度系数 | 
| DJIGimbalParamPitchControllerSmoothingFactor | Pitch 平滑系数 | 
| DJIGimbalParamYawControllerSmoothingFactor | Yaw 平滑系数 | 
1.3 云台状态
DJIGimbal 对象有一个代理属性 DJIGimbalDelegate,通过它可以获得云台状态和运动设置等信息。它包含三个回调方法:
gimbal:didUpdateState:可获取 DJIGimbalState 状态信息gimbal:didUpdateMovementSettings:可获取 DJIGimbalMovementSettings 运动设置信息gimbal:didUpdateBatteryRemainingCharge:可获取剩余电量百分比值
DJIGimbalState 对象包含以下属性:
| attitudeInDegrees | DJIGimbalAttitude对象,包含 pitch, yaw, roll 的值 | 
|---|---|
| fineTunedRoll | roll 微调值 | 
| fineTunedPitch | pitch 微调值 | 
| fineTunedYaw | yaw 微调值 | 
| mode | 云台模式(DJIGimbalMode) | 
| isMobileDeviceMounted | 手机是否安装在云台上 | 
| isMotorOverloaded | 电机是否过载 | 
| isCalibrationSuccessful | 是否校准成功 | 
| sCalibrating | 是否在校准状态 | 
| calibrationProgress | 校准进度(百分比) | 
| isPitchAtStop | pitch 值是否到达极限 | 
| isRollAtStop | roll 值是否到达极限 | 
| isYawAtStop | yaw 值是否到达极限 | 
| isBalanceTesting | 是否处于平衡测试 | 
| pitchBalanceTestResult | pitch 轴平衡测试结果 | 
| rollBalanceTestResult | roll 轴平衡测试结果 | 
| yawBalanceTestResult | yaw 轴平衡测试结果 | 
| balanceState | 平衡状态 | 
| isMountedUpwards | 云台是否安装在无人机上方(仅支持 M210 和 M210 RTK) | 
2. 操控云台
云台的控制和控制无人机运动方式类似,也是有 pitch,yaw 和 roll 三种方向。
2.1 设置云台工作模式
根据飞机的运动,云台可以设置以下几种跟随模式:
- FPV (First Person View) Mode:在该模式下,只有 pitch 方向是可以控制的,yaw 和 roll 方向则会相对固定于飞机。
 - Yaw Follow Mode:顾名思义,yaw 值会跟随飞机的朝向,而 pitch 和 roll 是可以控制的。
 - Free Mode:在此模式下,pitch,roll 和 yaw 值都是可以控制的。
 
要修改这几种工作模式,可以调用 Gimbal 对象的 setMode:withCompletion 方法。
2.2 自定义控制
在 DJI-SDK 中,控制云台的运动有两种方式
- 角度
 - 速度
其中以角度的方式控制,又分为
绝对角度和相对角度,相对角度是相对于当前角度进行运动,而绝对角度是以飞机的朝向作为 0 度的基准来进行运动。 
首先我们需要构建 DJIGimbalRotation 对象
let gimbalRotation = DJIGimbalRotation(pitchValue: pitchValue, rollValue: nil, yawValue: yawValue, time: 0, mode: .speed)
DJIGimbalRotation 的 mode 属性是个枚举值,它决定云台以哪种模式进行运动:
- absoluteAngle:绝对角度
 - relativeAngle:相对角度
 - speed:速度
 
构建好 DJIGimbalRotation 对象后,则可以通过 rotateWithRotation:completion 方法执行。
func rotate(with rotation: DJIGimbalRotation, completion: DJICompletionBlock? = nil)
2.3 重置(回正)
DJIGimbal 对象提供一个叫 resetWithCompletion 的方法。该方法可以重置云台的位置,但是调用该方法后,云台的行为会根据产品的不同而不同:
- Osmo 系列:pitch 和 yaw 会重置到最初值
 - Phantom 系列:第一次调用会将云台重置到垂直指向地球,第二次调用则会回到最初的状态。
 - 其它产品(e.g. Inspire1): 只会把云台 pitch 值设置回最初。
 
2.4 扩展云台上仰角度
默认情况下,云台的 Pitch 值的范围是 [0, 90],如果需要扩展这个范围到 [-30, 90],即云台最大可以上仰至 30 度,则可以调用 setPitchRangeExtensionEnabled:withCompletion 方法来设置。
