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

30代エンジニアの備忘録

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

🤖 【TurtleBot3 ROS2環境構築⑦】SLAMで地図作成 - slam_toolboxとRViz2で部屋の地図を作る

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

(2026年5月時点)前回は TurtleBot3 を bringup し、キーボード操縦と RViz2 で LiDAR 可視化まで完了しました。本記事は TurtleBot3 × ROS 2 Humble シリーズの第7回で、SLAM 地図作成がゴールです。

今回はその続きとして、いよいよSLAMで部屋の地図を作るところまで進めます。

SLAMは「ロボットが自分の位置を推定しながら、同時に地図も作る」ための技術です。最初は少し難しそうに見えるけど、TurtleBot3なら slam_toolbox とRViz2を組み合わせることで、実機を走らせながら地図が伸びていく様子を体験できます。初めて同期すると、LiDAR と地図の対応が視覚化されるので理解の助けになります。 参考:slam_toolbox(ROS 2)


この記事で何がわかる?

  • TurtleBot3実機でSLAMを始めるための起動順序
  • slam_toolbox とRViz2の起動方法
  • キーボード操縦で地図をきれいに作るコツ
  • 作成した地図を map_saver_cli で保存する方法
  • SLAM中によく出るトラブルと確認ポイント
💡
この記事ではROS2 Humble、TurtleBot3 Burger、ホストPCとTurtleBot3実機が同じWi-Fiで通信できている状態を前提にしています。まだbringupやteleopが動いていない場合は、先に前回の記事までを確認してください。 参考:ROS 2 Humble ドキュメント

今回の作業は、bringup、SLAM起動、RViz2確認、ゆっくり走行、地図保存という流れで進めます。先に全体像を図でつかんでおくと、複数ターミナルで何を動かしているのか迷いにくくなります。

TurtleBot3でSLAM地図作成を行う作業フロー
TurtleBot3でSLAM地図作成を行う作業フロー

SLAM では何が起きている?

SLAMでは、TurtleBot3がLiDARで壁や障害物を見ながら、オドメトリで「自分がどれくらい動いたか」を推定します。

ざっくり言うと、次の3つを同時に見ています。

  • /scan: LiDARの距離データ
  • /odom: タイヤ回転から推定した移動量
  • /tf: map、odom、base_footprint などの座標変換
flowchart LR
    A["LiDAR<br>/scan"] --> D["slam_toolbox"]
    B["Odometry<br>/odom"] --> D
    C["TF<br>robot frames"] --> D
    D --> E["Map<br>/map"]
    D --> F["map to odom TF"]
    E --> G["RViz2で表示"]

最終的に /map というトピックに地図が配信され、RViz2上で白黒の占有格子地図として見えるようになります。

下の図のように、TurtleBot3から出てくる /scan、/odom、/tf を slam_toolbox が受け取り、RViz2の表示と地図ファイルの保存につながっていきます。

TurtleBot3、slam_toolbox、RViz2、地図保存の関係図
TurtleBot3、slam_toolbox、RViz2、地図保存の関係図

Step 1:SLAM 開始前の確認手順は?

まずは前回と同じく、TurtleBot3が正常に動く状態かを確認します。

ホストPC側
export TURTLEBOT3_MODEL=burger
printenv TURTLEBOT3_MODEL
printenv ROS_DOMAIN_ID
TurtleBot3側

SSHで接続して確認します。

ssh turtlebot3
printenv TURTLEBOT3_MODEL
printenv ROS_DOMAIN_ID

両方の ROS_DOMAIN_ID が一致していることを確認してください。ここがズレていると、SLAM以前にトピックが見えません。

必要パッケージの確認

ホストPC側で slam_toolbox と地図保存用パッケージが入っているか確認します。

ros2 pkg prefix slam_toolbox
ros2 pkg prefix nav2_map_server

見つからない場合はインストールします。

sudo apt update
sudo apt install -y \
  ros-humble-slam-toolbox \
  ros-humble-nav2-map-server
