はじめに
ROS2にて圧縮画像をPublishする記事に辿り着けなかったので備忘録として残します。
本記事では、ラズパイから圧縮した画像をPublishするための流れをはじめから順に追っていきます。
環境
・Raspberry Pi4
・Ubuntu20.04(PCとラズパイ双方)
・ROS2 foxy(PCとラズパイ双方)
・webカメラ
本記事では言及がない限り、ラズパイのターミナルで作業を行っています。
webカメラを認識させる
ラズパイにwebカメラを認識させるため、/boot/firmware/config.txt
に以下の内容を追記します。
start_x=1
gpu_mem=128
追記後、ラズパイを再起動させます。
webカメラを認識しているか確認するため、次のパッケージをインストールします。
sudo apt install v4l-utils
インストールのあと、以下のコマンドを実行します。
v4l2-ctl --list-devices
実行後、以下のような出力がされます。
$ v4l2-ctl --list-devices
bcm2835-codec-decode (platform:bcm2835-codec):
/dev/video10
/dev/video11
/dev/video12
/dev/media1
bcm2835-isp (platform:bcm2835-isp):
/dev/video13
/dev/video14
/dev/video15
/dev/video16
/dev/media0
mmal service 16.1 (platform:bcm2835-v4l2):
/dev/video0
ここで、Cannot open device /dev/video0, exiting
と出ていなければ認識されています。
画像をPublishするためのパッケージをインストールする
以下のコマンドを実行して非圧縮で画像をPublishするパッケージをインストールします。
sudo apt install ros-foxy-v4l2-camera
次に、ROS2で圧縮して画像を送信するためのパッケージをインストールします。
sudo apt install ros-foxy-image-transport
sudo apt install ros-foxy-image-transport-plugins
ラズパイから圧縮画像をPublishする
はじめに、以下のコマンドでラズパイから圧縮画像をPublishします。
ros2 run v4l2_camera v4l2_camera_node
実行すると、カメラのキャリブレーションを行うためのファイルが見つからないというエラーメッセージがでますが、
ひとまず無視して構いません。
topicを確認すると、圧縮画像がPublishされていることが分かります。
/image_raw/compressed
というtopicが圧縮画像のメッセージです。
$ ros2 topic list -t
/camera_info [sensor_msgs/msg/CameraInfo]
/image_raw [sensor_msgs/msg/Image]
/image_raw/compressed [sensor_msgs/msg/CompressedImage]
/image_raw/compressedDepth [sensor_msgs/msg/CompressedImage]
/image_raw/theora [theora_image_transport/msg/Packet]
/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
圧縮画像をSubscribeする
次に、同一ネットワークにいるパソコンで圧縮画像を受け取ります。
パソコン側のターミナルで以下のコマンドを実行します。
ros2 run rqt_image_view rqt_image_view
すると、以下のように圧縮画像がSubscribeできていることが分かります。
配信周期の確認
圧縮前と後で、どの程度配信周期が変わったのか確認します。
初めに、圧縮前の周期
を確認します。
ros2 topic hz image_raw/compressed
というコマンドで確認できます。
$ ros2 topic hz image_raw
average rate: 21.042
min: 0.009s max: 0.143s std dev: 0.03588s window: 22
average rate: 22.968
min: 0.009s max: 0.143s std dev: 0.02852s window: 47
average rate: 22.130
min: 0.009s max: 0.145s std dev: 0.02956s window: 68
average rate: 21.363
min: 0.009s max: 0.246s std dev: 0.03489s window: 88
average rate: 21.803
min: 0.009s max: 0.246s std dev: 0.03334s window: 112
average rate: 21.399
min: 0.009s max: 0.246s std dev: 0.03394s window: 132
次に、圧縮後
の配信周期を確認します。
ros2 topic hz image_raw/compressed
というコマンドで確認できます。
$ ros2 topic hz image_raw/compressed
average rate: 29.964
min: 0.014s max: 0.055s std dev: 0.01013s window: 32
average rate: 29.719
min: 0.012s max: 0.057s std dev: 0.00996s window: 63
average rate: 29.966
min: 0.012s max: 0.057s std dev: 0.01028s window: 94
average rate: 30.000
min: 0.012s max: 0.057s std dev: 0.00937s window: 125
average rate: 29.997
min: 0.012s max: 0.057s std dev: 0.00851s window: 155
average rate: 30.024
min: 0.012s max: 0.057s std dev: 0.00797s window: 186
このように、圧縮を行うことで配信周期を向上させることができました。
参考