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

入力を変えて確かめる

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

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

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

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

前提と読み方

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

実装・実験 · 本文の条件と確認項目に沿って、計算例や比較表を追う。

ブラウザで固定入力の再生条件を調べる

上のパネルで、時刻源、headerのずれ、QoSの信頼性、再生するTFを変えて比較します。これは合成データの再生監査です。ROS・DDS・tf2・自己位置推定・ロボットのシミュレータではありません。bagファイルを開かず、実機にも接続しません。下のROSコマンドは、別途実環境で確認する場合の手順です。

毎回、bagの記録時刻が10.0–12.0秒、間隔が0.2秒の11個のscanを使います。入力の odom → base_link は9.8–12.2秒に0.2秒間隔で収録済みという設定です。実測値ではなく教材用の固定データです。時刻ずれの操作はscanのheaderだけに加算し、bagの記録時刻とTFの時刻を変えません。センサの時刻設定が違う入力を表すもので、rosbag2の再生オプションではありません。再生経過時間は (記録時刻 − 10秒) / 再生倍率。2倍速では再生の幅が1秒になりますが、headerの時刻域は変わりません。

四つの確認を分ける

  1. モデルでの受信: publisherが提供する信頼性とsubscriberが要求する信頼性を別々に選びます。提供がbest effort、要求がreliableの場合は非互換で、それ以外の3通りは互換です。topic名・型・他のQoS設定は適合していると仮定します。この無損失モデルでは互換なら全scanを受信します。実際のbest effort配信の保証、rosbag2が自動選択するQoS、キュー・deadline・lifespan・探索・遅れて参加する購読者は再現しません。
  2. 入力TFの収録範囲: scanのheaderが収録済みの入力TFの時刻範囲内かを確認し、端点も含めます。全記録に対する監査なので、モデルでscanを受信しない場合も計算します。tf2の実行中のキャッシュ、到着順、補間、待機、callback時点の参照可否は扱いません。範囲内でも実際のlookup成功を意味しません。
  3. ノード時刻との差: 再生時計では、各scanより先に /clock を受信し、その最新値がscanのbag時刻と一致すると仮定します。システム時計は教材用の1000秒から再生経過時間だけ進みます。use_sim_time を設定してもclockを未受信ならノード時刻は0で、差の確認は未評価となり「—」を表示します。初期化済みの場合は |ノード時刻 − scan header| ≤ 150 ms を数えます。この対称な範囲は教材の確認基準で、ROSの有効性規則、tf2の許容値、推定ノードのtimeoutではありません。受信やTF収録範囲とは別に計算します。
  4. TFの配信元: 評価する推定ノードが map → odom を出す設定です。「入力TFのみ」は記録済み odom → base_link を残します。「記録TFをすべて再生」は記録済み map → odom も加えて配信元を二つにします。「記録TFをすべて除外」は必要な入力側も取り除きます。数値は設定上の配信元数で、推定結果ではありません。二重配信の実際の挙動や静的TFのdurabilityは再現しません。

初期状態をAに保存し、Bで2倍速、headerを+400 ms、clockなし、QoS不一致、TF選択を試してください。A/Bの図は同じ軸範囲を使います。+400 msでは最後のscanがTF収録範囲を超え、全11個が教材の時刻差基準から外れます。clock未受信の件数は0ではなく未評価です。どちらも軌跡誤差の予測ではありません。表とJSONには各scanの記録時刻、header、再生経過、ノード時刻と独立した確認結果を残します。

参照資料と範囲

2026-09-20に rosbag2 Jazzy README、Jazzy playerのオプション、Jazzy QoS資料のソース、ROSの時計設計、Jazzy tf2時刻チュートリアルのソース、REP-105を確認しました。このLabのためにROS環境を実行したわけではありません。

A/Bは毎回初期化します。スケジューリング、通信損失、推定器の内部状態、時刻巻き戻り、複数clock配信元、キャリブレーション、静的TF、地図精度、閉ループ走行は対象外です。軌跡誤差は別の SLAM評価Labで扱います。ブラウザの確認は以下の実環境での再生確認を置き換えません。

不具合が出るたびに同じ場所を走り直すと、入力も設定も変わってしまう。rosbag2は入力を保存して比較の土台を作れる。ただし、ログを再生すればロボット全体が同じ動作をするわけではない。本記事はROS 2 Jazzyの一次資料に照らした手順で、実機・ROS環境での走行検証は行っていない。

