AbudoriLab.

自律ロボットで誰でも遊べるよう試行錯誤するブログです。

Lidar SLAMで地図作成 -RPLidarとCartographerで地図作成-

AbudoriLab.です。
SLAMで地図を作ってみるシリーズの第2回目の記事になります。
前回ではシミュレーション環境上で地図を作成してみました。
www.abudorilab.com
今回は実機のLidar(RPLIDAR)を用いて、SLAMで地図を作成する方法をまとめます。
本記事を作成するにあたり、@youtalk様のパッケージを利用させていただきました。
github.com

SLAMの分類

SLAMは使用のセンサによって名称が異なります。
といっても接頭詞が異なるくらいで、センサがLidarであれば"Lidar SLAM", カメラであれば"Visual SLAM",depthセンサであれば"Depth SLAM"と言った具合です。
入力情報に差異があるために手法も異なりますが、大枠の手続きは同じかつ目指すところは高精度な自己位置推定と地図作成の実現になります。
各センサを使用するメリット・デメリットについては、MACNICA様がまとめてくださっているのでリンクを紹介するに留めます。
www.macnica.co.jp

RPLidar

本稿ではRPLidarと呼ばれるLidarを使用します。
RPLidarは安価なため計測能力もそれなりですが、遊ぶ程度には十分なリーズナブルな商品になります。

RPLIDAR a1m8

電源を供給するためにはMicroUSBケーブルが別途必要になります。
※スキャン情報を計算機に転送する必要があり、通信可能ケーブルなことをご確認ください。
また、基本的にはロボットに搭載するかPC片手に自身で探索して計測するかと思うので長さは1mあれば十分かと思います。

準備

実機もMicroUSBを準備出来たらパッケージのインストールを開始します。
現時点(2021/8/17)でエラーがでないことを確認できたので、みなさまもすぐに遊べるかと思います。
※ROS2はdashingを使用しています。eloquentでの準備方法を知りたい方はコメントください。
githubを使用します。

手順1: colconとrosdepのセットアップ

sudo apt install python3-colcon-common-extensions python3-rosdep python3-argcomplete
sudo rosdep init
rosdep update

手順2: パッケージをgit cloneする

好みの場所にディレクトリを作成します
mkdir -p ~/abudori_ws/src
cd ~/abudori_ws/src
git clone https://github.com/youtalk/raspimouse_ros2.git
cd raspimouse_ros2
git submodule update --init

手順3: Luaファイルを編集

cd ~/abudori_ws/src/raspimouse_ros2/raspimouse_cartographer/config/
gedit raspimouse_rplidar_a1m8.lua
以下項目のステータスを変更してください
tracking_frame = "base_footprint" -> "base_link"
publish_frame_projected_to_2d = true -> false
use_odometry = true -> false

手順4: コンパイル

cd ~/abudori_ws
rosdep install --from-paths src --ignore-src -r -y
colcon build --symlink-install
.bashrcの最下に以下の文を追加して保存してください,"~/abudori_ws”適宜変更してください
source ~/abudori_ws/install/setup.bash
source ~/.bashrc

これで準備完了です。
ここまででエラーが出た場合はコメントにお願いします。また、解決案を見つけられた際にはノウハウを共有くださるとすごく助かります!

実機(RPLidar)で地図作成

PRlidarを使用してSLAM(cartographer)で地図を作成します。

手順0: PRLidar起動

USB端子側をPCへ、microUSBをRPLidarに接続して起動します。

手順1: USBシリアル接続に書き込み権限を付与

書き込み・読み込み・実行権限が付与されずデータを通信出来ない場合があります。

バイスファイルの確認

RPLidarに繋がっているUSBデバイスのデバイスファイル名を検索します。
※複数USBが接続されている場合は抜き差し時の変化からデバイスファイル名を特定しました。(もっと、賢いやりかたがあるのでしょうが)

ls /dev/ttyUSB*
f:id:nekoze-nya:20210826202130p:plain
図3: デバイスファイル名の検索結果
権限付与

ユーザ自身のみに権限を付与しています。

sudo chmod 700 /dev/ttyUSB0

手順2: PRLidarのモデルを読み込み

rviz2で地図作成の経過を可視化されるため必要になります。

ros2 launch raspimouse_bringup robot.launch.py

手順3: SLAMを起動する

ros2 launch raspimouse_cartographer cartographer.launch.py

手順4: 地図作成

Lidarを持って部屋を探索して地図を作成してください
下画像みたく移動経路と作成途中ですが地図が作られて行く経過を観察できます。

f:id:nekoze-nya:20210818215724p:plain
図1: 実機(PRLidar)を用いた地図作成

rosbagで記録したデータを再現して地図を作成

研究・開発に取組むにあたり、最適パラメータの検討や利用する手法を選択するための性能比較を実施することになります。
その実験において、都度データを計測して評価することは非効率かつ性能比較の観点で考えても賢いやり方ではありません。
そこで、一度計測したデータを使い回せるようにデータログを保存しましょう。
ここでは、ロギングデータの取得とそのデータを入力として地図を作成する方法をご紹介します。
※ 本シリーズ記事をいちから追ってくださっている方は新たにインストールするアプリはありません。

手順0: PRLidarを起動して地図作成を開始

既に紹介済み内容なのでまとめます。

RPLidarモデルの読み込み
ros2 launch raspimouse_bringup robot.launch.py
SLAMを起動
ros2 launch raspimouse_cartographer cartographer.launch.py

手順1: ロギングデータ作成

rosbag2を用いてデータ作成を開始します。
Ctrl+Cで終了でき、カレントディレクトリに保存できます。

ros2 bag record -o [好きな名前].bag /scan

手順2: 実行中のすべてのタスクを終了して、ロギングデータを使用して地図作成を開始

PRlidar読み込みとSLAMの起動をCtrl+Cで終了させて、再実行してください。
タスクを終了させて後の手順を記載します。
USBを抜いてPRLidarへの電源供給を停止させてください。
再実行を開始します。

RPLidarモデルの読み込み

USBを抜いたことでエラーを出しますが、地図は作成できますので気にしないで下さい。

ros2 launch raspimouse_bringup robot.launch.py
SLAMを起動
ros2 launch raspimouse_cartographer cartographer.launch.py

ロギングデータを再生して地図が作成され始めたことをrvizで確認してください。

ロギングデータの再生
ros2 bag play [保存した名前].bag


以上が実機のLidarを使って地図を作成する方法となります。

おわりに

次回は、ロボットを使って計測したデータを計算用のPCに送り地図を作成する方法についてご紹介いたします。
手を動かしてSLAMで遊んでみる本シリーズは次の記事が最後になるかと思います。