ここでは、ロボット(ルンバ)を移動台車として移動させる方法を説明します。
このライブラリでは、ロボットの走行軌跡を座標系上の直線、および曲線で指示します。
例えば、座標系の X 軸に沿ってロボットを走行させたい場合の C++ コードは以下のようになります。
この処理は、ロボットがエンコーダ情報を用いた自己位置を元に実現されています。また、自己位置を推定しているため、ロボットの現在位置を取得することも可能です。
このページでは、ロボットの移動させるときに用いる主なコマンドを紹介していきます。
ここで紹介していないコマンドについては hrk::Roomba_driver をご覧下さい。
ロボットの自己位置を取得します。
位置は、二次元座標系の X, Y および向きの3つの値で構成されます。
自己位置の初期値は (0, 0, deg(0)) で、原点上で X 軸の方を向いた状態です。 また、取得できる自己位置はエンコーダ情報を元に推定された位置なため、走行距離が長くなるにつれて実際の位置とは、ずれてきます。
以下は、直進しながら自己位置を表示するサンプルです。(完全なソースコード print_position.cpp)
ロボットに停止するよう指示します。
ただし、ロボットは急には止まれないため停止コマンドを発行してから停止するまで少し時間がかかります。 wait_stable() で待機することにより、実際に停止した状態になります。
直線の経路を走行させる場合、その直線は座標系で指定します。
ここでは、直線追従の使い方を示すために、直角に交わる経路の走行を2通りの方向で実装します。
曲り角で減速して一旦停止し、そこで 90 度だけ転回してから、再度走行する方法です。
このコマンドの処理を状態遷移図で表現すると、以下のようになります。
これらの処理を実現する C++ コードは、以下のようになります。
曲り角で停止せずに、弧を描きながら次の直線に追従する方法です。
直線追従コマンドを発行すると、ロボットは漸近しながら指示された直線に走行しようとするよう実装されているため、このような軌跡は、2つめの直線追従コマンドを適切なタイミングで発行すると実現できます。
以下に、状態遷移図とプログラムを示します。
走行させる円の軌跡は、円の中心と半径の長さを指定することで行います。また、半径の値が正の値のときは反時計回りで、半径の値が負のときには時計回りで走行します。
follow_circle.cpp より抜粋
座標系上のどの方向を向くかを指定します。 hrk::Run_drive::spin() が移動する角度幅を指定するのに対し hrk::Run_driver::spin_to_direction() では、向かせたい方向を指定します。
ロボットが時計回りと反時計回りのどちらで指定した方向を向くかは、ロボットの状態に依存して決まります。
どれだけ回転するかを指定します。360 [deg] 以上の回転が指定できるので、ぐるぐると向きを変え続けるような行動を実現できます。
spin.cpp より抜粋
ロボットを後ろに進ませるには、並進速度を負の値にして移動コマンドを発行します。
back_line.cpp より抜粋
back_circle.cpp より抜粋