おおたfabさんでは、「素人でもロボットをつくりたい」という勉強会を定期的に行っています。前回はシミュレータで動きとルンバ実機の動きを比較してみましたが、動きが大きく異なることがわかりました。今回はオドメトリ(Odometry)情報を取得して、細かい動きを比較してみることで、どのようにプログラムをすれば正確な動きになるのかを考えてみます。

今回もdemura.netさんの記事を参考にして進めています。
オドメトリ情報を取得してみる
オドメトリとは車輪の移動量や回転角度などから、自分の位置を推定する手法です。シミュレータであるGazeboやルンバの実機ではこのオドメトリ情報を取得することができます。これを取得して比較することで、どのようなプログラムを書けばいいのかを考察するのが目的です。
demura.netさんの記事にサンプルプログラムとして、odometry.py があります。これをmoveパッケージにコピーして動かすことにします。
ルンバ実機はRaspberry Pi 4で動かします。条件を同じにするためにGazeboシミュレーターもRaspberry Pi 4で動かしてオドメトリ情報を取得します。
ルンバを動かすプログラムは前回作成した正方形を描くためのプログラム move4k.py を使用します。
Gazeboシミュレータでオドメトリ情報を取得する
以下の手順で進めます。
- Raspberry pi 4でGazeboシミュレーターの起動 以下のコマンドを入力する。 $ roslaunch ca_gazebo create_empty_world.launch
- 別ターミナルでOdometryのログをとる。 $ roscd move $ rosrun move odometry.py > odometry_log.txt
- 別ターミナルでmove4k.pyを動かす。 $ roscd move $ rosrun move move4k.py
ログはこのような内容で出力されます。
| |
ルンバ実機でオドメトリ情報を取得する
以下の手順で進めます。
- Raspberry Pi 4をシャットダウンして、電源にモバイルバッテリーを接続して起動します。
- https://github.com/docofab/RoombaControlls/blob/main/ROS/instructions/setup-real-roomba-rasppi.md に従って実機が動くようにします。
- USBシリアル基板でルンバに接続します。
- ルンバドライバを動かします。 roslaunch ca_driver create_2.launch
- Raspberry Pi 4にsshログインしてOdometryのログをとります。 $ roscd move $ rosrun move odometry.py > odometry_roomba.txt
- Raspberry Pi 4にsshログインしてmove4k.pyを動かします。 $ roscd move $ rosrun move move4k.py
ログはこのような内容で出力されます。
| |
実際に動作している様子です。
取得したデータの比較
取得したデータをCSVフォーマットに置換して、Googleスプレッドシートに読み込みました。
まずはX,Yの情報をプロットしてみます。横軸がX座標、縦軸がY座標です。1mの正方形を描くようにプログラムしているので、正確に動いた場合はX軸、Y軸ともに0~1の範囲になります。
Gazeboシミュレーター

Gazeboシミュレーターではある程度正確な動きをしていますが、完全とはいえません。角が正確に曲がれていないのがわかります。
ルンバ実機

同じプログラムを使っているのですが、実機はシュミレーターとはかなり異なる動きになっています。角で曲がるところで大きくずれが生じています。
次に曲がるときに重要となる角速度θの情報をプロットしてみます。横軸は時間でms。縦軸がθです。90°の場合θは1.57radですから、斜めになっている部分が1.57増加することで90°回転していることになります。
Gazeboシミュレーター

ルンバ実機

シミュレーターはある程度正確な動きに見えますが、ルンバ実機はばらつきがあるように見えます。またタイムラインも異なるように見えます。この差は何なのかもう少し調べてみる必要がありそうです。
まとめ
やはり実機は床面を動くこともあり、シミュレーターのように毎回正確には動きません。各角で直角に動くようにオドメトリ情報で判断して補正すれば正確に動かないでしょうか。次回はそれを試してみます。
