如何使用DJI SDK监听遥控器棒值更新?
How to listen to the remote controller sticks values updates using DJI SDK?
我需要帮助来触发无人机遥控器摇杆变化时的动作。实际上,我想在用户开始玩摇杆时自动停止无人机的时间线任务。
我想我需要使用 DJIStick class 作为文档的参考来继续听棒值,但我无法正确处理!
要获取有关遥控器操纵杆状态的最新信息,您可以根据documentation.
这将使您能够非常频繁地响应操纵杆的位置。
但是,您将不得不在一段时间内存储以前的值,并创建一些逻辑来确定用户是否一直在更改该时间段内的棒值。
一个更简单的选择可能是让用户可以选择在您的 UI 中停止任务。使用遥控器停止任务(如果这是您的用例)的另一个紧急选项是切换遥控器上的飞行模式 - 这将自动停止任务。
我使用以下逻辑实现了对棍子变化的聆听:
- 设置代表 ViewController class
- 定义一个新函数,returns 并获取已连接设备(无人机)的 DJIRemoteController 实例
class ViewController: DJIRemoteControllerDelegate {
func fetchRemoteController() -> DJIRemoteController? {
if !(DJISDKManager.product() != nil){
return nil
}
if DJISDKManager.product() is DJIAircraft {
return (DJISDKManager.product() as! DJIAircraft).remoteController
}
return nil
}
}
- 然后,在无人机状态为飞行后(在我的例子中是无人机开始时间线任务后),你需要调用前面的函数
let remote = self.fetchRemoteController()
remote?.delegate = self
现在,当 sticks 发生变化时,应该会自动触发以下函数
func remoteController(_ rc: DJIRemoteController, didUpdate state:
DJIRCHardwareState) {
if state.rightStick.verticalPosition > 0 || state.rightStick.verticalPosition < 0 || state.rightStick.horizontalPosition > 0 || state.rightStick.horizontalPosition < 0 || state.leftStick.verticalPosition > 0 || state.leftStick.verticalPosition < 0 || state.leftStick.horizontalPosition > 0 || state.leftStick.horizontalPosition < 0 {
print("Detected move in Sticks while mission is started so stop the mission")
print("Right Stick vertical position is \(state.rightStick.verticalPosition) and horizontal position \(state.rightStick.horizontalPosition)")
print("Left Stick Value is \(state.leftStick.verticalPosition) and horizontal position \(state.leftStick.horizontalPosition)")
}
}
我需要帮助来触发无人机遥控器摇杆变化时的动作。实际上,我想在用户开始玩摇杆时自动停止无人机的时间线任务。
我想我需要使用 DJIStick class 作为文档的参考来继续听棒值,但我无法正确处理!
要获取有关遥控器操纵杆状态的最新信息,您可以根据documentation.
这将使您能够非常频繁地响应操纵杆的位置。
但是,您将不得不在一段时间内存储以前的值,并创建一些逻辑来确定用户是否一直在更改该时间段内的棒值。
一个更简单的选择可能是让用户可以选择在您的 UI 中停止任务。使用遥控器停止任务(如果这是您的用例)的另一个紧急选项是切换遥控器上的飞行模式 - 这将自动停止任务。
我使用以下逻辑实现了对棍子变化的聆听:
- 设置代表 ViewController class
- 定义一个新函数,returns 并获取已连接设备(无人机)的 DJIRemoteController 实例
class ViewController: DJIRemoteControllerDelegate { func fetchRemoteController() -> DJIRemoteController? { if !(DJISDKManager.product() != nil){ return nil } if DJISDKManager.product() is DJIAircraft { return (DJISDKManager.product() as! DJIAircraft).remoteController } return nil } }
- 然后,在无人机状态为飞行后(在我的例子中是无人机开始时间线任务后),你需要调用前面的函数
let remote = self.fetchRemoteController()
remote?.delegate = self
现在,当 sticks 发生变化时,应该会自动触发以下函数
func remoteController(_ rc: DJIRemoteController, didUpdate state: DJIRCHardwareState) { if state.rightStick.verticalPosition > 0 || state.rightStick.verticalPosition < 0 || state.rightStick.horizontalPosition > 0 || state.rightStick.horizontalPosition < 0 || state.leftStick.verticalPosition > 0 || state.leftStick.verticalPosition < 0 || state.leftStick.horizontalPosition > 0 || state.leftStick.horizontalPosition < 0 { print("Detected move in Sticks while mission is started so stop the mission") print("Right Stick vertical position is \(state.rightStick.verticalPosition) and horizontal position \(state.rightStick.horizontalPosition)") print("Left Stick Value is \(state.leftStick.verticalPosition) and horizontal position \(state.leftStick.horizontalPosition)") } }