ros2 中实现相机标定

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_camrealsense-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 中,或单独的文件)。

四、常见问题与解决

  1. 棋盘格检测不到

    • 检查图像是否清晰,光照是否均匀(避免过亮 / 过暗或反光)。
    • 确认 --size 参数与实际棋盘格内角点数量一致(不含边框)。
    • 尝试调整相机焦距,让棋盘格占图像较大比例。
  2. 标定结果误差大

    • 确保棋盘格平整(避免弯曲)。
    • 采集更多不同位置、角度的数据(进度条全绿)。
    • 检查 --square 参数是否与实际格子尺寸一致(单位为米)。
  3. 节点启动失败

    • 确认 camera_calibration 包已正确安装(对应 ROS2 发行版)。
    • 检查图像话题是否存在(ros2 topic list),话题类型是否为 sensor_msgs/Image

通过以上步骤,即可在 ROS2 中完成相机标定,获取准确的内参和外参,为后续视觉应用提供基础

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值