1. 基础

1.1 云台对象(Gimbal)

在大疆的产品中,云台是一个很重要的部分,除了无人机自带的云台外,还有灵眸(Osmo),禅思(Zenmuse),如影(Ronin)等系列产品。
DJISDK 中,可以通过 DJIBaseProduct 的子类: DJIAircraftDJIHandheld 来获取 gimbal 对象(Aircraft 对应的是无人机,Handheld 对应的则是手持设备)。获取到 Gimbal 对象后,则可以进行后续的相关操作。

  1. (DJISDKManager.product() as? DJIAircraft)?.gimbal
  2. (DJISDKManager.product() as? DJIHandheld)?.gimbal

1.2 云台能力范围(Gimbal Capabilities)

正如上面所说,云台贯穿着大疆各种产品线,因此 DJISDK 中开放的云台相关 API 并不是所有的产品都适用。
DJISDK 中,Gimbal 对象有一个 capabilities 的属性,可用于判断云台的某个属性在该设备上是否可用,该属性是一个字典值:

  • 每一个 Key 值都代表云台的能力,可以在 DJIGimbalKey.h 中找到这些以 DJIGimbalParam 作为前缀的字符常量。
  • 而相对应的 Value 值则是一个 DJIParamCapability 对象,该对象有 isSupported 的属性来判断设备是否支持该功能。同时这个值也可能会是继承于 DJIParamCapabilityDJIParamCapabilityMinMax 对象,这个对象有 minmax 的属性,用于查看此云台配置属性值的边界范围。

DJIParamCapability 只有一个属性:

  • isSupported:布尔类型,表示当前设备的云台是否支持该属性值

DJIParamCapabilityMinMax (继承于DJIParamCapability),它包含两个属性:

  • min:属性值的最小值
  • max:属性值的最大值
  1. // 例子
  2. guard let gimbal = (DJISDKManager.product() as? DJIAircraft)?.gimbal else { return }
  3. if let ajustPitchCapability = gimbal.capabilities[DJIGimbalParamAdjustPitch] as? DJIParamCapability {
  4. print("ajustPitch isSupported: \(ajustPitchCapability.isSupported)")
  5. }
  6. if let ajustPitchCapability = gimbal.capabilities[DJIGimbalParamAdjustPitch] as? DJIParamCapabilityMinMax {
  7. print("ajustPitch isSupported: \(ajustPitchCapability.isSupported)")
  8. print("ajustPitch Max: \(String(describing: ajustPitchCapability.max))")
  9. print("ajustPitch Min: \(String(describing: ajustPitchCapability.min))")
  10. }
  11. /*
  12. 输出:
  13. ajustPitch isSupported: true
  14. ajustPitch isSupported: true
  15. ajustPitch Max: Optional(17)
  16. ajustPitch Min: Optional(-90)
  17. */

下面是 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. 操控云台

云台的控制和控制无人机运动方式类似,也是有 pitchyawroll 三种方向。
DJI SDK 云台相关操作简析 - 图1

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 对象

  1. let gimbalRotation = DJIGimbalRotation(pitchValue: pitchValue, rollValue: nil, yawValue: yawValue, time: 0, mode: .speed)

DJIGimbalRotationmode 属性是个枚举值,它决定云台以哪种模式进行运动:

  • absoluteAngle:绝对角度
  • relativeAngle:相对角度
  • speed:速度

构建好 DJIGimbalRotation 对象后,则可以通过 rotateWithRotation:completion 方法执行。

  1. 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 方法来设置。