利用任务控制
Utilizing Mission Control
最近我开始尝试使用 DJI Mobile SDK 作为我的一个小项目。我一直在 Swift 使用 DJI 在其 Github 上提供的样本,但我在使用 missionControl 时遇到了问题,老实说,我什至不确定 missionControl 是否是最好的方法去做吧。
目标:简单的说就是想让无人机飞到指定的高度,拍下下面的视频。我现在甚至不关心水平运动,只关心垂直运动。
我做了什么:利用他们的样本,我得到了无人机来录制视频片段,但我无法让它真正飞行。我的第一个方法是使用 flightController,我已经成功地让它起飞和降落,但我不相信它们是 goToLocation() 之类的方法。这是起飞和降落的功能方法。
@IBAction func takeOffPressed(_ sender: Any) {
if let aircraft = DJISDKManager.product() as? DJIAircraft {
aircraft.flightController?.startTakeoff(completion: nil)
}else{
self.showAlertViewWithTitle(title:"Action", withMessage: "Product Connection Not Found")
}
}
@IBAction func landPressed(_ sender: Any) {
if let aircraft = DJISDKManager.product() as? DJIAircraft {
aircraft.flightController?.startLanding(completion: nil)
}else{
self.showAlertViewWithTitle(title:"Action", withMessage: "Product Connection Not Found")
}
}
虽然我让无人机起飞了,但这并不是真正的飞行所以我开始研究 missionControl class 那里似乎有任务来实现我想要的功能,但是我的代码似乎不正确,因为它不会导致无人机执行任何操作。如果这里有人对 DJI SDK 更有经验,我将不胜感激。我的非功能代码如下。
@IBAction func doMission(_ sender: Any) {
var elements = [DJIMissionControlTimelineElement]()
elements.append(DJITakeOffAction())
elements.append(DJIGoToAction(altitude: 1)!)
elements.append(DJIGoHomeAction())
DJISDKManager.missionControl()?.scheduleElements(elements)
DJISDKManager.missionControl()?.startTimeline()
}
时间线任务需要进行一些调整,包括开始行动的高度和添加 DJIRecordVideoAction 以录制所需持续时间的视频。试试下面修改后的代码:
@IBAction func doMission(_ sender: Any) {
var elements = [DJIMissionControlTimelineElement]()
elements.append(DJITakeOffAction())
elements.append(DJIGoToAction(altitude: 5)!)
elements.append(DJIRecordVideoAction(duration: 10)!) // this assumes a desired duration of 10 seconds
elements.append(DJIGoHomeAction())
DJISDKManager.missionControl()?.scheduleElements(elements)
DJISDKManager.missionControl()?.startTimeline()
}
您还可以使用 DJIMissionControl
addListener:toTimelineProgressWithBlock:
方法为您的代码添加额外的诊断,因为它会为每个时间轴事件调用,包括所有元素的开始和结束。
最近我开始尝试使用 DJI Mobile SDK 作为我的一个小项目。我一直在 Swift 使用 DJI 在其 Github 上提供的样本,但我在使用 missionControl 时遇到了问题,老实说,我什至不确定 missionControl 是否是最好的方法去做吧。
目标:简单的说就是想让无人机飞到指定的高度,拍下下面的视频。我现在甚至不关心水平运动,只关心垂直运动。
我做了什么:利用他们的样本,我得到了无人机来录制视频片段,但我无法让它真正飞行。我的第一个方法是使用 flightController,我已经成功地让它起飞和降落,但我不相信它们是 goToLocation() 之类的方法。这是起飞和降落的功能方法。
@IBAction func takeOffPressed(_ sender: Any) {
if let aircraft = DJISDKManager.product() as? DJIAircraft {
aircraft.flightController?.startTakeoff(completion: nil)
}else{
self.showAlertViewWithTitle(title:"Action", withMessage: "Product Connection Not Found")
}
}
@IBAction func landPressed(_ sender: Any) {
if let aircraft = DJISDKManager.product() as? DJIAircraft {
aircraft.flightController?.startLanding(completion: nil)
}else{
self.showAlertViewWithTitle(title:"Action", withMessage: "Product Connection Not Found")
}
}
虽然我让无人机起飞了,但这并不是真正的飞行所以我开始研究 missionControl class 那里似乎有任务来实现我想要的功能,但是我的代码似乎不正确,因为它不会导致无人机执行任何操作。如果这里有人对 DJI SDK 更有经验,我将不胜感激。我的非功能代码如下。
@IBAction func doMission(_ sender: Any) {
var elements = [DJIMissionControlTimelineElement]()
elements.append(DJITakeOffAction())
elements.append(DJIGoToAction(altitude: 1)!)
elements.append(DJIGoHomeAction())
DJISDKManager.missionControl()?.scheduleElements(elements)
DJISDKManager.missionControl()?.startTimeline()
}
时间线任务需要进行一些调整,包括开始行动的高度和添加 DJIRecordVideoAction 以录制所需持续时间的视频。试试下面修改后的代码:
@IBAction func doMission(_ sender: Any) {
var elements = [DJIMissionControlTimelineElement]()
elements.append(DJITakeOffAction())
elements.append(DJIGoToAction(altitude: 5)!)
elements.append(DJIRecordVideoAction(duration: 10)!) // this assumes a desired duration of 10 seconds
elements.append(DJIGoHomeAction())
DJISDKManager.missionControl()?.scheduleElements(elements)
DJISDKManager.missionControl()?.startTimeline()
}
您还可以使用 DJIMissionControl
addListener:toTimelineProgressWithBlock:
方法为您的代码添加额外的诊断,因为它会为每个时间轴事件调用,包括所有元素的开始和结束。