ルンバをPythonで動かしてみました(その2) (おおたfab 第46回 素人でもロボットをつくりたい)

Roomba

おおたfabさんでは、「素人でもロボットをつくりたい」という勉強会を定期的に行っています。前回はルンバのシミュレータでPythonプログラムの動作を確認し、ルンバ実機で動かすことに成功しました。今回はゴールを設定してシミュレータの動きとルンバ実機の動きを比較してみます。

roomba_serialport.jpg

今回もdemura.netさんの記事を参考にして進めています。

この記事ではいくつか課題が出されています。今回は以下の2つに挑戦してみます。

  • 正方形を描く:1辺がx[m]の正方形の軌跡を描くようにロボットを動かそう。
  • 円を描く:半径x[m]の円の軌跡を描くようにロボットを動かそう。

正方形を描く

ルンバで正方形を描いてみます。各自でプログラムを書いてもらったので2つのものができました。

それぞれ、Gazeboでシミュレートしてみます。

move4.pyは方向転換で少しずれてしまいます。

move4k.pyは動きは遅いですが、まあまあの動きをしています。

実機でmove4k.pyを動かしてみます。

このように実機では角で回転しすぎてしまい、90度の予定が120度ぐらい回ってしまいました。これは回転時間の管理が正確でないためだと思われます。回転動作に100回トピックを送っていますが、ここで発生する誤差が蓄積されたのかもです。

実は実機ではmove4.pyがまだ良い正方形を描いてくれました。動画を撮り損ねたので次回撮ってきます。

円を描く

ルンバで円を描いてみます。ルンバのノードにトピックとしてx=速度v[m/s]とz=角速度ω[rad/s]を送ります。

  • 360度=2πラジアン
  • 角速度ω[rad/s]=角度(回転角)θ[rad]/時間t[s]
  • 周速度v[m/s]は、v=rω(半径×角速度)

例えば、半径1mの円を描くためには、x=ω、z=ωを設定すればよいことになります。半径2mの円を描く場合は、x=2ω、z=ωです。これをプログラムに組み込みます。

Gazeboでシミュレートしてみると、きれいな円を描きます。

これは実機でも同様で正しい半径できれいな円を描きます。

このように連続した動きというのは再現しやすいようです。

ルンバらしい動きをしてみる

2つの課題以外にも実機でのセンサーを試してみることにします。

ルンバにはバンパーというセンサーが全面についています。ここにモノがぶつかるとセンサーがONとなり、それをノードで拾うことができます。ぶつかったらバックすればルンバらしい動きができるはずです。

Gazeboでシミュレートしながらプログラムを書いてみました。

しかし実機ではスムーズな動きにはなりませんでした。

Gazeboで確実にバックさせるようにトピックを送る周期を長めにした影響のようです。もう少し短周期になるようにプログラムの工夫が必要です。

まとめ

ある程度の動作はルンバに行わせることができるようになりましたが、以下の注意点がわかりました。

  • シミュレータとしてGazeboはありますが、実機の動きとはやや異なるため、ある程度の動きを確認した時点で、実機を使っての確認が必要。
  • トピックを発行する周期を長くした場合はスムーズな動きができないので、短い周期でトピックを送ることでスムーズな動きにできる。
  • 時間の扱いが極めて重要。少しでもずれると回転しすぎるなど、想定外の動きになる。

今回わかったことをプログラムに取り込むことと、オドメトリ (odometry)という自分の位置情報も取得できるようなので、このあたりを組み合わせることで精度があがるのではと思います。次回はこのあたりを工夫してチャレンジしてみます。

タイトルとURLをコピーしました