ここ数年はROS2にも取り組んでいます。ということで本記事は、以下の自社サイトで公開している下記記事の 要約版 です。
まず「なぜ ROS2 の動作がこう見えるのか」という前提を整理し、 その後ターミナルだけで /cmd_vel と /odom の関係を体感します。
🔗 前提の解説(座標系・オドメトリ・変換)
https://independence-sys.net/main/?p=7363🔗 実践編(ノードを動かしながら理解する)
https://independence-sys.net/main/?p=7373
ROS2 は
「動かしてみたけど、何が起きているのか分からない」
という壁に当たりやすいミドルウェアだと思います。
特に、
-
/cmd_velを送っているのに、なぜこう動くのか -
/odomの数値が何を意味しているのか - rviz で見ているけど、結局よく分からない
と感じたことがある方は多いのではないでしょうか。
※ rviz は、ROS2 が扱っている座標系や自己位置、センサーデータなどを
3D/2D で可視化するための公式ビジュアライザです。
この記事では、rviz を使わず、
ターミナルに表示される数値とログだけを使って、
-
/cmd_velと/odomの関係 - ロボット目線とワールド座標の違い
を体感的に理解することを目的にします。
最低限の前提(考え方だけ)
ROS2 では、次のような役割分担があります。
-
/cmd_vel
→ ロボット目線の速度命令(前進・回転) -
/odom
→ ワールド座標系で表現された自己位置の結果
重要なのは、
同じ動きでも「どの視点で見るか」で意味が変わるという点です。
-
/cmd_velは「ロボットから見た命令」 -
/odomは「世界から見た結果」
この視点の違いをつなぐのが「変換」です。
ここでの変換は、数学的な厳密さよりも
**「どう見たいか」「どう使いたいか」**という
アプリケーション都合の問題だと考えれば分かりやすくなります。
(この考え方の詳細は自社サイトの記事で整理しています)
仮想オドメトリで関係を単純化する
今回は、実センサーや実機は使いません。
代わりに、
-
/cmd_velを受け取る - 速度を時間で積分する
- 「完璧に命令通り動いたとした場合の自己位置」を
/odomとして出す
という 仮想オドメトリノードを使います。
これにより、
- センサー誤差
- ハードウェア依存
- ノイズ
を一切考えずに、
/cmd_vel → /odom の関係だけに集中できます。
ターミナルで「分かる瞬間」
構成はとてもシンプルです。
- teleop で
/cmd_velを送る - 仮想オドメトリで
/odomを生成する -
/odomを subscribe して、人間向けに解釈して表示する
odom_analyzer_node では、
ワールド座標系で表現された移動量を
ロボットの向きを使って「前進/後退」「左/右旋回」に変換し、
ターミナルに 1行で状態を表示します。
実際に操作すると、
- 前進キー →
FORWARDと表示され、x が増える - 後退キー →
BACKWARDと表示され、x が減る - 左旋回 →
LEFT - 右旋回 →
RIGHT
という対応関係がそのまま確認できます。
ここで初めて、
「ああ、
/cmd_velの命令が
こうやって/odomの数値になっているのか」
という感覚がつかめます。
rviz を使わない理由
rviz はとても便利ですが、
最初から使うと「結果」しか見えません。
- なぜそう見えるのか
- どの視点で見ているのか
- 数値がどう変換されたのか
が分からないまま「分かった気」になりがちです。
今回のように、
- 数値
- ログ
- 1行の表示
だけで確認すると、
後から rviz を見たときに
「rviz が何を可視化しているのか」がはっきりします。
再現用コード(GitHub)
今回使用したコードは GitHub にまとめています。
仮想オドメトリと解析ノードを含む最小構成です。
(ROS2の環境が出来ていればですが) clone → build → run ですぐ試せます。
まとめ
-
/cmd_velはロボット目線の命令 -
/odomはワールド座標での結果 - 変換は「数式」より「視点の違い」
- rviz は理解した後に使うと強力
ROS2 は、
開発現場のエンジニアにとっては「勉強するもの」ではなく
「動かしながら理解するもの」 だと感じています。
このアプローチが、
ROS2 を触り始めたエンジニアの助けになれば幸いです。