KR260でROS2のRviz2を使って、360°カメラ画像を処理してみました。
360°Live Streamingのデータからリアルタイムで物体検出までしています。
プログラム・テスト動画含めて紹介していきます。
ROS2で360°カメラの画像処理・物体検出をしてみた
KR260でROS2のRviz2を使って、360°カメラ画像を処理してみました。
360°Live Streamingのリアルタイムで物体検出したデータを使っています。
検出した物体のBoxをマーカーとして、Rviz2上に置いてみました。
実際のテスト動画の1つが下記です。
360°カメラから検出した全方位の物体をROS2でマーカ出力しています。
プログラム・テスト動画含めて紹介していきます。
Rviz2のインストール
Rviz2は、ROS2(Robot Operating System 2)のための3D可視化ツールです。
今回は360°Live Streamingの画像から、物体検出したデータをRviz2で表示させます。
下記手順でインストールしました。
1 2 3 4 |
sudo apt update sudo apt install ros-humble-rviz2 source /opt/ros/humble/setup.bash rviz2 |
ROS2でOpenCV関連のインストール
360°カメラからOpenCV経由で、画像を取得・処理しています。
ROS2と一緒に使うために、関連のライブラリもインストールします。
1 2 |
sudo apt install ros-humble-image-transport sudo apt install ros-humble-cv-bridge |
Rviz2の操作
Rviz2は下記で起動しています。
1 |
rviz2 |
起動すると空のMAP含めたRviz2のデフォルト画面が確認できます。
(KR260から)Publishされている画像を表示させます。
左側の「Displays」パネルの「Add」を選択して「Image」を選択します。
「Topic」を選びPublishされている画像を入力します。(下記例は/camera/image)
(KR260から)Publishされているマーカを表示させます。
左側の「Displays」パネルで「Global Options」の設定を見つけます。
「Fixed Frame」の設定をPublishされているものに変更します。(下記例は「base_link」)
これにより、マーカーが使用しているフレームIDと一致させることができます。
「Add」から「MarkerArray」を選択すれば、中央のビューウインドウにマーカ出力されます。
ROS2にマーカーをpublishする
ros2へのマーカーをpublishしています。
下記例は360°画像を4分割にしている場合のPythonの一部です。
(マーカーのサイズ・位置はかなり適当に置いています)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
def publish_markers(publisher, node, detections, classes, section): marker_array = MarkerArray() if section == 'q1': #front m_offset =[0, 1] theta = 0 id_offset =0 elif section == 'q2': #right m_offset =[1, 0] theta = 270 id_offset =10 elif section == 'q3': #back m_offset =[0, -1] theta = 180 id_offset =20 elif section == 'q4': #left m_offset =[-1, 0] theta = 90 id_offset =30 for i, det in enumerate(detections): marker = Marker() marker.header.frame_id = "base_link" marker.header.stamp = node.get_clock().now().to_msg() marker.ns = "yolo_boxes" marker.id = i + id_offset marker.action = Marker.ADD if classes[i] in (32, 51): #Sports Ball or Orange marker.type = Marker.SPHERE else: marker.type = Marker.CUBE # marker.type = Marker.SPHERE p_adj = 20 s_adj = 10 tmp_marker_x = (det[0] + det[2]) / (2 * p_adj) tmp_marker_y = (det[1] + det[3]) / (2 * p_adj) x_rotated, y_rotated = rotate_coordinates(tmp_marker_x, tmp_marker_y, theta) marker.pose.position.x = x_rotated + m_offset[0] marker.pose.position.y = y_rotated + m_offset[1] marker.pose.position.z = 0.0 marker.pose.orientation.w = 1.0 marker.scale.x = float(det[2] - det[0]) / s_adj marker.scale.y = float(det[3] - det[1]) / s_adj marker.scale.z = float(det[3] - det[1]) / s_adj # Height of the box det_color = colors[classes[i]] marker.color.a = 0.5 # Transparency marker.color.r = float(det_color[2]) marker.color.g = float(det_color[1]) marker.color.b = float(det_color[0]) marker.lifetime = Duration(seconds=2).to_msg() marker_array.markers.append(marker) publisher.publish(marker_array) |
ROS2で360°Live StreamingをImage出力する
最初にROS2を使って画像(Image)を出力するテストしています
本当に画像だけを出力します。
ROS2で360°の物体検出をImage出力する
次に物体検出した画像(Image)のみを出力するテストです。
ROS2で360°の物体検出をMarker出力する
KR260からPublishされた画像とマーカを、ROS2のRviz2で出力します。
プログラムに関しては下記GitHubに置いています。
テスト動画は冒頭でも紹介しましたが、下記となります。
KR260が360°画像を4分割して、各セクションで物体検出+マーカー出力しています。
360°カメラ周辺でボールをピックアップしたり、運んだりするテストをしています。
ROS2のマーカ含めて、リアルタイムで変化する様子が分かります。
ROS2で360°の物体検出を区別してMarker出力する
次のプログラムですが、今度は検出する物体を区別してマーカ出力を変えてみます。
具体的には、下記内容です。
- スポーツボール or オレンジ … 球体(Marker.SPHERE)
- それ以外(ペットボトルなど) … 立方体(Marker.CUBE)
プログラムの一部を切り出すと、下記のような形です。
1 2 3 4 5 |
if classes[i] in (32, 51): #Sports Ball or Orange marker.type = Marker.SPHERE else: marker.type = Marker.CUBE # marker.type = Marker.SPHERE |
プログラムは下記です。
このテストではKR260が360画像を前後に2分割しています。
ペットボトルだと立方体で、スポーツボールだと球体でマーカ出力できています。
テストで物体を運んだりするとき、リアルタイムでマーカ出力も変化することが分かります。
まとめ
ROS2のRviz2を使って、360°カメラ画像を処理してみました。
360°Live Streamingのデータからリアルタイムでマーカー出力まで出来ました。
今回のKR260で実施した内容は、下記記事で紹介したテストの一部です。
コメント