DJI Virtual Stick 控件未正确应用

DJI Virtual Stick Controls are not properly applied

我正在构建一个无人机应用程序,它将发送室内飞行的飞行命令。我正在实施 here.

中描述的 DJI Mobile SDK 的 Virtual Sticks

在试验 DJI 的模拟器教程后发现 here,我为我的应用程序实现了一个精简的非模拟版本。当我在户外测试我的应用程序时,控件始终如一且正确地工作。

然而,当我进入室内时,无论发送的命令如何,无人机只执行 1 个动作:无人机朝其左后螺旋桨的方向飞行。即使命令只是让无人机转向,无人机也会一直朝这个方向飞行。

知道会发生什么吗?我不确定 post 的代码是什么,因为我的代码在户外工作。

更新 #1

这是我的飞行控制器设置(在 Swift 中实现):

self.flightController = (DJISDKManager.product() as? DJIAircraft)?.flightController

self.flightController?.rollPitchControlMode = DJIVirtualStickRollPitchControlMode.velocity
self.flightController?.yawControlMode = DJIVirtualStickYawControlMode.angle
self.flightController?.rollPitchCoordinateSystem = DJIVirtualStickFlightCoordinateSystem.body

更新 #2

更改偏航角的代码(带有一些硬编码数字)。基本上是用来让无人机完全掉头的。

private var turnTime = 0
private var turnTimer: Timer? = nil

func turn() {
    self.turnTimer = Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: (#selector(turnDroneCommand)), userInfo: nil, repeats: true)
}

@objc func turnDroneCommand() {
    self.turnTime += 1

    let data = DJIVirtualStickFlightControlData(pitch: 0, roll: 0, yaw: Float(180), verticalThrottle: 0)

    self.flightController.send(data, withCompletion: { (error) in
        if error != nil {
            // Fire custom error callback
        }
    })

    if self.turnTime >= 7 {
        self.turnTimer?.invalidate()
        self.turnTime = 0
        // Fire custom success callback
    }
}

我实现了一种几乎相同的改变音高的方法。如前所述,这两个命令的当前结果都没有什么不同。

在与 DJI 的开发人员反复交流之后,我现在可以提供部分解决方案。

部分解决方案

如果您查看问题更新 #2 中提供的代码,您会注意到以下几行:

self.turnTimer = Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: (#selector(turnDroneCommand)), userInfo: nil, repeats: true)

self.turnTime += 1
...
if self.turnTime >= 7 {
    self.turnTimer?.invalidate()
    self.turnTime = 0
    // Fire custom success callback
}

timeInterval参数设置为0.2秒。这意味着命令以 5Hz 的频率发送不到 2 秒。根据 DJI 的开发人员的说法,需要以 10Hz(或更高,但我尚未验证)的频率发送命令 更长 然后 2 秒。

未决问题

Matrice 100 (M100) 在执行虚拟摇杆命令之前仍 "drifts" 朝向左后螺旋桨。 DJI 的开发人员似乎无法访问 M100,也无法自行测试。由于它似乎(基于非常非常有限的测试)是 M100 独有的问题,所以它可能不是 Mobile SDK 本身的问题。

我将此标记为答案,以防有人偶然发现另一架 DJI 无人机的 "ignore command" 问题。如果找到漂移的解决方案,我会相应更新。

我们在 M100 上的虚拟 RC 上遇到了类似的问题,这是 M100 固件而非 sdk 的问题。我们没有使用任何 SDK,我们使用直接串行命令直接连接到 M100 板载的 com 端口。我们放弃了使用虚拟 RC 的尝试,现在发送完美运行的速度命令。