【Androidでドローン(マルチコプター)を飛ばそう】 ドローンに接続する
今回は前回作ったクラス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: } } }; }
|
|
||||
|
|
||||