シミュレータ上のラズパイマウスを動かす方法 Part6
ラズパイマウスを動かすまでの流れ
Part6では測域センサ(URG)を用いてSLAMを行っていきましょう。
URGとは、北陽電気株式会社さんから発売されている測域センサで、前方240°を検出できます。
公式サイト : URG-04LX-UG01

SLAMについて
SLAMとは、Simultaneous Localization and Mappingの略で、自己位置推定と地図生成を同時に行うものです。
SLAMにはLIDER(Light Detection and Ranging)呼ばれるセンサを使用します。 上記のURGもLIDERの一種です。
SLAMを行うときはtfとscanという2つのデータが必要になります。
大まかな流れ

tf
ロボットを動かす上で必要になる、ロボットの位置姿勢や座標を変換したり配信しているトピックです。 ロボットの移動量(odometry, odom)から座標変換したパラメータを使用します。 tfトピックで配信しています。
scan
URGから取得できるセンサ値を含まれているトピックです。scanトピックで配信しています。
SLAM
自己位置推定と地図生成を同時に行っています。 地図生成に関してはtfトピックとscanトピックから、地図を生成するためのmapデータを生成しています。
map_server
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のパラメータを設定
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にしました。
SLAMを行う
まず以下の2つを起動させます。
起動したら、コントローラを使用してラズパイマウスを動かして地図を作っていきます。 初期位置にいる部屋を壁に沿って一周してみましょう。
一周させたら地図を保存しましょう。下のコマンドではroomという名前で保存しています。
実行結果

行っている様子
YouTubeで公開しています。
[Raspberry Pi Mouse Simulator] チュートリアルPart6 測域センサ(URG)を用いたSLAMの行い方
Last updated
Was this helpful?