【Androidでドローン(マルチコプター)を飛ばそう】 ドローンに接続する

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

今回は前回作ったクラスMiniDroneを使いAndroid端末からドローンへ接続します。

1-仕様

今回作るクラスは下記の仕様を持ちます。

  • Activityを継承している。
  • 以前作成した周囲のドローンを探索するActivityから呼び出される。
  • Intent#getParcelableExtraで接続対象DroneのARDiscoveryDeviceServiceを受け取る
  • Activity#onStartでDroneに接続を開始、ダイアログ「Connecting …」を表示する。
  • Activity#onBackPressedで接続を終了、ダイアログ「Disconnecting …」を表示する。
  • MiniDrone.Listenerを実装し、Drone接続状況やDrone飛行状況をコールバックする。

2-初期化部

Intent#getParcelableExtraを使い遷移前のActivityから接続するARDiscoveryDeviceServiceを受け取り、MiniDroneのインスタンスを作成する。
また、Drone接続状況やDrone飛行状況の変化をコールバックできるようにMiniDrone#addListenerを使いMiniDrone.Listenerを設定する。

    private static final String TAG = "MiniDroneActivity";
    /**MiniDroneクラス*/
    private MiniDrone mMiniDrone;
    /**接続・切断ダイアログ*/
    private ProgressDialog mConnectionProgressDialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //前画面から接続するDroneのARDiscoveryDeviceServiceを取得する
        Intent intent = getIntent();
        ARDiscoveryDeviceService service = intent.getParcelableExtra(MainActivity.EXTRA_DEVICE_SERVICE);
        //ARDiscoveryDeviceServiceを使いMiniDroneをインスタンス化する。
        mMiniDrone = new MiniDrone(this, service);
        //Drone接続状況やDrone飛行状況をコールバックするリスナーを設定する。
        mMiniDrone.addListener(mMiniDroneListener);
    }

3-接続開始

Activity#onStartでDroneへの接続を開始する。
接続開始前にダイアログを表示し、MiniDrone#connectを使いDroneに接続を要求する。
実際に接続に成功したか失敗したかはMiniDrone.Listener#onDroneConnectionChangedにコールバックが返ってくるようになっている。

    @Override
    protected void onStart() {
        super.onStart();
        // MiniDroneがインスタンス化できている、MiniDroneが接続状態でない場合は接続する。
        if ((mMiniDrone != null) && !(ARCONTROLLER_DEVICE_STATE_ENUM.ARCONTROLLER_DEVICE_STATE_RUNNING.equals(mMiniDrone.getConnectionState()))) {
            //ダイアログを設定する
            mConnectionProgressDialog = new ProgressDialog(this);
            mConnectionProgressDialog.setIndeterminate(true);
            //ダイアログのメッセージをConnecting ...にする
            mConnectionProgressDialog.setMessage("Connecting ...");
            mConnectionProgressDialog.setCancelable(false);
            //ダイアログを表示する
            mConnectionProgressDialog.show();
            //ドローンの接続要求の成否を判定する
            if (!mMiniDrone.connect()) {
                //ドローンの接続要求に失敗した場合はActivityを終了する
                finish();
            }
        }
    }

4-切断開始

Activity#onBackPressedでDroneへの切断を開始する。
切断開始前にダイアログを表示し、MiniDrone#disconnectを使いDroneに接続を要求する。
実際に切断に成功したか失敗したかはMiniDrone.Listener#onDroneConnectionChangedにコールバックが返ってくるようになっている。

    @Override
    public void onBackPressed() {
        if (mMiniDrone != null) {
            //ダイアログの設定する
            mConnectionProgressDialog = new ProgressDialog(this);
            mConnectionProgressDialog.setIndeterminate(true);
            //ダイアログのメッセージをDisconnecting ...にする
            mConnectionProgressDialog.setMessage("Disconnecting ...");
            mConnectionProgressDialog.setCancelable(false);
            mConnectionProgressDialog.show();
            //ドローンの切断要求の成否を判定する
            if (!mMiniDrone.disconnect()) {
                //ドローンの切断要求に失敗した場合はActivityを終了する
                finish();
            }
        } else {
            finish();
        }
    }

5-コールバックの実装

Android端末から接続・切断・操作によりDroneは様々な状態になります。
MiniDrone#addListenerでリスナーを設定することで、Droneからコールバックを受け取ることができます。
今回はonStartでDroneに送った接続リクエストをonDroneConnectionChangedにより受け取ります。

    private final MiniDrone.Listener mMiniDroneListener = new MiniDrone.Listener() {
        @Override
        public void onDroneConnectionChanged(ARCONTROLLER_DEVICE_STATE_ENUM state) {
            switch (state) {
                case ARCONTROLLER_DEVICE_STATE_RUNNING:
                    Log.d("Drone" , "ARCONTROLLER_DEVICE_STATE_RUNNING");
                    //ダイアログを消す
                    mConnectionProgressDialog.dismiss();
                break;
                case ARCONTROLLER_DEVICE_STATE_STOPPED:
                    //ダイアログを消す
                    mConnectionProgressDialog.dismiss();
                    //Activityを終了する
                    finish();
                break;
                default:
                break;
            }
        }

        @Override
        public void onPilotingStateChanged(ARCOMMANDS_MINIDRONE_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_ENUM state) {
            switch (state) {
                case ARCOMMANDS_MINIDRONE_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_LANDED:
                break;
                case ARCOMMANDS_MINIDRONE_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_FLYING:
                case ARCOMMANDS_MINIDRONE_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_HOVERING:
                break;
                default:
            }
        }
    };

