1. 为什么相机标定是机器人视觉的体检报告想象一下你新配了一副眼镜但镜片度数不准——看东西要么变形要么模糊。相机标定就是给机器人的眼睛做验光确保它看到的图像能真实反映物理世界。我在做视觉SLAM项目时曾因跳过标定步骤导致建图出现10cm的累积误差不得不返工重来。相机镜头天生存在两种误差径向畸变图像边缘弯曲和切向畸变镜头安装倾斜。就像人眼的散光不矫正会导致测量距离时出现系统性偏差三维重建的点云扭曲视觉定位的漂移累积ROS的camera_calibration功能包就像一套自动化验光设备通过分析棋盘格图案计算出相机的内参矩阵焦距、光心位置畸变系数k1,k2,p1,p2,k3外参矩阵双目相机间的相对位置实测表明标定后的Realsense D435i相机在2米距离上的测距误差从3.2%降至0.8%。下面我会手把手带你完成这个机器人验光流程。2. 标定前的准备工作2.1 制作高精度棋盘格标定板相当于验光时的视力表建议使用哑光材质避免反光干扰边长≥0.1m的大棋盘我常用8x6格打印时用游标卡尺验证实际尺寸生成棋盘格的Python代码import cv2 pattern_size (8, 6) # 角点数量 square_size 0.1 # 单位米 pattern_points np.zeros((np.prod(pattern_size), 3), np.float32) pattern_points[:, :2] np.indices(pattern_size).T.reshape(-1, 2) pattern_points * square_size img cv2.drawChessboardCorners(np.ones((800,600)), pattern_size, pattern_points[:,:2], True) cv2.imwrite(chessboard.png, img*255)2.2 搭建标定环境踩坑经验光照要均匀避免强侧光相机固定在三脚架上关闭自动对焦和白平衡标定前先做10分钟预热检查相机话题是否正常rostopic list | grep image_raw3. 单目相机标定实战3.1 启动标定节点运行命令以Realsense为例rosrun camera_calibration cameracalibrator.py \ --size 8x6 \ --square 0.1 \ image:/camera/color/image_raw \ camera:/camera \ --no-service-check关键参数说明参数作用典型值--size棋盘格角点数8x6--square单个格子物理尺寸(m)0.1image图像话题名/camera/color/image_raw3.2 数据采集技巧标定界面会显示四个进度条X/Y移动让棋盘格覆盖视野四角Size变化从最近到最远距离建议0.3m~2mSkew旋转倾斜±60°以内我的采集秘诀先做米字形移动覆盖视野然后像画螺旋线一样逐渐远离最后添加各种倾斜角度采集100张有效样本进度条全绿3.3 保存与验证结果点击CALIBRATE后终端会输出重投影误差建议0.2像素保存的yaml文件包含image_width: 640 image_height: 480 camera_matrix: !!opencv-matrix rows: 3 cols: 3 data: [615.5, 0, 327.2, 0, 615.1, 241.3, 0, 0, 1] distortion_coefficients: !!opencv-matrix rows: 1 cols: 5 data: [0.12, -0.25, 0.001, -0.002, 0.3]验证标定效果import cv2 undistorted cv2.undistort(raw_image, camera_matrix, dist_coeffs)4. 双目相机标定进阶4.1 同步采集设置双目标定需要额外获取左右相机间的旋转矩阵R平移向量T立体矫正参数启动命令示例rosrun camera_calibration cameracalibrator.py \ --approximate 0.1 \ --size 8x6 \ --square 0.1 \ left:/camera/infra1/image_rect_raw \ right:/camera/infra2/image_rect_raw \ right_camera:/camera/right \ left_camera:/camera/left \ --no-service-check4.2 关键注意事项必须同步触发左右相机硬件同步最佳标定板要同时出现在双视野中检查视差图是否连续stereo cv2.StereoBM_create() disparity stereo.compute(left_img, right_img)4.3 参数解析典型输出包含rotation: [0.999, 0.005, -0.012, -0.005, 0.999, -0.001, 0.012, 0.001, 0.999] translation: [-0.1203, 0.0005, 0.0011] essential: !!opencv-matrix fundamental: !!opencv-matrix5. 标定结果的实际应用5.1 提升视觉SLAM精度以RTAB-MAP为例修改配置Camera type0 Matrix typeopencv-matrix rows3/rows cols3/cols data615.5 0 327.2 0 615.1 241.3 0 0 1/data /Matrix Distortion typeopencv-matrix rows1/rows cols5/cols data0.12 -0.25 0.001 -0.002 0.3/data /Distortion /Camera5.2 优化三维测量标定后测距代码示例def calculate_depth(disparity, Q): points cv2.reprojectImageTo3D(disparity, Q) return np.linalg.norm(points[y,x])实测对比距离(m)标定前误差(cm)标定后误差(cm)1.03.20.82.06.71.5记得每3个月或剧烈震动后重新标定——就像眼镜度数会变化相机的视力也需要定期检查。当看到机器人稳定输出厘米级精度的定位数据时你会觉得这些准备工作绝对值得。
从棋盘格到精准感知:ROS camera_calibration实战单目与双目相机标定
发布时间:2026/5/15 22:27:23
1. 为什么相机标定是机器人视觉的体检报告想象一下你新配了一副眼镜但镜片度数不准——看东西要么变形要么模糊。相机标定就是给机器人的眼睛做验光确保它看到的图像能真实反映物理世界。我在做视觉SLAM项目时曾因跳过标定步骤导致建图出现10cm的累积误差不得不返工重来。相机镜头天生存在两种误差径向畸变图像边缘弯曲和切向畸变镜头安装倾斜。就像人眼的散光不矫正会导致测量距离时出现系统性偏差三维重建的点云扭曲视觉定位的漂移累积ROS的camera_calibration功能包就像一套自动化验光设备通过分析棋盘格图案计算出相机的内参矩阵焦距、光心位置畸变系数k1,k2,p1,p2,k3外参矩阵双目相机间的相对位置实测表明标定后的Realsense D435i相机在2米距离上的测距误差从3.2%降至0.8%。下面我会手把手带你完成这个机器人验光流程。2. 标定前的准备工作2.1 制作高精度棋盘格标定板相当于验光时的视力表建议使用哑光材质避免反光干扰边长≥0.1m的大棋盘我常用8x6格打印时用游标卡尺验证实际尺寸生成棋盘格的Python代码import cv2 pattern_size (8, 6) # 角点数量 square_size 0.1 # 单位米 pattern_points np.zeros((np.prod(pattern_size), 3), np.float32) pattern_points[:, :2] np.indices(pattern_size).T.reshape(-1, 2) pattern_points * square_size img cv2.drawChessboardCorners(np.ones((800,600)), pattern_size, pattern_points[:,:2], True) cv2.imwrite(chessboard.png, img*255)2.2 搭建标定环境踩坑经验光照要均匀避免强侧光相机固定在三脚架上关闭自动对焦和白平衡标定前先做10分钟预热检查相机话题是否正常rostopic list | grep image_raw3. 单目相机标定实战3.1 启动标定节点运行命令以Realsense为例rosrun camera_calibration cameracalibrator.py \ --size 8x6 \ --square 0.1 \ image:/camera/color/image_raw \ camera:/camera \ --no-service-check关键参数说明参数作用典型值--size棋盘格角点数8x6--square单个格子物理尺寸(m)0.1image图像话题名/camera/color/image_raw3.2 数据采集技巧标定界面会显示四个进度条X/Y移动让棋盘格覆盖视野四角Size变化从最近到最远距离建议0.3m~2mSkew旋转倾斜±60°以内我的采集秘诀先做米字形移动覆盖视野然后像画螺旋线一样逐渐远离最后添加各种倾斜角度采集100张有效样本进度条全绿3.3 保存与验证结果点击CALIBRATE后终端会输出重投影误差建议0.2像素保存的yaml文件包含image_width: 640 image_height: 480 camera_matrix: !!opencv-matrix rows: 3 cols: 3 data: [615.5, 0, 327.2, 0, 615.1, 241.3, 0, 0, 1] distortion_coefficients: !!opencv-matrix rows: 1 cols: 5 data: [0.12, -0.25, 0.001, -0.002, 0.3]验证标定效果import cv2 undistorted cv2.undistort(raw_image, camera_matrix, dist_coeffs)4. 双目相机标定进阶4.1 同步采集设置双目标定需要额外获取左右相机间的旋转矩阵R平移向量T立体矫正参数启动命令示例rosrun camera_calibration cameracalibrator.py \ --approximate 0.1 \ --size 8x6 \ --square 0.1 \ left:/camera/infra1/image_rect_raw \ right:/camera/infra2/image_rect_raw \ right_camera:/camera/right \ left_camera:/camera/left \ --no-service-check4.2 关键注意事项必须同步触发左右相机硬件同步最佳标定板要同时出现在双视野中检查视差图是否连续stereo cv2.StereoBM_create() disparity stereo.compute(left_img, right_img)4.3 参数解析典型输出包含rotation: [0.999, 0.005, -0.012, -0.005, 0.999, -0.001, 0.012, 0.001, 0.999] translation: [-0.1203, 0.0005, 0.0011] essential: !!opencv-matrix fundamental: !!opencv-matrix5. 标定结果的实际应用5.1 提升视觉SLAM精度以RTAB-MAP为例修改配置Camera type0 Matrix typeopencv-matrix rows3/rows cols3/cols data615.5 0 327.2 0 615.1 241.3 0 0 1/data /Matrix Distortion typeopencv-matrix rows1/rows cols5/cols data0.12 -0.25 0.001 -0.002 0.3/data /Distortion /Camera5.2 优化三维测量标定后测距代码示例def calculate_depth(disparity, Q): points cv2.reprojectImageTo3D(disparity, Q) return np.linalg.norm(points[y,x])实测对比距离(m)标定前误差(cm)标定后误差(cm)1.03.20.82.06.71.5记得每3个月或剧烈震动后重新标定——就像眼镜度数会变化相机的视力也需要定期检查。当看到机器人稳定输出厘米级精度的定位数据时你会觉得这些准备工作绝对值得。