一,常用的驱动包
在 ROS(Robot Operating System)中,实现摄像头驱动的功能包通常用于从摄像头设备获取图像数据,并将其发布为 ROS 消息(如 sensor_msgs/Image
)。
usb_cam
和 cv_camera
都是 ROS 中常用的摄像头驱动功能包,主要用于从 USB 摄像头获取图像数据并发布为 ROS 消息。
下面介绍它们两者的不同点:
- 依赖库方面:usb_cam基于 V4L2(Video4Linux2),这是 Linux 系统下的视频设备驱动框架。cv_camera基于 OpenCV,使用 OpenCV 的
VideoCapture
类来读取摄像头数据。 - 性能方面,usb_cam可以直接与摄像头硬件交互,性能较高,延迟较低,适合对实时性要求较高的应用;cv_camera通过 OpenCV 读取数据,性能稍低,可能会有一定的延迟。
- 功能特性方面:usb_cam支持摄像头参数(如分辨率、帧率、亮度、对比度等)的动态配置(支持从启动文件(launch file)中配置摄像头设备、分辨率、帧率等),支持发布
sensor_msgs/Image
和sensor_msgs/CameraInfo
消息,支持单目摄像头;cv_camera支持发布sensor_msgs/Image
消息,支持单目摄像头,功能相对简单,适合快速上手(配置选项较少,主要通过 OpenCV 的VideoCapture
参数设置)。 - 兼容性方面:usb_cam依赖于 V4L2,因此在某些非标准摄像头设备上可能无法正常工作。在 Linux 系统上兼容性较好,但在其他操作系统(如 Windows)上不支持;cv_camera基于OpenCV,兼容性较好,支持多种操作系统(如 Linux、Windows)。
下面仅介绍usb_cam的安装即使用方法
二,安装
我使用的是ROS的noetic版本所以使用ros-noetic-usb-cam下载即可
sudo apt update
sudo apt install ros-noetic-usb-cam
下面是我安装时出现的一些错误
由于无法下载usb_cam,发现是未正确配置ROS Noetic软件源,运行一以下代码并没有完成安装
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt-get update
由于直接安装usb_cam报错,尝试安装它的依赖v4l-utils,但失败了。经过查询发现安装 v4l-utils 时,系统尝试安装的 libv4l2rds0 版本与 v4l-utils 所需的版本不匹配(错误信息显示 v4l-utils 需要 libv4l2rds0 的版本为 1.18.0-2build1,但系统尝试安装的版本是 1.20.0-2。)。所以强制降级 libv4l2rds0
sudo apt-get install libv4l2rds0=1.18.0-2build1
sudo apt-get install v4l-utils(安装成功)
sudo apt-get install ros-noetic-usb-cam(安装成功)
安装成功后,可以运行以下命令验证是否正确安装:
rospack find usb_cam
如果安装成功,会返回 usb_cam
的安装路径,例如:
/opt/ros/noetic/share/usb_cam
三,启动节点
usb_cam
提供了一个默认的启动文件,可以直接运行。运行后会出现窗口显示当前摄像头实时图像。
roslaunch usb_cam usb_cam-test.launch
默认发布以下话题:
-
/usb_cam/image_raw
:摄像头原始图像数据(sensor_msgs/Image
)。 -
/usb_cam/camera_info
:摄像头参数信息(sensor_msgs/CameraInfo
)。
在终端输入rviz打开rviz。订阅话题usb_cam/image_raw即可
如果出现image_view相关的报错,可通过安装image_view功能包解决该报错。
sudo apt-get install ros-melodic-image-view
出现warning: Camera calibration file /home/ucar/.ros/camera_info/ head_camera.yaml not found. 这是因为还没有标定,下面会介绍
四,自定义启动文件及使用
需要注意通过 sudo apt install ros-noetic-usb-cam
安装的 usb_cam
是二进制包,不包括源码,安装后会分布在 ROS 的系统目录中,而并不在你自己定义的ROS工作空间中,如果你想将整个usb_cam工具包安装到当前工作空间来你可以使用如下命令将其克隆到工作空间
cd ~/catkin_ws/src
git clone https://github.com/ros-drivers/usb_cam.git
如果你没有克隆到当前工作空间中也是可以正常使用的。
如果需要自定义摄像头参数(如分辨率、帧率、设备号等),可以创建一个自定义的启动文件。 首先需要创建一个功能包
catkin_create_pkg camera_driver rospy usb_cam
创建完成后打开src文件,在里面创建一个launch文件,如下所示。你如果后续要使用opencv格式的话建议修改pixel_format格式为mjpeg,这是一个压缩图像文件,opencv可以解析。当然需要保证你的摄像头支持这个格式
<launch>
<env name="AV_LOG_LEVEL" value="quiet" />
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="log">
<param name="video_device" value="/dev/video0" /> <!-- 摄像头设备路径 -->
<param name="image_width" value="1280" /> <!-- 图像宽度 -->
<param name="image_height" value="720" /> <!-- 图像高度 -->
<param name="pixel_format" value="mjpeg" /> <!-- 像素格式 -->
<param name="camera_frame_id" value="usb_cam" /> <!-- 摄像头坐标系 -->
<param name="io_method" value="mmap"/> <!-- IO 方法 -->
<remap from="/usb_cam/image_raw" to="/camera/image_raw" /> <!-- 重映射话题 -->
</node>
</launch>
可以使用命令如下来查看摄像头是否支持mjpeg格式
v4l2-ctl --list-formats
创建完成后catkin_make编译完成后就可以通过这个launch文件运行usb_cam了。
roslaunch camera_driver camera_driver.launch
如果运行后刷屏出现警告[swscaler @ 0x55638371d0] No accelerated colorspace conversion found from yuv422p to rgb24。我试了很多种方法,觉得这是一种bug,可以在启动时使用以下命令来屏蔽这条错误
roslaunch camera_driver camera_driver.launch 2>&1 | grep -v 'No accelerated colorspace conversion found'
然后你就可以在代码里订阅话题/usb_cam/image_raw
来完成一些处理操作了。
五,摄像头标定
打印棋盘格,量出格的边长,比如我的为2.7cm,棋盘长宽为8X6
安装依赖
sudo apt-get install ros-noetic-camera-calibration
启动roscore
roscore
启动摄像头
roslaunch usb_cam usb_cam-test.launch
启动标定包
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.027 image:=/usb_cam/image_raw camera:=/usb_cam
如下所示开始标定过程
多角度移动标定板,直至calibration按键出现(点亮),点击calibration并等待计算完成。点击SAVE,calibrationdata.tar.gz
将保存在根目录tmp下。
点击 COMMIT,标定文件会自动保存在/home/ucar/.ros/head_camera.yaml
中,标定完成。
这时再运行roslaunch usb_cam usb_cam-test.launch就不会出现warning: Camera calibration file /home/ucar/.ros/camera_info/ head_camera.yaml not found.的报错