目录
系列文章目录
前言
三、标定目标
3.1 使用自定义标定目标
四、数据处理
4.1 相机数据中的标定目标检测
4.2 激光雷达数据中的标定目标检测
输入过滤器:
正常估算:
区域增长:
尺寸过滤器:
RANSAC:
4.3 用于 2D-3D 姿态估计的透视点算法
4.4 用于 3D-3D 配准的 GICP
4.5 误差计算和标定确定性估计
五、工作区
5.1 机器人工作区
5.1.1 初始化新机器人工作区
六、节点、可组合节点和小节点
6.1 节点
6.1.1 multisensor_calibration
6.1.2 extrinsic_camera_lidar_calibration
6.1.3 extrinsic_lidar_lidar_calibration
6.1.4 extrinsic_camera_reference_calibration
6.1.5 extrinsic_lidar_reference_calibration
6.1.6 publish_pointcloud
6.1.7 initialize_robot_workspace
6.2 可组合节点/小节点
6.2.1 CameraTargetDetection / CameraDataProcessingNodelet
对于外参的多传感器标定,工具箱的开发使用了非对称标定目标,如下图所示。非对称可以在传感器数据中检测到目标的完整 6-DOF 姿态,从而减少对应搜索中可能出现的歧义,使标定过程更加稳健。
多传感器标定 "使用的默认标定目标具有以下属性:
不过,多传感器标定工具箱允许通过编辑 yaml 文件来调整标定目标的参数:
%YAML:1.0
board_width: 1.2 # width of board in meters
board_height: 0.8 # height of board in meters
marker_size: 0.18 # side length of aruco markers in meters
marker_ids: # ids of marker used as a single column matrix
rows: 4
cols: 1
dt: i
data: [1, 2, 3, 4] # marker order goes clockwise, starting from top left of board
marker_positions: # x,y marker positions (top-left) on board relative to center, stored row-by-row in meters. x: rightwards, y: upwards
rows: 4
cols: 2
dt: f
data: [-0.55, 0.35,
0.37, 0.35,
0.37, -0.17,
-0.55, -0.17]
cutouts: # Cutouts (id + parameters) stored as a single row matrix. x: rightwards, y: upwards
rows: 1
cols: 12
dt: f
data: [1, -0.15, 0.15, 0.12, # Circular cutout: (id: 1, parameters: {X,Y,Radius})
1, 0.15, -0.15, 0.12,
1, -0.15, -0.15, 0.12]
min_marker_detection: 2 # minimum number of markers that need to be detected in the camera image
cad_model_mesh: "calibration_target_3holes_cad_mesh.ply" # relative file path to CAD model of the calibration target as mesh
cad_model_cloud: "calibration_target_3holes_cad_cloud.ply" # relative file path to CAD model of the calibration target as cloud
CAD 模型网格/云通过 GICP 将模型数据与分割点云对齐,用于优化检测到的目标姿态。
标定目标通过 ArUco 标记在图像数据中进行检测。在此过程中,利用 OpenCV 提供的功能来检测标记并计算标定目标相对于摄像机的姿态。为了从标记检测中推导出目标的姿态,该算法需要摄像机的固有参数,因此良好的固有标定至关重要。检测到的标记的图像点会被存储起来,随后作为 PnP 算法的一部分用作二维对应。此外,利用检测到的标记的图像位置和有关标定板几何形状的先验知识,还可以创建标定目标的三维点云。检测成功后,将公布检测结果、目标的 6-DOF Pose 以及重建的 3D 点云。其中,检测到的角所属的标记 ID 将存储在该点的强度值中。
激光雷达云数据中标定目标的检测和姿态估计是通过多个连续步骤实现的。其中使用了点云库(PCL)中的多种算法。
检测成功后,将公布检测结果以及目标的 6-DOF 姿态和分割后的三维点云。其中,检测到的角所属的标记 ID 将存储在该点的强度值中。
上述算法的参数作为动态参数公开,可通过调用 rqt_reconfigure 或从用户界面(编辑->首选项)打开首选项进行调整。下面是这些参数的概述:
在使用 2D-3D 对应集(如相机-激光雷达标定)进行外参姿态估计时,会使用 OpenCV 的透视-n-点(PnP)算法。配置 PnP 算法的参数是动态参数,可通过调用 rqt_reconfigure 或从用户界面打开首选项(编辑->首选项)进行调整。下面是这些参数的概述:
在对两个激光雷达传感器的三维点云进行配准(如激光雷达-激光雷达标定)时,会使用 “small_gicp ”的广义 ICP (GICP)。配置 GICP 算法的参数是动态参数,可通过调用 rqt_reconfigure 或从用户界面打开首选项(编辑->首选项)进行调整。下面是这些参数的概述:
在使用 PnP 算法通过 2D-3D 对应对准两个传感器的标定过程中,标定质量由平均再投影误差(mean reprojection error.html)来衡量。对于良好的标定,典型的重投影误差在 2-4 像素之间。
在两个三维传感器的标定中,传感器数据通过 GIPC 对齐,标定质量通过均方根误差(RMSE)来衡量。对于良好的标定,典型的均方根误差在视图厘米范围内。
为了量化结果的确定性,还要计算各个目标姿势的标准偏差。其中,对于给定的外参标定,检测到的标定目标的姿态从源传感器的坐标系投影到参考传感器的坐标系。平移和旋转差的标准偏差可以很好地说明标定的一致性。
标定使用工作区来存储设置和标定结果。这样做的目的是为每个机器人使用一个工作区(机器人工作区),其中为每个传感器和标定类型创建不同的子工作区(标定工作区)。
典型的工作区结构如下:
| settings.ini
| .urdf
| _.urdf
|
|----___calibration
| | settings.ini
| | calibration_results.txt
| | urdf_snippet.txt
| | .yaml
| |
| |---observations
| |---_backups
| | | ...
|
|----___calibration
| | ...
|
| ...
所有工作区的默认根文件夹都是 $HOME/multisensor_calibration
关于不同工作区内容的详细讨论见下文。
根目录(即机器人工作区)和每个子目录(即标定工作区)都有一个设置文件 (settings.ini),其中分别包含机器人和标定的特定设置。
机器人设置包含以下参数:
如果提供了 URDF 模型,外参标定结果将直接写入 URDF 文件。此外,标定计算出的外参姿态如果可用,也会直接存储到 URDF 文件中。在这种情况下,现有文件将被重命名,并在文件名后附加上次修改的日期。即使没有提供 URDF 文件,标定仍可执行。但仍会发出警告信息。
要初始化新的机器人工作区,有两个选项:
ros2 run multisensor_calibration initialize_robot_workspace --ros-args -p robot_ws_path:= -p robot_name:= [-p urdf_model_path:=]
5.2 标定工作区
标定设置包括特定的标定设置,并与下文所述的不同标定例程的启动参数相对应。每次标定后,结果都会存储在相应子目录下的 calibration_results.txt 文件中。除标定结果外,还会在 urdf_snippet.txt 文件中写入一个 XML 块,其中包含可复制到 URDF 文件中的标定数据。
如果在标定节点的启动配置中进行了指定,捕获的观测数据将存储在观测值中。在新标定开始时,之前的标定数据将被备份并移动到 _backups 中的一个新子文件夹中。
如果在机器人设置中指定了 URDF 文件,且该文件中存在已标定传感器的条目,则外参标定结果将直接写入 URDF 文件。
5.3 工作区模板
标定配置器还允许安装工作区模板。这在首次运行标定时尤其有用。默认情况下,标定配置器有一个示例机器人的工作区模板。不过,如果从源代码构建并安装了多传感器标定工具箱,则可以为配置器提供更多自定义工作区模板。具体方法如下
启动多传感器标定的主要用户友好入口点。它将启动标定配置器,通过该配置器可对任何标定进行参数化并启动标定。这不需要任何启动参数,只需像这样启动即可:
ros2 run multisensor_calibration multisensor_calibration
用于在照相机和激光雷达传感器之间进行外参标定的节点,具有用户友好的用户界面。
它包括
启动参数:
robot_ws_path: 存放机器人工作区的文件夹路径。如果该文件夹不存在,则不会创建。请参阅 “初始化新的机器人工作区 ”一节,了解如何创建新的工作区。
类型: 字符串 字符串
target_config_file(目标配置文件): 标定目标配置文件的路径。
例如,“$(find multisensor_calibration)/config/TargetWithCirclesAndAruco.yaml” ($(find multisensor_calibration)/config/TargetWithCirclesAndAruco.yaml
类型: 字符串
camera_sensor_name:要标定的摄像机传感器名称。
类型: 字符串 字符串
camera_image_topic(图像主题 相应摄像机图像的话题名称。
类型: 字符串 字符串
lidar_sensor_name:要标定摄像机的激光雷达传感器名称。
类型: 字符串 字符串
lidar_cloud_topic: 相应激光雷达云的话题名称。
类型: 字符串 字符串
camera_info_topic: 摄像机信息话题名称。如果省略此参数,摄像机信息主题名称将由指定的 camera_image_topic 生成。
类型: 字符串 字符串
默认值:"”
image_state: 所用摄像机图像的状态。
类型: 字符串 字符串
默认值: 'DISTORTED
可能的值:
DISTORTED(扭曲)": 来自摄像机的图像,即图像失真尚未校正,在进行立体声处理时也未校正。
未扭曲": 图像没有失真,但未进行立体处理校正。
'stereo_rectified'(已校正): 为立体处理而矫正的图像,即外极线水平对齐。
is_stereo_camera: 如果要将摄像机标定为立体摄像机,则设置为 “true”。如果设置为 “true”,则还需要设置 “right_camera_sensor_name ”和 “right_camera_info_topic”。
类型: bool
默认值:false
right_camera_sensor_name:当摄像机作为立体摄像机系统进行标定时,右侧摄像机传感器的名称。如果 is_stereo_camera == true 则为必填项。
类型: 字符串
默认值: "”
right_camera_info_topic: 与右侧摄像机相对应的摄像机信息的话题名称。将摄像机标定为立体摄像机系统时需要使用此名称。在 is_stereo_camera == true 时必须填写。
类型: 字符串 字符串
默认值:"”
rect_suffix: 右侧传感器名称的后缀以及整流图像的坐标系 id。如果输入图像的 “image_state”(图像状态)为 DISTORTED 或 UNDISTORTED,则会将其添加到修正后的坐标系图像 ID 中。如果 imageState_ 为 STEREO_RECTIFIED,则会从坐标系图像 ID 中移除。
类型: 字符串 字符串
默认值:"_rect
base_frame_id: 如果指定,外参姿态将根据给定帧 ID 的帧来计算。这不会改变参考传感器(即激光雷达传感器)的坐标系 ID,但会将估计的外参姿态执行后验变换到指定的坐标系。如果未指定或留空,外参姿态将根据参考传感器的坐标系计算。
类型: 字符串
默认值:"”
use_initial_guess(使用初始猜测): 从 TF 树中使用外参传感器姿态初始猜测(如果有)的选项。
类型: bool
默认值:false
save_observations(保存观测数据): 将用于标定的记录观测值保存到工作区的选项
类型:bool
默认值:false
sync_queue_size: 用于同步摄像机图像和激光雷达云图信息的队列大小
类型:int
默认值:100
use_exact_sync 如果要在摄像机图像信息和激光雷达云信息之间实现精确时间同步,则设为 true。
类型: bool
默认值:false
用于在两个激光雷达传感器之间进行外参标定的节点,具有用户友好的用户界面。
它包括
启动参数:
robot_ws_path: 存放机器人工作区的文件夹路径。如果该文件夹不存在,则不会创建。请参阅 “初始化新的机器人工作区 ”一节,了解如何创建新的工作区。
类型: 字符串 字符串
target_config_file(目标配置文件): 标定目标配置文件的路径。
例如,“$(find multisensor_calibration)/config/TargetWithCirclesAndAruco.yaml” ($(find multisensor_calibration)/config/TargetWithCirclesAndAruco.yaml
类型: 字符串
src_lidar_sensor_name:要标定的源激光雷达传感器名称。
类型: 字符串 字符串
src_lidar_cloud_topic: 相应激光雷达云的话题名称。
类型: 字符串 字符串
ref_lidar_sensor_name:要标定源激光雷达传感器的参考激光雷达传感器的名称。
类型: 字符串 字符串
ref_lidar_cloud_topic: 相应激光雷达云的话题名称。
类型: 字符串 字符串
base_frame_id: 如果指定,外参姿态将以给定帧 ID 的帧为基准进行计算。这不会改变参考传感器(即激光雷达传感器)的坐标系 ID,但会将估计的外参姿态执行后验变换到指定的坐标系。如果未指定或留空,外参姿态将根据参考传感器的坐标系计算。
类型: 字符串
默认值:"”
use_initial_guess(使用初始猜测): 从 TF 树中使用外参传感器姿态初始猜测(如果有)的选项。
类型: bool
默认值:false
align_ground_planes: 设置为 “true”,可额外对齐传感器数据中的地面平面。此外,还要指定直立坐标系 ID。类型:bool 默认值:false
upright_frame_id: Z 轴向上的坐标系 ID。用于检测传感器数据中的地平面。类型:字符串 字符串 默认值:"”
save_observations(保存观测数据): 将用于标定的记录观测值保存到工作区的选项
类型: bool
默认值: false
sync_queue_size: 用于同步摄像机图像和激光雷达云图信息的队列大小
类型:int
默认值:100
use_exact_sync 如果要在摄像机图像信息和激光雷达云信息之间实现精确时间同步,则设为 true。
类型: bool
默认值:false
该节点用于通过用户友好的用户界面,引导摄像机相对于参照物进行外参标定。
它包括
启动参数:
robot_ws_path: 存放机器人工作区的文件夹路径。如果该文件夹不存在,则不会创建。请参阅 “初始化新的机器人工作区 ”一节,了解如何创建新的工作区。
类型: 字符串 字符串
target_config_file(目标配置文件): 标定目标配置文件的路径。
例如,“$(find multisensor_calibration)/config/TargetWithCirclesAndAruco.yaml” ($(find multisensor_calibration)/config/TargetWithCirclesAndAruco.yaml
类型: 字符串
camera_sensor_name:要标定的摄像机传感器名称。
类型: 字符串 字符串
camera_image_topic(图像主题 相应摄像机图像的话题名称。
类型: 字符串 字符串
reference_name: 标定的基准名称。
类型: 字符串 字符串
reference_frame_id: 提供基准数据的坐标系 ID。
类型: 字符串 字符串
camera_info_topic:摄像机信息主题的名称: 摄像机信息话题名称。如果省略此参数,摄像机信息主题名称将由指定的 camera_image_topic 生成。
类型: 字符串 字符串
默认值:"”
image_state: 所用摄像机图像的状态。
类型: 字符串 字符串
默认值: 'DISTORTED
可能的值:
DISTORTED(扭曲)": 来自摄像机的图像,即图像失真尚未校正,在进行立体声处理时也未校正。
未扭曲": 图像没有失真,但未进行立体处理校正。
'stereo_rectified'(已校正): 为立体处理而矫正的图像,即外极线水平对齐。
is_stereo_camera: 如果要将摄像机标定为立体摄像机,则设置为 “true”。如果设置为 “true”,则还需要设置 “right_camera_sensor_name ”和 “right_camera_info_topic”。
类型: bool
默认值:false
right_camera_sensor_name:当摄像机作为立体摄像机系统进行标定时,右侧摄像机传感器的名称。如果 is_stereo_camera == true 则为必填项。
类型: 字符串
默认值: "”
right_camera_info_topic: 与右侧摄像机相对应的摄像机信息的话题名称。将摄像机标定为立体摄像机系统时需要使用此名称。在 is_stereo_camera == true 时必须填写。
类型: 字符串 字符串
默认值:"”
rect_suffix: 右侧传感器名称的后缀以及整流图像的坐标系 id。如果输入图像的 “image_state”(图像状态)为 DISTORTED 或 UNDISTORTED,则会将其添加到修正后的坐标系图像 ID 中。如果 imageState_ 为 STEREO_RECTIFIED,则会从坐标系图像 ID 中移除。
类型: 字符串 字符串
默认值:"_rect
base_frame_id: 如果指定,外参姿态将根据给定帧 ID 的帧来计算。这不会改变参考传感器(即激光雷达传感器)的坐标系 ID,但会将估计的外参姿态执行后验变换到指定的坐标系。如果未指定或留空,外参姿态将根据参考传感器的坐标系计算。
类型: 字符串
默认值:"”
save_observations(保存观测数据): 将用于标定的记录观测值保存到工作区的选项
类型: bool
默认值: false
该节点用于引导激光雷达传感器相对于参照物进行外参标定,具有用户友好的用户界面。
它包括
启动参数:
robot_ws_path: 存放机器人工作区的文件夹路径。如果该文件夹不存在,则不会创建。请参阅 “初始化新的机器人工作区 ”一节,了解如何创建新的工作区。
类型: 字符串 字符串
target_config_file(目标配置文件): 标定目标配置文件的路径。
例如,“$(find multisensor_calibration)/config/TargetWithCirclesAndAruco.yaml” ($(find multisensor_calibration)/config/TargetWithCirclesAndAruco.yaml
类型: 字符串
src_lidar_sensor_name:要标定的源激光雷达传感器名称。
类型: 字符串 字符串
src_lidar_cloud_topic: 相应激光雷达云的话题名称。
类型: 字符串 字符串
reference_name:标定参考的名称。
类型: 字符串 字符串
reference_frame_id: 提供基准数据的坐标系 ID。
类型: 字符串 字符串
base_frame_id:基准帧 ID: 如果指定,外参姿态将以给定帧 ID 的帧为基准进行计算。这不会改变参考传感器(即激光雷达传感器)的坐标系 ID,但会将估计的外参姿态执行后验变换到指定的坐标系。如果未指定或留空,外参姿态将根据参考传感器的坐标系计算。
类型: 字符串
默认值:"”
save_observations(保存观测数据): 将用于标定的记录观测值保存到工作区的选项
类型: bool
默认值: false
节点,用于从指定的 PLY 文件加载点云,并以给定的 frame_id 将其发布到给定的话题上。
启动参数:
point_cloud_file(云点文件): 加载点云的 PLY 文件。
类型: 字符串
默认值:"”
topic_name:发布点云的话题名称。
类型: 字符串 字符串
默认值: "”
frame_id: 要在其上发布点云的坐标系 ID。
类型: 字符串 字符串
默认值: "”
根据给定信息初始化不存在的机器人工作区的节点。
启动参数:
robot_ws_path: 机器人工作区的初始化路径。
类型: 字符串 字符串
默认值: "”
robot_name: 工作区对应的机器人名称。
类型: 字符串 字符串
默认值: "”
urdf_model_path:(可选)与机器人相关联的 URDF 模型的路径。
类型: 字符串 字符串
默认值: "”
该节点小程序用于运行相机数据处理,进而检测相机数据中与其他数据隔离的标定目标。这对开发和调试摄像机数据中的标定目标检测特别有帮助。
启动参数
相机: 摄像机的命名空间。
类型:字符串 字符串
默认: "/camera
image: 图像主题的名称: 摄像机命名空间中图像话题的名称。
类型: 字符串 字符串
默认值: "image_color
image_state(图像状态): 所用摄像机图像的状态。
类型: 字符串 字符串
默认值: "DISTORTED
可能的值:
DISTORTED(扭曲)": 来自摄像机的图像,即图像失真尚未校正,在进行立体声处理时也未校正。
未扭曲": 图像没有失真,但未进行立体处理校正。
'stereo_rectified'(已校正): 为立体处理而矫正的图像,即外极线水平对齐。
target_config_file(目标配置文件): 标定目标配置文件的路径。
例如:“$(find multisensor_calibration)/config/TargetWithCirclesAndAruco.yml”。
发布的话题:
~/annotated_image: 照相机图像,其中注有标定目标的检测标记。
~/target_pattern: 在摄像机中检测到的标定目标云,并重新投影到三维云中。只有在激光雷达云中检测到标定目标后才能使用。
~/marker_corners: 根据检测到的目标姿态推导出的标定目标上 ArUco 标记的角。标记角的每个点都用强度场内 ArUco 标记的 ID 增强。只有在激光雷达云中检测到标定目标后才能使用。
~/board_pose:检测到的标定目标的 6-DOF 姿态。只有在激光雷达云中检测到标定目标后才可用。
广告服务:
~/request_camera_intrinsics: 请求加载相机传感器内在元件的服务。
~/capture_target: 触发目标捕捉的服务。
~/request_processor_state: 获取处理器初始化状态的服务