ラズパイ上のROS2で圧縮した画像をPublishする


# はじめに
ROS2にて圧縮画像をPublishする記事に辿り着けなかったので備忘録として残します。
本記事では、ラズパイから圧縮した画像をPublishするための流れをはじめから順に追っていきます。

# 環境
・Raspberry Pi4
・Ubuntu20.04(PCとラズパイ双方)
・ROS2 foxy(PCとラズパイ双方)
・webカメラ

本記事では言及がない限り、ラズパイのターミナルで作業を行っています。

# webカメラを認識させる

ラズパイにwebカメラを認識させるため、`/boot/firmware/config.txt`に以下の内容を追記します。
```:/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できていることが分かります。
![Screenshot from 2022-02-28 19-03-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2553869/c34ad5ea-56f4-cc02-6916-082df8b68d25.png)



# 配信周期の確認
圧縮前と後で、どの程度配信周期が変わったのか確認します。
初めに、`圧縮前の周期`を確認します。
`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

```

このように、圧縮を行うことで配信周期を向上させることができました。

# 参考
https://qiita.com/Hiroaki-K4/items/53c2565c77319ecc76e2