【自律型ロボット製作記】#9 gmappingとlaser_scan_matcherでSLAMを試してみた
前回の記事(自律型ロボット製作記#8)で、amcl+laser_scan_matcherを試しましたが、次は、
gmappingとは?
gmappingはRBPF(Rao-Blackwellized ParticleFilter)-SLAMの代表例です。
PF(Particle Filter)には次元の呪いの問題があり、ロボット位置と地図をPFで推定すると、次元の指数乗で計算量が増加してしまいます。
そこでRBPF-SLAMはロボット位置と地図を分離して、位置推定のみにParticle Filterを使用し、地図推定は他の手法で解析的に求めます。1個の仮設(パーティクル)に1個の地図を割り当てているイメージです。
引用:Google Cartographerとgmappingの比較
詳細は勉強中ですが、
gmappingは、パーティクルフィルタを用いたアルゴリズムであり、amclとの違いは、地図データをinputするかoutputするかの違いのようです。
なので、現状のrplidarだけしかない私のロボットでもlaser_scan_matcherを使うことで、gmappingを動かせるのでは?と思ったのが今回のきっかけです。
※ずっと、gmappingは、wheel odometryなどの情報を使わないと使えないと思ってましたので。
自己位置推定アルゴリズムの整理
Lidar(レーザースキャナ)を使ったロボットの自己位置推定アルゴリズムを整理すると、以下のようになります。
○地図生成と自己位置推定を同時に行いたい場合
gmapping + laser_scan_matcher
or
hector_slam
○事前に作成した地図で自己位置推定を行いたい場合
amcl + laser_scan_matcher
動かしてみる
動作環境
システム構成は以下です。
・センサー:RPLiDAR A1M8 レーザースキャナ
・Ubuntu18.04
・ROS melodic
※ROS hector_slamが動作する自律ロボットで動かす。
(詳細は、過去の自律ロボット製作記記事を参照ください)
「ロボット製作記」に関する記事
gmappingのインストール
gmappingをインストールします
laser_scan_matcherはすでにインストール済です。
※詳細は、前回記事を参照ください。
【自律型ロボット製作記】#8 amclとlaser_scan_matcherで自己位置推定を試す
gmappingのlaunchファイルを作成
gmapping用のlaunchファイル(gmapping.launch)を作成します。
1 2 3 4 5 6 7 8 9 10 11 |
<launch> <!-- gmapping --> <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" clear_params="true"> <rosparam command="load" file="$(find inobo_navigation)/config/gmapping.yaml" /> <!-- <remap from="scan" to="front_laser/scan" /> --> <param name="base_frame" value="/base_link" /> <param name="odom_frame" value="/odom" /> <param name="map_frame" value="/map" /> </node> </launch> |
configフォルダにパラメータ用のyamlファイル(gmapping.yaml)を作成します。
※パラメータの意味は調査中。
1 2 3 4 5 6 |
map_update_interval: 1.0 temporalUpdate: 1.0 xmin: -4.0 xmax: 4.0 ymin: -4.0 ymax: 4.0 |
実行してみる
まず、roscoreの立ち上げ、rplidarノードを立ち上げます
前回amclのときに作成したlaser_odometory.launchを起動し、今回作成したgmapping.launchを立ち上げます
$ roslaunch gmapping.launch
rvizを立ち上げデバッグします。以下のようにマップを生成しながら自己位置が推定できていることが確認できました。
odometory座標系が随時補正されていき、大きく自己位置がずれることもなく初期位置に戻ってくれました。
hector_slamと厳密に比べてはいませんが、同等レベルの精度ではないかと思います。
(hector_slamは一度位置がずれると地図がぐちゃぐちゃになることがありますが、今回試したgmapping+laser_scan_matcherのほうが随時マップとマッチングするので、もしかしたら、精度は良いかもしれません。)
ただし、直線廊下などでは、やはりLidarのみでは位置がズレやすい気がしました。このあたりはホイールオドメトリも組み合わせて推定しないと厳しいかもしれません。
最後に
今回は、gmapping + laser_scan_matcherによるSLAMを試してみました。
様々な自己位置推定アルゴリズムが自ロボットに適用できることはわかってきました。
しかし、単にブラックボックス的に使うだけでは、様々な環境下での自己位置推定は厳しいと予想します。
ということで、これまで実験してきたamcl やgmappingなどの仕組みを掘り下げて理解していこうと思います。
参考
以下のサイトを参考にさせていただきました。ありがとうございます。
ROS講座91 Laserでmap位置を推定する
スポンサーリンク