ROS rtabmap_ros 自作 Stereo Camera

ROS rtabmap_ros 自作 Stereo Camera.

rtabmap_ros Tutorial で、Stereo カメラが使える とあるので、自作の Stereo Camera でも大丈夫なのか試してみました。

手元に、Logi Cool の USB カメラ C270 が1個あったので、急遽、もう一本買ってきてためしてみます。
始める前に、rtabmap_ros のパラメータで、
Kp/DetectorStrategy=6 (GFTT/BRIEF)
Vis/FeatureType=6 (GFTT/BRIEF)
がデフォルト設定になっています。これは、OpenCV に contrib を組み込まないと使えない事のようです。
introlab/rtabmap_ros
Kp/DetectorStrategy=8 (GFTT/ORB)
Vis/FeatureType=8 (GFTT/ORB)
だと、contrib は、必要ないです。
後述のドリフトの件は、デフォルトの 6(GFTT/BRIEF) を使っていた所為かもしれません。by nishi 2021.12.11

注1) 後日、改めて、新品を追加購入して、新品の C270n X 2 にしました。
古い C270 と新しい、C270n とでは、色の具合ちょっと異なりました。新しい C270n で揃えると、左右の色が同じになりました。
この違いが、後の、StereoCamera のキャリブレーションと、stereo_image_proc の結果に大きく影響してきます。
自作 StereoCamera を試す時は、必ず同じロットの C270n を2個揃えて下さい。
Rviz の strereo_camera/point2/PointCloud2 の表示で驚く程違いがでます。by nishi 2021.10.24

注2) 左右USBカメラの間隔は、空けないで、隣合わせで取り付けて下さい。by nishi 2021.10.26
間隔 無し=2[mm] で、レンズ間隔=7.3[cm] となって、Rviz の Stereo_camera/PointCloud2 の映像で最短焦点距離は、
57[cm] になりました。
以前は、レンズ間隔が、9.2[cm] でした、その時の最短焦点距離 70[cm] でした。
最短焦点距離 70[cm] で、rtabmap_ros でロボットカーを部屋の中で動かすと、近くの物体が認識出来なくて、
動作が不完全でした。
最短焦点距離を、57[cm] にして、なんとか、部屋の中で、rtabmap_ros でロボットカーを動かせるようになりました。
しかし欲を言えば、もっと短い方が良いです。できれば、最短焦点距離 35[cm] 程が良い様です。

注3) カメラの取り付けは、とにかく正確に!!
cameracalibrator.py で、左右のカメラ映像を見比べて、上下のズレ、傾きを限りなく Zero にしてください。

注4) 上記設定とStereoCamera キャリブレーションがうまく行けば、Rviz で StereoCamera/PointCloud2 を表示して、
カメラの後方からみてみると、結構きれいに表示されます。

注5) 結論を言えば、C270 は、カメラ間隔を狭められなくて、画角も狭い(55度) なので、stereo_image_proc を通した、最短焦点距離が、57[cm] 迄しか短くできない。
なので、部屋の中で、自作 Stereo_camera & rtabmap_ros を試すには、適切ではありません。
部屋の中で試すなら、最短焦点距離を短くできる、もっと画角が広くて、カメラの間隔を狭められるカメラをお勧めします。
Jetson Nano 4G、Raspberry pi 4 であれば、CSI カメラを2個繋げられるので、そちらの方が、簡単に、最短焦点距離の短い Stereo Camera を作れると思います。
画角は、80度以上が必要です。

注6) やはり、ロボットに乗せて、rtabmap_ros で使うのであれば、市販のStereo Camera、Depth Camera
を購入したほうが賢明です。

開発環境
PC: Ubuntu Mate 18.04
ROS : Melodic
USB Camera: Logi Cool C270 x 2

1. USBカメラの動作確認。
1個の場合。
PC に USB カメラを挿して、
$ lsusb
...
Bus 003 Device 009: ID 046d:0825 Logitech, Inc. Webcam C270
...
を、確認します。表示されなければ、
$ sudo update-usbids
行います。
OK であれば、

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

2.1 1個での実行
$ roscore

$ rosrun uvc_camera uvc_camera_node

$ rostopic list
/camera_info
/image_raw
...
が出てくれば、OK
image_view ノードによる確認。
$ rosrun image_view image_view image:=/image_raw

此処までは、以前試したので、すんなりと行きました。

3. Stereo(USB カメラ、2個) での場合。
Stereo の時は、どうするのか判らなかったのですが、
$ roscd uvc_camera
とすると、/opt/ros/melodic/share/uvc_camera とあったので
launch/ フォルダーを見ていたら、stereo_node.launch があったので、
$ roslaunch uvc_camera stereo_node.launch
/dev/video0 は、オープンOK で、
/dev/video1 のオープンでエラーになる。
USBカメラ1 だと /dev/video0,/dev/video1 がアサインされて、
USBカメラ2 だと /dev/video2,/dev/video3 がアサインされるので、
試しに、stereo_node.launch を、修正してみます。
<param name="left/device" type="string" value="/dev/video0" />
<!-- <param name="right/device" type="string" value="/dev/video1" /> -->
<param name="right/device" type="string" value="/dev/video2" />

これで、OK となりました。
確認は、Rviz でできます。
$ rviz
Add > By topic
/left/image_raw/Image
/right/image_raw/Image

4. 本題の、Stereo Handheld Mapping
を試してみます。

  3. Mapping mode
RealSense D415/D435 cameras: を真似て、



ワーニングが出るみたい。
camera_link を出力してやらないといけないみたい。

試しに、下記を、実行したが、カメラは、2個あるので、カメラの中心位置か?

static_transform_publisher
まだ、ワーニングは、消えない。

