RaspberryPI Camera
ラズベリーパイには公式でカメラが存在します。
名前はRaspberry Camera Ver1.3です。
こちらのカメラはラズパイに用意されているカメラスロットにそのまま挿すことができるので、コンパクトにまとめることができます。
ただ、公式とされている割には、あまりネット上に使用方法が載っていません。
まずそのまま挿しただけだと認識されません。
カメラを認識させる
http://m-ac.jp/raspi/hardware/camera/enable_camera/ubuntu/index_j.phtml#explanation
こちらによると、以下の方法で認識させることができるようです。
/boot/firmware/config.txt
に
start_x=1
gpu_mem=128
を最下部に追加します。
すると、cameraモジュール認識と、gpuメモリの拡大によって、正しく認識するようです。
(公式なのに、こんなことしないと認識しないってどうなの??感はありますが。。)
ROSからTopicとして配信する
ROSからの配信にはusb_camを使用しました。
ただ、そのままrosrunしても動かず、パラメータを下記のように指定する(usb_cam.launch)ことで動きました。
<launch>
<!-- usb_acmノードを実行する -->
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen">
<!-- カメラの指定 defaultは/dev/video0 -->
<param name="video_device" value="/dev/video0"/>
<!-- 画像の大きさ(横幅)の指定 -->
<param name="image_width" value="320"/>
<!-- 画像の大きさ(縦幅)の指定 -->
<param name="image_height" value="240"/>
<!-- 画像フォーマット設定 "mjpeg" or "yuyv" or "uyvy" -->
<param name="pixel_format" value="yuyv"/>
<!-- fpsの指定 frame per second -->
<param name="framerate" value="30"/>
<!-- コントラストの設定(色設1) -->
<param name="contrast" value="32"/>
<!-- 明るさの設定(色設2) -->
<param name="brightness" value="32"/>
<!-- 彩度の設定(色設3) -->
<param name="saturation" value="32"/>
<!-- フォーカス位置の設定 -->
<param name="focus" value="51"/>
</node>
</launch>
そして、以下のコマンドを打つことでtopicとして配信できます。
roslaunch usb_cam.launch
次に受け取り側を用意していきます。
Mac上でROSを動かす
ROSはLinux(Ubuntu)でないと実質動かせない問題があります。
今回はROS用にPCを一つ用意することはせず、Mac Book Air上にUbuntu環境をDockerで用意して、ROSを動かしました。
Dockerの用意はここを参照すると簡単でした。
https://note.com/npaka/n/ne9530038d80b
ただ、Mac上のROSとRaspberryPIを通信する上で、ポート制限で通信できないことがあったので、これに注意です。
今回使用したdocker-composeファイルはこちらです。
services:
ros:
image: tiryoh/ros-desktop-vnc:melodic
shm_size: 4gb
ulimits:
memlock: -1
stack: 67108864
ports:
- 6080:80
- 11311:11311
volumes:
db_data: {}
こちらを使って、docker-compose up -d
することで、ポート制限なく動かすことができました。
11311はROS Masterのポートです。
shm_sizeやullimitsはdocker上のvnc経由アクセスだと重たかったので追加した設定です。
ストリーミング重いなと思ったら、こちらが原因だったりするので、この設定を入れています。
圧縮画像で送る
そのままrawで送ると遅延が大きく発生してしまったので、圧縮して送ります。
圧縮方法は下記のqiitaを参照することでできました。(モジュールを二つ入れるだけです)
https://qiita.com/srs/items/dc72dc81c1ae46856ac5
これを入れた後に、下記コマンドでsubscribeすることで遅延の少ないストリーミングを実現できました。
rosrun image_view image_view image:=/usb_cam/image_raw _image_transport:=theora
圧縮方法はtheroraを使っています。
ストリーミングの様子はこちら。特に遅れなく送れていことが確認できます。