在无人机开发中的 Hotpoint Mission,其实就是我们常说的兴趣点环绕飞行,它可以控制飞机以一个坐标点为中心来进行环绕飞行。在 DJI-SDK 中,要想启动一个 Hotpoint Mission,首先要构建一个 DJIHotpointMission
的对象,然后通过 DJIHotpointMissionOperator
来启动执行 hotpoint 任务。
DJIHotpointMission 的属性
hotpoint, radius 和 altitude
hotpoint
是一个地理坐标值:CLLocationCoordinate2D
,它是整个环绕飞行的圆心。
有了圆心,当然少不了半径 radius
,它是飞机与圆心的距离。这里要注意的是 radius
的取值范围是 5米-500米
。altitude
是在环绕飞行中的高度。
startPoint
startPoint
是一个枚举值,它决定飞机飞到哪个方位开始执行环绕。
- north
- south
- west
- east
- nearest
下面这幅图可直观的理解,其中 nearest
意思是飞机离环绕飞行所组成的圆上最近的位置。
heading
heading
顾名思义,就是决定着飞机在环绕飞行中的机头朝向。它也是一个枚举值。
- lookingForward:机头方向与环绕飞行的移动方向一致
- lookingBackward:机头方向背对着环绕飞行的移动方向
- towardHotpoint:机头方向一直对着圆心
- awayFromHotpoint:机头方向背对着圆心
- controlledByRemoteController:通过遥控器摇杆控制机头方向
- UsingInitialHeading:使用飞机开始环绕飞行时的朝向
angularVelocity
angularVelocity
角速度,它控制着飞机环绕飞行时每秒转过的角度。DJIHotpointMissionOperator
提供了一个类方法来计算最大的角速度:
// 50 为飞行的半径
DJIHotpointMissionOperator.getMaxAngularVelocity(forRadius: 50) { (maxAngularVelocity, error) in
if let error = error {
print("error: \(error.localizedDescription)")
} else {
print("maxAngularVelocity: \(maxAngularVelocity)")
}
}
这里还有一个值得注意的点是:当 angularVelocity
的值为负数的时候,飞机会以顺时针的方向进行环绕飞行;当为正数的时候则以逆时针的方向。
DJIHotpointMissionOperator
DJIHotpointMissionOperator
是实际整个 Hotpoint 任务的执行者。
在开始一个 Hotpoint Mission 前,我们应该先检查一下当前的状态(DJIHotpointMissionState) 是否为 readyToStart,DJIHotpointMissionOperator
提供了 currentState
的属性来获取当前 Hotpoint Mission 所处的状态:
// 在开始执行前,判断是否在 readyToStart 的状态。
guard DJISDKManager.missionControl()?.hotpointMissionOperator().currentState == .readyToStart else {
print("Hotpoint mission operator not ready to start")
return
}
通过它提供的 startMission:withCompletion
方法,传入一个 DJIHotpointMission
对象,即可开始执行一个 Hotpoint 任务。
DJISDKManager.missionControl()?.hotpointMissionOperator().start(hotpiontMission) { (error) in
if let error = error {
print("Start hotpoint feature error: \(error.localizedDescription)")
}
}
更详细的内容可以查看 DJI-SDK 的官方文档