raspberry pi3 + navio2でssh接続するまでの手順

NAVIO2が来たので組み立て、初期設定を終わらせるまでの手順をまとめる(6月くらいの話であるが。)
ほぼ[公式ドキュメント](https://docs.emlid.com/navio2/)のままだが、ROSを動かす手前の段階までを一括してまとめておく
大まかな手順は以下の通り

- ハードウェアの組み立て
- SDカードの作成(OSインストール)
- 初期設定
- ROSでデータを確認

# ハードウェアの組み立て

大まかに、以下の二段階に分ける

1. NAVI2本体をRaspberry Pi基盤に取り付ける
2. NAVIO2基盤に各種センサ・コードを接続する

## NAVIO2本体の取り付け
以下に、Raspberry Pi 3 Model B上にNAVIO2を固定した状態の画像を示す

手順は以下の通り

1. NAVIO2付属のGPIO延長ピンをRaspberry Pi基盤に取り付ける
2. NAVIO2付属の金属製の柱をRaspberry Pi基盤にネジ止めする
3. Raspberry Pi基板から延長したGPIOピンをNAVIO2の無地の面を下にして接続する
4. 柱の位置を合わせ、NAVIO2をネジで固定する

この手順を図示したものは[公式サイト](https://docs.emlid.com/navio2/ardupilot/hardware-setup/)にある

注意事項としてはGPIO延長ピンの取り付けが非常に硬いことくらい

## センサ・コードの取り付け

次いで、NAVIO2基板上に(オプションの)各種センサ・コードを取り付ける

これらは公式サイトで明示的にカートに追加するか、国内の代理店でセットとして購入するなどの方法で入手できる
また、これらのパーツは、あくまで公式がサポートしているというだけで、規格さえ合えばほかの部品を流用することも可能だろう
(あくまで自己責任でとなるが)

取り付けるパーツは以下の通り

- GPSアンテナ
- 電源コード

他、「セット」の場合、UART端子用のコードなどが含まれているが必要に応じて接続する(本記事では触れない)

GPSアンテナは、"NAVIO2"という文字の近くの円形の端子に接続する

電源コードは基盤側面の"POWER"という表示のあるプラグに接続する

ほかの端子は自分の環境に合わせて、適宜接続してください

以上でハードウェアとして利用する準備は完了した

次いで、Raspberry Piを動かす準備を行う

# SDカードの作成(OSのインストール)

NAVIO2と情報をやり取りするRaspberry Piはlinux系OSで動作する
通常は[ラズベリーパイ財団](https://www.raspberrypi.org/)が提供する[Raspbian](https://www.raspberrypi.org/downloads/)が用いられるれが多いが、NAVIO2を利用する場合、開発元の[EMLID](https://reachrs.emlid.com/)の提供する、[NAVIO向けのパッケージがあらかじめインストールされたイメージ](https://docs.emlid.com/navio2/common/ardupilot/configuring-raspberry-pi/)を利用可能である

OSはSDカードに書き込み、Raspberry PiのSDカードスロットに差し込むことで起動できる

大まかな手順は以下の通り

1. OSのダウンロード
2. OSイメージの書き込み
3. 事前設定
4. Raspberry Piに差し込み、起動

今回、SDカードはTOSHIBA製[EXCERIA 32GB](https://www.amazon.co.jp/%E6%9D%B1%E8%8A%9D-Toshiba%E8%B6%85%E9%AB%98%E9%80%9F95MB-microSDHC-%E6%9B%B8%E8%BE%BC60MB-%E7%A7%92%E4%B8%A6%E8%A1%8C%E8%BC%B8%E5%85%A5%E5%93%81/dp/B00C67TX4E/)を使用する
また、SDカードへの書き込みはWindowsから行う(Linux等であれば、ddコマンドから書き込む例が多い)

## OSのダウンロード
以下のアドレスから、公式のイメージを入手することができる

* [Downloading configured Raspbian image](https://docs.emlid.com/navio2/common/ardupilot/configuring-raspberry-pi/)

ページ上部の"Download emlid-raspbian-20170323 SD card image"をクリックし、イメージファイルをダウンロードする

ファイルの拡張子".xz"は、少なくともwindows環境ではあまり見ない拡張子だと思うので、対応している解凍ソフトを入手し、解凍する必要がある
(私の環境では"[explzh](http://www.ponsoftware.com/archiver/download.htm)"を使用した)

解凍してできた、"emlid-raspbian-20170323.img"をSDカードに書き込む

## OSイメージの書き込み
OSイメージ(emlid-raspbian-20170323.img)をSDカードに書き込む
Linux系ならばddコマンドから書き込むのがベターのようだが、今回はwindowsの"[dd for windows](http://www.si-linux.co.jp/techinfo/index.php?DD%20for%20Windows)"を使用して書き込みを行う

dd for windowsを使用してイメージを書き込む手順は以下のようになる

- 書き込み先ドライブの選択
- 書き込むイメージファイルの選択
- 書き込む

以下にdd for windowsのメイン画面を示す

![dd_01.png](https://qiita-image-store.s3.amazonaws.com/0/126345/94e85632-59a0-fc86-c6ec-603399afa527.png)

書き込み先ドライブを選択するには、「ディスクの選択(左四角)」をクリックする
クリックすると、以下のようなドライブ選択画面が表示されるので、左側の一覧から書き込みたいSDカードのドライブを指定し、「OK」をクリックする(今回はGドライブを選択している)

次に、書き込むイメージファイルを指定する
「ファイル選択(右四角)」をクリックし、開かれるウィンドウ上で書き込みたいイメージファイルを選択する
ただし、初期状態だと、".ddi"という拡張子しか表示されないため、ウィンドウ下部のファイルの種類から「すべてのファイル」を指定し、イメージファイルを選択できるようにする必要がある

書き込み先ドライブの選択と書き込むイメージファイルの選択が終わったら、実際にイメージを書き込む
書き込みを実行してしまうと、書き込み先ドライブが初期化されてしまうので、特に書き込み先ドライブの選択に間違いがないか確認したうえで、「書込(中央四角)」をクリックする

書き込み終了後、エクスプローラー上のSDカードの名前が「boot」になっていれば成功である

## 事前設定
SDカードにOSイメージを書き込んだ後は、そのSDカードを刺したRaspberry Piにssh接続することができるよう準備しておく必要がある
droneなどに搭載することを考えると無線でネットワークに接続し、ssh接続できる状態となっているのが好ましい
HDMIとキーボードを接続して、直接中に入って設定する方法もあるが、SDカード内のファイルに少し手を加えることで無線LANに接続可能であるので、こちらの方法を使用する

まず、"boot"という名前になったSDカードの中を開く
".dat"など様々なファイルがあると思われるが、今回は"wpa_supplicant.conf"というファイルを確認できれば良い

この"wpa_supplicant.conf"は無線ネットワークへの接続を設定するファイルである
テキストエディタなどで開くことができるので、開き、編集する
以下に編集例を示す

```
country=GB
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
	ssid="your_network_ssid"
	psk="your_ssid_pass_key"
}
```

編集するべき内容は、"network"内の"ssid"と"psk"である
それぞれに、接続したいネットワークのssidと、そのssidに対応するパスキーを記述し、保存する
その他の部分に編集を加える必要はないが、ssidやpskといった項目が複数ある場合には、先頭に"#"を入れ無効化しておく

以上で、SDカードの準備は終了である

次に、Raspberry Piの初期設定を行う

# 初期設定
EMLIDがNAVIO2向けに提供しているイメージをRaspberry Piに導入した場合、以下のコマンドからssh接続することができる

```
$ ssh pi@navio.local
```

- 初期ユーザー名：pi
- 初期パスワード：raspberry

初期ユーザー名や初期パスワードは通常のRaspberry Piと同様であるが、IPアドレスの代わりに"navio.local"を指定することでもssh接続することが可能である

NAVIO2を搭載するロボットの形式に基づき、ArduPilotの初期設定を行う
手順は[Raspberry Piに接続した際に表示されるStepの通り](https://docs.emlid.com/navio2/common/ardupilot/installation-and-running/)である

これらの詳細は、ロボットの形式ごとに異なるため詳しくは説明しないが、各Stepでは大まかに以下の内容の設定を行う

- Step1:ロボットの形式の設定
    - ```sudo update-alternatives --config arducopter```
    - ```sudo update-alternatives --config arduplane```
    - ```sudo update-alternatives --config ardurover```
- Step2:GCS(Ground Control Stations)のアドレス設定、好みのエディタで編集する
    - ```sudo nano /etc/default/arducopter```
    - ```sudo nano /etc/default/arduplane```
    - ```sudo nano /etc/default/ardurover```
- Step3:deamonを再読み込みし、サービスを開始する
    - ```sudo systemctl daemon-reload```
    - ```sudo systemctl start arducopter```
    - ```sudo systemctl start arduplane```
    - ```sudo systemctl start ardurover```
- Step4:サービスを有効化(または無効化)する、以下は有効化コマンド
    - ```sudo systemctl enable arducopter```
    - ```sudo systemctl enable arduplane```
    - ```sudo systemctl enable ardurover```

Step1はdroneの形式を、コプター型か、プレーン(プロペラ飛行機)型か、ローバー(自動車)型か選択する

Step2では、"GCSの動いているPC(本記事では触れません)"のIPアドレスと、オプションを指定する
オプションはシリアルポートのマッピング設定である
以下に対応([公式](https://docs.emlid.com/navio2/common/ardupilot/installation-and-running/)より抜粋)を示す

```
-A - serial 0 (always console; default baud rate 115200)
-C - serial 1 (normally telemetry 1; default baud rate 57600) 3DR Radios are configured for 57600 by default, so the simplest way to connect over them is to run with -C option.
-D - serial 2 (normally telemetry 2; default baud rate 57600)
-B - serial 3 (normally 1st GPS; default baud rate 38400)
-E - serial 4 (normally 2st GPS; default baud rate 38400)
-F - serial 5
```

詳細は[公式サイト](https://docs.emlid.com/navio2/common/ardupilot/installation-and-running/)を確認のこと

Step3ではdaemonに登録し、Step4ではサービスを有効する

以上でRaspberry PiでNAVIO2を使用する初期設定は終了である

# ROSでデータを確認
[公式のドキュメント](https://docs.emlid.com/navio2/common/dev/ros/)通りで基本的には問題ない

tmuxなどでコンソールを分割し、```roscore```を立ち上げ、rosrunから```mavros_node```を立ち上げればよい

注意点として、fcuの設定は必要であるが、gcsの設定は必須ではない
gcsを立ち上げていない場合には指定する必要はない

rosrunに成功したならば、```rostopic list```から必要な情報を発見し、```echo```で確認することができる