💡
slam_toolbox はホストPC側で動かすのがおすすめです。TurtleBot3のRaspberry Pi 4でも動かせますが、RViz2も同時に使うため、まずはホストPCで処理した方が安定します。

Step 2:TurtleBot3 を bringup する方法は?

TurtleBot3側のSSHターミナルで、前回と同じbringupを起動します。

# TurtleBot3側
ros2 launch turtlebot3_bringup robot.launch.py

別のホストPCターミナルで、トピックが見えているか確認します。

ros2 topic list

最低限、次のトピックが見えていればSLAMに進めます。

/scan
/odom
/tf
/tf_static

LiDARが動いているかも確認しておきます。

ros2 topic hz /scan

average rate が表示され続ければOKです。TurtleBot3 BurgerのLDS系LiDARなら、だいたい5Hz前後で見えることが多いです。


Step 3:slam_toolbox を起動する方法は?

ホストPC側の新しいターミナルで slam_toolbox を起動します。

# ホストPC側
export TURTLEBOT3_MODEL=burger
ros2 launch slam_toolbox online_async_launch.py use_sim_time:=false

正常に起動すると、/map やSLAM関連のサービスが立ち上がります。

ros2 topic list | grep map

次のようなトピックが見えれば良い流れです。

/map
/map_metadata
💡
実機で動かすので use_sim_time:=false にします。Gazeboなどのシミュレーションでは true を使うことがありますが、実機SLAMではここを間違えると時間が進まず、地図が更新されない原因になります。

Step 4:RViz2 で地図を表示する方法は?

SLAMが起動したら、RViz2で地図を見ます。

# ホストPC側の別ターミナル
rviz2

RViz2が開いたら、左側のDisplaysで次を設定します。

  • Fixed Frame: map
  • Add -> Map -> Topic: /map
  • Add -> LaserScan -> Topic: /scan
  • Add -> TF
  • Add -> RobotModel

もしRobotModelがうまく表示されない場合は、まずMapとLaserScanだけでも大丈夫です。SLAMの確認では、地図が伸びていくことが一番大事です。

RViz2の見え方
  • 白い領域: ロボットが通れると推定した空間
  • 黒い線: 壁や障害物
  • 灰色の領域: まだ観測していない場所
  • 赤や緑の点群: LiDARが検出している現在の障害物

最初はTurtleBot3の周囲だけが小さく表示されます。ロボットをゆっくり動かすと、地図がじわじわ広がっていきます。


Step 5:teleop で地図を作るコツは?

ホストPC側の別ターミナルで、キーボード操縦を起動します。

ros2 run turtlebot3_teleop teleop_keyboard

SLAM中は、速く走らせるよりもゆっくり・一定速度・広く見渡すことが大切です。

おすすめの動かし方はこんな感じです。

  • 最初はその場でゆっくり左右に回転して、周囲の壁を認識させる
  • 壁に沿ってゆっくり前進する
  • 急旋回や急停止を避ける
  • 同じ場所に戻って、地図のズレが小さくなるか確認する
  • 狭い通路では特に速度を落とす
💡
SLAM中に机の脚や椅子など細い障害物が多い場所を高速で走ると、地図が歪みやすくなります。最初の1回は、障害物を減らした部屋で試すのがおすすめです。

Step 6:地図の品質を確認する方法は?

地図ができてきたら、保存する前に品質を見ます。

チェックポイントは次の通りです。

  • 壁が二重線になっていないか
  • 直線の壁が大きく曲がっていないか
  • スタート地点に戻ったとき、地図が自然につながっているか
  • 未観測の灰色領域が多すぎないか
  • ロボットの位置がRViz2上で大きく飛んでいないか

特に、部屋を一周してスタート地点付近に戻ったときに地図がきれいにつながると、かなり良い状態です。ここでズレが大きい場合は、もう一度ゆっくり走らせるか、最初から作り直した方が後のNav2で楽になります。


Step 7:地図を保存する手順は?

納得できる地図ができたら、ホストPC側で保存します。

