前回記事までで、ROSのNavigation Stackの使い方をなんとなく把握した。理解したとは言い難いけれど、どのようなトピックを準備すれば動きそうかがわかっただけでも良かったと思う。
ktd-prototype.hatenablog.com
もうちょっと使い方に慣れれば、必要な部分だけ自分のオリジナルに差し替えたりもできるだろう。
今回はマッピングの部分を、実際に手持ちのセンサを使って試してみることにする。
はじめに
前回まででわかったこと
以下の2点がわかった。
- /mapトピックと/scanトピックがあれば自己位置推定をしながら移動ができる
- 更に/scanトピックを/slam_gmappingノードに流し込み、そこから/mapトピックを発行させれば、並行して地図作成もできる
実際にはAMCL以外の自己位置推定方式やgmapping以外のSLAM方式がありそうなため、把握した範囲はかなり狭い。
更に、例えばあまりに障害物が入れ替わり立ち替わり現れたり消えたりした場合、SLAMで作った/mapの中身を途中でリセットするとかそういった実装上の操作が必要かも。
が、とりあえず「動くパターン」を1個見つけ、それを自分なりに明文化してまとめたのは悪くない行動だったと思う。
もう一歩踏み込んで、きちんと数式を追って理論を学ぶことも自分の引き出しを増やすのと、数式アレルギーの緩和のためにも大事な気がするけど・・・趣味でやっていると中々そこまで手が回らない。
今回やりたいこと
最終的には、屋内だけでなく野外でも動き回れるロボットにしたい。また屋内で動くにしても、いずれはもう少し高度な、例えば三次元物体認識とか、そういったものをやってみたい気がする。
そうなると、前回記事までで使っていた2次元のLiDAR(レーザーレンジファインダ:LRFと言う方が一般的?)ではちょっと不足な気がする。
自機で乗り越えられるギリギリくらいの高さにセットしておいて障害物回避に使うには良いだろうし、煮詰まった設計にするならそれ専用にセンサを用意しておく方が良いとも思うけど、こちらにも財布の都合や手元に置ける機体サイズの都合があるので、そういくつもは買っていられない。
ものづくりの教科書からは逸れるかもしれないが、もう少し高度なセンサを導入して、大は小を兼ねる的に前回までの範囲をカバーしつつより高度な環境認識も・・・という方向で進めてみたい。
というわけでとりあえずみんな使ってそうで情報が集まりやすそうなIntel RealSenseを用意した。今回はこれを使ってマッピング等を試してみる。
導入
使用環境・準備した機材
- intel Real Sense D435i
- Ubuntu18.04LTS
- ROS melodic
環境構築
実はセンサを買って環境を構築したのはかなり前で、もうどうやって環境を構築したかは忘れてしまった。
公式githubのREADMEに従って導入するのが間違いないだろう。
github.com
僕はこのうちのMethod2と呼ばれる、librealsense2を入れてからROS Wrapperを導入する方式を選んだような記憶がある。
詳しい手順はrealsense本体のリポジトリに載っている。
librealsense/distribution_linux.md at master · IntelRealSense/librealsense · GitHub
ROSを使わない動作確認
librealsenseのインストールが正常に終わっていると、以下のコマンドでビューワが立ち上がる。
$ realsense-viewer
この段階までであればこの辺を参考にした方が良いかも知れない。
www1.meijo-u.ac.jp
こんな感じで画像が取れる。どれくらいすごいのかはわからないけど、すごい。
ROSを使った動作確認
ひきつづき、上記の公式githubに従ってROSのwrapperを導入する。readmeの以下の部分。
GitHub - IntelRealSense/realsense-ros: Intel(R) RealSense(TM) ROS Wrapper for D400 series, SR300 Camera and T265 Tracking Module
こちらも無事インストールが終われば、以下のコマンドでノードが立ち上がる。
$ roslaunch realsense2_camera rs_camera.launch
ビューワが自動で立ち上がるわけではないので、rvizを立ち上げて自分で見に行く必要はある。
見られるトピックのリストはrostopic listで見てもいいし、github公式のreadmeにもpublished topic listが載っている。
ポイントクラウドというフレーズを聞いたことがある(あまり詳しくは知らない)が、上のやり方だとそのトピックは発行されていない。
以下のコマンドで取得できるようだ。
$ roslaunch realsense2_camera rs_camera.launch filters:=pointcloud
基本コマンドは一緒で、起動時のパラメータであるfiltersにpointcloudをセットすれば、該当するトピックが発行されるようになる。
この時、左下の小さいウインドウは相変わらず/camera/depth/image_rect_rawを表示しているつもりなのだが、どういう理屈かしらないがpointcloudが重畳されて表示されるようになっていた。
その他、例えばalign_depthというパラメータをtrueにする事例が紹介されていた。多分デプス画像と赤外パターン照射画像、デプス画像と可視画像を重ねて表示する機能だと思うのだが、rviz上だとわかりづらい。
例えば/camera/aligned_depth_to_color/image_raw を表示してみると、見た目はデプス画像が出てくるが、視野角がちょっと狭くなって可視画像のそれになっているので、表に出ていないだけでカラー画像が裏に重ねられてあるのかもしれない。
いわゆるマシンビジョンという観点で、わざわざ重畳した形で新しくトピックを発行し直すことにどういう意味があるのかはちょっとわからない。
画角サイズを合わせる手間を省くため?