ROSでは「与えらえたゴールに移動する」というタスクに関して、モーターへの指示コマンド(抽象度が低い)から移動先のゴール(位置と姿勢)を与える(抽象度が高い)までを幾つかの抽象度に分解して実装しています。
以下の節では、抽象度の低い順に紹介されています。
7.2.1 モータ, 車輪, エンコーダ
移動ロボットの制御においては、オドメトリ(内部センサによる移動量の推定)が重要になり、エンコーダから得られるモータの回転数だけでなく、加速度計などの移動量を測定できるセンサを使うこともあります。
例えば、Turtlebotで使っているRoombaは2つのモータの回転数に加え、一軸のジャイロにより姿勢の推定精度を向上させています。
移動ロボットの一番低レベルの制御は各モータのスピードを制御することです。
車輪のモータで速度を決めだけで無く、ステアリングのモータを制御して進行方向を変えたり、パンチルト台のモータを制御してカメラが見ている方向を変えることなども含まれます。このレベルは個々のロボット毎に大きく異なります。
モータの数や車輪の大きさはモータ毎に違うので、このレベルにおいてはロボット毎に異なるドライバを実装するのが普通です。
7.2.3 ロボット台車の制御
このレベルでは上位レベルから指示された通りに台車を制御することが要求されます。
例えば、「xxメータ/秒で動かす」「xxラジアン/秒で回転させる」などをいかに正確に実現するかが求められます。
指示された制御量にスムーズに追随するため、PD制御やPID制御と言われるドライバが実装されています。
例えば、あなたのロボットが静止状態にあり、「0.5m/sec(秒速50㎝)で前に進め」という指示をしたいとします。
その時、静止状態のロボットにいきなり0.5m/secの速度指定コマンドを送るのは現実的ではありません。急発進して、場合によっては倒れてしまうかもしれません。
そこで、ROSのBase Controllerノードでは、PID制御のような手法を使って、「スムーズに」指定された速度になるまでロボットの速度コマンドを細分化します。
例えば、以下のように一定時間間隔で徐々に速度を上げていきます。
0.0m/sec ->0.05m/sec -> 0.1m/sec -> 0.15m/sec ..... -> 0.5m/sec
この base controller ノードと呼ばれるノードからは自己位置(オドメトリ)が /odom トピックとして配信され、/cmd_vel ノードでは上位レベルからの移動速度を待っています。
同時に、コントローラノードは、一般的に(常にではないが)ベースフレーム(/ base_linkまたは/ base_footprintのいずれか)へ/odmを変換しています。
TurtleBotのようないくつかのロボットでは、ロボットの位置・姿勢のより正確な推定値を取得するために、車輪のオドメトリとジャイロデータを結合するrobot_pose_ekfパッケージを使用します。この場合には、robot_pose_ekfノードが/odom から/ base_footprintに変換しています。( robot_pose_ekfパッケージは拡張カルマンフィルタにより実装されています。)
このように、自分のロボット専用の base controller ノードを作ってしまえば、後は、上位レベルのプログラミングに専念することが出来ます。
7.2.4 move_base ROS パッケージによるFrame-Base Motion
move_baseパッケージは目的地(一般的な移動ロボットでは移動先の位置・姿勢)を与えられたときに現在地から目的地まで、障害物を回避しながら経路を生成し、移動する機能を提供します。
move_baseパッケージは、非常に洗練された経路計画であり、ロボットが移動するためのパスを選択する際に、ローカルおよびグローバルなコストマップの両方とオドメトリデータを組み合わせを利用します。
7.2.5 gmapping と amcl パッケージによるSLAM
gmappingパッケージにより地図を作成します。一般に、SLAMで地図を作るにはレーザレンジファインのような正確な距離センサが必要ですが、Turtlebotに搭載のKinectやXtionでも十分な精度の地図を得ることが可能です。
地図が作れたら、amcl (adaptive Monte Carlo localization) パッケージを使い正確な自己位置・姿勢を得ることができます。
7.2.6 セマンティックゴール Semantic Goals
抽象化の最上位のこのレベルでは、
「キッチンに行って、ビールを取ってきて」
とか、もっと曖昧に
「ビールを取ってきて」
のように、実現してもらいたいGoalをロボットに指示します。
7.2.7 まとめ
[Goal]
「ビールを取ってきて」
のように、実現してもらいたいGoalをロボットに指示します。
7.2.7 まとめ
0 件のコメント:
コメントを投稿