ROS2プログラミング演習_05: 実機のセットアップと動作確認（WSL2＋ROS→TurtleBot3実機）

## はじめに
今回からturtlebot3実機を動かします．
このページではTurtleBot3を動かすまでの設定・接続・動作確認を行います．

#### 環境
・OS: Windows11 Pro (64bit)
・ROS: ROS2 humble (WSL2のUbuntu22.04に)

ここまでの環境構築については下記参照
・WSL2にROS2を入れてgazeboでシミュレーションするまでの手順
https://qiita.com/pez/items/16011df0e663ceac694a

TurtleBot3実機のセットアップについては下記参照
https://qiita.com/pez/items/1251c7ad0a21fd6f0a48



## 1. wifiへの接続・通信

TurtleBot3と同じローカルネットワークに接続する必要があります．また，WSL上のubuntuと通信するためにファイヤーウォールの設定が必要です．

※参考にさせて頂いたページ
https://qiita.com/akinami/items/2200d2c49a43a183f14d


### ファイヤーウォールの設定
「設定」→「プライバシーとセキュリティ」→「Windowsセキュリティ」→「ファイヤーウォールとネットワーク保護」→「詳細設定」を開き，「受信の規則」で「ファイルとプリンターの共有（エコー要求-ICMPv4受信）」を有効にして下さい．


![スクリーンショット 2025-06-01 180758.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1962692/838582ad-e758-47d1-ad3c-ce093be7ccbb.png)



### ファイヤーウォールにルールを追加する
同じく，「設定」→「プライバシーとセキュリティ」→「Windowsセキュリティ」→「ファイヤーウォールとネットワーク保護」→「詳細設定」を開き，「受信の規則」で右の「新しい規則」をクリックします．

##### ・「カスタム」を選択して「次へ」
##### ・「全てのプログラム」を選択して「次へ」
##### ・「プロトコルの種類」を「UDP」に設定して「次へ」
##### ・「規則を適用するローカルIPアドレス」と，「規則を適用するリモートIPアドレス」の両方に，TurtleBot を接続している wifiルータが割り当てるIPアドレスの範囲を設定します．（例えば172.28.1.1 ～172.28.1.255 など）



### WSLのubuntuのIPアドレスとwindowsのIPアドレスをミラーリングする
#### 1. 「.wslconfig」ファイルの確認
C:\Users\【windowsログインユーザ名】 の中に「.wslconfig」ファイルがあるか確認する．ない場合は作成．中身を次のようにする．
```ruby:.wslconfgの中身
[wsl2]
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true
```





#### 2. IPアドレスの確認
```ruby:Powershell上で
ipconfig
```
```ruby:WSLのubuntuにて
ifconfig
```

それぞれ「IPv4アドレス」が同じになっているかを確認して下さい．



<!--
### ポートフォワーディング設定
Powershellを管理者権限で起動し，以下のコマンドを実行
```ruby:Powershell(管理者権限)
netsh.exe interface portproxy add v4tov4 listenport=22 connectaddress=(wsl -d Ubuntu-22.04 exec hostname -I).trimend()
netsh.exe interface portproxy add v4tov4 listenport=11311 connectaddress=(wsl -d Ubuntu-22.04 exec hostname -I).trimend()
```

下記コマンドでポートフォワーディング起動
```ruby:Powershell(管理者権限)
sc.exe config iphlpsvc start=auto # ブート時の自動起動設定
sc.exe start  iphlpsvc            # サービスの起動
```

下記コマンドでファイヤーフォールの設定変更（22番と11311番ポートをあける）
```ruby:Powershell(管理者権限)
New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort 22 -Action Allow -Protocol TCP
New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort 22 -Action Allow -Protocol TCP
New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort 11311 -Action Allow -Protocol TCP
New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort 11311 -Action Allow -Protocol TCP
```
-->


### ssh のインストール
※既にインストール済みの場合は不要
```ruby:WSL(ubuntu)にて
sudo apt install openssh-server
```
起動
```ruby:WSL(ubuntu)にて
sudo systemctl enabel ssh
sudo service ssh restart
```



### sshd_config の設定
※テキストエディタは各自好きなものを使用（下記はnano）

```ruby:WSL(ubuntu)にて
sudo nano /etc/ssh/sshd_config
~~~~~ 一部抜粋
Port 22
# AddressFamily any
ListenAddress 0.0.0.0
ListenAddress ::1
~~~~~ 一部抜粋
PasswordAuthentication yes
```
sshサービスを再起動
```ruby:WSL(ubuntu)にて
sudo service ssh restart
```



### ssh接続の確認

次にTurtleBot3にディスプレイ・キーボードを接続して立ち上げます．
・ユーザー名：ubuntu
・パスワード：turtlebot

同様にIPアドレスを確認して下さい．
```ruby:turtlebotにて
ifconfig
```

#### ここでPCとTurtlebotが同じネットワーク（同じwifiルータ）に接続されていることを確認して下さい．


<!--
#### turtlebot→ubuntu　ssh接続の確認

```ruby:turtlebotにて
ssh [ubuntuのーユーザー名]@[ubuntuのIPアドレス]

【例】
ssh ryo@192.168.0.10
```
パスワード（個人で設定したもの）を聞かれるので入力して接続できるか確認．
逆もやる．
-->





#### ubuntu(WSL) → turtlebot　ssh接続の確認
```ruby:WSL(ubuntu)にて
ssh ubuntu@[turtlebotのIPアドレス]

【例】
ssh ubuntu@172.28.1.11
```
パスワードは "turtlebot" です




## 2. 「.bashrc」の設定
.bashrcを編集する．下記はemacsを使う場合の例
```ruby:WSL（ubuntu）にて
sudo emacs ~/.bashrc
```
export の部分
下記は一例なので実機の設定に合わせて下さい．
実機の設定は実機で.bashrcを開いて確認します．

### ※設定内容については演習時に個別で確認します

```ruby:（例）WSL（ubuntu），TurtleBot共通
export ROS_DOMAIN_ID=30
export TURTLEBOT3_MODEL=waffle_pi
export OPENCR_MODEL=waffle
export OPEN_PORT=/dev/ttyACM0
export LDS_MODEL=LDS-02
```

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



## 3. 動作確認
teleopの確認
```ruby:TurtleBotにて(ssh接続でok)
ros2 launch turtlebot3_bringup robot.launch.py
```
```ruby:WSL（ubuntu）にて
ros2 run turtlebot3_teleop teleop_keyboard
```

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



## 4. 演習

動作確認中（bringupノードとteleopノードを立ち上げている時）に下記コマンドで表示されるトピックの送受信関係の図を添付して提出して下さい．
```ruby:
rqt_graph
```

![スクリーンショット 2025-06-09 134041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1962692/0a738971-f9b2-48b8-99a7-dfa5dd708d06.png)