在无人机开发中的 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) inif 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) inif let error = error {print("Start hotpoint feature error: \(error.localizedDescription)")}}
更详细的内容可以查看 DJI-SDK 的官方文档