最初に比較する境界を決める

例として、LiDARと車輪オドメトリを入力にする自己位置推定ノードを比較する。保存するのは入力の/scan、/odom、必要な/tf・/tf_staticである。推定ノードの出力は正解ではなく比較対象として別に保存する。画像を使う場合は画像だけでなく対応するCameraInfoも必要になる。

rosbag2のJazzy READMEで記録・情報表示・QoS上書きを確認した。調査日は2026-09-07。インストール済みパッケージの差を把握するため、ros2 bag record --helpとros2 bag play --helpの出力、パッケージのバージョンを実験記録へ残す。

記録と設定の保存

以下のtopic名とノード名は例である。既存の名前をros2 topic listとros2 node listで調べ、入力が配信されている状態で実行する。

ros2 topic info /scan --verbose
ros2 bag record -o replay-input --topics /scan /odom /tf /tf_static

記録はCtrl+Cで正常終了し、別のコマンドで確認する。

ros2 bag info replay-input
ros2 param dump /localizer > localizer-A.yaml

ノード名/localizerは自分の対象に置き換える。パラメータだけでなく、launchファイル、地図、URDF、外部キャリブレーション、ソフトウェアのコミット、開始姿勢も保存する。bag infoのメッセージ数が非ゼロでも、障害が起きた時間帯に必要な入力がそろっているとは限らない。各センサの時刻差と欠測区間も見る。

再生時の時刻とTFを一つにする

図1 · ボタンで表示を切り替え
入力記録から比較までの手順

ライブの入力配信を止めた解析環境で、対象ノードとRVizにuse_sim_time=trueを設定する。対象ノードの起動方法はパッケージごとに異なる。起動後、次のように再生する。

ros2 bag play replay-input --clock 100 --rate 1.0

--clockは再生時刻の供給に使う。Jazzyのplay実装でオプションを確認できる。シミュレータなど別の/clock配信元を同時に動かさない。記録時にシミュレーション時刻を使う場合の--use-sim-timeと、再生時の--clockは役割が異なる。

特に注意したいのは/tfに複数の変換が混ざる点である。評価対象がmap→odomを新しく出すなら、記録済みmap→odomを同時に再生してはいけない。一方、入力として必要なodom→base_linkは残す必要がある。topic全体を除くだけでは分離できないことがあるので、記録時点で出力を分けるか、変換ごとのフィルタを用意する。座標フレームの役割はREP-105を参照する。

表示されないときの切り分け

症状 先に調べるもの
bagにはあるのに受信しない topic名、型、購読側と再生側のQoS
点群だけ出て位置が飛ぶ 同じTFを配信するノードが二つないか
過去・未来へのTF参照エラー headerの時刻、use_sim_time、TFの収録範囲
2回目の再生だけ違う フィルタの内部状態、地図、時刻巻き戻りへの対応

QoSは配信の信頼性や履歴保持の設定である。むやみに全topicをreliableへ変更せず、topic info --verboseから互換性を確認する。必要なtopicだけにQoS上書きYAMLを適用する。静的TFのdurabilityを変える場合は、遅れて参加した購読者への配信も確認する。

AとBを比較する実験票

Aを終了して状態を初期化し、設定一項目を変えたBを新しく起動する。bag、再生速度、開始姿勢、地図、処理対象の時間範囲を同じにする。出力軌跡、処理遅延、入力欠測、失敗時刻を残し、「最後まで動いた」だけを評価にしない。乱数やスレッドの順序による差があるため、同条件の反復も必要である。

この比較は固定した観測への反応を調べるものだ。制御出力が変われば本来の次の観測も変わるので、記録済みセンサ入力による再生だけで閉ループの走行性能を証明できない。

完了の判定

必要な入力を受信し、同じ変換の配信元が一つで、時刻が整合し、AとBの違いを設定の差として説明できれば比較の準備ができた。SLAM評価へ進み、軌跡の時間合わせと誤差計算を追加する。

関連して読む

再生した出力を同じ時間範囲で評価する。SLAMの精度をどう測るか — ATE・RPE・処理時間と失敗例同じ分野を別の観点から読むICPはなぜ失敗するのか同じ分野を別の観点から読むROS 2で地図作成から自律走行まで — Jazzy・Nav2の最小再現手順