车载激光雷达标定到组合导航

本文介绍了一种将车载激光雷达标定到组合导航坐标系中的方法,重点讲解了如何通过标定板获取激光雷达与组合导航间的旋转和平移矩阵。文中详细解释了计算过程,包括点集中心计算、最优旋转矩阵求解及平移矩阵计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

车载激光雷达标定到组合导航


  在无人驾驶领域,经常需要把激光雷达标定到组合导航的坐标系中,这其中就涉及到了两个三维点集之间的旋转变换。标定的大致思路为:设计一块具有特殊几何形状的标定板,标定板上安装有组合导航,因此可以时时刻刻获取组合导航的经纬度坐标,并转化为utm坐标。然后根据标定板中心与组合导航之间的几何位置关系可以计算得到标定板中心的utm坐标。另一方面,在激光雷达的视野下移动标定板,利用一定的算法处理可以从原始点云数据中提取出标定板中心坐标。因此,就得到了两个三维点集,根据这两个三维点集就可以计算出激光雷达到组合导航的旋转矩阵以及平移矩阵。

  下图显示了3个对应点(需要求解的最小点)之间的旋转变换。
在这里插入图片描述

  假设Dataset A为在激光雷达坐标系下测得的标定板中心坐标集,Dataset B为在组合导航坐标系下测得的标定板中心的坐标。相应的点具有相同的颜色,RRR表示旋转,ttt表示平移。我们希望找到将数据集A中的点与数据集B中的点对齐的最佳旋转和平移。这里,“最优”或“最佳”是指最小平方误差。这种变换有时称为欧几里德变换或刚性变换,因为它保留了形状和大小。这与仿射变换不同,仿射变换包括缩放和剪切。

  根据上述描述,假设两个数据集没有噪声,则可以得到如下数学模型:
B=R∗A+t(1) B = R * A + t \tag{1} B=RA+t(1)
  如果两个数据集带有噪声,则需要最小化下列最小二乘误差:
err=∑i=1n∥R∗Ai+t−Bi∥2(2) err = \sum_{i=1}^{n}\left \| R*A^{i}+t-B^{i} \right \|^{2} \tag{2} err=i=1nRAi+tBi2(2)

  为了寻找RRRttt,通常需要一下三个步骤:
  ∙\bullet 计算点集合的中心点
  ∙\bullet 将点集合移动到原点,计算最优旋转矩阵RRR
  ∙\bullet 计算转移矩阵TTT

  计算点集合的中心点
  点集合的中心点计算非常简单,即只需要计算所有点每个维度坐标的平均值,可按如下公式进行计算:
centroidA=1N∑i=1NPAi(3) centroid_{A}=\frac{1}{N}\sum_{i=1}^{N} P_{A}^{i} \tag{3} centroidA=N1i=1NPAi(3)
centroidB=1N∑i=1NPBi(4) centroid_{B}=\frac{1}{N}\sum_{i=1}^{N} P_{B}^{i} \tag{4} centroidB=N1i=1NPBi(4)
其中PAiP_{A}^{i}PAiPBiP_{B}^{i}PBi3×13\times 13×1的矢量[xyz]\begin{bmatrix}x\\ y\\ z\end{bmatrix}xyz

  计算最优旋转矩阵
  可以使用奇异值分解(SVD)来求解得到最优旋转矩阵,首先将两个数据集重新居中,使两个中心点都位于原点,如下图所示。
在这里插入图片描述

  通过将两个数据集居中之后,消除了两个数据集之间的平移成分,从而只剩下旋转需要进行处理。接下来需要计算居中之后两个数据集之间的协方差矩阵,然后利用SVD求解得到旋转矩阵:
H=∑i=1N(PAi−centroidA)(PBi−centroidB)T(5) H=\sum_{i=1}^{N}(P_{A}^{i}-centroid_{A})(P_{B}^{i}-centroid_{B})^{T} \tag{5} H=i=1N(PAicentroidA)(PBicentroidB)T(5)
[U,S,V]=SVD(H)(6) [U,S,V]=SVD(H) \tag{6} [U,S,V]=SVD(H)(6)
R=VUT(7) R=VU^{T} \tag{7} R=VUT(7)
  在求解旋转矩阵时,有一种特殊情况需要注意。有时SVD会返回一个“反射”矩阵,这在数值上是正确的,但在现实生活中实际上是无意义的。因此需要通过检查R的行列式(来自上面的SVD)并查看它是否为负(-1)来解决这种特殊情况。如果是,则V的第三列乘以-1。

if determinant(R) < 0
    [U,S,V] = svd(R)
    multiply 3rd column of V by -1
    R = V * transpose(U)
end if

  计算平移矩阵
  对两个数据集中的每个点运用公式(1),可以得到:
∑i=1N(R×PAi+T)=PBi(8) \sum_{i=1}^{N}(R \times P_{A}^{i} + T) = P_{B}^{i} \tag{8} i=1N(R×PAi+T)=PBi(8)
上式等式两边分别除以数据集的个数NNN可以得到:
T=centroidB−R×centroidA(9) T = centroid_{B} - R \times centroid_{A} \tag{9} T=centroidBR×centroidA(9)

  C++代码实现

/**
 * @brief 对激光雷达进行标定,输出激光雷达相对于东北天的旋转矩阵和平移矩阵
 * @param pts1  输入--根据组合导航数据计算得到的标定板中心东北天坐标,相对于选定的东北天坐标系原点
 * @param pts2  输入--根据对激光雷达原始点云数据进行处理提取出来的标定板在激光雷达坐标系下的中心坐标
 * @param R     输出--旋转矩阵
 * @param T     输出--平移矩阵
 */
