基于ROS环境的相机标定教程

一、参考资料

ROS学习——利用电脑相机标定

二、安装usb_cam驱动包

usb_cam - ROS Wiki
GitHub - ros-drivers/usb_cam: A ROS Driver for V4L USB Cameras

usb_cam包用于读取图像。

1. 源码安装usb_cam

usb_cam用于实时SLAM,配合ROS平台使用。

1.1 下载usb_cam源码

cd catkin_ws/src

git clone https://github.com/ros-drivers/usb_cam.git
或者
git clone https://github.com/bosch-ros-pkg/usb_cam.git

cd ..
catkin_make
source ~/catkin-ws/devel/setup.bash

1.2 编译安装usb_cam

cd usb_cam
mkdir build
cd build
cmake ..
make

2. apt安装usb_cam

安装相机标定包camera_calibration,把kinetic改成自己的ros版本。

sudo apt-get install ros-kinetic-usb-cam

安装好 usb_cam 包后,在 /opt/ros/kinetic/share/usb_cam/launch 中会存在 usb_cam-test.launch 文件,在该文件中启动两个ROS节点,usb_cam_nodeimage_view

3. 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>

参数解释

  • /dev/video0 是默认摄像头的编号,可以根据具体情况更改。

    查看摄像头的指令:ls /dev/video*

2. 启动usb_cam相机驱动节点

rosrun usb_cam usb_cam_node

4. 启动相机

运行usb_cam中的launch文件,如果可以成功运行,且能看到图像则安装成功。

roslaunch usb_cam usb_cam-test.launch

如果成功启动后,会发布一系列的topic:

rostopic list

# 输出
/usb_cam/camera_info
/usb_cam/image_raw
/usb_cam/image_raw/compressed
/usb_cam/image_raw/compressed/parameter_descriptions
/usb_cam/image_raw/compressed/parameter_updates
/usb_cam/image_raw/compressedDepth
/usb_cam/image_raw/compressedDepth/parameter_descriptions
/usb_cam/image_raw/compressedDepth/parameter_updates
/usb_cam/image_raw/theora
/usb_cam/image_raw/theora/parameter_descriptions
/usb_cam/image_raw/theora/parameter_updates

其中,usb_cam 是一个名字空间。

5. 显示相机图像

rosrun image_view image_view image:=/usb_cam/image_raw

三、相机标定(单目)

单目标定:How to Calibrate a Monocular Camera
双目标定:How to Calibrate a Stereo Camera

camera_calibration - ROS Wiki
Camera Calibration and 3D Reconstruction
ROS&OpenCV下单目和双目摄像头的标定与使用

ROS官方提供了用于单目、双目标定的 camera_calibration 包,这个包是使用opencv里的张正友标定法。

1. 安装camera_calibration

安装相机标定包camera_calibration,把kinetic改成自己的ros版本。

rosdep install camera_calibration
或者
sudo apt-get install ros-kinetic-camera-calibaration
rostopic list

# 输出
/camera/camera_info
/camera/image_raw

2. 相机标定关键步骤

2.1 准备标定板

calib.io

2.2 启动相机标定包

camera_calibration
cameracalibrator.py

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.0254  image:=/usb_cam/image_raw camera:=/usb_cam

参数解释

  • –size:表示内角点的size;
  • –square:指定方格的尺寸,我们使用的是A4纸打印的黑白格,尺寸为25.4 mm=0.0254 m;
  • image:表示使用的是来哪个Topic的图像数据。

2.3 移动标定板

标定开始后,在GUI屏幕的右侧,可以看到标有X、Y、Size和Skew的条形控件。不停地移动标定板,当条形控件被绿色填满,意味着校准完成。在校准过程中,需要将棋盘对着相机视野,朝着左/右/上/下/前/后移动,还需要倾斜棋盘。

  • X控件:表示标定板在相机视野中的左右移动;
  • Y控件:表示标定板在相机视野中的上下移动;
  • Size控件:表示标定板在相机视野中的前后移动,可以理解为标定板离相机的远近;
  • skew:标定板在相机视野中的倾斜转动;
    在这里插入图片描述

2.4 计算CALIBRATE标定

所有条形控件变为绿色,CALIBRATE 按钮由灰色变为深绿色,则标定完成,点击 CALIBRATE 开始标定计算,过程大约1-2分钟。标定成功后,右边三个按钮全量(全部变为绿色),此时终端会显示相机的各个参数。
在这里插入图片描述

2.5 保存SAVE标定数据

点击SAVE 按钮,标定结果保存路径为:/tmp/calibrationdata.tar.gz

2.6 查看标定数据

解压并打开 calibrationdata.tar.gz,可以看到标定的图片和标定好的数据文件ost.txtost.yamlost.yaml 文件可以提取出来改名为任意名称,例如 left.yamlright.yaml

3. 解析ost.yaml

ost.yaml 是相机内参的标定文件,又称为校正数据文件

image_width: 640
image_height: 480
camera_name: camera
camera_matrix:
  rows: 3
  cols: 3
  data: [ 581.88585,    0.     ,  314.2472 ,
            0.     ,  592.27138,  210.27091,
            0.     ,    0.     ,    1.     ]
camera_model: plumb_bob
distortion_coefficients:
  rows: 1
  cols: 5
  data: [0.221666, -0.575455, -0.014215, 0.003895, 0.000000]
rectification_matrix:
  rows: 3
  cols: 3
  data: [ 1.,  0.,  0.,
          0.,  1.,  0.,
          0.,  0.,  1.]
