移動ロボット
車輪型ロボットがどのように動き、目的地までの道を見つけるか。差動駆動・アッカーマン・全方向移動の運動学、map・odom・base_linkの座標系、Nav2スタック、倉庫のフリートを協調させる方法を解説します。
概要
移動ロボットは、作業空間を自ら持ち運びます。固定されたベースと到達可能な領域を持つ代わりに、世界の中での位置姿勢を持ち、それを推定しなければなりません。さらに、周囲で人やパレットが動く中で経路を計画し、それに沿って走行する必要があります。このハブでは、平らな床を走る車輪型ロボットを扱います。車輪配置が運動をどう制約するか、ナビゲーションスタックをどう組み上げるか、倉庫で自律移動ロボット(AMR)のフリートをどう協調させるかを説明します。ベースの立ち上げ、ナビゲーションの調整、現場へのロボット導入を担当するエンジニア向けの内容です。
重要な考え方
車輪配置が運動学を決める
差動駆動ロボットは、1本の車軸上に2つの駆動輪を持ちます。車輪半径をr、トレッド幅をL、左右の車輪角速度をωR、ωLとすると、前進速度はv = r(ωR + ωL)/2、旋回角速度はω = r(ωR − ωL)/Lです。その場で旋回できますが、横方向には移動できません。これは非ホロノミック拘束であり、プランナはこれを守る必要があります。自動車のようなアッカーマンステアリングは、自転車モデルでよく記述できます。最小旋回半径はホイールベースを最大操舵角の正接で割った値です。そのため、その場で旋回できず、切り返しのための空間が必要です。メカナムホイールやオムニホイールを使う全方向移動ベースはホロノミックです。回転しながら任意の方向に並進できますが、その代償として、ローラが滑り、摩耗し、汚れた床ではトラクションを失います。車輪速度を積分するとオドメトリが得られます。ただし、車輪の滑りやr・Lの誤差のため、ドリフトは際限なく大きくなります。
座標系:map・odom・base_link
REP 105は、ROS 2のナビゲーションコードの多くが前提とする3つの座標系を定めています。ロボット本体はbase_linkで、x前方、y左、z上です。odom座標系は連続的ですがドリフトするため、短期的な局所制御に向いています。map座標系はドリフトしませんが、自己位置推定器が補正を行うと、その中での位置姿勢が跳ぶことがあります。そのため長期的な目標には向いていますが、コントローラの基準としては不適切です。自己位置推定器がmapからodomへの変換をパブリッシュし、オドメトリ源がodomからbase_linkへの変換をパブリッシュします。新しいベースを立ち上げるとき、最初の仕事はtf2を通じてこのツリーを正しく構成することです。
ナビゲーションスタック
Nav2は、Macenskiら(2020)が説明したROS 2のナビゲーションスタックです。ナビゲーションを複数のサーバに分割し、ビヘイビアツリーでそれらを協調させます。粒子フィルタであるAMCLのような自己位置推定器が、事前に作成した占有格子地図上で位置姿勢を推定します。あるいは、同時自己位置推定と地図作成(SLAM)のシステムが、走行しながら地図を作ります。グローバルプランナは地図上で経路を求めます。コントローラは、直近のセンサデータから作るローカルコストマップを使い、毎秒何回もその経路に追従します。Nav2には複数のコントローラが付属しています。DWB(Fox、Burgard、Thrunが1997年に発表した動的ウィンドウ法に従うROS 1のDWAコントローラの後継)、Regulated Pure Pursuit、MPPIなどです。ビヘイビアツリーは、進行が止まったときの対応を決めます。コストマップのクリア、後退、待機、再計画のいずれかです。
倉庫AMRとフリート
何もない床を走る1台のロボットは、ナビゲーションの問題です。通路・エレベータ・ドアを人と共有する50台のロボットは、交通の問題です。フリートマネージャは、ジョブを割り当て、経路や交差点を予約し、ロボットを充電に向かわせます。ロボットとこの層の間のインタフェースには、2つのオープンな取り組みがあります。VDA 5050は、ドイツ自動車工業会VDAがVDMAおよびカールスルーエ工科大学と共同で策定したもので、中央のフリートコントローラと異なるメーカーの車両との間のメッセージを定義しています。本稿執筆時点で、GitHubリポジトリで公開されている最新版はバージョン3.0.0です。Open Roboticsが開発するOpen-RMFは、複数のフリートを、ドアやエレベータなど建物の共用設備と協調させます。
どこから始めるか
まず差動駆動から始めてください。上記の運動学を導出し、シミュレーションします。センサとノイズではオドメトリがドリフトする理由を示し、グリッド上の経路計画ではグローバルプランナを作ります。差動駆動A*プロジェクトは、これらをカルマンフィルタと組み合わせます。ROS 2については、Hello ROS 2と状態推定のハブから始めてください。
ツールとプラットフォーム
| ツール | 用途 | ライセンス |
|---|---|---|
| Nav2 | ROS 2のナビゲーション:自己位置推定、プランナ、コントローラ、ビヘイビアツリー、ドッキング | 混在:パッケージごとにApache-2.0、BSD-3-Clause、LGPL-2.1-or-later |
| slam_toolbox | ROS 2向けの2D LiDAR SLAMと自己位置推定 | LGPL-2.1 |
| robot_localization | 拡張カルマンフィルタ(EKF)とアンセンテッドカルマンフィルタ(UKF)による、オドメトリ・慣性計測装置(IMU)・GPSの融合 | BSD-3-Clause |
| ros2_controllers | 差動駆動・アッカーマン・三輪・メカナム・オムニホイールの駆動コントローラ | Apache-2.0 |
| Open-RMF | 複数フリートの交通管理と建物設備との統合 | Apache-2.0 |
| VDA 5050 | フリートコントローラと車両の間のインタフェース仕様とJSONスキーマ | MIT(リポジトリ) |
よくある間違い
- ベースコントローラに設定した車輪半径やトレッド幅が間違っている。5 m直進させ、その場で10回転させてから、測定した誤差をもとに両方を補正してください。
- ベースコントローラとEKFのように、2つのノードから同時に
odomからbase_linkへの変換をパブリッシュする。各変換を所有するノードは必ず1つにしてください。 - ローカルコントローラを
map座標系で動かし、自己位置推定の補正のたびにロボットがガクッと動く。 - コストマップをロボットの半径分だけ膨張させ、ロボットが角をこする理由がわからない。安全マージンを加え、実際のフットプリントをモデル化してください。
- 誰もいない廊下でナビゲーションを調整する。人が通り過ぎる場面、ガラス壁、狭いドアでテストしてください。
- 3台目のロボットが届くまで、フリートマネージャを不要なものとして扱う。
さらに深く
- REP 105、Coordinate Frames for Mobile Platforms。
- Macenskiら、The Marathon 2: A Navigation System、2020年、およびNav2のドキュメント。
- Fox、Burgard、Thrun、The dynamic window approach to collision avoidance、IEEE Robotics and Automation Magazine、1997年。
- Lynch、Park、「Modern Robotics」、Cambridge University Press、2017年。車輪型移動ロボットを扱う第13章と、ノースウェスタン大学の講義資料。
- VDA 5050仕様のリポジトリとOpen-RMFプロジェクト。