ArduPilot開発のための実機を作る(Navio2中編)
Navio2を使った実機作成の後編に行く前に、ちょっと寄り道の中編を書いてみます。
テーマは「GCS(Ground Control Stations)との接続方法」についてです。
前編では、Navio2 → GCS(UDP14550番ポートでListen)の接続要求でした。自宅に居ながらのローカルネットワークの環境であればこれで十分です。
外に出て、フィールドワークをしたり、タブレット・スマホなどのデバイスに接続したいと思うたびに、ラズベリーパイにログインしてGCSの接続先を書き換えて、っていう作業をしないといけません。
出先でネットワーク環境があるか、モバイルルーターなどを持ち歩かないといけません。。。これはなかなか不便ですよね。
折角、ラズベリーパイにWi-Fiがビルドインされているのにそれを活用しない手はないですよね。
よく市販のドローンであるような、ドローンがWi-FiのAPになっていて、それにスマホを接続する方法をNavio2でもやってみましょう。
【注意事項】
Navio2とGCSは1:1という前提です。1:多などはまだ試したことがないので動くかはわかりません。
設定ファイルの内容や、パスなどは私の環境そのままです。必ずご自身の環境に合わせて変更してください。
不備、間違い、改善点などありましたら遠慮なくご指摘ください。
【更新情報】
2017/05/08 ワンライナーに関するご指摘
2017/04/30? インターフェース「wlan0」の表記強調
■ 前提条件と作業の流れ
この記事は「ArduPilot開発のための実機を作る(Navio2前編)」を前提としています。
必要なパッケージをインストール
ラズベリーパイをWi-Fiのアクセスポイント(以降、AP)化
DHCPサーバを導入
動作確認
もうちょっと便利に
■ 作業開始
ここからはラズベリーパイにログインして作業してください。
無線のインターフェースは"wlan0"と認識されている前提とします。
ご自身の環境に合わせて読み替えてください。
■ 必要なパッケージをインストール
以下のコマンドで必要なパッケージをインストールします。ここでは詳しく説明しませんが、hostapdがAP化、isc-dhcp-serverが接続したクライアントにIPアドレスなどの情報を自動的に割り当てる役割があります。
■ ラズベリーパイをWi-FiのAP化
AP化することによって、GCSなどの端末 → Navio2(ラズベリーパイ)という接続の構図になります。 APとなるNavio2側のIPアドレスを192.168.100.1として固定に設定します。以下のようにdhcp設定になっているwlan0インターフェースをstatic固定IPに変更します。
hostapdの設定ファイル /etc/hostapd/hostapd.conf を以下のように作成します。設定ファイルを作成する場所は安全に管理できればどこでもいいです。そのままコピペして動かないということがないように画像で見せます。
詳しいパラメータの説明はQiita「hostapd設定覚書」を参考にしてみてください。
今回は、wlan0をアクセスポイントとして、SSIDをnaviowifi、パスワードをnaviowifiと設定しました。
作成した設定ファイルを読み込ませます。
以下のコマンドで、DAEMON_CONFを設定します。
ここまで設定が終わった時点で、手動で以下のコマンドを実行してAPとして動作するか確認してみます。
お手持ちのスマホなどでWi-Fi検出リストを見てみてください。naviowifiという名前の無線が表示されるはずです。ここでうまくいかない方はどこか間違っていますので見直してみてください。
次にhostapdデーモンが起動時に自動起動するようにサービスとして登録します。
次のコマンドでsystemd用のサービスファイルを作成します。
上記内容のファイルを保存したら、次のコマンドでサービスを有効にしサービスを開始します。サービスの状態を確認します。
正常にサービス起動できていれば、ここで一度ラズベリーパイからログアウトして、電源を切って、再起動します。再起動後にスマホからnaviowifiが検出できればこれでAP化は完了です。
■ DHCPサーバを導入
次は、APに接続してきたクライアントにIPアドレス情報を自動的に割り当てるためにDHCPサーバを設定して有効にします。
APにしたwlan0インターフェースに対してDHCPのサービスを提供するように設定します。
次のコマンドでINTERFACESをwlan0に設定してください。あと、デフォルトで設定ファイルは/etc/dhcp/dhcpd.confとなりますので、その設定も合わせてします。違う場所に設定ファイルを保存している場合は適宜そのパスをDHCPD_CONFで指定してください。
シンプルに配布するIPアドレスの範囲”range”とブロードキャストの設定のみです。これも目的や、自分の環境などに合わせて編集してください。
そして、DHCPのサーバも同様に起動時に有効になるように次のコマンドでサービスを有効にし登録します。
■ 動作確認
だいたいここまで終わっていればかなり便利になっています。
ラズベリーパイからログアウトして、電源を切って、接続されているすべてのケーブルを外します。
給電をUSBケーブルにするか、バッテリーにするかは自由ですが、ラズベリーパイを再起動します。
無線機能があるパソコンでnaviowifiに接続してみてください。
puttyやteratermでnavio.local(192.168.100.1)に簡単にリモートに接続できるようになります。
■ もうちょっと便利に
まだ、問題が一つ残っています。それはGCSの接続先を起動時に指定しないといけないってことです。前編では、決まったGCS端末のIPアドレスを指定していました。
今回AP化したことによって毎回手動で書き換えてもさほど手間にはならなくなりましたが、もっと簡単にしたい・・・ですよね。
MACアドレスに対し固定IPを割り当てるようにしてもいいですが、私はワンライナースクリプトで割り当て済みIPリストからpingに応答するホストをGCSとしてArduCopterの起動オプションに設定するようにしました。これでもまだまだ不完全ですが一応使えてます。改良点どんどん指摘してください!
■ 備 考
【ご指摘】
コプターサービスが先に起動するので、GCS_TARGETになるのでは?というご指摘をいただきました。
【回答】
初回起動時はそうなってしまいますが、2回目以降や異なる複数台のGCS接続がある場合に一番最後にリースしたIPアドレスをターゲット指定するという意図で書きました。
どしどし、ご指摘ください!!
■ 筆者紹介

川村剛(かわむらつよし) ドローンソフトウェアエンジニア養成塾 第2期卒業生。
記事の誤りを見つけた方は下記のメールアドレスまでご連絡ください。 techblog@drone-j.com (週末にメールを確認していますので、対応が遅くなること、休みの日にメールを返信させていただくこと、ご了承ください。)