日記 ---自己位置推定の実機実装
Sun Aug 9 21:25:51 JST 2015 (modified: Sun Oct 1 10:50:27 JST 2017)
views: 2473, keywords:プログラミング,パーティクルフィルタ,C++,C/C++,Raspberry,研究,確率ロボティクス,自己位置推定 この記事は最終更新日が7年以上前のものです。
必要に迫られ、およそ10年数ぶりに実機用のパーティクルフィルタのコードを書いています。売るものではないので公開してますが、ロボットの場合、ハードウェアが違うとコードがそのまま使えないのであまり反響はありません・・・が、ロボットは日経Linuxの連載で使っているRaspberry Pi Mouseで市販品なので、ちゃんとお化粧して教科書書いて小銭を稼ぐ使ってもらうのが目標です。
Raspberry Pi Mouseの自己位置推定コードをゴリッゴリに開発中。 自己位置推定のコードをひと通り作ってログを使って動作確認済み。週明け実機でオンラインで実験。 日経Linuxの連載もどうぞ。 https://t.co/sRjfBYVfod
— Ryuichi Ueda (@ryuichiueda) August 9, 2015
リポジトリを見ても、「ああC++だなあ(逃げよう)」ということくらいしか分からんのでここに何やってるか書いておくと、次の写真のような環境で、ロボットに地図をもたせて、地図のどこにロボットがいるのか自分で把握させるコードを書いています。センサ情報はロボット前面の四つの赤外線センサから得られます。また、ロボットがどれだけ動いたかはモータへの指令から求めることができますが、壁に接触しながら動くと訳の分からん挙動を示すので大変です。
ロボットは次のような地図を持っています。ロードした地図をテキストで描画する確認用プログラムの出力を示します。シェル芸でしょうか。いいえ、C++です。
uedambp:map ueda$ ./main ./map | head -n 15
+---+---+---+---+
| | |
+ + + + +
| | |
+ + + + +
| | |
+---+ +---+---+
| | |
+---+---+---+---+
この出力をFacebookに貼りつけたら「Rogueみたい」というコメントを書き込むおじさまがたがたくさん釣れたんですが、さあなんのことやら。
今日と明日はロボットのいる大学に行けないのでロボットへの行動指令とセンサの値のログを採取して開発中ですが、とりあえずそれっぽいものができましのでgifアニメをはりつけます。
作っているコードはパーティクルフィルタというものです。地図の上にロボットの分身(ブツブツ)をばら撒いて、行動とセンサの履歴が説明できない分身を殺しまくって、説明できるやつを増やしてロボットの実際の位置に分身の位置を寄せていきます。
上の実行例は実際のロボットの位置を書き込んでないのですが、最終的にはロボットの最後の位置近くにブツブツが固まりました。
まだなんのことかサッパリ分からんと思いますが、続きは某所での講義で。分かってる人には「壁にぶつかったあとのパーティクルの挙動のモデル化が難しかったけど適当な方法でもうまくいった」とお伝えします。
寝る。