ラズパイにROS2開発環境を構築

# 概要
### この記事の存在意義
micro-ROSを用いることでPCとマイコンをROS2でつなぐことができる。しかし、PCとマイコンはUSBでつなぐことが前提とされているのが現状だ。
F7で無線通信を行う場合は中継器を用いてUDP通信を行う方法があるが、micro-rosはどうやら対応していない。
一つの結論として、無線通信用にラズパイを用意してROS2を入れ、ラズパイとマイコンをmicro-rosでつなぎ、ラズパイとPCはwifi経由で通信する方法が考えららる。本記事ではそのために取り敢えずラズパイにROS2を入れるところまでを解説する。
もう一つのやり方として、ESPなどのwifiに対応したマイコンボードを使うことも考えられる。もっと言うと、制御する機構が少なければ、ラズパイのGPIOピンで事足りるので、F7を使わない選択肢もある。

### 大まかな手順
- ubuntuのインストール
- ssh接続をする
- ROS2のインストール
既に関連する記事がいくつかあるので、この記事で新しく説明することは多くない

# 動作環境・バージョン
### 動作環境
Ubuntu22.04　：デュアルブートした実機PC
Raspberrypi 4 model B　
### バージョン
ROS2 : humble
raspiのOS: Ubuntu server 22.04 (64bit) 　：desktopでもいいが、軽いのでこちらを選択

