2010年5月21日金曜日

gmapping + Roombaでマップができた

おひさしぶりです。

ようやくマップができました。

(自宅の地図大公開です。)
上側がキッチン、下がリビングダイニングです。
左側には広大な部屋がたくさんありますが、あまり遠くにいかせてもあれなので、
今回は自宅のごく一部の地図としました。

(本当は段差があるので、段差なしの領域だけとしてみました。)
(本当は部屋を片付けるのが面倒なので、ここだけです。)



ルンバから取得するオドメトリの値は全然実世界と合わないので、
距離は8倍、角度は3倍しました。
するとちょうどよさげです。
謎ですが気にしない。気楽にやります。

なぜ今まで、オドメトリとレーザーをやってきたか、というとgmappingを使ってマップを作るためです。

この二つがあればマップを自動作成することができます。


http://www.ros.org/wiki/navigation/Tutorials/RobotSetup/Odom

をよく読んで自分のロボットのオドメトリをpublishします。
TFの形と、nav_msgs/Odometryの形の2つでpublishします。

Odometryのデバッグはrvizを使いました。

そしてgmappingを使います。
http://www.ros.org/wiki/slam_gmapping/Tutorials/MappingFromLoggedData

基本的にはロボットを動かす前に、

$ rosbag record -a -O map
などとして、トピックをすべて記録。


そして、その状態でロボットを動かします。

で、できたmap.bagファイルをslam_gmappingに食わせます。

$ rosparam set use_sim_time true
して、rosbagでの再生にgmappingを対応させて、
$ rosrun gmapping slam_gmapping
でgmappingを起動。

$ rosbag play map.bag
でトピックを再生します。

rosbagは非常に便利です。テストにも必須な気がします。

gmappinはパラメータがいろいろありますが、デフォルトの設定で一応できたのでよしとします。

再生が終わってから
$ rosrun map_server map_saver
とすると安定版マップがmap.pgm/map.yamlとして取ってこれます。
$ rosrun map_server map_saver static_map:=dynamic_map
とすると、現状の最新マップが取ってこれます。

やっとマップができましたので、次回はこれを使っていよいよ自律移動です!

1 件のコメント: