前回Jetson Nano (Jetpack 4.6) + ROS1 (Melodic) で Hector_SLAM を動かしてみるの続きです。
マッピング(地図作成)
RPLiDAR を起動しておきます。
1 2 3 4 |
ls /dev | grep ttyUSB sudo chmod 666 /dev/ttyUSB0 roslaunch rplidar_ros rplidar.launch |
Hector_SLAMの以下のコマンドで、RPLiDARのデータの点群地図をrvizでマッピングしてみました。
1 |
roslaunch hector_slam_launch tutorial.launch |
こういう間取りの部屋をスキャン
hector_mappingノードと、geotiffマップの生成に必要なhector_trajectory_serverノードとhector_geotiffノードを使っています。
ノードとトピックの関係は以下のコマンドで描画できます。
1 |
rqt_graph |
Hector_geotiffは、マップとRPLiDARの軌道をGeoTIFF画像ファイルに保存します。
新しいターミナルを開いて次のコマンドを実行。
1 |
rostopic pub syscommand std_msgs/String "savegeotiff" |
savegeotiffマップが以下のフォルダーに保存されます。
~/catkin_ws/src/hector_slam/hector_geotiff/maps
ファイルは2種類あります。
tif拡張子のある方がGeoTIFFです。
こんな画像です。
マップは、ROS用のhector_slamライブラリによって作成された2DグリッドベースのSLAMマップです。
これは以下のような間取りの部屋をスキャンしたものです。なるほどです。
右上に流れているのは開口したドアを通してレーザーが隣室の壁をスキャンしたものです。
窓側は遮光カーテンが引かれているのでレーザーは漏れていません。
GeoTIFFはGIS方面ではよく使われるもので、地理参照情報が埋め込まれたラスター画像です。
一緒に保存されているTFWファイルはワールドファイルと呼ばれるもので、一般的にはTIFF画像として保存されているマップの位置、スケール、回転が記述されています。
参考までに
QGISで地図画像(GeoTIFF:ラスターデータ)から位置情報を抽出
RPLiDAR のscanデータを表示してみます。
Addボタンをクリック、topicでLaserScanを追加
scanされたデータが表示されています(赤の細線)。
Appendix
地図はmap_serverを使って取得することもできます。
map_serverをインストールしておきます。
1 |
sudo apt-get install ros-melodic-map-server |
地図データを保存するフォルダー作成
1 |
mkdir ~/maps |
Hector_SLAM 起動後、以下を実行
1 |
rosrun map_server map_saver -f ~/maps/map |
pgmとyamlの2つのファイルが作成されています。
yamlには地図の解像度や原点の情報が書かれています。
pgmは画像ファイルでこんな感じ
反対に、保存したデータを読み込んでみます。
ROSを起動しておきます。
1 |
roscore |
もう一つターミナルを開いて、データを保存したフォルダーへ移動し、yamlファイルを指定してmap_serverを起動します。
1 2 3 |
cd ~/maps rosrun map_server map_server map.yaml |
さらにもう一つターミナルを開いてrvizを起動します。
1 |
rviz |
左下のAddボタンをクリック
By topic タブで/map を選択してOKをクリック。
こんな感じ。
Appendix2
ダイソーのアクリルボックスを使えば、RPLiDARとJetsonをまとめたハンドヘルドなHector_SLAMのシステムが作れます。上記ではJetson Nano (4GB) を使っていますが、2GBバージョンでも動きます。
アクリルボックスx2をちょこっと加工(といっても穴あけ程度ですけど)
電源はAnkerのモバイルバッテリでいけます。
こんな感じ。各パーツは強力両面テープで固定すればOKです。なお、RPLiDARの4つのスペーサーはM2.5です。
下段のボックスの下にシャーシ用ケースを追加して、少々トルクのあるステッピングモータと取付用ブラケット、ホイール、ボールキャスタをつければ、odometryを取得できるロボットカーにも変身….するはず(JetsonのGPIOにはモーター駆動できるPWMが2つフリーになっていたと思うので^^…..モーターへの給電は後から考えます->給電とPWM制御にPi PicoかZeroもあり?)。
odometryなしでロボットカーを動かすならサーボモータでいけます。
Jetson をサーボモーターで駆動する場合は以下を参照
Jetson Nano の GPIO にサーボモータをつないで制御してみる
なお、ステッピングモータの駆動やオドメトリの取得については次回。
Leave a Reply