AbudoriLab.

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

SLAM用のセンサデータを取ろう!【つくチャレ2024-3】

Abudoriです。今回はGLIMを自分の環境で使用するためのセンサの準備を行います。 センサデータの型が合っていれば、かなり制限の少ない優しいSLAMになっていると実感しました。以前より断然ハードルが下がっておりますので、皆さんもレッツトライです!この記事で敷居を下げることができたら幸いです。

GLIMのインストール方法はこちら www.abudorilab.com

スポンサードリンク

センサの準備

GLIMをつかってSLAMをする上で必要なセンサは、

  • 3Dな距離センサ
  • IMU

の2つです。必ずしも回転式3D LiDARを使用しなくてならないというわけはありません。他にも様々な3Dなセンサを利用することができます。

今回の環境はUbuntu22 ROS 2はHumbleを利用しました(GLIMを動かす環境ではなく、計測用PCの環境でやっております)。

3D LiDARの使い方

Velodyneを16ラインのセンサをつかいます。インストール、使い方は以下の記事をご覧ください。

www.abudorilab.com

VLP-16のような高級な回転式LiDARでなくても別の3Dセンサを使用することができます。 以下のセンサは新品で10万円台以下でIMUも搭載されているため、後述のIMUを別途用意する必要がありません。

例えば、 LivoxのMid360

Azure Kinnect

Intel RealSenseD455

などが活用できます。いずれもsensor_msgs/msg/pointcloud2とsensor_msgs/mgs/imuの二つを利用できるセンサであればOKです。

IMUの使い方

Velodyne LiDARなどのBuild in IMUがないセンサでGLIMを使用するには後付けでIMUを追加する必要があります。

こちらのIMUは5000円程度で内部のマイコンで計算したカルマンフィルタを実施した結果を出力してくれます。 シリアル通信でsensor_msgs/msg/imuを出力できます。 今回のSLAMでは2.8km程度の規模の3次元地図を最後まで破綻なく完走することができました。 このような格安IMUでも充分に利用できることがわかりました。

WitMotionのROS 1パッケージは存在するが、ROS 2の公式パッケージはありません。 非公式ですが、こちらのROS 2ラッパーのパッケージを利用しました。 github.com

また、witmotionはlibqt5serialport5のライブラリが必要です。こちらのライブラリをインストールします。

sudo apt-get install libqt5serialport5-dev

このパッケージは内部に別のリポジトリのリンクが貼ってあります(リンクだけなので、もとのコードは空っぽ)。 なので、リンク先も合わせてクローンしますよというオプションをつける必要があります。 --recurciveをつけることでリンク先のコードも自動的にクローンされます。 また、もとのmainブランチではなく、ros2ブランチに切り替えてください。なので、以下のようなコマンドを入力します。

cd colcon_ws/src
git clone -b ros2 --recursive https://github.com/ElettraSciComp/witmotion_IMU_ros.git witmotion_ros
..
colcon build --packages-select witmotion_ros

これでROS 2でwitmotionが使えるようになります。

witmotionをLinuxPCとUSB接続します。

ubuntu22の場合、USBシリアルが認識されないバグがあるそうです。

ls /dev/ttyUSB*

USBを接続してからこのように入力してもなにもシリアルデバイスが表示されません。USBケーブルを接続してもしなくても画面が変わりません。 こちらに症状の詳細があるので参考にしました。同じ症状だったためこちらの方法ですぐに改善しました。

kamuycikap.hatenablog.com

認識しない原因はUbuntu22で標準になった点字ディスプレイ用のドライバと競合して、接続を解除されてしまうようです。 今の用途では必要ないのでアンインストールします。

sudo apt autoremove brltty

を入力した後、USBケーブルを抜き差しして、再び確認。

ls /dev/ttyUSB*

ttyUSB0が確認できたので、権限を与えます。

sudo chmod 777 /dev/ttyUSB0

これでシリアルデバイスのwitmotionと通信することができるようになりました。

witmotionのROS 2パッケージを起動します。

ros2 launch witmotion_ros wt905.launch.py 

こちらのlaunchファイルで動作しました。使用しているセンサはWT901Cですが、wt901.launch.pyでは一部の値が動作しませんでした。

全ての値が変動しているかを確認します。

ros2 topic echo /imu

うまく出力されない場合、IMU側のファームウェアの設定を変えてみてください。Windowsに設定アプリケーションがあり、配布されています。 チェック項目は

  • Baudrate→115200bps
  • Hz→100Hz

を確認してみてください。

www.wit-motion.com

スポンサードリンク

屋外でセンサをデータを取りにいけるようにしよう

VLP-16を屋外で持ち運びしながら計測するために、以下の計測治具を作りました。

即席計測治具

VLP-16は汎用的なカメラのインチネジがあるので一般的な3脚に取り付け、その上にIMUを両面テープで取り付けました。 計測開始時のInitialposeが少しでも良くなるように、格安な水平器を両面テープで取り付けました。

ミニPCとLiDARの電源構成

プログラムは問題なく動くことが確認できました。ただ、センサデータを取りに行くためには、これらのPC やセンサを屋外に持っていかなければなりません。 デスクではACアダプタが使えましたが、屋外ではバッテリー駆動させる必要があります。 今回は以下の図のような構成で屋外に持ち出しました。

