RollPitchControlMode.VELOCITY 旋转无人机,相差90度的问题

Completed

Comments

10 comments

  • sheng

    你是只发送一次sendVirtualStickFlightControlData去控制么,使用虚拟摇杆控制是一个pid的过程,可以监听无人机的heading是否旋转到指定角度后再退出虚拟摇杆控制

    0
    Comment actions Permalink
  • 大壮

    是一直发的。做了一个定时器一直在发的。

    public void yawByAngularVelocityMode(float tartGetAngle, boolean isClockwise,IControlCompleteCallback callback) {
    int speed = isClockwise ? YAWSPEED : -YAWSPEED;
    clearMission();
    if (controller == null) {
    init();
    }

    if (controller == null) {
    callback.onResult(-3, "飞机未连接");
    return;
    }

    if (!isFlying()) {
    callback.onResult(-3, "飞机未起飞");
    return;
    }

    verticalThrottle = 0;
    pitch = 0;// (float)controller.getState().getAttitude().pitch;
    roll = 0;//(float) controller.getState().getAttitude().roll;
    yaw = speed;

    controller.setYawControlMode(YawControlMode.ANGULAR_VELOCITY);
    controller.setYawControlMode(YawControlMode.ANGULAR_VELOCITY);
    controller.setVirtualStickModeEnabled(true, djiError -> {
    if (djiError != null) {
    LyLog.showLog("setVirtualStickModeEnabled " + djiError.getErrorCode() + " " + djiError.getDescription());
    }
    });

    /*controller.setFlightOrientationMode(FlightOrientationMode.AIRCRAFT_HEADING, djiError -> {
    if (djiError != null) {
    LyLog.showLog("setFlightOrientationMode " + djiError.getErrorCode() + " " + djiError.getDescription());
    }
    });*/
    sendVirtualStickDataTask = new SendVirtualStickDataTask();
    sendVirtualStickDataTimer = new Timer();
    sendVirtualStickDataTimer.schedule(sendVirtualStickDataTask, 0, 100);

    // 单位毫秒
    long time = (int) (Math.abs(tartGetAngle) * 1000 / Math.abs(speed));
    LyLog.showLog("无人机旋转=tartGetAngle="+tartGetAngle+" time="+time);

    mHandler.postDelayed(() -> {
    sendVirtualStickDataTimer.cancel();
    cancel();
    controller.setYawControlMode(YawControlMode.ANGLE);
    }, time);
    callback.onResult(1, "成功");
    }
    0
    Comment actions Permalink
  • sheng

    看你贴出来的代码, yaw赋值是使用速度来控制的,如果想要用角度控制

    FlightController.sendVirtualStickFlightControlData(new FlightControlData(pitch,
    roll,
    yaw,
    verticalThrottle)的yaw传入就是你要旋转的角度,注意:yaw不是旋转多少度,是无人机机体坐标系下以正北方向的机头朝向角度
    0
    Comment actions Permalink
  • 大壮

    我就是想用角速度来实现。

    因为如果用  controller.setYawControlMode(YawControlMode.ANGLE) 来实现,参数 只能是[-180, 180], 而我要想实现 类似【向右旋转270度】这种指令。只能通过角速度的方式去实现,自己控制好时间。

    我问题的关注点在于 :

    1、我开机后直接旋转,最终的旋转角度会少90度。 如果在旋转了一次的基础上再次旋转,旋转效果就是对的。2、只要往前飞行了一段距离,再次去旋转,又会出现旋转角度少90度的问题。

     

    0
    Comment actions Permalink
  • DJI Developer Support
    1、我开机后直接旋转,最终的旋转角度会少90度。 **如果在旋转了一次的基础上再次旋转,旋转效果就是对的。** 2、 **只要往前飞行了一段距离,再次去旋转,又会出现旋转角度少90度的问题。** --》我理解第二次旋转是飞机没有停下的情况下直接再次旋转吗?飞机静止之后是需要一段时间进行加速的。
    0
    Comment actions Permalink
  • 大壮

    最终测试结果:

    将间隔 100 改为 5 。首次和后续都不会有偏差。   

    sendVirtualStickDataTimer.schedule(sendVirtualStickDataTask, 0, 100)

    sendVirtualStickDataTimer.schedule(sendVirtualStickDataTask, 0, 5)

     

    原因未知。等官方解答。

    0
    Comment actions Permalink
  • DJI Developer Support
    改成5其实就是修改了发送指令的频率,飞机接受指令也会更多。推荐使用的指令频率是25hz。
    0
    Comment actions Permalink
  • 大壮

    没有解释根本原因。 因为间隔为100毫秒的时候,只有往前(往右/往左/)飞过后,首次旋转有偏差。 后续再次的旋转是没有问题的。

    0
    Comment actions Permalink
  • 大壮

    没有解释到根本原因。

    因为间隔为100毫秒的时候,只要使用虚拟摇杆往前(往右/往左/向上/上下)飞过后,首次旋转就会有90度偏差。 然后后续再次的旋转是没有问题的。

    注:1、所有的操作都是等飞机停稳后再次发送命令的。 2、我用的是模拟器DJI Assistant 2 (Consumer Drones Series)测试的。3、我没有条件去室外用真机测试。所以不确定是不是模拟器的问题。

    0
    Comment actions Permalink
  • DJI Developer Support
    如果您只是修改了sendVirtualStickDataTimer.schedule(sendVirtualStickDataTask, 0, time)的time属性,那么前后改动的部分就只有SDK发送命令的部分以及飞机接受频率的部分。 第一次旋转和第二次旋转在模拟器上可以看到飞机表现不一致吗?
    0
    Comment actions Permalink

Please sign in to leave a comment.