こんにちはshotaです。このシリーズではRaspberry Pi Mouse(ラズパイマウス)でROS 2を動かしていきます。
今回はラズパイマウスのROS 2サンプル集にある、SLAM(自己位置推定と地図作成)サンプルを実行します。
前回のおさらい
前回はライントレースオプションキットを取り付けて、ラズパイマウスROS 2サンプル集にあるライントレースサンプルを実行しました。
今回もROS 2サンプル集を使用するので、下記の記事を参考にサンプル集をインストールしてください。
また、ROS 2サンプル集ではブザーを鳴らしたりモータを回したりします。
デバイスドライバも忘れずにインストールしてください。
作業に必要なもの
- Raspberry Pi Mouse V3
- 商品ページはこちら
- これまでの記事で、ROS 2 DashingをインストールしたUbuntu 18.04、をインストールしたRaspberry Pi Model 4 B、を搭載したラズパイマウスをセットアップしています
- Raspberry Pi Mouse オプションキットNo.8 [マルチLiDARマウント]
- 商品ページはこちら
- 組み付けにはプラスドライバーが必要です
- 360 Laser Distance Sensor LDS-01
- 作業用PC
- Ubuntu 18.04のPCを用意しました。ROS 2 Dashingインストール済みです。
- ゲームコントローラ
- ラズパイマウスを操作するために必要です
- Logicool Wireless Gamepad F710
- SONY DUALSHOCK 3
オプションキットの組み付け
それではマルチLiDARマウントオプションキットをラズパイマウスに組み付けましょう。
マルチLiDARマウントはURG-04LX-UG01、RPLIDAR A1、LDS-01に対応しています。
今回はLDS-01を使用します。
LDS-01のUSB変換基板を組み付ける
まず、LDS-01のUSB変換基板をLiDARマウントに組み付けます。
写真のように、マウントの裏側にタッピングネジで固定します。
LDS-01本体を組み付ける
続いて、LDS-01本体をLiDARマウントに組み付けます。
写真ではネジの種類が統一されていませんが、実際の製品では正しいネジが同封されているのでご安心ください。
4箇所をネジで固定します。
LDS-01を固定できたらUSBケーブルを接続します。
マルチLiDARマウントをラズパイマウスに組み付ける
最後にマウントをラズパイマウスに組み付けます。
まず、マウントのネジ穴がない方のツメをラズパイマウスの後側に引っ掛けます。
続いて、マウントのネジ穴がある方のツメをラズパイマウスの前側に引っ掛けます。
写真のようにツメを引っ張り・・・
引っ掛けます。
タッピングネジで固定します。
これで組み付け完了です。
SLAMサンプルを実行する
それではSLAMサンプルを実行します。
実行手順はパッケージのREADMEにも書かれています。
まず、ラズパイマウス上で、mouse_with_lidar.launch.pyを実行します。
実行すると、ラズパイマウスのノードとLDS-01のノードが起動します。
$ ros2 launch raspimouse_ros2_examples mouse_with_lidar.launch.py lidar:=lds
次に、ラズパイマウスを動かすためにjoystick_controlサンプルを実行します。
こちらは、ラズパイマウス、作業用PCのどちらで実行しても構いません。
今回は作業用PCでサンプルを実行します。
$ ros2 launch raspimouse_ros2_examples teleop_joy.launch.py joydev:="/dev/input/js0" joyconfig:=dualshock3 mouse:=true
最後にSLAMノードを起動します。
このサンプルで使用するのは、Slam Toolboxというパッケージです。
次のコマンドを作業用PCで実行します。
実行すると、Slam Toolboxのノードと、RVizが起動します。
$ ros2 launch raspimouse_ros2_examples slam.launch.py
これで準備が整いました。コントローラでラズパイマウスを動かすと、RViz上に地図が表示されます。
実際に動かしている風景を紹介したいのですが、私の自宅が見えてしまうので、代わりに次の動画をご覧ください。
1:37~ がマルチLiDARマウントとSLAM実行例の紹介です。
SLAMを成功させるための工夫
READMEの手順を実行しただけではSLAMが上手くいかないことがあります(自己位置推定がズレる、地図が崩れる等)。
その対策を紹介します。
走行速度を落とす
joystick_controlサンプルのデフォルトの走行速度は、SLAMをするには少し早いです。
走行速度を落としてみましょう。
走行速度の変更方法はサンプル集のREADMEを参照してください。
過去のブログ記事でも紹介しています。
パルスカウンタで自己位置を計算する
raspimouseノードは走行速度司令(cmd_velトピック)をもとに自己位置(odomトピック)を計算します。
ラズパイマウスの仕様上、cmd_velトピックがパブリッシュされても、ラズパイマウスがすぐに走り出さない場合があります。
このとき、ラズパイマウスは動いていなくても、raspimouseノードは「動いている」と判定するため、実際の位置とodomトピックは大きくズレます。
このズレを抑えるために、パルスカウンタを使用します。
パルスカウンタは、実際にモータへ送られたPWMパルス数をカウントするため、
より正確に自己位置を計算できます。
次のコマンドでラズパイマウス上のファイルを編集します。
$ cd ~/ros2_ws/src/raspimouse_ros2_examples/ $ vim config/mouse.yml
use_pulse_countersをtrueにしましょう。
raspimouse: ros__parameters: odometry_scale_left_wheel : 1.0 odometry_scale_right_wheel: 1.0 use_light_sensors : true use_pulse_counters : true
ノードを起動し直すとパルスカウンタが有効になります。
Slam Toolboxのパラメータを編集する
上記はラズパイマウスの設定でしたが、Slam Toolboxのノードにも設定可能なパラメータがたくさんあります。
次のコマンドで、Slam Toolboxのノードで使用されるパラメータを変更できます。
$ cd ~/ros2_ws/src/raspimouse_ros2_examples/ $ vim config/mapper_params_offline.yaml
パラメータの詳細はSlam ToolboxのREADMEを参照してください。
その他
その他、SLAMサンプルに関する情報を紹介します。
LiDARのセンサ情報をRVizに表示する
ノードを起動した後、RVizのDisplaysにある、Global Options -> Fixed Frameをlaserにすると、LiDARのセンサ情報を表示できます。
地図とLiDARのセンサ情報を同時に表示したいのですが、RVizの不具合により(2020/08/17時点では)表示できません。
もう間もなくROS 2 Dashingにも修正版がアップロードされるようです。
URGとRPLiDARへの対応について
マルチLiDARマウントはURG-04LX-UG01とRPLIDAR A1にも対応していますが、(2020/08/17時点では)SLAMサンプルはLDS-01にしか対応していません。
その理由は各センサのROS 2パッケージが無かったためです。
URGにはurg_nodeというROSパッケージが用意されています。
こちらはROS 2対応しているのですが、最近までメンテナンスされていない状態でした。
その後、パッケージのメンテナーが決まり、不具合も修正されました。
後ほどROS2 サンプル集も更新したいと思います。
RPLiDARにはrplidar_rosというROSパッケージが用意されています。
こちらはROS 2に対応していません。
しかし、RPLiDAR販売元のSlamtecのROS 2パッケージが無いだけで、
別の方が作成したROS 2対応パッケージはあります。
どうしてもROS 2でRPLiDARを動かしたい場合は、上記のパッケージを使うか、また別の方のパッケージを使うか、パッケージを自作することになると思います。
まとめ
今回は、
- ラズパイマウスにマルチLiDARマウントを取り付けました
- ラズパイマウスROS 2サンプル集のSLAMサンプルを実行しました
- SLAMサンプルを実行するための工夫や問題点を紹介しました
次回は、新しく作成するROS 2サンプルの紹介か、ROS 2サンプル集のデバッグについて記述する予定です。