ROS2 中实现相机标定,主要依赖官方提供的 camera_calibration 功能包,该包支持单目、双目相机的内参(焦距、主点、畸变系数)和外参(双目基线等)标定。以下是详细的实现步骤:
一、准备工作
1. 硬件与环境
- 待标定的相机(单目或双目),确保已通过 ROS2 驱动发布图像数据(如
sensor_msgs/Image类型话题)。 - 打印一张棋盘格标定板(推荐使用黑白棋盘格,可通过 在线工具生成),需记录:
- 棋盘格内角点数量(如
8x6,即每行 8 个、每列 6 个内角点,不含边框)。 - 每个棋盘格的实际物理尺寸(如
0.024m,即 2.4 厘米)。
- 棋盘格内角点数量(如
- 确保 ROS2 环境正常(已安装对应发行版,如 Humble、Iron 等)。
2. 安装 camera_calibration 功能包
camera_calibration 是 ROS2 官方标定工具,通过 APT 安装:
bash
# 替换 <distro> 为你的ROS2发行版(如humble、iron)
sudo apt install ros-<distro>-camera-calibration
安装完成后,可通过以下命令验证:
bash
ros2 pkg list | grep camera_calibration
3. 确认相机图像话题
相机需通过 ROS2 驱动(如 usb_cam、realsense-ros 等)发布图像话题,首先确认话题是否正常:
- 启动相机驱动(以
usb_cam为例,需先安装ros-<distro>-usb-cam):bash
-
ros2 run usb_cam usb_cam_node_exe - 查看图像话题(通常为
/image_raw或/camera/image_raw):bash
-
ros2 topic list # 列出所有话题 ros2 topic echo /image_raw # 确认话题有数据(二进制图像数据) - 可视化图像(可选,需安装
rqt_image_view):bash
-
在弹出的界面中选择相机图像话题,确认图像清晰、无遮挡。ros2 run rqt_image_view rqt_image_view
二、单目相机标定步骤
1. 运行标定节点
使用 camera_calibration 中的 cameracalibrator 节点,指定图像话题、棋盘格参数:
bash
# 格式:
# ros2 run camera_calibration cameracalibrator --size [内角点行数x列数] --square [单个格子尺寸(米)] image:=<图像话题> camera:=<相机命名空间>
# 示例(假设内角点8x6,格子0.024m,图像话题为/camera/image_raw):
ros2 run camera_calibration cameracalibrator --size 8x6 --square 0.024 image:=/camera/image_raw camera:=/camera
参数说明:
--size:棋盘格内角点数量(如8x6表示宽 8 个、高 6 个)。--square:单个棋盘格的物理尺寸(单位:米)。image:=<话题>:相机发布的图像话题(需与实际话题一致)。camera:=<命名空间>:相机的 ROS 命名空间(用于后续保存标定结果)。
2. 采集标定数据
运行命令后,会弹出一个标定界面,界面右侧有 4 个进度条:
X:棋盘格在图像左右方向的覆盖范围。Y:棋盘格在图像上下方向的覆盖范围。Size:棋盘格与相机的距离变化(近 / 远)。Skew:棋盘格的倾斜角度变化。
操作要求:
- 缓慢移动棋盘格,让其出现在图像的不同位置(左上、右上、左下、右下、中心)。
- 改变棋盘格与相机的距离(近、中、远)。
- 倾斜棋盘格(让平面与相机光轴有夹角)。
- 直到 4 个进度条均变为绿色(表示数据足够)。
此时界面会显示检测到的棋盘格角点(绿色点),若未检测到,检查棋盘格是否清晰、光照是否均匀(避免反光)。
3. 计算并保存标定结果
- 点击界面中的 CALIBRATE 按钮,程序会自动计算内参(焦距、主点)和畸变系数(k1, k2, p1, p2, k3),耗时约 10-30 秒(取决于数据量)。
- 计算完成后,点击 SAVE 按钮,标定结果会保存到临时目录(如
/tmp/calibrationdata/<日期>/),生成的文件包括:ost.txt:标定参数的文本记录。<相机命名空间>.yaml:相机信息文件(核心,包含内参和畸变系数),例如camera.yaml。
4. 应用标定结果
将保存的 <相机命名空间>.yaml 文件复制到相机驱动的配置目录(如 usb_cam 的配置文件夹),并在相机启动文件(.launch.py 或 .param.yaml)中指定 camera_info_url 路径,例如:
python
运行
# 在相机launch文件中添加参数
parameters=[
{"camera_info_url": "file:///path/to/your/camera.yaml"}
]
重启相机驱动后,相机将发布包含标定信息的 sensor_msgs/CameraInfo 话题(如 /camera/camera_info),供后续视觉算法(如 SLAM、目标检测)使用。
三、双目相机标定步骤
双目相机需同时标定左右目内参,以及左右目的相对外参(旋转矩阵、平移向量),步骤与单目类似,但需指定左右目两个图像话题。
1. 运行标定节点
bash
# 格式:
# ros2 run camera_calibration cameracalibrator --size [内角点行数x列数] --square [单个格子尺寸(米)] \
# left:=<左目图像话题> right:=<右目图像话题> left_camera:=<左目命名空间> right_camera:=<右目命名空间>
# 示例(左目话题/camera/left/image_raw,右目话题/camera/right/image_raw):
ros2 run camera_calibration cameracalibrator --size 8x6 --square 0.024 \
left:=/camera/left/image_raw right:=/camera/right/image_raw \
left_camera:=/camera/left right_camera:=/camera/right
2. 采集与保存数据
操作与单目相同,需确保左右目同时清晰拍到棋盘格。标定完成后,会生成两个 .yaml 文件(左目和右目),以及双目外参(包含在右目的 yaml 中,或单独的文件)。
四、常见问题与解决
-
棋盘格检测不到:
- 检查图像是否清晰,光照是否均匀(避免过亮 / 过暗或反光)。
- 确认
--size参数与实际棋盘格内角点数量一致(不含边框)。 - 尝试调整相机焦距,让棋盘格占图像较大比例。
-
标定结果误差大:
- 确保棋盘格平整(避免弯曲)。
- 采集更多不同位置、角度的数据(进度条全绿)。
- 检查
--square参数是否与实际格子尺寸一致(单位为米)。
-
节点启动失败:
- 确认
camera_calibration包已正确安装(对应 ROS2 发行版)。 - 检查图像话题是否存在(
ros2 topic list),话题类型是否为sensor_msgs/Image。
- 确认
通过以上步骤,即可在 ROS2 中完成相机标定,获取准确的内参和外参,为后续视觉应用提供基础
974

被折叠的 条评论
为什么被折叠?



