30代エンジニアの備忘録のカバー画像

30代エンジニアの備忘録

組み込み開発・信号処理・プログラミングの技術メモと短編小説

🤖 【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点だけ:

  1. 同じWi-Fiルーターに接続(同一サブネット)
  2. 同じ ROS_DOMAIN_ID を設定する(ホストPCと TurtleBot3 で数値が一致していること)
ROS2マルチマシン通信の概要(ホストPC・TurtleBot3・Wi-Fiルーターの構成図)
ROS2マルチマシン通信の概要(ホストPC・TurtleBot3・Wi-Fiルーターの構成図)

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アドレスをメモする
Wi-Fi接続成功時のターミナル出力
Wi-Fi接続成功時のターミナル出力
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と同じ値
ホストPCとRPi4でROS_DOMAIN_IDが一致していることを確認
ホストPCとRPi4でROS_DOMAIN_IDが一致していることを確認
💡
ROS_DOMAIN_ID が1つでも異なると、トピックが全く見えません。必ず両方のマシンで同一の値(0〜101)を設定してください。

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-TurtleBot3間のクロスホスト通信確認画面
ホストPC-TurtleBot3間のクロスホスト通信確認画面
ノードとトピックの相互確認
# ホスト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
ルーター管理画面で静的DHCPリース設定
ルーター管理画面で静的DHCPリース設定

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
SSH公開鍵認証設定完了後のコマンドライン
SSH公開鍵認証設定完了後のコマンドライン

マルチマシン通信で困ったら?

ホスト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 更新で挙動が変わる前提で読んでください。