uvc_camera参考链接:uvc_camera - ROS Wiki
usb_cam参考链接:usb_cam - ROS Wiki
External Player - 哔哩哔哩嵌入式外链播放器
什么样摄像头可以用
在ROS中使用摄像头的前提是,摄像头在Linux系统下是可识别的,通常来说UVC协议的USB摄像头都可以正常使用,例如这一类。
大部分笔记本电脑自带的摄像头都是UVC协议的,所以也是可以直接使用的。
对于一些具有CSI或者MIPI接口的嵌入式板卡,在接入对应接口的摄像头后可能也可以使用,但不是绝对的。
例如树莓派接入CSI摄像头后启用bcm2835-v4l2驱动可以正常使用,但是JetsonNano使用CSI摄像头就不可以通过本文的方法驱动。
验证摄像头设备可用
使用命令检查当前设备列表
ls /dev
如果设备列表中有video*设备,则摄像头设备在当前系统中有被正确的识别。
如果使用虚拟机,需要将摄像头设备连接到虚拟机中。
检查有video设备后可以使用Ubuntu下的拍照软件cheese进一步验证
cheese
拍照软件能显示摄像头画面就基本稳了
获取摄像头驱动包
ROS下摄像头的驱动包有多款,这里笔者常用的两款为例,如果你有更好用的功能包也欢迎留言推荐给我
usb_cam
usb_cam可以通过apt方式直接安装二进制包,如果使用其他版本的ROS,自行替换命令中的noetic字段
sudo apt install ros-noetic-usb-cam
安装没有报错即为完成
rosrun方式运行
先启动roscore,然后运行驱动节点usb_cam_node
roscore
rosrun usb_cam usb_cam_node
启动节点后终端中可能会报如下的警告,可以忽略,实测不影响使用
摄像头启动后启用rqt工具查看图像
rqt_image_view
选择正确的话题即可预览到摄像头的画面
roslaunch方式运行
usb_cam包中提供了一个launch文件例程usb_cam-test.launch
roslaunch usb_cam usb_cam-test.launch
在这个launch文件中除了启动usb_cam_node节点外还会包含一个image_view用于预览摄像头画面
uvc_camera
在Melodic版本中,uvc_camera有提供二进制安装包,可以通过apt方式安装
sudo apt install ros-melodic-ucv-camera
在Noetic版本中,uvc_camera目前还没有提供二进制安装包,需要通过源码编译的方式安装
源码编译前需要先安装依赖的软件
sudo apt install libv4l-dev
然后将源码克隆到你的工作空间src
目录下,这里以catkin_ws
工作空间为例
cd ~/catkin_ws/src/
git clone https://github.com/ros-drivers/camera_umd.git
github在不同的时间,不同的地区可能会出现无法访问的问题,可以借助ghproxy来牵线搭桥
cd ~/catkin_ws/src/
git clone https://ghproxy.com/github.com/ros-drivers/camera_umd.git
成功获取源码后就可以编译功能包
cd ~/catkin_ws/ && catkin_make
编译完成后就可以使用uvc_camera功能包了
rosrun方式运行
roscore
rosrun uvc_camera uvc_camera_node
节点启动后可以通过rqt等工具查看图像
roslaunch方式运行
roslaunch uvc_camera camera_node.launch
有多个摄像头时
以上两个功能包无论时通过使用rosrun还是roslaunch的方式启动,使用的视频设备都是/dev/video0。当你有多个摄像头或者需要使用的摄像头设备不是/dev/video0时候,通过这两种方式启动就不能达到预期的效果了。
我的建议是编写launch文件来启动,launch文件可以参考功能包目录下的luanch。
Tips:我不建议对原功能包中的文件做修改,如果编写launch文件,我建议你将launch文件放在你自己开发的功能包目录下。
例如usb_cam功能包下的usb_cam-test.launch文件
<launch>
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
<param name="video_device" value="/dev/video0" />
<param name="image_width" value="640" />
<param name="image_height" value="480" />
<param name="pixel_format" value="yuyv" />
<param name="camera_frame_id" value="usb_cam" />
<param name="io_method" value="mmap"/>
</node>
<node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
<remap from="image" to="/usb_cam/image_raw"/>
<param name="autosize" value="true" />
</node>
</launch>
通过修改video_device参数的值即可修改摄像头设备为你需要启动的设备名。其余的参数例如image_width和image_height是用于设备图像的分辨率,完整的参数列表和参数含义可以在功能包的wiki页面中查看。
其他的问题
带compressed的图像话题
如果你已经安装了compressed-image-transport功能包,则相机节点发布的话题中,除了image_raw话题外,应该还有image_raw/compressed这样一个话题。
带有compressed的话题是一种压缩后的图像格式,在跨设备或者带宽资源有限的网络中传输时会更流畅,以640*480分辨率的图像为例。通过rostopic bw工具分别查看两个话题的带宽。
rostopic bw /usb_cam/image_raw
rostopic bw /usb_cam/image_raw/compressed
可以看到两个话题分别占用的带宽,差距还是很明显的。