# コンテンツ
[ここから](https://www.raspberrypi.com/software/)お使いのOSに合わせた`Raspberry Pi Imager`をインストールしてください。
`Ubuntu Server20.04.5 LTS(64-bit)`を書き込むのですが、書き込む前にパスワードなどを設定しておくことができます。
<img width="682" alt="スクリーンショット 2023-10-04 125042.png (101.9 kB)" src="https://img.esa.io/uploads/production/attachments/19744/2023/10/04/148658/f6d36a3d-9ee1-484f-b016-5e7c7d9c39a7.png">
設定マークをクリックして、
<img width="681" alt="スクリーンショット 2023-10-04 125134.png (115.7 kB)" src="https://img.esa.io/uploads/production/attachments/19744/2023/10/04/148658/6e384d98-017c-42bb-8782-dcd0dba2abc7.png">
各項目の設定をします。
wifiの設定も行うことができるので、ここで予め設定しておくとよいでしょう。
## wifiに接続し、IPアドレスをしらべる

PCからラズパイを操作できるようにするためにwifiに接続した上でIPアドレスを把握する必要があります。モニターを使う方法が一般的ですが、モニターがない場合もあるかと思うので、ヘッドレスセットアップを行う方法も紹介します。

### モニターを用いる方法
#### wifiの設定
ラズパイに電源とキーボードをつないで起動してください。
wifiの設定を行います、一つ前の手順でwifiの設定を済ませた場合は不要です。
以下のコマンドを実行してください。
`cd /etc/netplan/`
`sudo nano 50-cloud-init.yaml`
そして、以下の内容を追記して保存
```
wifis:
    wlan0:
        optional: true
        dhcp4: true
        access-points:
            SSID名:
                password: パスワード
```
SSID名とパスワードは使用するwifiに合わせて変えてください
以下のコマンドを実行して、エラーがないか確認してください
`sudo netplan --debug try`
`sudo netplan --debug generate`
問題がなければ設定を適用します。
`sudo netplan --debug apply`
一応再起動してください
`sudo reboot`

#### IPアドレスの取得

次にラズパイのIPアドレスを調べます
ラズパイ側で`ip a`を実行して`wlan 0`から始まる箇所のIPアドレス(`inet`から始まる)を確認して下さい。

### ヘッドレスセットアップ

#### wifiの設定
ヘッドレスセットアップを行う場合は、一つ前の手順(OSをmicroSDに書き込む段)でwifiの設定をしておいて下さい。
さらに、microSDをPC側で開いて、root以下に`ssh`という空のディレクトリを作成しておいてください。

#### IPアドレスの取得

次にラズパイのIPアドレスを調べます
この段階ではラズパイ側を弄れないのでwifiの管理者画面から確認します。このときにラズパイがwifiに接続できているかの確認も同時にできるので、オススメの方法です。
私の使用しているTP-LinkのTL-WR841Nではtplinkwifi.netとPC側でブラウザのwebアドレス欄に入力すれば開けます
※パスワードを求められる場合もある。初期パスワードはadminらしいが、分からなければこの方法は使えない
<img width="960" alt="スクリーンショット 2023-10-04 133220.png (127.7 kB)" src="https://img.esa.io/uploads/production/attachments/19744/2023/10/04/148658/68a27749-957c-4322-a6cb-9a640486658b.png">
※赤枠の箇所をクリックするとIPアドレスが見られる

何らかの理由でwifiの管理者画面を開けない場合は以下の方法を試して下さい。
先ず、ラズパイをつなぐwifiーmicroSDの書き込み時にそう設定したwifi、にPCも接続して下さい。
PC側で`ifconfig`をしてPCのIPアドレスを確認して下さい。
<img width="778" alt="Screenshot from 2023-12-10 13-24-39.png (55.2 kB)" src="https://img.esa.io/uploads/production/attachments/19744/2023/12/10/148658/eed21e83-d4bb-4f75-94c0-2a7586b8af97.png">
`wlo1`の`inet`を見て下さい。この値の前3つーこの写真なら`192.168.0`、を確認して下さい。
次にラズパイが正常にwifiに接続できていることを信じて以下のコマンドを打って下さい。
`echo <inetの前３区切り>.{1..255} | xargs -P256 -n1 ping -c1 -t1 | grep ttl `
このコマンドは、wifiによって繋がれたネットワーク内の可能性がある全てのIPアドレスに対してpingを打って疎通確認を行い、返答があったIPアドレスをリストアップしています(通信詳しくないので解釈が間違ってるかも)。
<img width="786" alt="Screenshot from 2023-12-10 13-28-15.png (27.5 kB)" src="https://img.esa.io/uploads/production/attachments/19744/2023/12/10/148658/fe2bc1cc-24c0-4f1c-9968-73e4de0f42c8.png">
以上のような結果が帰ってくるかと思います。これらのIPのどれかがラズパイのIPアドレスです。
この写真では`192.168.0.1`、`192.168.0.104`、`192.168.0.151`のどれかということになります。



## ssh接続する
IPアドレスが分かったら、PC側で以下のコマンドを実行してください
`sudo ssh ユーザー名@IPアドレス`
ssh接続できたら、PCからラズパイを操作できます
取り敢えず、`sudo apt update`と`sudo apt upgrade`をしておきましょう。

## ROS2のインストール
[ROS2公式ドキュメント](https://docs.ros.org/en/humble/Installation/Alternatives/Ubuntu-Development-Setup.html)に従ってインストールすればよい

# トラブルシューティング
### 一般論
ラズパイとsshするPCは同じwifiもしくはLANにつながっている必要があります。上手くいかないときはこれを先ず確認して下さい。

### 個別の対策

<details><summary>ros2-humble-desktopのパッケージが見つからない、と言われる</summary><div>

間違えて32bitをインストールしていませんか？
`uname -a`で確認して下さい。

<img width="1104" alt="Screenshot from 2023-12-10 13-43-32.png (15.7 kB)" src="https://img.esa.io/uploads/production/attachments/19744/2023/12/10/148658/48369fd2-85a8-4334-ba6f-c16ff65d0684.png">


`aarc64`のように`~64`と表示されれば64bitですが、そうでなければ32bitが入っている可能性を検討して下さい。

</div></details>


# 終わりに
ラズパイは小規模なロボットを自主開発する場合にはお世話になることも多いかと思います。STMマイコンとROS2を連携する場合などではロボコンでも使う機会があるでしょう。
ただ、ubuntuを入れてしまうとGPIOピンを使う際に一手間必要になるみたいなので、気が向いたらそれについても調べて記事を書きたいと思います。
# 参考文献
[Linuxのpingコマンドで覚えておきたい使い方16選(+2個)|俺的備忘録～なんかいろいろ～](https://orebibou.com/ja/home/201504/20150414_001/)