🤖 【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中によく出るトラブルと確認ポイント
今回の作業は、bringup、SLAM起動、RViz2確認、ゆっくり走行、地図保存という流れで進めます。先に全体像を図でつかんでおくと、複数ターミナルで何を動かしているのか迷いにくくなります。
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の表示と地図ファイルの保存につながっていきます。
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 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 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中は、速く走らせるよりもゆっくり・一定速度・広く見渡すことが大切です。
おすすめの動かし方はこんな感じです。
- 最初はその場でゆっくり左右に回転して、周囲の壁を認識させる
- 壁に沿ってゆっくり前進する
- 急旋回や急停止を避ける
- 同じ場所に戻って、地図のズレが小さくなるか確認する
- 狭い通路では特に速度を落とす
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の自己位置推定とゴール指定ナビゲーションに挑戦します!