シミュレータ上のラズパイマウスを動かす方法 Part6
Last updated
Last updated
Part6では測域センサ(URG)を用いてSLAMを行っていきましょう。
URGとは、北陽電気株式会社さんから発売されている測域センサで、前方240°を検出できます。
公式サイト : URG-04LX-UG01
SLAMとは、Simultaneous Localization and Mappingの略で、自己位置推定と地図生成を同時に行うものです。
SLAMにはLIDER(Light Detection and Ranging)呼ばれるセンサを使用します。 上記のURGもLIDERの一種です。
SLAMを行うときはtfとscanという2つのデータが必要になります。
ロボットを動かす上で必要になる、ロボットの位置姿勢や座標を変換したり配信しているトピックです。 ロボットの移動量(odometry, odom)から座標変換したパラメータを使用します。 tf
トピックで配信しています。
URGから取得できるセンサ値を含まれているトピックです。scan
トピックで配信しています。
自己位置推定と地図生成を同時に行っています。 地図生成に関してはtf
トピックとscan
トピックから、地図を生成するためのmap
データを生成しています。
SLAMによって出来たmap
データから地図画像(.pgm
)と地図データ(.yaml
)を生成しています。 他に地図画像(.pgm
)と地図データ(.yaml
)より地図情報をmap
トピックで配信することが出来ます。
まずURGを動かすためのROSパッケージをインストールします。 すでにurg_node
をインストールしている場合は行わなくて大丈夫です。
次に、SLAMのROSパッケージをインストールします。
最後にmap_server
をインストールしましょう。
以上で準備完了です。
URGを使用するには先程インストールしたurg_node
が必要になりますが、Gazeboを起動すると同時に起動します。
URG付きラズパイマウスは以下のコマンドで起動します。
tfの相対座標変換の見てみましょう。
odom
から座標変換されてbase_link
になり、さらに座標変換して枝分かれしてることがわかります。 これらの情報をtf
トピックは配信しています。
次にURGから配信されるセンサ値を確認してみましょう。
センサ値は/scan
トピックで配信されます。
と打ち、/scan
トピックがあることを確認し、
と打つと、数字がたくさん表示されると思います。
上に遡って見てみると以下のようになっています。
画像の ranges: [inf,inf, ... ]の部分がセンサ値になります。カンマで区切られている値1つ1つがセンサ値で、URGが検出できる前方240°分あります。
センサ値が大きいほどURGと壁や物との距離が遠く、値が小さいほど距離が近いです。また遠すぎするとinf(infinity)が出ます。
センサ値の可視化にはRvizというGUIツールを使用します。 Rvizの起動には以下のコマンドを使用します。
起動したら、Fixed Frameのurg_lrf_linkに変更します。
次に画面左下のAddを押しBy display typeのLaserScanを追加し、Topicを/scanにします。
起動時のシミュレータは以下の図のようになっています。 上のRvizの図と見比べると、赤い点群がシミュレータの壁と対応していることがわかります。
gmappingはSLAMのアルゴリズムの1つで、正確に地図作成するために様々なパラメータを設定する必要があります。パラメータはlaunchファイルに記述します。
今回は、raspimouse_sim_gmapping.launch
という名前にします。
チュートリアルのコントローラを用いたラズパイマウスの動かし方で使用した、ロボットをコントローラで動かすためのlaunchファイルを起動しています。
urg_node
を起動するための記述ですが、 urg_node
はGazeboの起動と同時に立ち上がるため、コメントアウトしています。
Rvizを起動します。 今回はgmapping用のRvizの設定(gmapping.rviz)を作っておいたので、こちらを使用します。
ここでgmappingのパラメータの設定をしています。
base_frame
はロボットのメインフレームでbase_link
、 odom_frame
はオドメトリのフレームでodom
を設定しています。
maxUrange
でURGの最大測定範囲を設定しています。
xmin
とymin
、xmax
、ymax
で地図の大きさを設定しています。
以下の4つはそれぞれオドメトリの誤差の設定をしています。この値が大きすぎても小さすぎても正確な地図は出来ません。今回はすべて0.1にしました。
srr
:移動したときの移動の誤差
srt
:移動したときの回転の誤差
str
:回転したときの移動の誤差
stt
:回転したときの回転の誤差
particles
はパーティクルの数を設定しています。この値が大きいほど正確な地図ができやすいですが、計算量が増えてしまいます。今回はデフォルトの30にしました。
まず以下の2つを起動させます。
起動したら、コントローラを使用してラズパイマウスを動かして地図を作っていきます。 初期位置にいる部屋を壁に沿って一周してみましょう。
一周させたら地図を保存しましょう。下のコマンドではroomという名前で保存しています。
YouTubeで公開しています。
[Raspberry Pi Mouse Simulator] チュートリアルPart6 測域センサ(URG)を用いたSLAMの行い方