首页 > 解决方案 > 如何在虚拟摇杆上实现 rc 命令?

问题描述

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

a:左/右(-100~100) b:前/后(-100~100) c:上/下(-100~100) d:偏航(-100~100)

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

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

JoystickView 操纵杆 = (JoystickView) findViewById(R.id.joystickView);

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

标签: dji-sdk

解决方案


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

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

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

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

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

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

在此示例中,通过DJI SDK的 TimerTask 方法中的方法SendVirtualStickDataTask扩展TimerTask并仅将当前俯仰、滚动、偏航和垂直油门值发送到无人机。sendVirtualStickFlightControlDatarun()

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

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

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

对于控制模式/坐标系,以下 DJI SDK 文档很有帮助(向下滚动到“虚拟摇杆”): 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 Flight Assistant 2 软件来测试您的代码。


推荐阅读