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

## はじめに
TurtleBot3をROS2で動かした際の忘備録(1)です
（waffle pi と burger 両方で確認済）
同じネットワーク内のPCからTurtleBot3をリモート操作します

Raspberry Pi 4B バージョンの場合は下記別記事参照
https://qiita.com/pez/items/1251c7ad0a21fd6f0a48


・リモート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 3B+)
　または
・TurtleBot3 burger (Raspberry Pi 3B+)

Raspberry Pi 4B バージョンの場合は下記別記事参照
https://qiita.com/pez/items/1251c7ad0a21fd6f0a48


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

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

以後の手順は下記公式サイトを参考にしています
（ページの上の方で「Foxy」を選択する）

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

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


## イメージファイルの準備
ダウンロードした iso ファイルを 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行ほど）
```
時刻がずれていることが原因らしいので修正しなくてはいけない
### 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
```

### 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_pi
$ 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
```

ここで最後の行に
failed to set dtr/rts
という気になる表示が出ていたが調べても原因は分からず
放置してもロボットは動くらしいのでスルー



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

## Lidarの設定
ここで使うTurtleBot3のLidarは「LDS-01」だったので下記を実施
```ruby:
$ echo 'export LDS_MODEL=LDS-01' >> ~./bashrc
$ source ~/.bashrc
```


## 設定確認／.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-01
```
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が動かせたら成功