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

30代エンジニアの備忘録

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

【TurtleBot3 ROS2環境構築⑤】ネットワーク設定とSSH接続 - HostPCとTurtleBot3を繋ぐ

シリーズ この記事は「TurtleBot3 × ROS2 環境構築シリーズ」の一部です。 シリーズ目次を見る

【TurtleBot3 ROS2環境構築⑤】ネットワーク設定とSSH接続 - HostPCとTurtleBot3を繋ぐ


はじめに

読み分け: ④ Wi-FiとDDS疎通 で talker/listener。本記事(⑤)は netplan・SSH・固定 IP・ROS_DOMAIN_ID。
④でやること: 同一 Wi-Fi 上の DDS 疎通確認(nmcli、ROS_DOMAIN_ID、talker/listener)。
⑤でやること: SSH 接続、netplan、固定 IP、HostPC と TB3 の ROS_DOMAIN_ID 一致。同一 LAN 前提(WAN 公開・ゼロトラスト設計は対象外)。
DDS の詳細手順は④に集約し、ここでは接続の固定化に絞っています。

2026年5月時点。シリーズ⑤です。Raspberry Pi のセットアップ後、ホストPC から SSH で操作できる状態にします。想定読者は「モニターを繋ぎっぱなしにしたくない」「再起動のたびに IP を探すのが面倒」という段階の方です。

よくある状況は次のとおりです。RPi4 のセットアップは終わったが、ホストPC からの操作手順が分からない。IP の確認場所が分からず、毎回ディスプレイを繋いでいる。

完了後は、ホストPC のターミナル1つから RPi4 を操作でき、再起動後も IP と ROS_DOMAIN_ID がずれにくい状態を目指します。

この記事のゴールは、同一 Wi-Fi 上で SSH を確立し、ROS_DOMAIN_ID の説明 を揃えたうえで ros2 topic が見えることです。DDS の詳細な疎通手順は Wi-FiとDDS疎通(④)、本記事は netplan・SSH・固定 IP を担当します。


この記事で押さえること

  • Raspberry Pi(TurtleBot3)のWiFi設定方法
  • ホストPCからSSH接続を確立する手順
  • 固定IPアドレスの設定方法(DHCPの罠を回避。)
  • ROS_DOMAIN_ID と ROS_LOCALHOST_ONLY の扱い(マルチマシンでは ROS_LOCALHOST_ONLY=1 にしない)
  • pingとros2 topic listで疎通確認する方法
  • 実機でよく詰まるポイントとその解決策

HostPC と TurtleBot3 のネットワーク構成は?

HostPC と TurtleBot3(Raspberry Pi 4)を同一 Wi-Fi に接続する構成です。有線でも構いませんが、教材では無線が多いです。

[HostPC (Ubuntu 22.04)]
    ↕ WiFi
[WiFiルーター]
    ↕ WiFi
[TurtleBot3 (Raspberry Pi 4)]

ROS 2 は DDS でトピックを共有します。同一サブネットにいるだけで発見される一方、ROS_DOMAIN_ID の説明 の不一致は「トピックが見えない」典型原因です。

ROS_DOMAIN_ID はホストPC と TurtleBot3 で同じ整数(0〜101)にしてください。複数人が同じ LAN で ROS 2 を動かす場合は、衝突を避ける値に変えるのが無難です。

検証環境: HostPC Ubuntu 22.04 + ROS 2 Humble / TurtleBot3 RPi4 + Ubuntu 22.04 Server + ROS 2 Humble(2026年5月時点)。

Raspberry Pi の Wi-Fi は netplan でどう設定する?

netplanを使ったWiFi設定

Ubuntu 22.04 Server では Ubuntu netplan リファレンス でネットワークを管理します。初回だけ HDMI とキーボードを繋ぐか、Imager 事前設定済みなら SSH のみで進められます。

netplanの設定ファイルを開きます:

sudo nano /etc/netplan/50-cloud-init.yaml

以下の内容に編集します:

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: true
      optional: true
  wifis:
    wlan0:
      dhcp4: true
      optional: true
      access-points:
        "あなたのSSID":
          password: "WiFiパスワード"

設定を適用します:

sudo netplan apply
YAML はインデントが構文です。タブではなくスペース2つで揃えてください。インデント崩れは netplan apply で即エラーになります。
raspi-configを使う方法(代替)

raspi-configが使える環境なら、GUIライクなメニューで設定できます:

sudo raspi-config

System Options → Wireless LAN でSSIDとパスワードを入力するだけです。

WiFi接続を確認する
ip a show wlan0

