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

入力を変えて確かめる

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

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

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

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

前提と読み方

前提知識 Nav2の起動とRViz表示ができ、TFと速度指令を理解していること。

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

ブラウザでフットプリントの幾何を比較する

上のパネルで長方形の長さ・幅、通路幅、向き、横方向の位置を変更します。図と符号付き隙間は、無限に続く平行な2つの壁と正確な長方形の幾何計算です。ROSやローカルPythonは不要です。下に残した診断手順とは別の計算例です。

基準点は長方形の中心です。世界座標のxは通路方向、yは横方向、正の角度は+xから反時計回り。長さLは機体x方向、幅Bは機体y方向。壁はy=±W/2、中心は(0,e)です。角度θに対する横方向の占有幅は S=L|sin θ|+B|cos θ|。上側の隙間は W/2−e−S/2、下側は W/2+e−S/2、最小値は W/2−|e|−S/2。正は離れている、ゼロは接触、負は壁の領域との重なりを表します。一般の多角形間距離やコストマップ出力ではありません。接触表示の数値許容差10⁻¹² mは計算誤差用で、運用上の余裕ではありません。

初期値は幅0.60 m、通路幅0.80 m、角度と横ずれゼロで、両側の隙間は0.10 mです。30度、横ずれ0.10 m、90度、広い通路を比較してください。正面向きで収まっても、回すと角が壁に重なる場合があります。A/Bは共通の表示範囲でxとyを等縮尺にし、表には4頂点の世界座標をm単位で示します。

茶色の破線の半径は R=√(L²+B²)/2。中心を固定して1回転したときの全姿勢を包む円です。その全回転における最小隙間を W/2−|e|−R で解析的に計算します。角度のサンプリングによる近似ではありません。特定の角度までの旋回、計画した軌跡の掃引領域、車両が実行できる動作を表すものではありません。90度の姿勢が収まっても途中の姿勢で重なる場合があります。長方形を想定外形の全体とし、追加のパディングはありません。

入力範囲は教材用の仮定です。地図セル、障害物観測、インフレーションのコスト、位置推定誤差、積載物、TF、プランナ、コントローラ、速度指令、Nav2実行は含みません。正の隙間から通行可能性や安全性は判定できません。円は説明用の包絡で、robot_radiusの設定推奨ではありません。Nav2 tuning guide は外形とインフレーションを区別し、Inflation Layer parameters はここで計算しないコストを説明しています。参照確認日: 2026-09-20。

指定した地図・姿勢・ゴールの確認は別のナビゲーションLabへ。実際の停止原因を調べる手順は下へ続きます。

経路の線が見えるのにロボットが進まないときは、計画と実行を分けて調べる。経路が存在しても、現在の車体姿勢から実行できる速度指令があるとは限らない。対象はROS 2/Nav2 Jazzy。以下は公式資料を基にした診断手順で、実機走行を検証した記事ではない。

まず同じ停止場面を保存する

停止時のglobal path、local/global costmap、footprint、TF、オドメトリ、速度指令、アクションの結果とログをそろえる。RVizでは同じ時刻・同じ座標で重ねて見る。起動直後と数秒後の画面を比較して原因を断定しない。rosbag2の再生手順を使うと、入力条件をそろえやすい。

図1 · ボタンで表示を切り替え
Nav2の停止を切り分ける四段階

車体が通る幾何条件を確認する

幅0.60 mの車体を幅0.80 mの通路へ正対させると、中心にある場合の左右の余裕は0.10 mずつである。これは静的な寸法計算にすぎず、位置推定誤差、壁の厚みの表現、積載物、旋回時の張り出しは含まない。長方形は向きが変わると必要な幅も変わる。

footprintは車体外形の多角形、robot_radiusは円による近似に使う。入力した寸法とRViz上の輪郭を比較し、メートル単位、base_linkからの原点、センサや荷物の突き出しを確認する。Nav2のチューニングガイドでは車体形状とコスト場を扱っている。停止を消すために実物より小さい輪郭へ変更してはいけない。

コストは物理的な壁と同じではない

障害物レイヤーは観測を地図へ反映し、inflationは障害物周辺に距離に応じたコストを広げる。inflation_radiusはその広がり、cost_scaling_factorは減衰の速さに関係する。ほかの条件が同じなら、scalingを大きくすると距離による指数減衰が速くなる。Inflation Layerの説明を参照する。

高コストの帯をすべて「絶対に入れない領域」と読むのも、inflation_radiusをそのまま車体の最低離隔距離と読むのも正確ではない。衝突判定、車体外形、各planner/controllerのコスト利用を合わせて考える。global mapは通れてもlocal mapに古い障害物が残るなら、センサのclearing、観測範囲、TFの有効時刻を先に確認する。

経路から実行可能な動きへ

経路は通る場所を示す。controllerは現在速度や運動制約を考えて次の指令を作る。狭い場所で大きく向きを変える、最小旋回半径がある車体にその場回転を求める、加速度制限で候補が実行できない、といった不一致が停止につながり得る。

Controller Serverの資料で、選択中のcontroller・progress checker・goal checkerを確認する。progress checkerは進捗、goal checkerは到達を判定する仕組みであり、単に同じ「止まる設定」ではない。プラグイン名とエラーメッセージを記録してから、そのプラグインの制約を読む。

指令がどこで消えるかを追う

観察 次の確認
controllerが有効な指令を作れない local costmap、TF、運動制約、候補軌道の評価
controllerの出力は非ゼロ、最後の出力はゼロ velocity smoother、collision monitor、手動停止、優先順位切替
最後の出力も非ゼロ、車輪は動かない topic名・型、driver、enable状態、制御モード
動くがすぐに失敗扱いになる odometryと実際の移動、progress checkerの条件

/cmd_velという名前だけで最終段と決めつけない。構成によって中間topicがあり、TwistとTwistStampedも異なる。ros2 topic info <実際のtopic名> --verboseで配信元・購読先・型を追う。停止機能を解除して診断するのではなく、どの条件が成立して停止したかをログで確認する。

変更を一つずつ判定する

通路、開始姿勢、目標、地図、入力ログを固定し、一項目だけ変更する。到達の有無に加えて、最小離隔、停止回数、指令、失敗理由を比較する。本記事の0.10 mという計算から安全な余裕値を決めることはできない。実機の寸法と誤差、利用環境に基づく別の確認が必要である。

起動そのものが不安定なら、先にNav2の最小構成へ戻る。構成が安定してから診断を始めると、地図の問題とドライバの問題を混ぜずに説明できる。

関連して読む

同じ停止区間を保存して設定比較に使う。rosbag2でロボットの不具合を再現する同じ分野を別の観点から読むICPはなぜ失敗するのか同じ分野を別の観点から読むロボットの座標変換入門