Gazebo turtlebot3 burger Depth Camera Program です。
Gazebo turtlebot3 burger Depth Camera plugin で、Depth Camera (rgbd camera) が使えるようになったので、
サンプルプログラムを作ってみます。
開発環境
OS: Ubuntu Mate 18.04
ROS: melodic
開発ツール: Visual Studio Code
1. 概要
rgbd データは、 /camera/depth/points に出てきます。
$ rostopic type /camera/depth/points
sensor_msgs/PointCloud2
さて、sensor_msgs/PointCloud2 とは、何じゃろかいから始めないといけません。
グーグルでググると、
ROSのsensor_msgs:PointCloud2データの構造と扱い方 があって、参考にさせてもらいました。ふむふむ。
サンプルプログラムもグーグルで検索すると、
https://www.programcreek.com/python/example/99841/sensor_msgs.msg.PointCloud2 がありました。
Example 6 辺りが使えそうです。
これは、どうやら、ros_numpy パッケージの抜粋みたいです。
早速、パッケージをインストールしてみます。
$ sudo apt install ros-melodic-ros-numpy
2. 作成
上記プログラムを参考に、早速テストプログラムを作ってみます。
1. ~/catkin_ws/src/ros_start/scripts/pointcloud2_test2.py
3. 実行は、
$ roscore
$ roslaunch turtlebot3_gazebo turtlebot3_world_nav_nishi.launch
$ roscd ros_start/scripts
$ python pointcloud2_test2.py
結果は、
理解するのに、おんちゃんは、時間がかかりました。
どうやら、
x が、 カメラの左右軸 (x0 から) の値(M)。
y が、カメラの上下軸 (y0 から) の値(M)。
z が、カメラの前方軸 (z0 から) の値(M)。
中心座標 (x0,y0,z0) = (0,0,0) は、カメラの中心点の様です。
受信データで言えば、行:列 = 240:320 が 中心座標 の (x,y,z,rgb) になる。
ただし、 y は値が逆転しているのか?
ここまで、わかれば、Gazebo / Turtlebot3 バーガーを、動かすプログラムができそうです。
4. 本題のプログラム
Gazebo / Turtlebot3 バーガー に、 深度カメラ(rgbd カメラ: openni kinect) プラグインを載せて、
トピックで送られてくる、 /camera/depth/points (sensor_msgs/PointCloud2) を解析して、
バーガーが壁から 35cm 近づいたら、直進をやめて、向きを変えるプログラムを作ります。
測定は、行=240 のデータのみ使います。
y=0.0 なので、カメラの高さ位置の距離データのみ利用します。
列のデータは、[0,40, 80, 120, 160, 200, 240, 280, 320, 360, 400, 440, 480, 520, 560, 600,639] の所のみチェックします。
該当箇所の x,z から、 カメラ(x0,z0) からの距離をそれぞれ計算して、 0.35 [M] 以内か判定します。
5. 作成2
1. ~/catkin_ws/src/ros_start/scripts/tbot3_rgbd_camera1.py
5. 実行は、
$ roscore
$ export TURTLEBOT3_MODEL=burger
$ roslaunch turtlebot3_gazebo turtlebot3_world_nav_nishi.launch
$rviz
Fixed Frame : odom
Add > RobotModel
Add > ByTopic > /camera/depth/image_raw/image
Add > ByTopic > /camera/depth/points/PointCloud2
$ roscd ros_start/scripts
$ python tbot3_rgbd_camera1.py
どうぞね!
少しは、バーガーが、自動で、動くかね!