inet 192.168.x.x の行が出れば Wi-Fi 接続成功です。表示された IP をメモし、SSH の HostName に使います。


SSH でホストPCから RPi4 に接続するには?

Raspberry Pi側でSSHを有効化

Ubuntu 22.04 Server では openssh-server が入っていることが多いですが、systemctl で有効化を確認します。

# SSHサービスの状態確認
sudo systemctl status ssh

# 有効化(自動起動設定)
sudo systemctl enable ssh
sudo systemctl start ssh

Active: active (running) と表示されればOKです。

ホストPCからSSH接続

ホストPC側のターミナルで以下を実行します:

ssh ubuntu@192.168.x.x

ubuntu はUbuntu 22.04 Serverのデフォルトユーザー名です。IPアドレスは先ほど確認したものに置き換えてください。

初回接続時は以下のメッセージが表示されます:

The authenticity of host '192.168.x.x' can't be established.
ED25519 key fingerprint is SHA256:xxxx...
Are you sure you want to continue connecting (yes/no/[fingerprint])?

yes と入力してEnterを押せば接続完了です。

毎回IPアドレスを打つのが面倒な方は、~/.ssh/config に設定を書いておくと楽です。Host turtlebot3 / HostName 192.168.x.x / User ubuntu と記述しておくと ssh turtlebot3 だけで接続できます。
SSH公開鍵認証の設定(パスワード入力を省略)

パスワード入力を減らすため、ホストPC から ed25519 鍵で公開鍵認証を設定します。

ホストPC側で:

# 鍵がない場合は生成
ssh-keygen -t ed25519 -C "turtlebot3"

# 公開鍵をRaspberry Piにコピー
ssh-copy-id ubuntu@192.168.x.x

設定後は ssh ubuntu@<IP> でパスワード無し接続できることが多いです(権限・sshd_config は環境次第)。


固定 IP(DHCP 予約)はなぜ必要か?

なぜ固定IPが必要なの?

DHCP だけだと再起動のたびに IP が変わり、SSH の HostName や RViz の設定がずれます。固定 IP または DHCP 予約を推奨します。

教材でも再起動のたびに IP を探し直す負荷は大きいです。ルーターの DHCP 予約が手軽なことが多いです。

netplanで固定IPを設定
sudo nano /etc/netplan/50-cloud-init.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: true
      optional: true
  wifis:
    wlan0:
      dhcp4: no
      optional: true
      addresses:
        - 192.168.1.100/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
      access-points:
        "あなたのSSID":
          password: "WiFiパスワード"

192.168.1.100 は割り当てたいIPアドレス、192.168.1.1 はルーターのIPアドレスに変えてください。

設定を適用:

sudo netplan apply
ルーターのIPアドレスは ip route show で確認できます。default via xxx.xxx.xxx.xxx のxxx部分がゲートウェイ(ルーター)IPです。
ルーター側でDHCP予約を使う方法(もっと簡単)