5. Tutorials/Stereo Handheld Mapping を見直していたら、
  2. Bring-up the camera に書かれている事を、前準備として、行わないといけないとの事です。
ここが、完全に抜けちょりました。

  2.1 Bring-up example for a Bumblebee2 camera が、参考になるみたいです。
試行錯誤の結果、下記の様に、launch ファイルを作成しました。
その前に、rtabmap_ros パケージがUpdateされても影響がでないように、自分用のパッケージを作成します。
$ cd ~/catkin_ws/src
$ catkin_create_pkg rtabmap_ros_my rospy roscpp std_msgs
$ mkdir -p rtabmap_ros_my/launch
$ cd ..
$ catkin_make

ratbmap_ros_my/launch/rtabmap-nishi.launch

tf 情報で、source_frame、camera のリンクが必要みたいです。
序に、odom と base_link の tf link も記述しました。

改めて、実行
$ roscore

$ roslaunch rtabmap_ros_my rtabmap-nishi.launch

この後、3. Mapping mode の RealSense D415/D435 cameras: を参考に実行します。

少し、前にすすんだか!!
まだ、rviz で、画像が出てきません。
stereo_image_proc でワーニングがでているみたい。

カメラのキャリブレーションをすれば良いのか?
下記を参考に、キャリブレーションを行います。
How to Calibrate a Stereo Camera
checkerboard (8x6) を印刷して、
印刷したチェックパターンの一辺が、2.5[cm] だったので、--square 0.025 にします。

1) CAUBRATE がグリーンに変わるまで、チェックボードを動かします。
左右、上下、前後に移動、回す、斜めにする。
2) X、Y、Size、Skew(斜め) の下の緑色のバーが目安みたいです。十分長くなるまで、チェックボードを動かし続けます。
3) 十分であれば、CAUBRATE をクリックします。
4) Calibrating が終われば、COMMIT がグリーンに変わります。クリックすれば保存されますが、その際に、
書き込み許可のパーミッションにしておきます。
/opt/ros/melodic/share/uvc_camera (777)
5) 約、250サンプルで、Calibrating には、3.2 Ghz x 2 Core で、3から4時間程です。
Jetson Nano 2G だと.... PC でキャリブレーションして、結果をコピーしたほうが良いかも。
6) キャリブレーション を十分すれば、rtabmap_ros の stereo キャリブレーション不足のワーニングは、でなくなると思います。
但し、あとで判ったことですが、これだけでは、実測の距離と、Rviz 上の図面上の距離がかなりずれます。
これへの対応は、stereo_image_proc のパラメータの調節が必要になります。
stereo_image_proc で、距離の補正が、パラメータでできる様なので試してみます。
ROSで始めるロボティクス(9) ー ROSを使ったステレオカメラキャリブレーション
注) 昨今のブラウザーの所為か画像が、残念ながら見えません。
stereo_image_proc Tutorials ChoosingGoodStereoParameters 本家。
注2) 残念ながら、上記のパラメータ調整では、距離の補正は出来ないみたいです。やはりキャリブレーションをしっかりやります。
Skew は、100% 、Size は、60[%] 以上にします。
7) stereo_node.launch と、stereo_image_proc は、同じマシンで実行させます。Network を介すると、rtabmap_ros の
stereo キャリブレーション不足のワーニング がでたりします。

rviz 起動時にもエラーがでているみたい。

octomap_rviz_plugins が必要みたいだ。
$ sudo apt install ros-melodic-octomap-rviz-plugins

rtabmapviz では、何か表示されるようになりました。
ただし、表示内容がよくわからん。

起動ターミナルには、[ WARN ] や [ ERROR ] がいっぱい出てきます。



なんだかんだ言って、やっと出来たみたいぞね。
rtabmapviz 上で、3D Map 画面 で、マウスでドラッグして、向きや大きさを変えられるみたいぞね。

Rviz で、Add ->stereo_camera > points2 > PointClouds2 など表示すると、でてくるみたいだ。
/rtabmap/proj_map に、 2D マップが出ているみたい。試しに、保存してみます。
$ rosrun map_server map_saver -f ~/maps_rtab3 map:=/rtabmap/proj_map
保存出来ました。
であれば、これを、自作 Turtlebot3(foxbot_core3) に搭載してやれば、/odom 、/imu は、foxbot_core3 から適宜、更新されるので、
後は、 teleop_key で、適当に動かせば、2D Map(SLAM)が出来上がるのではないか!。
しかし、/rtabmap の下には、色んな map 情報が出ているみたいです。
2D map で作成されるのは、カメラの中心位置が、地面になるみたい。

固定カメラで、しばらく置いておくと、位置がドリフトしているみたい。
/odom トピックが書き変っているのか?
IMU 情報を与えてやれば、手持ちで動かせて、部屋の 2D Map が作れるのか。
/imu だけ与えれば、 /odom は、rtabmap_ros が更新するのか?

しかし、Stereo 画像のマッチングを、PC で処理するとやはり重たい。
これでは、SBC ( Jeston nano 2G ) 上では無理か?
やはり、 D435 等の、カメラ組み込みの、Depth 機能を使う必要があるみたいだ、

或いは、Stereo カメラの取り込みだけを、SBC で行って、それ以降は、PC で行うか?
将来的には、全て SBC に組み込まないといけないが。

うーーん。どうするか?

このブログ記事について

このページは、おんちゃんが2021年9月 6日 17:27に書いたブログ記事です。

ひとつ前のブログ記事は「Turtlebot3 の自作 #8」です。

次のブログ記事は「ROS rtabmap_ros 自作 Stereo Camera #2」です。

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

カテゴリ

ウェブページ

サイトナビ