6-まとめ

実装したクラスを実際に使ってみましょう。
画面起動時にダイアログ「Connecting …」が表示されます。
接続に成功するとダイアログが消え、Logに「ARCONTROLLER_DEVICE_STATE_RUNNING」が表示されます。
しかし、接続が失敗するとダイアログが消え、Activityが終了します。
今回は接続まで実装しました、次回は実際に飛ばしてみたいと思います。

    public class MiniDroneActivity extends AppCompatActivity {
        private static final String TAG = "MiniDroneActivity";
        /**MiniDroneクラス*/
        private MiniDrone mMiniDrone;
        /**接続・切断ダイアログ*/
        private ProgressDialog mConnectionProgressDialog;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //前画面から接続するDroneのARDiscoveryDeviceServiceを取得する
            Intent intent = getIntent();
            ARDiscoveryDeviceService service = intent.getParcelableExtra(MainActivity.EXTRA_DEVICE_SERVICE);
            //ARDiscoveryDeviceServiceを使いMiniDroneをインスタンス化する。
            mMiniDrone = new MiniDrone(this, service);
            //Drone接続状況やDrone飛行状況をコールバックするリスナーを設定する。
            mMiniDrone.addListener(mMiniDroneListener);
        }

        @Override
        protected void onStart() {
            super.onStart();
            // MiniDroneがインスタンス化できている、MiniDroneが接続状態でない場合は接続する。
            if ((mMiniDrone != null) && !(ARCONTROLLER_DEVICE_STATE_ENUM.ARCONTROLLER_DEVICE_STATE_RUNNING.equals(mMiniDrone.getConnectionState()))) {
                //ダイアログを設定する
                mConnectionProgressDialog = new ProgressDialog(this);
                mConnectionProgressDialog.setIndeterminate(true);
                //ダイアログのメッセージをConnecting ...にする
                mConnectionProgressDialog.setMessage("Connecting ...");
                mConnectionProgressDialog.setCancelable(false);
                //ダイアログを表示する
                mConnectionProgressDialog.show();
                //ドローンの接続要求の成否を判定する
                if (!mMiniDrone.connect()) {
                    //ドローンの接続要求に失敗した場合はActivityを終了する
                    finish();
                }
            }
        }

        @Override
        public void onBackPressed() {
            if (mMiniDrone != null) {
                //ダイアログの設定する
                mConnectionProgressDialog = new ProgressDialog(this);
                mConnectionProgressDialog.setIndeterminate(true);
                //ダイアログのメッセージをDisconnecting ...にする
                mConnectionProgressDialog.setMessage("Disconnecting ...");
                mConnectionProgressDialog.setCancelable(false);
                mConnectionProgressDialog.show();
                //ドローンの切断要求の成否を判定する
                if (!mMiniDrone.disconnect()) {
                    //ドローンの切断要求に失敗した場合はActivityを終了する
                    finish();
                }
            } else {
                finish();
            }
        }

        private final MiniDrone.Listener mMiniDroneListener = new MiniDrone.Listener() {
            @Override
            public void onDroneConnectionChanged(ARCONTROLLER_DEVICE_STATE_ENUM state) {
                switch (state) {
                    case ARCONTROLLER_DEVICE_STATE_RUNNING:
                        Log.d("Drone" , "ARCONTROLLER_DEVICE_STATE_RUNNING");
                        mConnectionProgressDialog.dismiss();
                    break;
                    case ARCONTROLLER_DEVICE_STATE_STOPPED:
                        mConnectionProgressDialog.dismiss();
                        finish();
                    break;
                    default:
                    break;
                }
            }

        @Override
        public void onPilotingStateChanged(ARCOMMANDS_MINIDRONE_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_ENUM state) {
            switch (state) {
                case ARCOMMANDS_MINIDRONE_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_LANDED:
                break;
                case ARCOMMANDS_MINIDRONE_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_FLYING:
                case ARCOMMANDS_MINIDRONE_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_HOVERING:
                break;
                default:
            }
        }
    };
}

【国内正規品】Parrot Minidrones Airborne Night Blaze(レッド)ドローン規制対象外200g 未満・パリデザイン・LED 付き自動安定ホバーリングクアッドコプター ・30万画素カメラ・簡単にアクロバット・スマホ・タブレットで操作 PF723132

新品価格
¥17,150から
(2017/2/28 00:50時点)


Parrot Airborne Cargo MiniDrone - Mars (White) by Parrot

新品価格
¥22,692から
(2017/2/28 00:53時点)


Parrot MiniDrones Airborne Night Drone Maclane (Blue) [並行輸入品]

新品価格
¥12,000から
(2017/2/28 00:54時点)


【国内正規品】Parrot Bebop 2 ホワイト Full HD/30fps 魚眼レンズ カメラ・25分飛行時間・8GB 内部フラッシュメモリー・自動安定ホバーリング・最高水平速度:60KM/H・パリデザイン・GNSS (GPS GLONASS)付・クワッドコプター PF726073

新品価格
¥65,701から
(2017/2/28 00:57時点)


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)