projection_matrix:
  rows: 3
  cols: 4
  data: [ 591.88599,    0.     ,  315.96148,    0.     ,
            0.     ,  603.39893,  205.72873,    0.     ,
            0.     ,    0.     ,    1.     ,    0.     ]

参数解释

  • image_widthimage_height:表示图片的长宽;
  • camera_name:相机名称;
  • camera_matrix:相机内参矩阵;
  • distortion_model:指定畸变模型的类型;
  • distortion_coefficients:畸变系数矩阵;
  • rectification_matrix:矫正矩阵,一般为单位阵;
  • projection_matrix:世界坐标到像平面的投影矩阵;

4. 图像去畸变

有了校正数据后,可以使用 image_proc 包提供的功能来对相机图像进行去畸变。image_proc 会从指定的 topic 上提取相机校正参数,这个topic默认为 /xxx_cam/camera_infoxxx_cam 是名字空间,可以指定,例如:

ROS_NAMESPACE=usb_cam rosrun image_proc image_proc

image_proc 会将处理后的图像发布到 /xxx_camera/image_rectimage_rect_colorimage_rect 是灰度图像,image_rect_color 是彩色图像。

如何将yaml校正数据文件发布到 /xxx_camera/camera_info 话题?对于单目相机比较简单,在启动 usb_cam 时,为其指定 camera_info_url 参数即可,camera_info_url 参数则指向yaml校正数据文件。修改 usb_cam-test.launch 文件,在其中添加如下:

<param name="camera_info_url" type="string" value="file://$(find usb_cam)/ost.yaml" />
<!-- param name="camera_info_url" type="string" value="file:///home/yoyo/ost.yaml" / -->

这样在 usb_camera 启动时会加载该相机的yaml校正数据文件。其实,usb_camera 是调用了 camera_info_manager 包提供的 CameraInfoManager 类来读取yaml校正参数文件并发布。

5. 总结

  1. 当标定板(棋盘格)上出现彩色线条时,表明当前画面被有效捕捉;
  2. 当标定板差不多占满相机界面时,捕捉图像成功率最高;
  3. 每次移动之后,请保持标定板不动直到窗口出现高亮提示;
  4. 为了得到一个好的标定结果,应该让标定板尽量出现在相机视野的各个位置。让标定板在视野的左边、右边、上边、下边、倾斜、水平等,多移动标定板。
  • 3
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
【资源说明】 基于ROS的手眼标定程序包源码(c和c++)+项目使用说明.zip 包含基础标定程序包,提供多组机器臂工具坐标和Marker坐标即可完成标定 - 包含JAKA、AUBO机械臂标定程序 - 本程序在`ros kinetic melodic`平台测试通过 >本程序包目前仅针对眼在手上的标定,通过输入两组以上的机械臂姿态信息(x,y,z,rx,ry,rz)和装在机械手上的相机所识别的标志物的姿态信息,经过程序计算可输出,机械臂末端和相机之间的坐标变换矩阵。 ```mermaid graph LR A[机械臂位姿] -->C[手眼标定] B[相机中标定板位姿] -->C C --> F[末端与相机位姿] ``` ## 使用指南 ### 1、基础使用 基础使用是在得到多组机械臂位姿与机械臂末端相机位姿之后直接使用本程序进行计算机械臂末端与相机之间的位姿关系。 - 机械臂位姿可以通过示教器或者SDK进行获取 - 相机中标定板位姿我们可以通过ArUco或者ArTookit等工具获得,可以参考这里。 > 我们使用一般读到的`(X,Y,Z,RX,RY,RZ)`六个数据表示 #### 安装测试 1. 下载编译 ``` git clone http://10.55.16.230/sangxin/handeye-calib.git cd handeye-calib catkin_make or catkin build ``` 2. 修改base_hand_on_eye_calib.launch文件中,base_handeye_data参数为从机械臂位姿和标定板位姿所在的配置文件所在的绝对目录,可以使用launch文件的`find`。 ``` <launch> <!-- <arg name="base_handeye_data" default="The file path of handeye data." /> --> <arg name="base_handeye_data" default="$(find handeye-calib)/config/base_hand_on_eye_test_data.csv" /> <node pkg="handeye-calib" type="base_hand_on_eye_calib.py" name="base_hand_on_eye_calib" output="screen" > <param name="base_handeye_data" value="$(arg base_handeye_data)" /> </node> </launch> ``` 3. 运行程序 ``` source devel/setup.bash roslaunch handeye-calib base_hand_on_eye_calib.launch ``` 4. 查看结果 程序会根据配置文件中的坐标进行计算,最终输出如下数据(单位毫米,弧度制): 数据包含不同算法下计算结果,以及计算结果的标准差和方差等数据。 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
ROS单目相机标定是一种通过使用ROS(机器人操作系统)来校准单目相机的方法。校准相机的目的是确定相机的内部参数(例如焦距和畸变系数),以便在图像处理和计算机视觉应用中正确地测量和估计物体的位置和大小。为了进行ROS单目相机标定,可以参考ROS Wiki提供的教程。首先,需要安装相应的ROS软件包,例如使用以下命令安装ROS Melodic版本的相机标定软件包: sudo apt-get install ros-melodic-camera-calibration 然后,确保相机已经通过ROS发布了图像,可以使用以下命令列出ROS主题以检查图像是否已发布: rostopic list 通过执行以上步骤,您就可以开始进行ROS单目相机标定了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [ROS单目相机标定](https://blog.csdn.net/weixin_44709392/article/details/124169293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [1.ROS机器视觉:单目摄像头的调用与标定](https://blog.csdn.net/wzfafabga/article/details/127206880)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花花少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值