公司动态
3D雷达与相机标定:基于ArUco码的完整原理与工程实践指南
1. 项目概述为什么我们需要3D雷达与相机标定在机器人、自动驾驶和三维重建领域多传感器融合是提升系统感知能力、鲁棒性和精度的核心手段。其中3D激光雷达LiDAR能提供精确、稠密且不受光照影响的三维点云而相机则能提供丰富的纹理和颜色信息。然而这两个传感器“看”到的世界坐标系是不同的。雷达点云位于雷达自身的坐标系下而图像像素则位于相机坐标系下。如果不将它们统一到同一个坐标系下那么雷达探测到的障碍物轮廓就无法与图像中看到的物体边界对齐所谓的“融合”也就无从谈起。这个过程就是传感器标定更具体地说是求解雷达坐标系与相机坐标系之间的刚性变换关系——一个旋转矩阵R和一个平移向量t。这个标定过程听起来像是实验室里的精密操作但实际上它是每一个SLAM即时定位与地图构建工程师、自动驾驶感知算法工程师在实际项目中必须亲手搭建和验证的基础设施。一个标定不准的系统就像戴着一副没调好瞳距的3D眼镜所有后续的感知、定位和决策都可能建立在扭曲的信息之上后果可想而知。因此掌握一套详细、可靠且可复现的标定方法是进入这个领域的必修课。本文将围绕使用ArUco码这一经典工具手把手带你完成从原理理解、工具准备、数据采集到参数解算与验证的全流程。2. 标定原理与核心思路拆解2.1 坐标系转换的数学本质3D雷达与相机标定的核心数学问题是求解一个六自由度的刚体变换。假设我们有一个在雷达坐标系下的点 ( P_{lidar} [x_l, y_l, z_l]^T )以及在相机坐标系下对应的点 ( P_{camera} [x_c, y_c, z_c]^T )。它们之间的关系可以表示为[ P_{camera} R \cdot P_{lidar} t ]其中( R ) 是一个3x3的正交旋转矩阵( t ) 是一个3x1的平移向量。我们的目标就是通过一系列已知在两个坐标系下坐标的对应点对 ( { (P_{lidar}^i, P_{camera}^i) } )来最优地估计出 ( R ) 和 ( t )。这引出了两个关键子问题如何获取高精度的对应点对我们需要一个“信标”它既能在雷达点云中被清晰、稳定地识别和定位也能在相机图像中被高精度地检测和定位。这个信标就是我们的标定板而ArUco码因其检测鲁棒性和提供的角点信息成为了理想选择。如何从对应点对求解变换这是一个经典的“绝对定向问题”或“点云配准问题”通常使用SVD奇异值分解等方法求解。2.2 为什么选择ArUco码作为标定靶标市面上标定板种类很多比如棋盘格、Charuco板、圆形网格等。选择ArUco码或与棋盘格结合的Charuco板进行雷达-相机标定主要基于以下几点考量检测鲁棒性ArUco码内置的二进制编码提供了强大的ID识别和错误检测能力。即使在部分遮挡、光照不均或图像畸变较大的情况下也能被稳定检测到这保证了数据采集的成功率。提供三维结构信息一个单一的ArUco码只能提供四个角点的像素坐标。但我们可以预先精确测量或通过设计如将其打印在平整的硬质板材上知道这四个角点在“标定板坐标系”下的三维坐标。当我们将多个ArUco码以已知的、非共面的空间关系排列在一块板上时我们就获得了一个具有丰富三维结构信息的靶标。雷达可以探测到整个板的点云从而拟合出板的三维平面和角点位置。便于自动化ArUco检测算法成熟如OpenCV的aruco模块可以全自动地输出每个检测到的码的ID和四个角点的像素坐标。这非常适合编写脚本进行批量数据采集和处理。与相机标定流程兼容我们通常需要先对相机进行内参标定求取焦距、主点、畸变系数等。使用棋盘格或Charuco板可以一次性完成相机内参和雷达-相机外参的初始化流程上更统一。注意纯ArUco码板在点云中可能不易识别。更常见的做法是使用Charuco板它结合了棋盘格的角点便于亚像素精度定位和ArUco码提供唯一ID和鲁棒性或者将大的ArUco码粘贴在具有明显几何特征如平板、三角板的物体上以便雷达点云能清晰地捕捉到该物体的轮廓。2.3 整体标定流程设计一个完整的标定流程可以概括为以下四个阶段我们将按此展开准备阶段制作标定板安装并同步传感器。数据采集阶段多角度、多位置采集传感器数据对。数据处理阶段分别从图像和点云中提取标定板角点的三维坐标。参数求解与验证阶段利用对应点对求解变换矩阵并评估标定精度。3. 实操准备工具、数据与环境搭建3.1 硬件与标定板制作传感器3D雷达如Velodyne VLP-16, Ouster OS1, Livox Mid-40等。确保你知道它的坐标系定义通常是前-左-上或右-前-上。相机RGB或灰度相机均可建议使用全局快门相机以减少运动模糊。需要知道相机的大致焦距用于后续初始化。标定板制作 推荐使用Charuco板。你可以使用OpenCV的cv2.aruco.CharucoBoard_create()和cv2.aruco.CharucoBoard.generateImage()函数生成并打印。尺寸板子不宜过小建议对角线长度在雷达有效测距范围内且能在相机视野中占据较大比例。例如一个包含6x8个棋盘格方格尺寸30mm、每个格点放置一个5x5的ArUco码的板子。材质使用平整、坚硬的材质打印如亚克力板或铝板并确保粘贴牢固、无翘曲。平整度直接影响点云中平面拟合的精度。测量你必须精确测量棋盘格方格的物理尺寸单位米这是所有计算的基础。使用游标卡尺多次测量取平均。安装 将雷达和相机刚性固定在同一平台上确保在标定过程中它们之间的相对位姿不变。尽量让两者的视野重叠区域较大。3.2 软件环境与依赖安装你需要准备以下软件环境ROS (Robot Operating System)这是最常用的数据采集和同步框架。我们通过ROS Bag来录制同步的雷达点云和图像话题。OpenCV (4.7)用于检测ArUco/Charuco角点以及进行相机标定和坐标计算。PCL (Point Cloud Library)或Open3D用于处理点云数据如滤波、平面分割、点云配准等。Python作为胶水语言编写数据处理和标定脚本。安装核心依赖以Ubuntu为例# 安装OpenCV包含contrib模块内有aruco sudo apt-get install python3-opencv libopencv-contrib-dev # 安装PCL的Python绑定 (pclpy可能较复杂常用python-pcl或Open3D) pip install open3d numpy scipy # 或者尝试安装python-pcl (可能需要从源码编译) # pip install python-pcl # 确保ROS环境已配置好3.3 数据采集要点与技巧采集数据的好坏直接决定标定上限。遵循以下原则充分激励所有自由度平移将标定板在传感器共同视野内前后、左右、上下移动。旋转将标定板绕其自身X、Y、Z轴旋转并相对于传感器组合进行偏航、俯仰、横滚。目的使标定板在图像和点云中出现在不同的位置和姿态为优化问题提供充分的约束。保证数据质量图像确保标定板清晰、对焦准确、光照均匀避免反光和阴影完全遮盖ArUco码。点云标定板应处于雷达的最佳测距区间内。板面应尽可能正对雷达以获取更稠密、更准确的点云。如果板子太倾斜点云可能过于稀疏。同步使用ROS的message_filters进行近似时间同步或使用硬件触发线确保严格同步。异步数据会引入误差。数据量通常采集30-50组有效数据对同步的图像和点云即可。并非越多越好但覆盖的姿态要全。实操心得采集时可以让人手持标定板缓慢地、连续地做“8字形”或球面运动同时用rosbag record录制所有话题。之后可以按时间或手动截取关键帧。这样比摆拍每个姿势更高效且姿态过渡自然更容易覆盖各种情况。4. 核心数据处理从图像和点云提取对应点这是标定中最关键、最易出错的一步。我们需要为每一组数据获取标定板上一组角点在相机坐标系下的3D坐标以及同一组角点在雷达坐标系下的3D坐标。4.1 图像端获取角点的相机3D坐标对于Charuco板我们假设已经通过单独的相机标定流程得到了相机的内参矩阵 ( K ) 和畸变系数 ( dist )。处理单张图像的步骤如下import cv2 import numpy as np def detect_charuco_corners(image, board, camera_matrix, dist_coeffs): 检测图像中的Charuco角点并估计板子姿态。 Args: image: 输入图像 board: 预定义的CharucoBoard对象 camera_matrix: 相机内参矩阵K dist_coeffs: 畸变系数 Returns: corners_3d: 角点在相机坐标系下的3D坐标 (N, 3) corners_ids: 对应的角点ID success: 是否成功检测 gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 检测角点 corners, ids, rejected cv2.aruco.detectMarkers(gray, board.dictionary) if ids is None or len(ids) 4: # 至少需要检测到一些码 return None, None, False # 插值得到Charuco角点 num_corners, charuco_corners, charuco_ids cv2.aruco.interpolateCornersCharuco( corners, ids, gray, board ) if num_corners 4: # 至少需要4个角点来估计姿态 return None, None, False # 使用PnP算法估计标定板在相机坐标系下的姿态 # object_points: 角点在标定板坐标系下的3D坐标 (单位米) # 我们需要根据charuco_ids从board.chessboardCorners中获取 obj_points board.chessboardCorners[charuco_ids].squeeze(1).astype(np.float32) img_points charuco_corners.squeeze(1).astype(np.float32) # 使用SOLVEPNP_IPPE或SOLVEPNP_ITERATIVE方法 success, rvec, tvec cv2.solvePnP( obj_points, img_points, camera_matrix, dist_coeffs, flagscv2.SOLVEPNP_IPPE_SQUARE # Charuco板是平面适合用IPPE ) if not success: return None, None, False # rvec, tvec 描述了从标定板坐标系到相机坐标系的变换 # 我们将角点从标定板坐标系变换到相机坐标系 R_board_to_cam, _ cv2.Rodrigues(rvec) # 旋转向量转旋转矩阵 corners_3d_in_cam (R_board_to_cam obj_points.T tvec).T # 形状 (N, 3) return corners_3d_in_cam, charuco_ids, True这段代码的核心是cv2.solvePnP函数它利用已知的物体3D点标定板角点、对应的图像2D点以及相机内参求解出了标定板相对于相机的位姿rvec,tvec。进而我们可以将所有角点从标定板坐标系转换到相机坐标系得到我们需要的corners_3d_in_cam。4.2 点云端获取角点的雷达3D坐标从雷达点云中提取标定板角点坐标更具挑战性因为点云是无序且可能包含噪声的。一个典型的流程是点云预处理对原始点云进行直通滤波只保留标定板可能存在的空间区域如传感器前方一定距离和角度内以减小数据量。接着进行统计滤波或半径滤波去除离群噪点。平面分割使用RANSAC算法拟合点云中的主导平面这个平面就是我们的标定板。提取属于该平面的内点。点云投影与边界提取将内点点云投影到拟合的平面上。在这个二维投影上使用Alpha Shape、凸包Convex Hull或矩形拟合算法得到标定板的边界轮廓。角点计算如果拟合的是矩形四个角点可以直接从矩形顶点得到。对于Charuco板我们需要更精确地定位内部角点。一种方法是利用已知的标定板物理尺寸和角点布局。将投影后的点云进行二维网格化。根据点云密度或特征匹配出与标定板角点布局对应的网格顶点。由于雷达点云精度高且我们已知角点在标定板坐标系下的坐标我们可以将提取的平面点云与一个“理想”的标定板点云模型进行ICP迭代最近点配准从而直接得到从标定板坐标系到雷达坐标系的变换进而算出角点坐标。以下是使用Open3D进行平面分割和边界提取的简化示例import open3d as o3d import numpy as np def extract_board_from_pointcloud(pcd_np, board_size_mm): 从点云中提取标定板平面并估算角点。 Args: pcd_np: 点云数据形状为 (N, 3) 的numpy数组。 board_size_mm: 标定板物理尺寸 (width, height)单位米。 Returns: corners_3d_in_lidar: 估算的四个角点在雷达坐标系下的3D坐标 (4, 3)。 success: 是否成功。 pcd o3d.geometry.PointCloud() pcd.points o3d.utility.Vector3dVector(pcd_np) # 1. 预处理这里假设点云已经是感兴趣区域 # 可以添加体素下采样 pcd pcd.voxel_down_sample(voxel_size0.01) # 2. 平面分割 (RANSAC) plane_model, inlier_indices pcd.segment_plane(distance_threshold0.01, ransac_n3, num_iterations1000) [a, b, c, d] plane_model # 平面方程 axbyczd0 inlier_cloud pcd.select_by_index(inlier_indices) if len(inlier_cloud.points) 100: # 内点太少 return None, False # 3. 将内点点云投影到拟合的平面上 # 计算投影点 (一种简单方法找到平面上离每个点最近的点) # 更稳健的方法是构建平面坐标系 inlier_np np.asarray(inlier_cloud.points) # 平面法向量 plane_normal np.array([a, b, c]) plane_normal plane_normal / np.linalg.norm(plane_normal) # 找到平面上的一个点例如所有内点的中心投影到平面上 centroid np.mean(inlier_np, axis0) # 中心到平面的有向距离 dist (np.dot(centroid, plane_normal) d) / np.linalg.norm(plane_normal)**2 point_on_plane centroid - dist * plane_normal # 构建平面上的二维坐标系 # 任意找一个与法向量不平行向量作为X轴基底 temp_vec np.array([1, 0, 0]) if abs(plane_normal[0]) 0.9 else np.array([0, 1, 0]) x_axis np.cross(temp_vec, plane_normal) x_axis x_axis / np.linalg.norm(x_axis) y_axis np.cross(plane_normal, x_axis) # 保证为右手系 # 将三维点投影到二维平面 points_2d [] for pt in inlier_np: vec pt - point_on_plane x np.dot(vec, x_axis) y np.dot(vec, y_axis) points_2d.append([x, y]) points_2d np.array(points_2d) # 4. 寻找二维点云的边界凸包 from scipy.spatial import ConvexHull try: hull ConvexHull(points_2d) hull_points_2d points_2d[hull.vertices] # 凸包顶点二维 except: return None, False # 5. 拟合矩形并获取角点 (这里简化取凸包顶点中近似矩形的四个点) # 更复杂的方法使用最小面积矩形拟合 (cv2.minAreaRect) # 此处假设凸包顶点已近似矩形且顺序已知。实际中需要排序。 # 假设我们通过某种方式得到了四个有序的角点二维坐标 corners_2d (4, 2) # corners_2d ... (排序后的四个顶点) # 将二维角点反投影回三维空间 corners_3d_in_lidar [] for corner_2d in corners_2d: # corners_2d 需要是排序好的四个角点 pt_3d point_on_plane corner_2d[0] * x_axis corner_2d[1] * y_axis corners_3d_in_lidar.append(pt_3d) corners_3d_in_lidar np.array(corners_3d_in_lidar) # (4, 3) # 6. 根据标定板已知尺寸进行缩放和微调 (此处省略) # 已知 board_size_mm (width, height) # 可以计算当前提取的角点构成的矩形的尺寸与已知尺寸求比例进行缩放。 # 或者使用ICP与一个已知角点3D坐标的模型点云进行精配准。 return corners_3d_in_lidar, True重要提示从点云自动、精确地提取任意姿态下的Charuco板所有内部角点是一个研究课题。上述方法仅提取了外部四个角点对于初值估计可能足够。但对于高精度标定更常用的方法是半自动或基于初始值迭代优化半自动在点云可视化工具中手动选取标定板的四个角点或特征点。基于模型ICP先通过图像端得到粗略的R, t将标定板的3D模型所有角点变换到雷达坐标系下作为初始点云然后与实际的雷达点云进行ICP配准精修位姿从而得到更精确的角点雷达坐标。4.3 数据关联与对应点对构建经过4.1和4.2对于第i组数据我们得到了corners_cam_i一组在相机坐标系下的3D角点坐标以及它们的ID。corners_lidar_i一组在雷达坐标系下的3D角点坐标目前假设是四个外部角点且顺序已知。关键步骤是确保两组数据中的角点一一对应。由于我们使用了Charuco板每个角点都有唯一的ID在charuco_ids中。我们需要根据charuco_ids从corners_cam_i中选取与我们提取的corners_lidar_i所对应的那些角点例如只取四个板子外角的ID。确保corners_lidar_i的角点顺序与corners_cam_i中选取的角点顺序完全一致例如都是按左上、右上、右下、左下的顺时针顺序。这样我们就构建了一组对应的3D点对(P_lidar, P_camera)。遍历所有采集的数据帧我们将得到多组这样的对应点对集合用于最终的标定求解。5. 外参求解从点对到变换矩阵当我们收集了足够多N组每组M个角点的对应点对后就可以求解雷达到相机的变换矩阵 ( ^{C}T_{L} )即 ( R, t )。5.1 使用SVD求解绝对定向问题这是最经典和常用的方法。问题表述为找到最优的 ( R ) 和 ( t )最小化所有对应点对的变换误差 [ \min_{R, t} \sum_{i1}^{N} \sum_{j1}^{M} | (R \cdot P_{lidar}^{ij} t) - P_{camera}^{ij} |^2 ] 其中 ( i ) 是数据帧索引( j ) 是角点索引。求解步骤如下去中心化分别计算雷达点集和相机点集的质心中心点。 [ \bar{P}L \frac{1}{K}\sum{k1}^{K} P_{lidar}^k, \quad \bar{P}C \frac{1}{K}\sum{k1}^{K} P_{camera}^k ] 其中 ( K N \times M ) 是总点对数。然后计算去中心化的点 [ Q_{L}^k P_{lidar}^k - \bar{P}L, \quad Q{C}^k P_{camera}^k - \bar{P}_C ]计算协方差矩阵 [ H \sum_{k1}^{K} Q_{L}^k \cdot (Q_{C}^k)^T ]对H进行奇异值分解 [ H U \Sigma V^T ]计算旋转矩阵 [ R V U^T ] 需要检查行列式 ( \det(R) ) 是否为1。如果是-1说明这是反射而非旋转将 ( V ) 矩阵的最后一列取反后再计算 ( R )。计算平移向量 [ t \bar{P}_C - R \cdot \bar{P}_L ]Python实现示例import numpy as np from scipy.spatial.transform import Rotation as R def solve_rigid_transform(points_lidar, points_camera): 使用SVD求解最优的R和t。 points_lidar: (K, 3) 雷达坐标系下的点集 points_camera: (K, 3) 相机坐标系下的对应点集 K 3 assert points_lidar.shape points_camera.shape K points_lidar.shape[0] # 1. 去中心化 centroid_l np.mean(points_lidar, axis0) centroid_c np.mean(points_camera, axis0) q_l points_lidar - centroid_l q_c points_camera - centroid_c # 2. 计算协方差矩阵 H H q_l.T q_c # (3, 3) # 3. SVD分解 U, S, Vt np.linalg.svd(H) # 4. 计算旋转矩阵 R_mat Vt.T U.T # 处理反射情况 if np.linalg.det(R_mat) 0: Vt[-1, :] * -1 R_mat Vt.T U.T # 5. 计算平移向量 t_vec centroid_c - R_mat centroid_l return R_mat, t_vec # 假设 all_points_lidar 和 all_points_camera 是收集好的所有对应点对 (K, 3) R_cl, t_cl solve_rigid_transform(all_points_lidar, all_points_camera) print(fRotation Matrix (Camera - Lidar):\n{R_cl}) print(fTranslation Vector (Camera - Lidar):\n{t_cl})得到的 ( R_{cl} ) 和 ( t_{cl} ) 就是我们要的标定结果表示将一个点在雷达坐标系下的坐标变换到相机坐标系下。5.2 利用非线性优化进行精修SVD方法提供了一个闭式解但它最小化的是点对之间的欧氏距离误差。在实际传感器中噪声模型可能更复杂。我们可以将SVD的解作为初始值进行进一步的非线性优化Bundle Adjustment同时优化外参和内参如果允许并考虑不同的误差项。一个常见的优化目标函数是重投影误差将雷达点根据当前估计的外参变换到相机坐标系再投影到图像平面与图像中检测到的角点像素坐标进行比较。 [ \text{Error} \sum_{i,j} | \pi(K, R, t, P_{lidar}^{ij}) - p_{image}^{ij} |^2 ] 其中 ( \pi ) 是相机投影函数。我们可以使用Ceres Solver或g2o等优化库来实现。这能有效利用所有观测数据通常能得到比SVD更鲁棒、更精确的结果尤其是当数据存在 outliers异常点时。6. 标定结果验证与误差分析标定完成后绝不能直接投入使用必须进行严格的验证。6.1 定量验证方法重投影误差这是最直观的指标。使用标定得到的外参将验证数据集未参与标定的数据中的雷达点云投影到图像上。def project_lidar_to_image(points_lidar, R_cl, t_cl, camera_matrix, dist_coeffs): 将雷达点云投影到图像平面 # 将点从雷达坐标系变换到相机坐标系 points_cam (R_cl points_lidar.T t_cl.reshape(3,1)).T # 过滤掉相机后面的点 (z0) mask points_cam[:, 2] 0 points_cam points_cam[mask] points_lidar points_lidar[mask] # 投影 points_2d, _ cv2.projectPoints(points_cam, np.zeros(3), np.zeros(3), camera_matrix, dist_coeffs) points_2d points_2d.squeeze(1) return points_2d, points_lidar, mask计算投影点与图像中实际边缘、角点或特征之间的平均像素距离。一个好的标定平均重投影误差应小于1-2个像素。点云对齐可视化将雷达点云用标定外参变换到相机坐标系然后与相机图像或深度图如果有叠加显示。在RViz或自定义可视化工具中检查物体的轮廓是否与图像边缘对齐。例如墙壁的边缘、桌子的棱角是否重合。反向投影一致性选取图像中的特征点如标定板角点根据相机内参和深度信息如果有反投影到3D空间得到相机坐标系下的3D点再通过标定外参的逆变换到雷达坐标系与雷达点云中对应区域进行比较。6.2 常见问题与排查技巧实录即使按照流程操作标定结果也可能不理想。以下是一些常见问题及排查思路问题现象可能原因排查与解决方法重投影误差巨大10像素1. 数据对应关系错误。2. 角点提取严重不准。3. 传感器同步极差。4. 标定板尺寸输入错误单位是米还是毫米。1.检查数据关联可视化几组数据在图像和点云中分别标记出你认为的对应角点看是否匹配。2.检查角点像素坐标和3D坐标打印出来看看是否合理。图像角点是否因畸变校正过度而扭曲点云角点是否因平面拟合不准而漂移3.检查时间戳确保图像和点云的时间差在传感器帧周期内如相机30fps则差应33ms。4.核对物理尺寸用游标卡尺重新测量标定板方格尺寸确认代码中使用的单位是米。误差随标定板位置变化1. 相机内参不准特别是畸变系数。2. 相机和雷达之间存在非刚性形变或振动。3. 标定板不平整。1.重新标定相机内参使用更多姿态的标定板图像确保畸变模型正确。2.检查安装刚性用力摇晃传感器组合看是否有相对位移。考虑使用更稳固的支架。3.检查标定板将板子放在绝对平坦的桌面上看是否有翘曲。点云对齐后存在系统性偏移1. 旋转矩阵求解错误反射问题。2. 坐标系定义不一致。1.检查R的行列式应为1。如果是-1在SVD求解后添加反射处理见5.1代码。2.统一坐标系明确雷达和相机的坐标系定义X向前Y向左Z向上。在变换时注意轴的方向。一个简单的检查方法将标定板放在传感器正前方板子法向量应大致指向传感器。变换后的点云法向量方向应与相机光轴方向大致相同。部分区域对齐好部分差1. 相机镜头畸变未正确校正图像边缘畸变大。2. 雷达在不同距离和角度下的测距系统误差。1.使用更优的相机畸变模型如rational模型并在图像边缘也采集足够多的数据。2. 雷达的系统误差较难修正可尝试在标定中只使用中心视野重叠度高的数据。标定结果不稳定1. 数据量不足或姿态覆盖不全。2. 点云角点提取算法噪声大。1.增加数据量并确保姿态多样性特别是绕三个轴的旋转。2.改进点云角点提取尝试半自动选取或使用更鲁棒的平面检测和矩形拟合算法。考虑使用ICP精修。6.3 提升标定精度的进阶技巧多板联合标定在同一场景中同时放置多个不同姿态的标定板一帧数据就能提供大量约束可以减少数据采集工作量并提升精度。运动标定让传感器组合相对于一个静止的标定板运动或者让标定板运动而传感器静止。利用多帧间的约束可以同时标定外参和传感器的时间偏移。在线标定在系统运行过程中利用环境中的自然特征如地面、建筑物边缘进行持续的外参微调以应对安装松动或温度漂移。使用更先进的靶标如带有反光材料的标定板在雷达点云中会产生高强度的回波更容易被分割和识别。整个标定过程是一个系统工程涉及传感器特性理解、数据处理、几何计算和实验设计。第一次尝试可能会遇到各种问题但按照本文的步骤耐心地检查每个环节——从标定板制作、数据采集、角点提取到结果验证——你最终一定能获得一套稳定可靠的雷达-相机外参。这套参数将是你的多传感器感知系统坚实的地基。