首页 > 解决方案 > 如何使用 VirtualSticks 实际控制无人机

问题描述

我正在努力使用 DJI SDK 向无人机发送命令。我正在使用 Phantom 4 V2.0 和 DJI SDK 4.15 版。有一个关于如何使用 VirtualSticks 来指挥无人机的教程,但仅适用于模拟器。我尝试使用相同的代码来驾驶真正的无人机,但没有成功。如果我通过提供的方法启动电机,它们将立即停止,可能是因为我的应用程序在摇杆空闲时向无人机发送的命令。这是代码:

screenJoystickLeft.setJoystickListener((joystick, pX, pY) -> {
        if (Math.abs(pX) < 0.02) {
            pX = 0;
        }

        if (Math.abs(pY) < 0.02) {
            pY = 0;
        }
        float pitchJoyControlMaxSpeed = 10;
        float rollJoyControlMaxSpeed = 10;

        if (horizontalCoordinateFlag) {
            if (rollPitchControlModeFlag) {
                pitch = (float) (pitchJoyControlMaxSpeed * pX);

                roll = (float) (rollJoyControlMaxSpeed * pY);
            } else {
                pitch = -(float) (pitchJoyControlMaxSpeed * pY);

                roll = (float) (rollJoyControlMaxSpeed * pX);
            }
        }

        if (null == sendVirtualStickDataTimer) {
            sendVirtualStickDataTask = new SendVirtualStickDataTask();
            sendVirtualStickDataTimer = new Timer();
            sendVirtualStickDataTimer.schedule(sendVirtualStickDataTask, 100, 200);
        }
    });

    screenJoystickRight.setJoystickListener((joystick, pX, pY) -> {
        if (Math.abs(pX) < 0.02) {
            pX = 0;
        }

        if (Math.abs(pY) < 0.02) {
            pY = 0;
        }
        float verticalJoyControlMaxSpeed = 2;
        float yawJoyControlMaxSpeed = 3;

        yaw = yawJoyControlMaxSpeed * pX;
        throttle = (verticalJoyControlMaxSpeed * pY) < 1 ? 1 : (verticalJoyControlMaxSpeed * pY);

        if (null == sendVirtualStickDataTimer) {
            sendVirtualStickDataTask = new SendVirtualStickDataTask();
            sendVirtualStickDataTimer = new Timer();
            sendVirtualStickDataTimer.schedule(sendVirtualStickDataTask, 0, 200);
        }

        Log.d(TAG, "Right vertical: " + pY);
    });

关于如何修改我的代码以成功驾驶实际无人机的任何想法?有没有人以其他方式完成它?此代码取自DJI Demo GitHub

标签: javaandroiddji-sdkdrone

解决方案


推荐阅读