参考:
1.
ROS USB摄像头配置(单目和双目)_ros 配置摄像头输出分辨率_小小洋洋的博客-CSDN博客
2.ROS:使用usb_cam软件包调试usb摄像头_[warn] [1686222613.714079718] [usb_cam]: camera ca_通哈膨胀哈哈哈的博客-CSDN博客
补充:上面的参考中,都是使用笔记本自带的摄像头进行校准,本文补充使用多个USB摄像头。
一、usb_cam功能包安装(不推荐使用sudo apt-get install的方式配置usb_cam,因为其不能修改launch文件,导致只能使用一个摄像头)
1.ROS下的usb相机驱动软件功能包为usb_cam,所以使用下面代码将usb_cam功能包下载到工作空间catkin_ws的src下:
cd ~/catkin_ws/src/
git clone https://github.com/bosch-ros-pkg/usb_cam.git usb_cam
cd ../
catkin_make
注意:catkin_make编译时是否正常, 注意shell端输出的日志信息,最后几行会显示编译的结果,有时候由于工作空间包含的东西太多,会导致编译失败,但并不会报错,需要我们自己判断。
编译正常会显示下面这个打印信息:
[100%] Built target usb_cam_node
2.验证是否usb_cam是否能够正常使用:
cd ~/catkin_ws
source devel/setup.bash
roslaunch usb_cam usb_cam-test.launch
注意:usb_cam-test.launch文件中有这一行代码,表示关闭相机的图像
<arg name="image_view" default="false" />
把false改成true再运行launch就可以正常显示了。(若还是没有图像,建议使用cheese软件或v4l2进行尝试,判断是否是USB相机的问题)
二、多个摄像头的校准
为什么要对相机进行校准?
答:在使用张正友标定法拍摄时应尽量保证相机参数不变 这里主要是焦距不变,焦距变化会导致部分fov变化,从而影响几乎全部的标定参数。当然,大多数场景中相机本身焦距都是固定的,而消费级,如手机镜头由于其本身畸变不大,且焦距较短,因此影响会比较小。
相机标定的应用场景不一样,有的是想从二维图像还原出三维场景,这时就对相机外参有要求(如固定角度固定位置的相机成像然后还原三维场景)
一般在我们使用usb_cam来启动相机时,如果没有校准过的话都会收到如下的警告,例如“[WARN] [1423194481.257752159]: Camera calibration file /home/xxx/.ros/camera_info/camera.yaml not found.”,对于"unknown control 'focus_auto'"的警告是由于启动的摄像头不具备自动对焦功能,如果启动的摄像头具备自动对焦功能的话,则没有这个警告提示。
1.安装相机校准软件包。
在kinetic中安装校准软件包命令如下:
sudo apt install ros-melodic-camera-calibration
2. 棋盘格可从这个网页教程中找到跳转入口:attachment:check-108.pdf of camera_calibration/Tutorials/MonocularCalibration - ROS Wiki
多个摄像机采用一个一个标定的方式进行,具体步骤如下:
首先,修改usb_cam/config/usb_cam.yml文件中的video_device端口号为usb端口号(可以使用ls /dev/video*查询摄像头的端口号),然后usb_cam功能包下的usb_cam.launch文件,启动usb相机。
然后,使用rostopic list查看相机的话题名称,将下面命令中的xxx替换成查找到的后缀为/image_raw的话题名并运行:
rosrun camera_calibration cameracalibrator.py –size 8×6 –square 0.0255 image:=xxx
下面对命令中各参数进行简单介绍,–size是上述棋盘的宽度和高度, –square 0.0255是棋盘的一个小方格的实际尺寸。这个小方块是正方形,但是打印出来的尺寸可能会各不相同。由于使用A4纸张打印出来是25.5毫米(我们可以使用尺子测量一下每个格子的宽度即可),所以下面命令中写了0.0255,如果换成A3纸张打印的话,每个方格是36毫米,需要将square参数改为0.036即可,一般由于打印的不同大小我们只需要改动square大小,其他参数基本上不用改动。
接着,引用其他博主的一张图(如果没有看到这些进度条和按钮,记得用鼠标点击窗口的最大化图标,这样就能看到了):
点击calibration后需要等待一会儿,save按钮就会变绿,点击save即可将校准文件保存。
然后,运行如下指令:
cd /tmp
mkdir ~/calibration
mv calibrationdata.tar.gz ~/calibration
cd ~/calibration
tar xzf calibrationdata.tar.gz
mv ost.txt ost.ini
rosrun camera_calibration_parsers convert ost.ini head_camera0.yaml
head_camera0.yaml就是最终的相机配置文件,由于有多个摄像头需要进行校准文件的配置,因此校准文件不能再使用默认的搜寻路径,这里先将得到的相机配置文件存放到~/catkin_ws/src/usb_cam/config下,具体如何操作看第三步。
重复以上操作,对第2个usb摄像头进行同样操作即可,注意文件命名不要重叠。
三、多个摄像头的调用——launch文件的修改
1.首先创建usb0和usb1摄像头的yml配置文件,通过修改yml配置文件可以调整相机的白平衡、曝光值等参数。
cd ~/catkin_ws/src/usb_cam/config
cp usb_cam.yml usb_cam0.yml
cp usb_cam.yml usb_cam1.yml
2.对usb0.yml和usb1.yml进行修改,主要有:
video_device: /dev/video4 #使用v4l2->open device可以进行查询,也可用其它方式
camera_name: head_camera1 #和别的usb_camera一样就行
camera_frame_id: head_camera1
3.第2部分提到由于存在多个摄像头需要进行校准文件的配置,所以需要指定校准文件的索引路径,指定索引路径也是在usb0.yml文件中,找到下面参数进行修改即可。
camera_info_url: "file://~/catkin_ws/src/usb_cam/config/head_camera0.yaml"
4.仿照usb_cam-test.launch文件的书写形式进行修改,主要是针对节点名、相机yml配置文件、以及remap重映射的话题对象进行修改(<group ns="xxx">可任意命名),可得:
<launch>
<group ns="camera0">
<arg name="image_view" default="true" />
<node name="usb_cam0" pkg="usb_cam" type="usb_cam_node" output="screen" >
<rosparam command="load" file="$(find usb_cam)/config/usb_cam0.yml"/>
</node>
<node if="$(arg image_view)" name="image_view" pkg="image_view" type="image_view"
respawn="false" output="screen">
<remap from="image" to="/camera0/usb_cam0/image_raw"/>
<param name="autosize" value="true" />
</node>
</group>
<group ns="camera1">
<arg name="image_view" default="true" />
<node name="usb_cam1" pkg="usb_cam" type="usb_cam_node" output="screen" >
<rosparam command="load" file="$(find usb_cam)/config/usb_cam1.yml"/>
</node>
<node if="$(arg image_view)" name="image_view" pkg="image_view" type="image_view"
respawn="false" output="screen">
<remap from="image" to="/camera1/usb_cam1/image_raw"/>
<param name="autosize" value="true" />
</node>
</group>
</launch>