ros使用相机usb_cam标定内参

如果你使用anconda虚拟环境,则在进行以下操作前,切换到ros兼容的python环境,参考这篇文章

1. 下载安装usb_cam包
  • 下载安装
//安装usb_cam包
sudo apt-get install ros-[换成你的ros版本]-usb-cam

//测试打开相机
roslaunch usb_cam usb_cam-test.launch

出现以下画面:
20220815092801

  • 查看摄像头设备名
ls /dev/video*

选择自己需要显示的设备,再修改launch文件,就可以使用。

20220815093414

如果需要更换相机显示,则下载usb_cam源码修改launch文件

  • 下载usb_cam源码

源码地址

cd 工作空间的src目录下
git clone https://github.com/ros-drivers/usb_cam.git
cd .. //回到工作空间
catkin_make //编译
source devel/setup.bash

查看相机接口信息

v4l2-ctl -d 0 --all

20220815095317

参考相机接口信息修改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>

运行修改后的launch文件即可

roslaunch usb_cam xxx.launch //xxx为你修改后的launch文件
2. 使用笔记本内置相机 / usb相机进行内参标定
  • 打印标定板

官方给出的标定板尺寸: 8x6和0.108

  • 打开相机

roslaunch usb_cam usb_cam-test.launch   

如果你没有标定过的话,你会发现打开相机时会有一条警告

20220815100547

  • 打开标定窗口

一般来说正常安装ros都是包含了camera_calibration,输入下面命令检查一下

rosdep install camera_calibration
#All required rosdeps installed successfully

之后执行相机标定py文件


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

弹出display窗口

20220815101143

其中:
(1)--size 8x6: 为当前标定板的大小(如果你的棋盘格的小方格的个数是9x7,那么我们这里就写–size 8x6)
(2)--square 0.108:为每个小棋盘格的边长,单位是米,上面打印的标定版尺寸
(3)image:=/usb_cam/image_raw:标定当前订阅图像来源自名为/usb_cam/image_raw的topic
(4)camera:=/usb_cam:为摄像机名

注意:

你需要使用rostopic list查看自己的的订阅名,我使用的是USB摄像机,因此用的是上面的命令,如果是其他相机先查阅一下订阅名,修改相应的imagecamera参数,eg:

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 image:=/camera/image_raw camera:=/camera
  • 开始标定

为了得到一个好的标定结果,应该使得标定板尽量出现在摄像头视野的各个位置里:标定板出现在视野中的左边,右边,上边和下边,标定板既有倾斜的,也有水平的,离得近的远的都要有,最好保证所有的进度条都是绿色满格的 。

20220815101143

界面中的

x:表示标定板在视野中的左右位置。

y:表示标定板在视野中的上下位置。

size:标定板在占视野的尺寸大小,也可以理解为标定板离摄像头的远近。

skew:标定板在视野中的倾斜位置。

(1) 通过不停的移动标定板:直到X、Y、Size、Skew四个都变成绿色

(2) 当四个都变绿色时,此时点击CALIBRATE开始标定,过程大约1,2分钟

20220815102829

(3) 点击COMMIT将结果保存到电脑路径:/home/sun/.ros/camera_info/head_camera.yaml,再次启动相机时就不会有Camera Calibration文件找不到的警告了

head_camera.yaml标定好的参数如下:

image_width: 640
image_height: 480
camera_name: head_camera
camera_matrix:
  rows: 3
  cols: 3
  data: [517.5903341153015, 0, 323.3090435751261, 0, 517.7724331237808, 255.469742969125, 0, 0, 1]
distortion_model: plumb_bob
distortion_coefficients:
  rows: 1
  cols: 5
  data: [-0.05426751481755746, -0.03837743589544444, -0.002732448183023058, 0.007057077502912143, 0]
rectification_matrix:
  rows: 3
  cols: 3
  data: [1, 0, 0, 0, 1, 0, 0, 0, 1]
projection_matrix:
  rows: 3
  cols: 4
  data: [502.5735473632812, 0, 328.3470488253988, 0, 0, 511.0068969726562, 254.9924938559434, 0, 0, 0, 1, 0]

参数意义:
image_heightimage_width代表图片的长宽 camera_name为摄像头名
camera_matrix规定了摄像头的内部参数矩阵
distortion_model指定了畸变模型
distortion_coefficients指定畸变模型的系数
rectification_matrix为矫正矩阵,一般为单位阵
projection_matrix为外部世界坐标到像平面的投影矩阵

到此相机内参标定完成
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