DJI Mobile SDK(2):多自由度控制飞行(Virtual Stick)

来源:互联网 发布:物润船联软件下载 编辑:程序博客网 时间:2024/06/18 06:47

  由于项目开发需要用电脑控制Mavic进行飞行。最终选择的方案是用手机做一个中转,即“电脑->手机app->遥控器->飞行器”,电脑和手机之间采用TCPSocket通信。
  循序渐进,本文主要介绍如何编写手机app来控制Mavic飞行。

编写UI

  UI上一共放置了18个Button,用来模拟遥控器,主要包括左右两套摇杆、起飞、降落、使能手机控制、关闭手机控制,以及四个备用Button。具体代码就不写了,最终实现的界面如下。

按钮响应

  最主要的一个Button就是EN(使能手机控制),点击之后,进行一系列初始化的工作。在onClick()方法里编写。

    public void onClick(View v){        switch (v.getId()) {                      case R.id.button_enable_virtual_stick:{                //使能控制                DJISampleApplication.getAircraftInstance().                getFlightController().                setVirtualStickModeEnabled(true, new CommonCallbacks.CompletionCallback() {                    @Override                    public void onResult(DJIError djiError) {                    }                });                //设置飞行器坐标系和控制模式                DJISampleApplication.getAircraftInstance().getFlightController().                        setRollPitchCoordinateSystem(FlightCoordinateSystem.BODY);                  DJISampleApplication.getAircraftInstance().getFlightController().                        setVerticalControlMode(VerticalControlMode.POSITION);                 DJISampleApplication.getAircraftInstance().getFlightController().                        setYawControlMode(YawControlMode.ANGULAR_VELOCITY);                 DJISampleApplication.getAircraftInstance().getFlightController().                        setRollPitchControlMode(RollPitchControlMode.VELOCITY);                 //定时器用来定时,200ms发送一次数据                if (null == sendVirtualStickDataTimer) {                       sendVirtualStickDataTask = new SendVirtualStickDataTask();                      sendVirtualStickDataTimer = new Timer();                     sendVirtualStickDataTimer.schedule(sendVirtualStickDataTask, 100, 200);                }                break;            }        }    }

  首先是使能手机控制,其次设置飞行器的坐标系(body || ground)和飞行控制模式(速度控制 || 位置控制)。这个很重要,因为它决定着你点击按钮后发给飞机的到底是速度值还是位置值(我这里依次设置的是:坐标系–BODY,垂直–POSITION,Yaw轴–ANGULAR_VELOCITY,PitchRoll轴–VELOCITY),详情参考DJI developer。最后是一个定时器配置,每隔200ms给无人机发送一次数据。
  之后在onClick()方法里添加其他Button的响应,代码如下:

            case R.id.button_take_off:{                DJISampleApplication.getAircraftInstance().getFlightController()                        .startTakeoff(new CommonCallbacks.CompletionCallback() {                            @Override                            public void onResult(DJIError djiError) {                            }                        });                break;            }            case R.id.button_auto_land:{                DJISampleApplication.getAircraftInstance().getFlightController().                startLanding(new CommonCallbacks.CompletionCallback() {                    @Override                    public void onResult(DJIError djiError) {                    }                });                break;            }            case R.id.button_left_up:{                yaw = 0;                  pitch = 0;                roll = 0;                if (throttle < 50) {                    throttle = throttle + 1;                }                break;            }            case R.id.button_left_left:{                yaw = -10f;                 pitch = 0;                roll = 0;                throttle = 3f;                break;            }            case R.id.button_left_center:{                yaw = 0;                 pitch = 0;                roll = 0;                break;            }            case R.id.button_left_right:{                yaw = 10f;                 pitch = 0;                roll = 0;                throttle = 3f;                break;            }            case R.id.button_left_down:{                yaw = 0;                pitch = 0;                roll = 0;                if (throttle > 3){                    throttle = throttle - 1;                }                break;            }            case R.id.button_right_up:{                yaw = 0;                 pitch = 0;                roll = 1;                throttle = 3f;                break;            }            case R.id.button_right_left:{                yaw = 0;                pitch = -2;                roll = 0;                throttle = 3f;                break;            }            case R.id.button_right_center:{                yaw = 0;                pitch = 0;                roll = 0;                break;            }            case R.id.button_right_right:{                yaw = 0;                pitch = 2;                roll = 0;                throttle = 3f;                break;            }            case R.id.button_right_down:{                yaw = 0;                pitch = 0;                roll = -1;                throttle = 3f;                break;            }            case R.id.button_disable_virtual_stick:{                DJISampleApplication.getAircraftInstance().                getFlightController().                setVirtualStickModeEnabled(false, new CommonCallbacks.CompletionCallback() {                    @Override                    public void onResult(DJIError djiError) {                    }                });                break;            }            default:                break;        }

  以上主要是其它Button的响应,根据我们设置的控制模式,yaw pitch roll分别代表三个轴的速度(或角速度),throttle 代表垂直的高度。这里还有自动起飞、自动降落、关闭手机控制的Button,不再赘述。
  之后就是我们的定时器的定时发送任务,把手机设置的控制指令每隔200ms发送给无人机。

    private class SendVirtualStickDataTask extends TimerTask {         @Override        public void run() {            if (isFlightControllerAvailable()) {                  DJISampleApplication.getAircraftInstance()                        .getFlightController()                        .sendVirtualStickFlightControlData(new FlightControlData(pitch,                                        roll,                                        yaw,                                        throttle),                                new CommonCallbacks.CompletionCallback() {                                    @Override                                    public void onResult(DJIError djiError) {                                    }                                });            }        }    }

模拟飞行

  代码写完了,不能每次调试都拿着飞机出去飞,况且代码不知道能不能用,万一出点Bug,乱发一些控制信号,可能就炸机了(说到这里,摸了摸我的Mavic云台T_T)。
  不过DJI还是很人性化的,有一个调参软件DJI Assistant可以模拟飞行。装飞机驱动之后,把飞机通过USB连接到PC上,打开DJI Assistant找到“模拟器”。就可以愉快地调试啦!
这里写图片描述
  特别提示,模拟器必须要连接无人机,防止出现危险,请把无人机的桨叶全部拆掉!!!
  加油!

原创粉丝点击