1
2

More than 1 year has passed since last update.

ROSのカメラノードを複数同時に立ち上げる

Last updated at Posted at 2021-12-26

複数のカメラを同時に起動して映像を受信したかったので、調べながら行ったことを自分の備忘録として書き記しておきます。

環境

・VMware Workstation Player
・Ubuntu18.04
・ROS Melodic

使用するUSBカメラについて

なんでも大丈夫です。
当記事ではSEW11-2K370WLというWebカメラを2台使用します。

必要なパッケージのインストール

$ sudo apt install ros-melodic-uvc-camera
$ sudo apt install ros-melodic-image-*
$ sudo apt install ros-melodic-image-view
$ sudo apt install v4l-utils

USBカメラのキャリブレーション

こちらの記事などを参考に、必要に応じてUSBカメラのキャリブレーションを行ってください。

カメラ情報の確認

下記のコマンドを入力してカメラがどこにマウントされているのかを調べます。

$ v4l2-ctl --list-devices


WEB CAM: WEB CAM (usb-0000:03:00.0-2):
    /dev/video0
    /dev/video1

WEB CAM: WEB CAM (usb-0000:03:00.0-4.1):
    /dev/video2
    /dev/video3

私の環境では/dev/video0/dev/video2にマウントされているのが分かりました。


次に、使用するカメラで扱えるパラメータを調べます。
異なるカメラを2台使用している場合、ポート名の部分をもう1台のカメラがあるところに変更して再度実行してください。(私の場合だと/dev/video2になります。)
同じカメラを2台使用している場合はどちらか一方でのポート名でのコマンドで大丈夫です。

$ v4l2-ctl -d /dev/video0 --list-formats-ext


ioctl: VIDIOC_ENUM_FMT
    Index       : 0
    Type        : Video Capture
    Pixel Format: 'MJPG' (compressed)
    Name        : Motion-JPEG
        Size: Discrete 1920x1080
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1440x1080
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1280x720
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 800x480
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 3840x2160
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x360
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 800x600
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 2560x1440
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 2592x1944
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1920x1080
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.033s (30.000 fps)

    Index       : 1
    Type        : Video Capture
    Pixel Format: 'YUYV'
    Name        : YUYV 4:2:2
        Size: Discrete 1280x720
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 800x480
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 320x240
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x360
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 800x600
            Interval: Discrete 0.033s (30.000 fps)

    Index       : 2
    Type        : Video Capture
    Pixel Format: 'H264' (compressed)
    Name        : H.264
        Size: Discrete 1920x1080
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1440x1080
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1280x720
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 800x480
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 320x240
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x360
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 800x600
            Interval: Discrete 0.033s (30.000 fps)

uvc_cameraのデフォルトのピクセルフォーマットはYUYVなのですが、YUYV形式で2つもカメラノードを立ち上げると映像の転送容量が大きくなり、fpsが低下する場合があります。
このカメラではピクセルフォーマットがMJPGの時に1980×1080で30fps出せることが分かったので、この値を使用することにします。

launchファイルの作成

1つのコマンドで2つのカメラノードを同時に立ち上げられるようにするために、launchファイルを作成します。
下記のコマンドでlaunchファイルを作成します。エディタは何でも大丈夫です。

$ cd /opt/ros/melodic/share/uvc_camera/launch
$ sudo gedit two_cameras.launch



下記の内容をコピーし、解像度やfpsの部分等は自分が使っているカメラにあったものに変更して貼り付けてください。
このlaunchファイルでは2つのカメラの名前をそれぞれcamera_rightとcamera_left、フォーマットをMJPG、解像度を1920×1080、30fpsに設定しています。

two_cameras.launch
<?xml version="1.0"?>

<launch>
    <group ns="camera_right">
        <node pkg="uvc_camera" name="camera0" type="uvc_camera_node" output="screen">
            <param name="device" type="string" value="/dev/video0"/>
            <param name="width" type="int" value="1920"/>
            <param name="height" type="int" value="1080"/>
            <param name="fps" type="int" value="30"/>
            <param name="format" value="jpeg"/>
            <param name="frame_id" value="camera_right"/>
        </node>
    </group>


    <group ns="camera_left">
        <node pkg="uvc_camera" name="camera1" type="uvc_camera_node" output="screen">
            <param name="device" type="string" value="/dev/video2"/>
            <param name="width" type="int" value="1920"/>
            <param name="height" type="int" value="1080"/>
            <param name="fps" type="int" value="30"/>
            <param name="format" value="jpeg"/>
            <param name="frame_id" value="camera_left"/>
        </node>
    </group>
</launch>

カメラ映像の確認

ちゃんとカメラノードが2つ立ち上がっているか確認します。
ターミナルを新しく3つ開き、下記のコマンドをそれぞれ入力してください。

ターミナル1
$ roscore
ターミナル2
$ roslaunch uvc_camera two_cameras.launch
ターミナル3
$ rostopic list


/camera_left/camera_info
/camera_left/image_raw/compressed
/camera_right/camera_info
/camera_right/image_raw/compressed
/rosout
/rosout_agg



camera_leftとcamera_rightの両方が存在しているのが分かります。
/camera_left/image_raw/compressed/camera_right/image_raw/compressedがカメラ映像です。


実際に映像を見てみます。
下記のコマンドで映像を見ることができます。

ターミナル3
$ rqt_image_view



左上のドロップダウンリストから/camera_left/image_raw/compressed及び/camera_right/image_raw/compressedを選択することで映像を確認することができます。
image.png

参考・リンク

ROS KineticでのUSBカメラ接続とキャリブレーションまで
ROS講座66 カメラのキャリブレーションを行う
USBカメラが使えない #52
uvc_camera ROS Wiki

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2