ROS2環境構築 <Part 2-2> TurtleBot3(実機)のセットアップ／Raspberry Pi 4B

## はじめに
TurtleBot3をROS2で動かした際の忘備録(3)です
同じネットワーク内のPCからTurtleBot3をリモート操作するまでになります

Raspberry Pi 3B+ バージョンの場合は下記別記事参照
https://qiita.com/pez/items/1d3d15b3911d5dab1702


・リモートPCにVirtualBox＋Ubuntuが導入済み（下記別記事参照）
https://qiita.com/pez/items/a3ef1855f7e1e0ed3dfd
・リモートPCにROS(ROS2 Foxy)がインストール済み（下記別記事参照）
https://qiita.com/pez/items/1df36628524ff40a3d93

・TurtleBot3は組立て済み

の状態からを想定しています


## 環境
##### リモートPC (Panasonic Let's Note CF-FV)
・OS: Windows11 Pro (64bit)
・VirtualBox: 6.1.38 (Ubuntu20.04.5, GUI環境)
・ROS: ROS2 Foxy

##### ロボット
・TurtleBot3 waffle pi (Raspberry Pi 4B)
※ラズパイのバージョンが同じなら burger でもほとんど同じ操作になります
(waffle pi の部分がburgerになるくらい）
Raspberry Pi 3B+ バージョンの場合は下記別記事参照
https://qiita.com/pez/items/1d3d15b3911d5dab1702

##### その他
・microSD カード
　16GB以上あればOK

## TurtleBot3用のイメージファイルをダウンロード
ラズパイのハードウェアのバージョンを確認
※このページでは Raspberry Pi 4B を使用しています
```ruby:ラズパイ(TurtleBot3にて)
$ cat /proc/device-tree/model
```

以後の手順は下記公式サイトを参考にしています
（ページの上の方で「Foxy」を選択する）←これお間違えなく！

https://emanual.robotis.com/docs/en/platform/turtlebot3/sbc_setup/#sbc-setup

使用するTurtlebot3に合わせてイメージファイルを選択しダウンロード：ここでは「Raspberry Pi 4B」のROS2 Foxy image
具体なファイル名は「tb3_rpi4_foxy_20210825.zip」でした


## イメージファイルの準備
ダウンロードした zip ファイルを解凍すると img ファイルが現れるのでこれを microSD カードに書き込む
色々方法はあるかと思いますがここでは Disk Imager を使いました

https://ja.osdn.net/projects/sfnet_win32diskimager/

※環境によってはかなり時間がかかる場合があります
できるだけデータ転送速度が速いもの(USBならGen3以降とか)を使うとよいと思います


## micorSDの未割り当て領域を有効に
上のリンクの公式サイトではGPartedなどを使ってパーティションのリサイズをしなさいとありますが，今回はやろうとしたら何もしなくても全領域使ってパーティションが切られていたので何もせず

https://sourceforge.net/projects/gparted/


## TurtleBot3を起動・初期設定
書き込みできた microSD を TurtleBot の RaspberryPi に挿入して起動する
waffle pi だとこんな感じ↓で入れにくいですが burger の方は手で何とかなります
![図15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1962692/3e941a83-7df8-2543-b7fd-04afcad432a1.png)

・ユーザー名：ubuntu
・パスワード：turtlebot

となっています

下記やったことのメモ（全てTurtleBot3のUbuntuでのコマンド入力）
```ruby:キーボードレイアウト修正
$ sudo dpkg-reconfigure keyboard-configuration
```
Generic 105-key(Intl) PC → Japanese → Japanese → The default for the keyboard layout → No compose key
```ruby:再起動
$ reboot
```
```ruby:wifiの設定
$ cd /etc/netplan/
$ sudo vi 50-cloud-init.yaml
```
・access-points: の下の行に繋げたいwifiのSSIDを記入
・さらにその下  password: [パスワードを記入], 保存して終了

```ruby:また再起動
$ reboot
```
```ruby:wifiが繋がっていることを確認
$ ifconfig
```
※ifconfig が入っていない場合は sudo apt install net-tools

```ruby:apt-get updateでエラー
$ sudo apt-get update

E: Release file for http://~~~~~  is not valid yet ~~~
 (という感じのが4行ほど）
```
時刻がずれていることが原因らしいので修正しなくてはいけない
※エラーが起こらない場合は「Lidarの設定など」へ進む
### Raspberry Pi の時刻の同期について
※時刻がずれていない場合はやる必要なし
```ruby:まずは確認
$ timedatectl
```
 → 1年以上前の日時が表示された

```ruby:timezoneを日本にする
$ sudo timedatectl set-timezone Asia/Tokyo
```
次に「timedatectl」関連で設定を試みたのですがなかなかうまくいかず・・・
System clock synchronized: が何をしても yes になってくれないなと思いながら調べたところ，どうやら私の職場のネット環境のせい（ntp通信が許可されていない，外部へのpingも帰ってこない）らしいということが分かった．実際，自宅のWiFiに繋いだらあっさり同期できた．

 
仕方ないので職場では時計を見ながら手動で合わせて乗り切ることにする
（再起動する度に時間がずれるが・・・）
```ruby:手動での時刻合わせ
$ sudo date --set='yyyy/mm/dd hh:mm:ss'
```
(例) sudo date --set='2022/10/27 09:18:55'
とりあえず apt-get update などはできるようになる
```ruby:
$ sudo apt-get update
```

### dpkgのエラー
何かを apt install しようとすると下記のようなエラーが出た
```ruby: 
Waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend. It is ~~略
```
下記で対処（必要ないものもあるかも）
```ruby: 
$ sudo systemctl mask apt-daily.service
$ sudo systemctl mask apt-daily.timer
$ sudo systemctl mask apt-daily-upgrade.service
$ sudo systemctl mask apt-daily-upgrade.timer
$ sudo rm /var/lib/apt/lists/lock
$ sudo rm /var/lib/dpkg/lock
$ sudo rm /var/lib/dpkg/lock-frontend
```

### Lidarの設定など

./bashrc を確認する．もし「export ROS_DOMAIN_ID=30」の記載がなければ追加する
（MEMO: echoを使うよりエディタで編集した方がリスクが低いので推奨）

```ruby: 
$ sudo vi ~/.bashrc
```
開いたら一番下などに「export ROS_DOMAIN_ID=30」を追記して保存

今回のTurtleBot3についているLidarは「LDS-02」なので下記操作を行いました
```ruby: 
$ sudo apt update
$ sudo apt install libudev-dev
$ cd ~/turtlebot3_ws/src
$ git clone -b ros2-devel https://github.com/ROBOTIS-GIT/ld08_driver.git
$ cd ~/turtlebot3_ws/src/turtlebot3 && git pull
$ rm -r turtlebot3_cartographer turtlebot3_navigation2
$ cd ~/turtlebot3_ws && colcon build --symlink-install
```
さらに ./bashrc に「export LDS_MODEL=LDS-02」を追記する
```ruby: 
$ sudo vi ~/.bashrc
```
開いたら一番下などに「export LDS_MODEL=LDS-02」を追記して保存




### OpenCRのファームウェア更新
※OpenCR：Turtlebot3のラズパイにくっついている制御用ボード
基本的に公式サイトの通りなのでここはメモ書き程度

https://emanual.robotis.com/docs/en/platform/turtlebot3/opencr_setup/#opencr-setup

```ruby: ファームウェアのインストール
$ sudo dpkg --add-architecture armhf
$ sudo apt update
$ sudo apt install libc6:armhf
```

```ruby: OPENCR_MODELの指定
$ export OPENCR_PORT=/dev/ttyACM0
$ export OPENCR_MODEL=waffle
$ rm -rf ./opencr_update.tar.bz2
```

```ruby:
$ wget https://github.com/ROBOTIS-GIT/OpenCR-Binaries/raw/master/turtlebot3/ROS2/latest/opencr_update.tar.bz2
$ tar -xvf ./opencr_update.tar.bz2
```

```ruby:アップロード
$ cd ~/opencr_update
$ ./update.sh $OPENCR_PORT $OPENCR_MODEL.opencr
```


音が鳴る（ドレミファソラシド）
完了の合図？



## 設定確認／.bashrc
※ここからはTurtleBotだけでなくリモートPCの方のターミナルでもコマンド入力します

TurtleBotとリモートPC両方で ~/.bashrc の中を確認する
```ruby:
$ sudo vi ~/.bashrc
```
export の部分
```ruby:TurtleBot, リモートPC共通
export ROS_DOMAIN_ID=30
export TURTLEBOT3_MODEL=waffle_pi
export OPENCR_MODEL=waffle
export OPEN_PORT=/dev/ttyACM0
export LDS_MODEL=LDS-02
```
burgerの場合はwaffle, waffle_piのところをburgerにする

有効化
```ruby:
$ source ~/.bashrc
```



## 動作確認
公式サイトにてスイッチを押して動くか試せとあるのでその通りにする
https://emanual.robotis.com/docs/en/platform/turtlebot3/opencr_setup/#opencr-setup
（上で「Foxy」を選択して下の方の「OpenCR Test」の部分，詳細省略）

最後にteleopの確認
```ruby:TurtleBotにて(ssh接続でok)
$ ros2 launch turtlebot3_bringup robot.launch.py
```
```ruby:リモートPCにて
$ ros2 run turtlebot3_teleop teleop_keyboard
```

リモートPCからキーボード操作でTurtleBotが動かせたら成功