固定IPの設定がよくわからない場合、ルーターのDHCP予約機能を使うのが一番簡単です。

  1. ルーターの管理画面にアクセス(例: http://192.168.1.1 ※メーカーにより異なる)
  2. 「DHCP予約」や「静的リース」の設定を探す
  3. Raspberry PiのMACアドレスと割り当てたいIPを登録

こうするとRaspberry PiはいつもそのIPアドレスをもらえるようになります。Raspberry Pi内のファイルは変更不要です。


ROS 2 の ROS_DOMAIN_ID はどう揃える?

SSH接続が確立できたら、次はROS2のネットワーク設定をしていきましょう。

ROS_DOMAIN_IDの設定

ROS_DOMAIN_ID は DDS の論理セグメントです。HostPC と TurtleBot3 で同じ値が必須です(ROS_DOMAIN_ID の説明)。

デフォルトは 0 ですが、複数人が同じネットワークを使う場合は別の値に変えましょう。

echo 'export ROS_DOMAIN_ID=30' >> ~/.bashrc
source ~/.bashrc

SSH接続したRaspberry PiのターミナルでHostPCと同じ値を設定します:

echo 'export ROS_DOMAIN_ID=30' >> ~/.bashrc
source ~/.bashrc
ROS_LOCALHOST_ONLY の設定

ROS_LOCALHOST_ONLY=1 に設定すると、ROS2通信がローカルホスト(同じPCの中)に限定されます。

TurtleBot3と通信するためにはこれを設定してはいけません。

通信できない場合、以下を確認してください:

echo $ROS_LOCALHOST_ONLY

何も表示されないか 0 であればOKです。1 の場合はunsetしましょう:

unset ROS_LOCALHOST_ONLY
# または ~/.bashrc から削除する
TURTLEBOT3_MODELも設定しておきましょうね。BurgerならHostPC側の~/.bashrcに追加: export TURTLEBOT3_MODEL=burger
/etc/hostsの設定(オプション)

IPアドレスの代わりにホスト名で通信したい場合は /etc/hosts を設定します。

HostPC側:

sudo nano /etc/hosts

以下を追加:

192.168.1.100    turtlebot3

TurtleBot3側も同様に:

192.168.1.200    hostpc

これで ping turtlebot3 や ssh ubuntu@turtlebot3 が使えるようになります。


ping と ros2 topic で疎通はどう確認する?

設定が完了したら、ちゃんと繋がっているか確認しましょう。

pingで疎通確認

HostPCからTurtleBot3(Raspberry Pi)にpingを打ちます:

ping -c 4 192.168.1.100

成功すると以下のような出力が得られます:

PING 192.168.1.100 (192.168.1.100) 56(84) bytes of data.
64 bytes from 192.168.1.100: icmp_seq=1 ttl=64 time=2.45 ms
...
4 packets transmitted, 4 received, 0% packet loss

0% packet loss が出ればネットワーク疎通はOKです

ros2 topic listでROS2通信確認(要点)

SSH と固定 IP が通ったあと、ROS_DOMAIN_ID がホスト側と TurtleBot3 側で一致していることをまず確認します。talker/listener をクロスホストで回す細かい切り分けは、turtlebot3-ros2-network-setup に寄せています。

bringup が動いている状態であれば HostPC で:

ros2 topic list

/scan や /odom などが増えるのが一般的です(構成により名称は異なります)。

/battery_state
/cmd_vel
/imu
/joint_states
/odom
/parameter_events
/rosout
/scan
/tf
/tf_static

ネットワーク・SSH でよくあるトラブルは?

pingが通らない

症状: ping 192.168.1.100 を実行してもレスポンスがない

確認ポイント:

  1. Raspberry PiがWiFiに繋がっているか確認: Raspberry Pi内で ip a show wlan0 を実行して inet アドレスが表示されているか確認
  2. IPアドレスが正しいか確認: DHCPの場合、再起動でIPが変わっている可能性あり。ip a で現在のIPを確認
  3. ファイアウォールの確認: sudo ufw status で確認。Activeの場合は sudo ufw allow from 192.168.1.0/24 で許可
SSH接続に失敗する

症状: ssh: connect to host 192.168.x.x port 22: Connection refused

# Raspberry Pi上でSSHサービスを確認
sudo systemctl status ssh
# 停止していれば起動
sudo systemctl start ssh
sudo systemctl enable ssh
ros2 topic listで何も表示されない

症状: ros2 topic list を実行しても何も出ない(または /parameter_events と /rosout しか出ない)

最頻出の原因: ROS_DOMAIN_IDが違う。

# HostPCとTurtleBot3の両方で確認
echo $ROS_DOMAIN_ID

両方同じ値になっているか確認しましょう。

2番目に多い原因: ROS_LOCALHOST_ONLY=1 が設定されている

echo $ROS_LOCALHOST_ONLY
# 1 と出れば unset ROS_LOCALHOST_ONLY で解除

3番目の原因: TurtleBot3のbringupがまだ起動していない(これは⑥で解説)

netplan applyでエラーが出る

症状: sudo netplan apply でエラーが出る

# YAMLの構文確認
sudo netplan generate

エラーメッセージを確認してYAMLのインデントを修正しましょう。tabs vs spaces 問題が非常に多いです


ネットワーク・SSH 設定の要点は?

この記事ではTurtleBot3とホストPCのネットワーク接続を確立する手順を解説しました。

  • Raspberry PiのWiFiをnetplanで設定
  • SSH接続を有効化してホストPCからリモートアクセス確立
  • 固定IPアドレスでIPアドレス変動問題を解消
  • ROS_DOMAIN_IDをHostPCとTurtleBot3で統一
  • ROS_LOCALHOST_ONLY は設定しない(マルチマシンでホスト間通信を許可)
  • ping と ros2 topic list で疎通確認

これでTurtleBot3をリモート操作する準備が整いましたね。次の記事⑥ではいよいよTurtleBot3のbringupを起動してキーボードで操縦してみましょう。🤖


この記事の検証環境は?

  • HostPC: Ubuntu 22.04 LTS + ROS2 Humble
  • TurtleBot3: Raspberry Pi 4 (4GB) + Ubuntu 22.04 Server + ROS2 Humble
  • TurtleBot3モデル: Burger