void LidarCalib::pose_estimation_3d3d(const vector<Eigen::Vector3d> &pts1, const vector<Eigen::Vector3d> &pts2,
                              Eigen::Matrix3d &R, Eigen::Vector3d &T){
    // pts1 = R * pts2 + T;
    Eigen::Vector3d p1(0,0,0), p2(0,0,0); // center of mass
    int N = pts1.size();
    for (int i = 0; i < N; i++){
        p1 += pts1[i];
        p2 += pts2[i];
    }
    p1 = p1 / N;
    p2 = p2 / N;

    vector<Eigen::Vector3d> q1, q2; // remove the center
    for (int i = 0; i < N; i++){
        Eigen::Vector3d q1_temp, q2_temp;
        q1_temp= pts1[i] - p1;
        q2_temp = pts2[i] - p2;
        q1.push_back(q1_temp);
        q2.push_back(q2_temp);
    }

    // compute q1*q2^T
    Eigen::Matrix3d W = Eigen::Matrix3d::Zero();
    for(int i = 0; i < N; i++){
        W += q2[i] * q1[i].transpose();
    }

    // SVD on W
    Eigen::JacobiSVD<Eigen::Matrix3d> svd(W, Eigen::ComputeFullU | Eigen::ComputeFullV);
    Eigen::Matrix3d U = svd.matrixU();
    Eigen::Matrix3d V = svd.matrixV();

    Eigen::Matrix3d E;
    E << 1,0,0,0,1,0,0,0,(V * (U.transpose())).determinant();

    // pts1 = R * pts2 + T;
    // ENU = R * Lidar + T;
    R = V * E * (U.transpose());
    T = p1 - R * p2;
}
车载毫米波雷达的标定是确保其在自动驾驶、高级驾驶辅助系统(ADAS)和车辆感知系统中提供高精度数据的关键步骤。毫米波雷达因其在恶劣天气条件下的稳定性和较高的测距精度,广泛应用于前方碰撞预警、自适应巡航控制、盲点检测等功能中。为了保证这些功能的可靠性,需要对毫米波雷达进行精确的标定。 ### 标定方法 毫米波雷达的标定主要包括静态标定和动态标定两种方式: 1. **静态标定**:静态标定通常在实验室或受控环境中进行,通过使用已知距离的目标来校准雷达的距离测量精度[^1]。该方法可以消除雷达内部误差,如时钟偏移、信号处理延迟等。具体操作包括将目标放置在不同已知距离处,并记录雷达返回的数据,然后通过算法调整雷达参数以匹配实际距离。 2. **动态标定**:动态标定则是在实际道路条件下进行,主要用于校正安装位置偏差(如角度偏移)、环境干扰等因素引起的误差。这种方法依赖于其他传感器(如摄像头、激光雷达)提供的信息来进行联合标定。例如,在多传感器融合系统中,可以通过视觉信息确定目标的真实位置,并与毫米波雷达的数据进行对比,从而调整雷达的安装角度和位置偏差。 ### 标定流程 毫米波雷达的标定流程一般包括以下几个步骤: 1. **准备工作**:确保雷达处于正常工作状态,并准备好标定所需的设备,如标准反射板、高精度定位装置等。此外,还需要选择合适的标定场地,以减少外部干扰。 2. **距离标定**:在静态环境下,利用已知距离的目标对雷达的距离测量精度进行标定。此过程可能涉及多个距离点,以便覆盖雷达的工作范围。通过比较雷达测量值与真实值之间的差异,调整雷达的内部参数。 3. **角度标定**:角度标定主要是校正雷达的水平和垂直方向上的安装角度偏差。这一步骤通常需要借助外部参考物,如激光指示器或已知位置的目标。通过测量目标在不同角度下的响应,计算出雷达的角度偏差并进行修正。 4. **速度标定**:对于具有多普勒效应测速功能的毫米波雷达,还需要进行速度标定。该过程可以通过移动平台或旋转台来实现,确保雷达能够准确地测量目标的速度。 5. **验证与调整**:完成初步标定后,需要在多种场景下进行测试,以验证标定效果。如果发现某些情况下雷达性能不佳,则需要重新调整相关参数。 6. **定期维护**:由于车辆运行环境复杂且长期使用可能导致雷达性能下降,因此建议定期进行标定,以保持雷达的最佳工作状态。 ### 代码示例 以下是一个简单的Python代码片段,用于模拟毫米波雷达的距离标定过程。假设我们有一个包含真实距离和雷达测量距离的数据集,我们可以使用线性回归模型来拟合这两者之间的关系,并据此调整雷达的测量结果。 ```python import numpy as np from sklearn.linear_model import LinearRegression # 假设的真实距离和对应的雷达测量距离 true_distances = np.array([1.0, 2.0, 3.0, 4.0, 5.0]).reshape(-1, 1) measured_distances = np.array([1.1, 2.1, 3.1, 4.1, 5.1]) # 创建线性回归模型 model = LinearRegression() model.fit(true_distances, measured_distances) # 获取斜率和截距 slope = model.coef_[0] intercept = model.intercept_ print(f"拟合方程: 雷达测量距离 = {slope:.2f} * 真实距离 + {intercept:.2f}") # 使用拟合方程校正新的测量值 new_measured_distance = 4.5 corrected_distance = (new_measured_distance - intercept) / slope print(f"校正后的距离: {corrected_distance[0]:.2f}") ``` 这段代码展示了如何通过线性回归分析来建立雷达测量距离与真实距离之间的关系模型,并利用该模型对新的测量值进行校正。 ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Roar冷颜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值