【Spot Micro計画 #3】RaspberryPIカメラ映像をROSでMacのDocker上ROSに送る

January 08, 2023
Author(著者):
清水ノイエン内田
Docker
RaspberryPi
ROS
SpotMicro

RaspberryPI Camera

ラズベリーパイには公式でカメラが存在します。

https://amzn.to/3ItYsLH

名前は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を使用しました。

http://wiki.ros.org/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を使っています。

ストリーミングの様子はこちら。特に遅れなく送れていことが確認できます。


copyright © 2024 beavers-hive.com