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: true
ajustPitch isSupported: true
ajustPitch 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
方法来设置。