目次 — 知りたいところから読む

入力を変えて確かめる

実験パネルを開き、実行を押すとPythonを読み込みます。停止と初期値へのリセットができます。結果はこの端末内で計算します。Pythonのインストールは不要です。

下にあるローカル実行の手順は、配布ソースを再現するための任意の手順です。ブラウザ実験には不要です。

実験パネルを別タブで開く

再現用ソースをダウンロード

前提と読み方

前提知識 Labはブラウザで実行。任意の実環境手順にはUbuntu 24.04・ROS 2 Jazzy・TFの知識。

実装・実験 · 公式資料を確認した再現手順。この記事作成時のGazebo実行・実機走行は未実施。

最初のNav2実験では、独自ロボットの設定をすべて同時に持ち込まず、公式のTurtleBotシミュレーションで「地図を作る」と「保存済み地図で移動する」を分けて確認する。2026年9月7日時点のJazzy向け資料に基づく手順であり、この執筆環境ではGazeboを起動していない。

環境と版を記録する

対象はUbuntu 24.04、ROS 2 Jazzy、対応するGazebo環境。ROS 2導入済みのGUI端末で、Nav2 Quickstartに従って必要なパッケージを準備する。Humble向けGazebo Classicの手順とは混ぜない。

source /opt/ros/jazzy/setup.bash
sudo apt update
sudo apt install ros-jazzy-navigation2 ros-jazzy-nav2-bringup ros-jazzy-slam-toolbox ros-jazzy-nav2-minimal-tb3-sim
dpkg-query -W ros-jazzy-navigation2 ros-jazzy-nav2-bringup ros-jazzy-slam-toolbox ros-jazzy-nav2-minimal-tb3-sim
ros2 launch nav2_bringup tb3_simulation_launch.py --show-args

インストール時の版を記録し、slam、map、use_sim_time引数があることを確認する。Jazzyのlaunchファイルを対応する資料として読む。

地図作成モードで起動する

図1 · ボタンで表示を切り替え
シミュレータ、SLAM Toolbox、Nav2を接続して地図を保存し、再起動後にAMCLを使う

実機と通信しない専用のROS環境で起動する。以下のROS_DOMAIN_IDは例であり、同じIDの実機が存在しないことを確認する。以後、新しい端末でも同じ設定を使う。

source /opt/ros/jazzy/setup.bash
export ROS_DOMAIN_ID=73
ros2 launch nav2_bringup tb3_simulation_launch.py slam:=True headless:=False use_sim_time:=True

公式SLAM手順ではSLAMが/mapとmap → odomを提供する。このモードへAMCLを別途追加して、同じTFを二重に配信しない。

小さいゴールで地図が更新されるかを見る

別端末で環境を読み込み、export ROS_DOMAIN_ID=73を設定してから確認する。

ros2 topic list
ros2 topic hz /scan
ros2 run tf2_ros tf2_echo map base_link

RVizで地図、LaserScan、ロボットの位置が対応していることを確認する。まず既に観測できている近い自由空間へNav2 Goalを置き、到達したら隣の領域へ進む。未知領域の奥をいきなり指定して経路が出ないことと、SLAMが動いていないことを混同しない。

地図を保存して再起動する

同じ環境の別端末で、新しい作業フォルダへ地図を保存する。mapは保存ファイルの名前であり、既存の地図を上書きしない名前を選ぶ。

mkdir -p nav2-map-lab
cd nav2-map-lab
ros2 run nav2_map_server map_saver_cli -f map --ros-args -p use_sim_time:=true

生成されたmap.yamlと、それが参照する画像の両方を保持する。元のlaunchをCtrl+Cで止めて終了を待ち、nav2-map-labフォルダから保存地図で起動する。

ros2 launch nav2_bringup tb3_simulation_launch.py slam:=False map:="$PWD/map.yaml" headless:=False use_sim_time:=True

RVizの2D Pose Estimateでシミュレータ上の現在位置・向きを指定する。その後、近いゴールを指定し、経路の生成と到達を確認する。保存地図モードは地図を更新するSLAMモードと役割が異なる。

失敗を境界ごとに切り分ける

症状 先に確認すること
ロボットや世界が表示されない シミュレータの起動ログとモデルの導入
地図が出ない /scan、SLAMノード、シミュレーション時計
TFが見つからない ノード間のdomain、時刻、frame名
保存地図で位置が合わない YAMLの画像参照と初期位置・向き
経路が出ない ゴールが既知の自由空間内か、車体の大きさを含めて通れるか

各段階で使用した版、起動コマンド、地図、成功・失敗のログを残す。newbotの実装記録は3D LiDARと別のオドメトリ構成を含むため、この最小手順からの変更点を一つずつ追って読む。

関連して読む

動いた後の精度を評価するSLAMの精度をどう測るか — ATE・RPE・処理時間と失敗例同じ分野を別の観点から読むICPはなぜ失敗するのか同じ分野を別の観点から読むロボットの座標変換入門