如何在虚拟摇杆上实现 rc 命令?

How to implement rc command on virtual joystick?

我需要在虚拟操纵杆上实现一个 Tello 命令,即 rc a b c d。从不同的论坛了解到,对于虚拟摇杆,我们需要使用rc命令来移动Tello无人机。但我不知道如何实施。在他们的 SDK 文档中,他们将其称为

a:left/right(-100~100) b:forward/backward(-100~100) c:up/down(-100~100) d:偏航(-100 ~100)

这些负值是什么意思?如何使用rc指令移动无人机?

这是我正在使用的虚拟摇杆代码:

JoystickView joystick = (JoystickView) findViewById(R.id.joystickView);

joystick.setOnMoveListener(new JoystickView.OnMoveListener() {
    @Override
    public void onMove(int angle, int strength) {
        // code goes here
    }
});

值-100~100通常是它们各自轴的速度。根据设置的坐标系和轴的控制方式,飞行器沿该值对应的轴运动。根据您提供的代码,我假设强度值表示杆的百分比 pushed/shifted,角度值表示杆被推入的方向。

对于虚拟摇杆,您需要通过访问飞行控制器来设置控制模式和坐标系:

setRollPitchControlMode(RollPitchControlMode.VELOCITY);
setYawControlMode(YawControlMode.ANGULAR_VELOCITY);
setVerticalControlMode(VerticalControlMode.VELOCITY);
setRollPitchCoordinateSystem(FlightCoordinateSystem.BODY);

上面选择的模式确保虚拟控制器的行为与默认的物理遥控器相同。 此外,您需要先使用 setVirtualStickModeEnabled 方法激活虚拟 Sticks,然后才能使用它们。

现在为了连续控制飞机,您需要发送至少 5 Hz 的 virtualStickData:

SendVirtualStickDataTask task = new SendVirtualStickDataTask();
this.timer = new Timer();
this.timer.schedule(task, 0, 200);

本例中SendVirtualStickDataTask扩展了TimerTask,仅通过DJI SDK中的sendVirtualStickFlightControlData方法将当前的俯仰、横滚、偏航和垂直油门值发送给无人机。 run()TimerTask 方法。

最后,当前的俯仰、滚动、偏航和垂直油门值设置在您在问题中发布的 onMove() 方法中。例如。您可以使用三角函数 sin 和 cos 来确定强度值的 x 和 y 部分,如下所示:

pitch = Math.cos(angle)*strength;
roll = Math.sin(angle)*strength;

请注意,角度必须是弧度,您可能需要将 angle/strength 转换为浮动。此外,根据角度值的确定方式,您需要相应地调整该值。 第二个操纵杆可用于控制垂直油门和偏航。您将需要一些微调和测试。

对于控制modes/coordinate系统,以下DJI SDK文档很有帮助(向下滚动到"Virtual Sticks"): https://developer.dji.com/mobile-sdk/documentation/introduction/component-guide-flightController.html

DJI 也有一个虚拟摇杆使用的基本代码示例: https://developer.dji.com/mobile-sdk/documentation/android-tutorials/SimulatorDemo.html

我强烈建议您在尝试在现实世界中飞行之前使用 DJI 飞行助手 2 软件测试您的代码。