ロボット研究開発、ソフトウェア開発、コンテンツ制作配信

【自律型ロボット製作記】#9 gmappingとlaser_scan_matcherでSLAMを試してみた


前回の記事(自律型ロボット製作記#8)で、amcl+laser_scan_matcherを試しましたが、次は、gmapping+laser_scan_matcherでSLAM(地図作成+自己位置推定)を試してみます。

スポンサーリンク

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(レーザースキャナ)を使ったロボットの自己位置推定アルゴリズムを整理すると、以下のようになります。

Lidar(レーザースキャナ)を搭載したロボット(ホイールオドメトリ、IMUなどは無し)
○地図生成と自己位置推定を同時に行いたい場合
gmapping + laser_scan_matcher ←今回は試すのはこちら
or
hector_slam

○事前に作成した地図で自己位置推定を行いたい場合
amcl + laser_scan_matcher

動かしてみる

動作環境

システム構成は以下です。
・センサー:RPLiDAR A1M8 レーザースキャナ
・Ubuntu18.04
・ROS melodic
※ROS hector_slamが動作する自律ロボットで動かす。
(詳細は、過去の自律ロボット製作記記事を参照ください)
「ロボット製作記」に関する記事

gmappingのインストール

gmappingをインストールします

$ sudo apt-get install ros-melodic-gmapping

laser_scan_matcherはすでにインストール済です。
※詳細は、前回記事を参照ください。
【自律型ロボット製作記】#8 amclとlaser_scan_matcherで自己位置推定を試す

gmappingのlaunchファイルを作成

gmapping用のlaunchファイル(gmapping.launch)を作成します。

configフォルダにパラメータ用のyamlファイル(gmapping.yaml)を作成します。
※パラメータの意味は調査中。

実行してみる

まず、roscoreの立ち上げ、rplidarノードを立ち上げます

$ roscore
$ roslaunch rplidar_ros rplidar.launch

前回amclのときに作成したlaser_odometory.launchを起動し、今回作成したgmapping.launchを立ち上げます

$ roslaunch laser_odometry.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位置を推定する

   

スポンサーリンク

いいね!を押すと、
最新記事をお届けします。

Twitter で
関連記事(一部広告含む)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


ページトップボタン