このセンサ構成で屋外に持ち出す

VelodyneもミニPCも外径5.5mm、内径2.1mmのDCジャックで電源供給します。昔はDCDC基板を作成し、DCジャックに半田付けなどをする必要がありましたが、今ではモバイルバッテリーのPD給電ですべて完了します(便利になりましたね)。

以下のモバイルバッテリーを使用しました。PCとVelodyneの同時利用で3〜4時間程度連続使用可能です。

このモバイルバッテリーにPDトリガーケーブルを接続すると12V出力してくれます。 USB PDではお互いの機器で通信をして、充電側の機器の必要な電圧を確認します。本来はスマホなどの端末に入っている通信基板がこのケーブルの持ち手の中に入っているため、通信が行われ12Vで出力されるわけです。今回はこの通称USB PDトリガーケーブルを2本使用します。

このトリガーケーブルはUSB PDの他の9Vや19Vなどの電圧も販売されているため、出先の電子工作で必要になった時に便利です。

今回使用したトリガーケーブルはこちらです。なぜか約2000円のケーブルと約1000円のケーブルが出回っているのですが、両方買った結果、同じでした。簡易包装かどうかの違いでした。安い方で構いません。

高い方

安い方

トリガーケーブルはUSB PDの正式な使用方法ではありませんので、自己責任でのご使用をお願いいたします。

回転式LiDARの場合、回り始めに多大な電力を必要とします。PDケーブルを挿した瞬間に回り始めますが、このとき他のポートは瞬間的に電圧低下が発生しリセットがかかります。つまり、LiDARを先に挿さないとPCの電源が落ちます。JetsonやRaspberryPiのように挿した瞬間に起動するコンピュータを使用する場合はご注意ください。

ミニPCとLiDARとモバイルバッテリーの取り付け工作

屋外にPCを持ち出すときには工夫が必要です。 すでに充分に工夫されたロボットになっている場合をのぞき、そのまま持っていくと高確率で現場で泣く羽目になります。 ノートPCを利用する場合でもひと工夫すると失敗率を下げることができます。

このようなプラスチックダンボール(以下、プラダン)にミニPCとVelodyneのInterfaceBOXを固定します。

固定には強力な両面テープを使用しました。

プラダンには配線を結束バンドで固定しまとめました。

このように各配線すべて90度ごとに結束バンドで固定しています。 このように固定すれば、動いたときに端末にささっているコネクタが直接引っ張られることがありません。 カバンに入れて歩くと、計測途中に配線がぬけててプログラムが死んでたり、空のデータが記録され続けたりという悲劇が起きますので、このようにして防ぎます。

配線は工夫しないと悲劇がよく起きる

同じくバッテリーも動かないように面ファスナーで固定します。 配線に対する固定は甘いですが、他のPC充電にも使うので便利さ重視です笑。 カバンの出し入れ以外では特に不具合はないと思います。途中で抜けてしまうということは一度もありませんでした。

ビリビリを使ってバッテリーを固定。そのままバッグに入れてGO。

4時間程度バッテリーが持ちます。あとは現場でrosbag recordするだけです。

スポンサードリンク

センサデータを記録しよう

ここまで準備ができれば、あとはセンサノードを起動して記録を開始するだけです。とはいっても、フィールドで作業するにはミスがつきもの。 可能な限り、現場で作業する量をゼロに近づけましょう。

おうちで一発で記録開始できるスクリプトを用意します。 好きなところに、スクリプトとrosbagを保管するディレクトリを作っておきましょう。

以下のようなコマンドを入力します。

mkdir ~/scripts
cd ~/scripts

IMUとVelodyneを同時に取得するためのbash scriptを作成します。適当なテキストエディタを開いて以下のようなファイルを保存します。

gedit record.bash

record.bashに書き込むスクリプト

#!/bin/bash
sudo chmod 777 /dev/ttyUSB0
sleep 2
gnome-terminal --window -- ros2 launch witmotion_ros wt905_launch.py
gnome-terminal --window -- ros2 launch velodyne velodyne-all-nodes-VLP16-launch.py
gnome-terminal --window -- rviz2
sleep 5

ros2 bag record /imu /velodyne_packets /velodyne_points

このスクリプトを実行すると、

  • USBシリアル機器の権限付与
  • 新しいターミナルを開いてwitmotionパッケージを実行
  • 新しいターミナルを開いてvelodyneパッケージを実行
  • 新しいターミナルを開いてrviz2を開いてVelodyneが動いているか確認
  • 指定のトピックのみのrosbagの計測を開始

の順に実行します。途中で数秒待っているのは安定させるためです。

スクリプトを保存したら、実行権限を与えます。

chmod +x record.bash

できたら必ずおうちで動作確認をしましょう。

./record.bash

それぞれのトピックがきちんと値が取得できているか、rosbagがきちんと取れているか確認をしましょう。

あとは実際に撮りたいコースまで向かって、レコードを開始し、ひたすら歩くのみです。

公園のベンチで記録スタートする図

現場作業ですと以下のような、無線でキーボードとタッチパッドが一体になっているのが非常に便利です。 かならず一つ持っておくとどこかで救われるでしょう。