環境
この記事は以下の環境で動いています。
項目 | 値 |
---|---|
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
<?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"
は圧縮した画像を非圧縮の画像に変換するという指示です。入れ替えると非圧縮を圧縮に変換します。in
とout
を正しいROSトピック名にremapします。
<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つのマシンで作業をします。
export ROS_IP='192.168.2.20' #ロボットPCのIP
rosrun uvc_camera uvc_camera_node
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
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が出ています。