相机与激光雷达标定:gazebo仿真livox_camera_lidar_calibration---相机内参标定
相机与激光雷达标定:gazebo仿真livox_camera_lidar_calibration---相机内参标定
前言
ROS功能包:livox_camera_lidar_calibration提供了一个手动校准Livox雷达和相机之间外参的方法,已经在Mid-40,Horizon和Tele-15上进行了验证。其中包含了计算相机内参,获得标定数据,优化计算外参和雷达相机融合应用相关的代码。本方案中使用了标定板角点作为标定目标物,由于Livox雷达非重复性扫描的特点,点云的密度较大,比较易于找到雷达点云中角点的准确位置。相机雷达的标定和融合也可以得到不错的结果。
前一篇链接中在gazebo中搭建了ROS功能包(livox_camera_lidar_calibration)的仿真场景
本篇在gazebo中进行相机内参的标定
采集相机标定内参的棋盘标定板图像
要求:
要准备20张以上的照片数据,各个角度和位置都要覆盖
启动搭建的gazebo场景
通过rqt_image_view来保存获取的图像
rqt_image_view
- 1
点击那个保存的图标就行了.
在livox_camera_lidar_calibration文件夹下,新建data/camera/photos文件夹,在data/camera下新建in.txt文件
把图片保存在photos下面就行了
然后移动棋盘标定板
在gazebo中有个可以直接移动的图标,就是那个十字箭头,然后选中棋盘标定板,出现3个轴,然后拖动鼠标就可以移动
我在各个位置拍了8张
然后不同角度的拍照,旋转棋盘标定板,改变一定角度,不要太大也.
gazebo也有个图片可以改变物体姿态,
然后在改变3个轴的姿态,再拍几张
重复上面的过程,拍了21张图片
相机内参标定配置
编辑in.txt文件,写入所有需要使用的照片名称
然后编辑cameraCalib.launch文件,将里面的配置弄好
<?xml version="1.0" encoding="UTF-8"?>
<launch>
<param name="camera_in_path" value="$(find camera_lidar_calibration)/data/camera/in.txt" /> <!-- the file to contain all the photos -->
<param name="camera_folder_path" value="$(find camera_lidar_calibration)/data/camera/photos/" /> <!-- the file to contain all the photos -->
<param name="result_path" value="$(find camera_lidar_calibration)/data/camera/result.txt" /> <!-- the file to save the intrinsic data -->
<param name="row_number" type="int" value="8" /> <!-- the number of block on the row -->
<param name="col_number" type="int" value="7" /> <!-- the number of block on the column -->
<param name="width" type="int" value="20" /> <!-- the width of each block on the chessboard(mm) -->
<param name="height" type="int" value="20" /> <!-- the height of each block on the chessboard(mm)-->
<node pkg="camera_lidar_calibration" name="cameraCalib" type="cameraCalib" output="screen"></node>
</launch>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
需要改的是
图片名称路径和文件路径
行数和列数 与每个格的尺寸
进行相机内参标定
修改好后输入指令开始标定
roslaunch camera_lidar_calibration cameraCalib.launch
- 1
其中有的图片运行会非常慢,或者找不到角点,经过调试发现
调用的节点的CPP中有这样一行
if (0 == findChessboardCorners(imageInput, board_size, image_points_buf)) {
- 1
这的检测时间和条件是很高的.
我一开始采的很多图片就识别不了.因为opencv的那个函数就是那样子的.
对于这个问题,可以使用 camera_calibration 这个功能包,在线的采集标定图像,方便一些
最后求到相机内参是这样的:
文章来源: blog.csdn.net,作者:月照银海似蛟龙,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq_32761549/article/details/125676777
- 点赞
- 收藏
- 关注作者
评论(0)