ubuntu mate 18.04 ros melodic で orb_slam_2_ros を試してみました。

ubuntu mate 18.04 ros melodic で orb_slam_2_ros を試してみました。

インストールの参考にしたのは、下記ページです。
https://www.hackadda.com/post/2020/5/17/using-orb-slam-ros-to-map-the-world/
ただし、kinetic は、 melodic に書き換えてインストールします。

テストに関しては、gazebo turtlebot3 のシュミレーションで行っていますが、
説明の様には、全てがうまくは行きませんでした。

rviz の確認で、どうしても中央のスクリーンに、Pointcloud2 が表示されませんでした。

なので、おんちゃんは、色々試して結果、 PC の USB カメラを入力にして、rviz で、Ponitcloud2 が表示されたので、
ブログに記載しました。

1. USB カメラ (uvc_camera) を使えるようにします。
1) USBカメラを USB ポートに挿して、カメラの製品名が表示されるか確認します。
$ lsusb
...
Bus 003 Device 002: ID 046d:0825 Logitech, Inc. Webcam C270
...
もし名称が表示されない場合は、
$ sudo update-usbids
を実行すれば、表示されるようになると思います。

2)関連パッケージのインストール
$ sudo apt-get install ros-melodic-uvc-camera
$ sudo apt-get install ros-melodic-image-*
$ sudo apt-get install ros-melodic-rqt-image-view

3) 起動確認
$ roscore
$ rosrun uvc_camera uvc_camera_node

$rostopic list
で、
/image_raw があればOKです。

4) 映像の確認
$ rosrun image_view image_view image:=/image_raw

2. ここから、いよいよ、 orb_slam2 の確認。
1) $ roscore

2) USBカメラの起動。
$ rosrun uvc_camera uvc_camera_node /image_raw:=/camera/rgb/image_raw

3) orb_slam2_r200_mono.launch を実行
$ roslaunch orb_slam2_ros orb_slam2_r200_mono.launch

ここで、
New Map created with 119 points
が表示されれば、成功です。
もし、Map point vector is empty!
が、ずっと表示される場合は、USBカメラの本体を手で動かすと、
New Map created with 119 points
が、表示されるとのことです。

注1 gazebo turtlebot3 では、上記表示がなされずに、ずっと
Map point vector is empty!
が表示され続けます。
実際のUSBカメラの様にカメラを動かせないので、どう対処すればよいのかわかりません。
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch を起動して、
turtlebot3 を動かして見ますが、変化はありません。

4) Rviz で確認。
$ rviz

Add ボタン > By Topicで、
/orb_slam2_mono/debug_image/Image
/orb_slam2_mono/map-points/Pointcloud2
の2つを追加します。

どうぞね、ちゃんと表示されたかね!!
左の、Image には、緑の小さなボックスのマーカが幾つも表示されれば、OK です。
New Map created with 119 points が表示されない場合は、
緑の流れるような線になります。

USBカメラで、自分の顔を写して試すと色々参考になる点がわかります。
rviz の中央のスクリーンの、Pointcloud2 の 3Dプロット図を拡大して、マウスで視点を
変えて見てみると、何か顔に相当する立体の物があるのを見て取れます。
これが、ORB SLAM2 の処理結果と言うことでしょうか?

注1) こういう場合は、左右、または、上下が逆転している場合があるので、そのつもりで見てください。
おんちゃんの場合は、左右が逆のような気がします。また、Z軸 0 は、カメラの位置でしょうか?

注2) カメラは、固定の場合は、問題ないと思いますが、もしカメラを動かす場合は、位置+姿勢情を
与えてあげないと、つじつまが合わなくなると思います。

rviz の代わりに、
$rqt_image_view image:=/orb_slam2_mono/debug_image
を使うと、確認しやすいかも

ただ、本来の目的は、地図の作成です。
turtlebot3_gazebo を使って、turtlebot3 を動かして、シュミレーション空間を
orb slam2 + mono camera で撮影して、その空間の地図を作成して、
その後の、シュミレーションで、turtlebot3 を目的地まで自動で移動させるのが、最終目的です。

3. ちなみに、turtlebot3_gazebo の場合は、下記流れになります。
1) $ roscore
2) $ roslaunch turtlebot3_gazebo turtlebot3_house.launch
3) $ roslaunch orb_slam2_ros orb_slam2_r200_mono.launch
ここで、
Map point vector is empty!
が表示され続けるので、そこが問題です。

