ROS講座57 カメラ画像を圧縮して送信


環境

この記事は以下の環境で動いています。

項目
CPU Core i5-8250U
Ubuntu 16.04
ROS Kinetic

インストールについてはROS講座02 インストールを参照してください。
またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。

概要

ロボットでの画像の使い方として、遠隔操作のためにロボットについているwebカメラの画像を転送してリモートで見るという方法があります。しかしWebカメラの画像を非圧縮(以下の図の上)で送るとwifiの帯域が足らずに送信周期が下がりいわゆる「カクカク」した画像になります。
そのために画像を圧縮して送信する必要があります(以下の画像の下)。このためにimage_transportというパッケージを使いsensor_msgs/CompressedImage
型に変換します。また画像処理用のROSノードは圧縮した画像をそのままで処理することはできません。そのために受信した側では圧縮した画像の展開をする必要があります。

image_transportのインストール

以下の2つのパッケージをインストールします。このパッケージをインストールすると特に何もしなくてもimage_raw/compressedというROSトピックが自動的に生成されます。

インストール
sudo apt-get install -y ros-kinetic-image-transport
sudo apt-get install -y ros-kinetic-image-transport-plugins

image_view起動用のlaunch

cam_lecture/launch/republish.launch
<?xml version="1.0"?>
<launch>
  <arg name="use_compressed" default="false" />

  <group if="$(arg use_compressed)">
    <node name="image_republish" pkg="image_transport" type="republish" args="compressed raw">
      <remap from="in" to="/image_raw" />
      <remap from="out" to="/image_exp" />
    </node>
    <node name="image_view" pkg="image_view" type="image_view" >
      <remap from="image" to="/image_exp"/>
    </node>
  </group>
  <group unless="$(arg use_compressed)">
    <node name="image_view" pkg="image_view" type="image_view" >
      <remap from="image" to="/image_raw"/>
    </node>
  </group>
</launch>

ポイントは以下のrepublishノードの起動です。args="compress raw"は圧縮した画像を非圧縮の画像に変換するという指示です。入れ替えると非圧縮を圧縮に変換します。inoutを正しいROSトピック名にremapします。

republishノードの起動
<node name="image_republish" pkg="image_transport" type="republish" args="compressed raw">
 <remap from="in" to="/image_raw" />
 <remap from="out" to="/image_exp" />
</node>

実行

通信をするのでロボットPC側と手元PC側の2つのマシンで作業をします。

ロボットPC側のshellにて
export ROS_IP='192.168.2.20' #ロボットPCのIP
rosrun uvc_camera uvc_camera_node
手元PC側のshellにて(非圧縮で転送)
export ROS_IP='192.168.2.10' #手元PCのIP
export ROS_MASTER_URI='http://192.168.2.20:11311' #ロボットPCのIP 
roslaunch cam_lecture republish.launch
手元PC側のshellにて(圧縮で転送)
export ROS_IP='192.168.2.10' #手元PCのIP
export ROS_MASTER_URI='http://192.168.2.20:11311' #ロボットPCのIP 
roslaunch cam_lecture republish.launch use_compressed:=true

非圧縮の場合は転送容量は3.1MB/sですが1.6Hz程度しか出ていません。

圧縮の場合は1.4MB/sと減っている上に30Hzが出ています。

参考

画像圧縮によってフレームレートを向上させるパッケージの紹介

目次ページへのリンク

ROS講座の目次へのリンク