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>
あとでキャリブレーションについても書く(かもしれない)