https://www.hackadda.com/post/2020/5/17/using-orb-slam-ros-to-map-the-world/
では、/orb_slam2_mono/map-points/Pointcloud2 がちゃんと出ているので、
何か、記載されていない手順がありそうです。
turtlebot3 のカメラの topic に初期化か何かの設定がないのか?

よくよく見たら、
If you go with the mono version, then you might get a constant stream of Map point vector is empty!
on your terminal. Don't worry, It is because the monocullar SLAM is not initialized yet.
To compute depth, the monocular slam uses a concept called parallax,
which relies on the difference in the rate of percieved movement of objects at different depths.
You would need to move the turtlebot around until the system is initialized.
You can do it by launching a teleop node by running the following.
とのこと、
4) のキー入力で システムが初期化されるまで、動かせとのことです。

この問題が解決できれば、以下の操作です。

4) $ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
このターミナルからキー入力して、turtlebot3 を動かします。

5) $ rviz
Add ボタン > By Topicで、
/orb_slam2_mono/debug_image/Image
/orb_slam2_mono/map-points/Pointcloud2
の2つを追加。

6) 4)のターミナルから、turtlebot3 を操作して、3) のターミナルから、"New Map created with xxx points "
が出るのを確認します。そしたら、部屋内をすべて写して周ります。

使ってみた感想は、赤い高い壁には、よくマーカーが表示されます。
白いテーブルにも、よく反応しますが、それ以外は、ほとんど反応せず。
部屋の明るさの関係か、判定のスレッショルドの指定値があるのだろうか。
まあ、しかし、これでは、使い物にならないかも。

rviz のPointCloud2 の3次元表示には、壁らしき物が、ドットで出ているみたいだが、
これが、判定結果なのか?
orb_slam2 のモノカメラ処理は、3次元での空間認識になるのでしょうか?
orb_slam2 の基本を理解していないのでなんともなりましぇん。

7) map.bin の吐き出し。
$ ROS_HOME=~/.ros; rosservice call /orb_slam2_mono/save_map map.bin
で、
~/.ros/map.bin が作成されるとのことです。

さて、ここからが、まだ判りません。
map.bin をどのようにすれば、地図が作成されるのか?
どうすれば、 map.gpm , map.yaml になるのか?

map.bin のその後の加工について、幾つか記載があるページを見てみましたが、まだ判りません。
map.bin 自体は、作者が決めた独自データのようです。
中身は、おんちゃんは、PointCloud2 の累積データのような気がしますが?

4. map.bin の事は置いといて、 PointCloud2 からどうやら、3Dプロットデータが出ているようなので、
それを自分で取り込んで、3Dプロット情報の、適当なZ位置のZ平面で切れば、2D図面ができるのでは。

例えば、床から、10cm のところのデータだけをピックアップして、
2Dにプロットすれば、部屋の間取り図ができるのでは。

または、カメラにモーションセンサーをつけて、移動量から現在位置、カメラの姿勢(ポーズ)を算出して、
画像とポーズ情報を、ORB-SLAM2 へ与えるようにしておいて。
カメラを持って部屋のなかを移動して写す。

または、人の顔を周りからぐるっと写せば、それで、3Dプロット図が描けるのでは。
ただし、顔の場合は、余りに遠いプロットデータは、捨てれば良いのか?

ただし、これを実現するには、やはり ORB SLAM2 の性能次第かなあ...
ステレオカメラなら、もっとよいのかな?

turtlebot3_house.launch と orb_slam2_r200_mono.launch の環境で、何度か試して、
みますが、やはり、前方の赤い壁しか認識しない状態です。
なので、自分で、PointCloud2 を取り込んで、2D化しても、赤い壁の図面しか書けないのが、
現状のようです。残念!!

ただし、PointCloud2 を取り込んで、あるZ軸のみ抽出して、2D化して、地図を作成する。
方向としては、間違っていない気がします。

このブログ記事について

このページは、おんちゃんが2020年10月15日 19:12に書いたブログ記事です。

ひとつ前のブログ記事は「ESP-EYE Simple HTTPD Server with MIC / MIC stream server」です。

次のブログ記事は「ubuntu mate 18.04 ros melodic で orb_slam_2_ros を試してみました。#2」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

カテゴリ

ウェブページ

サイトナビ