如何在虚拟摇杆上实现 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 软件测试您的代码。
我需要在虚拟操纵杆上实现一个 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 软件测试您的代码。