🤖 【TurtleBot3 ROS2環境構築④】Wi-Fi設定とROS2マルチマシン通信 - ホストPCとTurtleBot3を繋ぐ
シリーズ この記事は「TurtleBot3 × ROS2 環境構築シリーズ」の一部です。 シリーズ目次を見る
2026年5月時点。シリーズ④です。RPi4 の Wi-Fi と ROS 2 マルチマシン通信を設定し、ホストPC と TurtleBot3 が同一ネットワークでトピック共有できる状態にします。
netplan・SSH・固定 IP の具体は netplan・SSH・固定IP(⑤) に寄せています。本記事は nmcli で Wi-Fi に乗せ、talker/listener で DDS 疎通を見る流れです。自宅/社内など信頼できるセグメントを想定し、WAN 公開 SSH やゼロトラスト設計までは範囲外です。
読み分け(役割分担):netplan・SSH・固定 IPの具体は slug turtlebot3-ros2-setup-04-network-ssh の記事へ寄せています。こちら(turtlebot3-ros2-network-setup)は nmcli で Wi‑Fi に乗せ、talker/listener で DDS 疎通 を見る流れです。セキュリティの前提:自宅/社内など信頼できるセグメントを想定しています。WAN へ SSH を晒す構成や、組織標準のゼロトラスト設計までは本文の範囲外です。
ROS 2 のマルチマシン通信の仕組みは?
ROS 2 は DDS ミドルウェアで同一ネットワーク上のノードが自動発見します。ROS 1 の master 設定は不要です。仕組みの説明は ROS_DOMAIN_ID の説明 を参照してください。
設定の核心は2点だけ:
- 同じWi-Fiルーターに接続(同一サブネット)
- 同じ ROS_DOMAIN_ID を設定する(ホストPCと TurtleBot3 で数値が一致していること)
Step 1: RPi4 の Wi-Fi はどう設定する?
1-1. 接続状況の確認
SSHでRPi4に接続した状態で確認します。
nmcli device status DEVICE TYPE STATE CONNECTION
eth0 ethernet connected Wired connection 1
wlan0 wifi disconnected -- 1-2. Wi-Fiに接続
sudo nmcli device wifi connect "Wi-FiのSSID" password "パスワード" 接続成功時:
Device 'wlan0' successfully activated. 1-3. Wi-FiのIPアドレス確認
ip addr show wlan0
# inet 192.168.1.101/24 ← このIPアドレスをメモする
1-4. Wi-Fi自動接続の確認
nmcli connection show "Wi-FiのSSID" | grep autoconnect
# connection.autoconnect: yes ← 自動接続ON no になっている場合:
nmcli connection modify "Wi-FiのSSID" connection.autoconnect yes 1-5. LANケーブルの取り外し
Wi-Fi接続確認後、LANケーブルを取り外してWi-FiのIPアドレスで再接続します。
ssh ubuntu@192.168.1.101 # Wi-FiのIPアドレスで接続 Step 2: ROS_DOMAIN_ID はどう揃える?
両方のマシンで ROS_DOMAIN_ID を同じ値にそろえることが最重要です。
ホストPC側の確認
grep ROS_DOMAIN_ID ~/.bashrc
# export ROS_DOMAIN_ID=30
echo $ROS_DOMAIN_ID
# 30 TurtleBot3(RPi4)側の確認
grep ROS_DOMAIN_ID ~/.bashrc
# export ROS_DOMAIN_ID=30 ← ホストPCと同じ値
Step 3: ファイアウォールは何を確認する?
sudo ufw status
# Status: inactive ← 問題なし ファイアウォールが active の場合、ROS2のDDS通信を許可します:
# ホームネットワーク全体からの通信を許可
sudo ufw allow from 192.168.1.0/24 Step 4: talker / listener で疎通確認するには?
TurtleBot3側でtalkerを起動
# RPi4(SSH接続中)
source ~/.bashrc
ros2 run demo_nodes_cpp talker ホストPC側でlistenerを起動
新しいターミナルで実行します。
# ホストPC
ros2 run demo_nodes_cpp listener ホストPC側に "Hello World: 1, 2, 3, ..." が表示されれば通信成功。
ノードとトピックの相互確認
# ホストPCから
ros2 node list
# /talker ← RPi4のノードが見える
ros2 topic list
# /chatter
# /rosout Step 5: 固定 IP はどう設定する?
DHCPではIPアドレスが変わることがあります。ルーター側で固定IPを割り当てると便利です。
ルーター側での設定(確実なのはこれ)
ルーターの管理画面でRaspberry Pi 4のMACアドレスに対してIPを固定します。
# RPi4のMACアドレス確認
ip link show wlan0 | grep ether
# link/ether xx:xx:xx:xx:xx:xx
Step 6: SSH 接続を楽にするには?
毎回IPアドレスを入力するのは手間なので、ホストPCの ~/.ssh/config に設定します。
cat >> ~/.ssh/config << 'EOF'
Host turtlebot3
HostName 192.168.1.101
User ubuntu
EOF 以降は次のコマンドだけで接続できます:
ssh turtlebot3 SSH公開鍵認証(パスワードレス接続)
# 公開鍵が未作成の場合
ssh-keygen -t rsa -b 4096
# TurtleBot3に公開鍵を転送
ssh-copy-id ubuntu@192.168.1.101
マルチマシン通信で困ったら?
ホストPC側でRPi4のノードが見えない
# 1. DOMAIN_IDの確認(両方のマシンで実行)
echo $ROS_DOMAIN_ID # 両方で同じ値か?
# 2. 同じサブネットか確認
# ホストPC: 192.168.1.xxx
# RPi4: 192.168.1.xxx ← 最初の3オクテットが一致していること
# 3. ping疎通確認
ping 192.168.1.101
# 4. ROS_LOCALHOST_ONLYの確認(1ならローカルのみ)
echo $ROS_LOCALHOST_ONLY
# 1が返ってきたら:
unset ROS_LOCALHOST_ONLY && source ~/.bashrc Wi-Fiが頻繁に切断される
# パワースイッチングモードを無効化
sudo iwconfig wlan0 power off
# 永続化
echo "iwconfig wlan0 power off" | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local ネットワーク設定の要点は?
- TurtleBot3(RPi4)をWi-Fiに接続し、LANケーブルなしで運用できるようにした
- ホストPCとRPi4に同じ ROS_DOMAIN_ID を設定した
- talker / listenerでマルチマシン通信(ホストPC↔TurtleBot3)を確認した
- 固定IPとSSH設定で接続を快適にした
- 次回はいよいよTurtleBot3の実機を起動(bringup)してキーボード操縦を行います。
この記事の検証範囲は?
- HostPC: Ubuntu 22.04 LTS + ROS 2 Humble
- TurtleBot3: Raspberry Pi 4 + Ubuntu 22.04 Server + ROS 2 Humble(Burger 例)
- スナップショット日付の固定はしておらず、apt 更新で挙動が変わる前提で読んでください。