ROS摄像头驱动

一,常用的驱动包

在 ROS(Robot Operating System)中,实现摄像头驱动的功能包通常用于从摄像头设备获取图像数据,并将其发布为 ROS 消息(如 sensor_msgs/Image)。

usb_cam 和 cv_camera 都是 ROS 中常用的摄像头驱动功能包,主要用于从 USB 摄像头获取图像数据并发布为 ROS 消息。

下面介绍它们两者的不同点:

  1. 依赖库方面:usb_cam基于 V4L2(Video4Linux2),这是 Linux 系统下的视频设备驱动框架。cv_camera基于 OpenCV,使用 OpenCV 的 VideoCapture 类来读取摄像头数据。
  2.  性能方面,usb_cam可以直接与摄像头硬件交互,性能较高,延迟较低,适合对实时性要求较高的应用;cv_camera通过 OpenCV 读取数据,性能稍低,可能会有一定的延迟。
  3. 功能特性方面:usb_cam支持摄像头参数(如分辨率、帧率、亮度、对比度等)的动态配置(支持从启动文件(launch file)中配置摄像头设备、分辨率、帧率等),支持发布 sensor_msgs/Image 和 sensor_msgs/CameraInfo 消息,支持单目摄像头;cv_camera支持发布 sensor_msgs/Image 消息,支持单目摄像头,功能相对简单,适合快速上手(配置选项较少,主要通过 OpenCV 的 VideoCapture 参数设置)。
  4. 兼容性方面: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.的报错