noetic/ROS、libuvc_cameraでUSBカメラを使う

ROSでUSBカメラを使うにあたっての覚書。

現状、メンテナンスされているUSBカメラのnodeはlibuvc-cameraの様子。 uvc-cameraはnoeticをサポートしてないし、usb-camはnoeticでも動くけどメンテされてないらしい。 そのため、libuvc-cameraを使っていく。

カメラを使うにはキャリブレーションが必要。以下のパッケージを入れる。

sudo apt install ros-noetic-libuvc-camera ros-noetic-camera-calibration ros-noetic-image-proc

接続したUSBカメラはどれか確認するには、以下のコマンドを実行する。

v4l2-ctl --list-devices

すると以下のような結果が返ってくる。usb-*となっているのがUSBカメラ。

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

Full HD webcam: Full HD webcam (usb-0000:01:00.0-1.1):
    /dev/video0
    /dev/video1
    /dev/media2

次に、USBカメラを起動するにあたって必要なフォーマット、幅、高さ、フレームレートなどを確認するには以下のコマンドを実行する。

v4l2-ctl --list-formats-ext

すると以下のような結果が返ってくる。

ioctl: VIDIOC_ENUM_FMT
    Type: Video Capture

    [0]: 'MJPG' (Motion-JPEG, compressed)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1920x1080
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 320x240
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 800x600
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1280x720
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1024x576
            Interval: Discrete 0.033s (30.000 fps)
    [1]: 'YUYV' (YUYV 4:2:2)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1920x1080
            Interval: Discrete 0.200s (5.000 fps)
        Size: Discrete 320x240
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 800x600
            Interval: Discrete 0.050s (20.000 fps)
        Size: Discrete 1280x720
            Interval: Discrete 0.100s (10.000 fps)
        Size: Discrete 1024x576
            Interval: Discrete 0.067s (15.000 fps)

/dev/video0がIndex 0に対応していると思っている。多分。30fpsのところがフレームレート。

あとはベンダーIDとデバイスIDを以下のコマンドで確認できる。

lsusb

実行すると以下のような結果が返ってくる。(抜粋)

Bus 001 Device 003: ID 1bcf:2283 Sunplus Innovation Technology Inc. USB2.0 Hub

この場合、VendorIDは1bcfで、DeviceIDが2283である。

以上の情報をもとに以下のような.launchファイルを作成する。

<?xml version="1.0"?>
<launch>
  <node pkg="libuvc_camera" type="camera_node" name="mycam">
    <param name="vendor" value="0x1bcf"/>
    <param name="product" value="0x2283"/>

    <param name="width" value="640"/>
    <param name="height" value="480"/>
    <param name="video_mode" value="mjpeg"/>
    <param name="frame_rate" value="30"/>
  </node>
</launch>

usb_cam.launchという名前で保存したとすると。

roslaunch usb_cam.launch

で実行できる。

ビューアがないと正しく起動できてるかわからないので、 ビューアを立ち上げたい場合はrosrunでビューアだけ実行すればよい。

rosrun image_view image_view image:=/image_raw

ビューアも立ち上げるlaunchファイルも張っておく。

<?xml version="1.0"?>
<launch>
  <node pkg="libuvc_camera" type="camera_node" name="mycam">
    <param name="vendor" value="0x1bcf"/>
    <param name="product" value="0x2283"/>

    <param name="width" value="640"/>
    <param name="height" value="480"/>
    <param name="video_mode" value="mjpeg"/> <!-- or yuyv/nv12/mjpeg -->
    <param name="frame_rate" value="30"/>
  </node>
  <node name="image_view" pkg="image_view" type="image_view">
    <remap from="image" to="/image_raw" />
  </node>
</launch>

あとでキャリブレーションについても書く(かもしれない)