【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:
}
}
};
}
|
|
||||
|
|
||||



