ROS下使用并校准多个USB摄像头

参考:

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>
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
您好!要在ROS使用USB摄像头,您需要进行以下步骤: 1. 首先,确保您已经安装了ROS,并且创建了一个ROS工作空间。 2. 连接您的USB摄像头到计算机上,并确保它已被正确识别。您可以通过运行`lsusb`命令来查看已连接的USB设备列表,确认摄像头是否显示在其中。 3. 在ROS工作空间的src目录下,创建一个新的包,例如`camera_pkg`,并初始化该包: ``` cd ~/catkin_ws/src catkin_create_pkg camera_pkg rospy ``` 4. 在`camera_pkg`包下创建一个新的节点文件,例如`camera_node.py`,并添加以下内容: ```python #!/usr/bin/env python import rospy from sensor_msgs.msg import Image from cv_bridge import CvBridge import cv2 def camera_callback(data): bridge = CvBridge() cv_image = bridge.imgmsg_to_cv2(data, "bgr8") cv2.imshow("USB Camera", cv_image) cv2.waitKey(1) def camera_node(): rospy.init_node("camera_node", anonymous=True) rospy.Subscriber("/usb_camera_topic", Image, camera_callback) rospy.spin() if __name__ == '__main__': try: camera_node() except rospy.ROSInterruptException: pass ``` 5. 保存并关闭文件后,给节点文件添加可执行权限: ``` chmod +x camera_node.py ``` 6. 编译ROS工作空间: ``` cd ~/catkin_ws catkin_make ``` 7. 运行节点: ``` rosrun camera_pkg camera_node.py ``` 这样,ROS节点将订阅名为`/usb_camera_topic`的图像消息,并显示在名为"USB Camera"的窗口中。您可以根据需要修改节点文件中的话题名称和图像显示方式。 希望这对您有帮助!如有任何问题,请随时提问。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值