mkdir -p ~/turtlebot3_maps
ros2 run nav2_map_server map_saver_cli -f ~/turtlebot3_maps/my_room

成功すると、次の2ファイルが作成されます。

~/turtlebot3_maps/my_room.yaml
~/turtlebot3_maps/my_room.pgm

yaml は地図のメタ情報、pgm は実際の白黒画像データです。

ls -l ~/turtlebot3_maps

my_room.yaml の中身も確認しておきます。

cat ~/turtlebot3_maps/my_room.yaml

代表的には次のような内容になります。

image: my_room.pgm
mode: trinary
resolution: 0.05
origin: [-2.1, -3.4, 0]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.25

resolution: 0.05 は、1ピクセルが5cmを表すという意味です。TurtleBot3の屋内ナビゲーションでは、このくらいの解像度が扱いやすいです。


Step 8:保存した地図を確認する方法は?

保存した地図画像は、通常の画像ビューアでも確認できます。

xdg-open ~/turtlebot3_maps/my_room.pgm

もし画像ビューアで開けない場合は、ImageMagickなどでPNGに変換してもOKです。

sudo apt install -y imagemagick
convert ~/turtlebot3_maps/my_room.pgm ~/turtlebot3_maps/my_room.png
xdg-open ~/turtlebot3_maps/my_room.png

白い場所が走行可能領域、黒い場所が壁や障害物です。ここで地図が斜めに大きく歪んでいたり、壁が二重に見えたりする場合は、Nav2での自己位置推定が不安定になりやすいです。


よくあるトラブルと対処方法は?

/map が出てこない

まず slam_toolbox が起動しているか確認します。

ros2 node list | grep slam

次に、SLAMに必要な入力が届いているか確認します。

ros2 topic hz /scan
ros2 topic echo /odom --once
ros2 run tf2_tools view_frames

/scan、/odom、/tf のどれかが欠けると地図は作れません。

RViz2でFixed Frameエラーが出る

RViz2のFixed Frameを map にします。それでもエラーが出る場合は、slam_toolbox が map フレームを出していない可能性があります。

ros2 topic echo /tf --once

map、odom、base_footprint のつながりがあるか確認します。

地図がぐにゃっと歪む

よくある原因は、ロボットを速く動かしすぎていることです。

  • 速度を落とす
  • 急旋回を避ける
  • 床でタイヤが滑っていないか確認する
  • バッテリー電圧が低すぎないか確認する
  • 最初にその場回転して周囲を観測する
ros2 topic echo /battery_state --once
地図保存でエラーになる

map_saver_cli が入っていない可能性があります。

ros2 pkg prefix nav2_map_server
sudo apt install -y ros-humble-nav2-map-server

保存先ディレクトリの権限も確認します。

mkdir -p ~/turtlebot3_maps

今回使った ROS 2 コマンド一覧

# TurtleBot3側
ros2 launch turtlebot3_bringup robot.launch.py

# ホストPC側: SLAM
export TURTLEBOT3_MODEL=burger
ros2 launch slam_toolbox online_async_launch.py use_sim_time:=false

# ホストPC側: RViz2
rviz2

# ホストPC側: teleop
ros2 run turtlebot3_teleop teleop_keyboard

# ホストPC側: 地図保存
mkdir -p ~/turtlebot3_maps
ros2 run nav2_map_server map_saver_cli -f ~/turtlebot3_maps/my_room

まとめ:Nav2 に進む前に押さえること

  • TurtleBot3実機で slam_toolbox を起動できた
  • RViz2で /map、/scan、TFを見ながら地図作成できた
  • teleopでゆっくり走らせると、地図の品質が上がることがわかった
  • map_saver_cli で yaml と pgm の地図ファイルを保存できた
  • 次回のNav2自律走行に使うための地図が準備できた

これで、TurtleBot3が「ただ動く」状態から、「自分の周囲を地図として理解する」状態まで進みました。次回はいよいよ、この地図を使ってNav2の自己位置推定とゴール指定ナビゲーションに挑戦します!