9.基于轨迹相似性理论进行自动驾驶车辆IMU和车身的外参标定

本文介绍了自动驾驶车辆中组合导航的原理,通过Novatel等产品的高精度定位信息进行车体坐标系和IMU坐标系的标定。讨论了轨迹相似性、航位推算及车速源选择,重点分析了标定效果,特别是pitch角的标定挑战。

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

0. 说明

本文部分参考这篇文章,本文相关公式不清晰可以去看这篇博客。

1. 组合导航产品介绍

自动驾驶车辆一般会装有有GNSS/INS组合导航器件,比如NOVATEL,导远这些公司的产品。它可以提供高精度的车辆定位信息。组合定位系统的相关知识可以参考组合定位系统
在这里插入图片描述
我们这里IMU和车体坐标系的标定,就用到了组合导航给出的高精度位姿信息。注意:不同的组合导航产品可能输出位置的参考坐标系不同,在编程的时候也要注意坐标系统一。比如我使用的novatel产品输出的位置信息是在WGS84坐标系下,应该把它转换到ENU导航坐标系。相应坐标系转换可以参考这里

2. 标定原理

一方面,我们通过novatel得到厘米级定位信息,可以获得车辆的运行轨迹“真值”。另一方面,我们也可以通过车速,IMU和车体之间的安装角误差以及novatel得到的IMU到导航系的位姿得到车辆运行轨迹在导航系下的表示。
显然,在各项系数都标定完毕,且忽略一些误差的情况下,两个轨迹应该是重合的。详细情况会在后面讲到。

3. 轨迹相似性原理

假设车体坐标系为m系,IMU系为b系,两者之间有较小的安装角误差。两者之间的外参可以如下表示:
在这里插入图片描述
另外,里程计的测量中还可能存在刻度系数误差 δ K D \delta K_D δKD,其输出速度大小 v ~ \tilde{v} v~与理论速度大小 υ \upsilon υ之间的关系为:在这里插入图片描述
所以,在导航坐标系中里程计的实际速度输出应该为:
在这里插入图片描述
由于车辆只有前向速度,所以 υ D m \upsilon^m_D υDm = 0, υ D \upsilon_D υD, 0,重新整理公式得:
在这里插入图片描述
从上式可以得出,翻滚角不影响里程计的测量值。

3.1 航位推算

假设车辆在行驶中水平的姿态角很小。
在这里插入图片描述
对上式进行积分,可以得到位置方程:
在这里插入图片描述
可以看到,上式包含里程计的刻度因子,组合导航的姿态失准角,IMU到车身的安装角(pitch和yaw),理论上可以标定这几个参数。我们忽略组合导航的姿态失准角,便可以标定IMU到车身的安装角以及里程计的刻度因子。

3.2 轨迹相似的可视化

在这里插入图片描述
可见,真实轨迹和解算轨迹相差一个旋转以及缩放因子。
两点说明:

  1. 缩放是有里程计刻度因子导致;
  2. 相对旋转有导航姿态失准角以及IMU和车身安装角导致;

4. 选择车速源

那我们的车辆速度选择什么来源呢?一个是轮速计,但是他会有刻度因子标定的问题,会把误差引入到我们安装角估计当中来;再就是可以使用NHC(车辆约束假设),这里参考了武汉大学多源智能导航实验室的一篇论文。论文在这
在这里插入图片描述
基于NHC假设,我们可以将GNSS观测的速度(GNSS处于固定解状态时)取模,当做车辆的前向速度,这样就不用估计里程计的刻度因子了。
这样的话,我们就可以用novatel给出的轨迹“真值”和DR轨迹作差,得到误差方程了。
在这里插入图片描述

5. 标定效果

在这里插入图片描述
上图是高程上反应pitch角标定的效果。


下面是分别给pitch和yaw角添加了5度的偏差,看能否标回来。可以看到yaw角能标定回来,pitch角标定效果较差。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后一张放大图表明车辆频繁上下坡会显著降低pitch的标定精度。

### 多传感器融合在大场景SLAM中的实现方案与算法 #### 背景介绍 多传感器融合技术在大场景SLAM(Simultaneous Localization and Mapping)中扮演着至关重要的角色。单一传感器往往难以应对复杂的环境挑战,例如光照变化、动态物体干扰以及长时间运行带来的累积误差等问题[^3]。因此,通过结合多种传感器的优势,能够显著提升系统的鲁棒性精度。 #### 关键技术点分析 1. **多传感器数据同步** 数据同步是多传感器融合的核心之一。为了确保来自不同传感器的数据能够在时间上对齐,在实际应用中通常采用硬件触发或者软件插值的方式完成同步处理[^2]。对于激光雷达摄像头这样的异构传感器组合来说,精确的时间戳管理尤为重要。 2. **标定方法** 传感器之间的相对位置关系需要提前校准好才能有效开展后续工作。目前主流的标定方式包括静态目标物辅助标定法、动态轨迹拟合标定法等[^1]。特别是在自动驾驶领域内,车体上的多个传感器可能还需要额考虑振动等因素的影响来提高标定准确性。 3. **特征提取与关联匹配** 不同类型的传感器会产生各自独特的观测信息形式。比如图像帧里边有丰富的纹理细节可用于构建地图节点;而LiDAR扫描则擅长捕捉距离测量值形成三维空间结构描述。如何把这些差异化的特性合理映射到统一框架下并建立可靠的对应关系成为一大难点[^4]。 4. **状态估计模型设计** 基于贝叶斯理论的状态更新机制广泛应用于各类滤波器当中,如EKF(Extended Kalman Filter), UKF(Unscented Kalman Filter),Particle Filters粒子滤波等等。它们通过对先验概率分布函数不断修正从而得到更接近真实情况的位置姿态估值结果。 5. **回环检测优化策略** 针对大规模环境下可能出现重复区域识别困难的情况,引入词袋模型(Bag Of Words Model) 或者卷积神经网络(Convolutional Neural Networks,CNNs) 进行高效检索比较相似子序列片段有助于减少漂移现象发生几率同时加快收敛速度。 6. **计算资源分配考量** 当涉及到实时在线运算需求时,则需特别注意平衡性能表现与功耗消耗之间矛盾冲突状况下的取舍决策过程。一些轻量化版本的设计思路或许能提供一定借鉴意义,像VINS-Fusion就兼顾到了这一点使得其具备较强适应能力适用于不同类型平台部署场合之下。 --- ```python import numpy as np def sensor_fusion_algorithm(sensor_data_list): """ A simplified example of a multi-sensor fusion algorithm. Args: sensor_data_list (list): List containing data from different sensors. Returns: fused_result (dict): Fused result after processing all input data. """ # Example placeholder function to demonstrate concept fused_result = {} for i, data in enumerate(sensor_data_list): if isinstance(data, dict) and 'type' in data.keys(): if data['type'] == 'camera': processed_camera_data = process_image(data['data']) fused_result.update(processed_camera_data) elif data['type'] == 'lidar': point_cloud = convert_to_pointcloud(data['data']) fused_result.update({'point_cloud': point_cloud}) elif data['type'] == 'imu': orientation = estimate_orientation(data['data']) fused_result.update({'orientation': orientation}) return fused_result def process_image(image_array): """Process image array.""" features_detected = detect_features_in_image(image_array) keypoints_matched = match_keypoints(features_detected) return {'image_features': keypoints_matched} def convert_to_pointcloud(raw_lidar_measurements): """Convert raw LiDAR measurements into structured Point Cloud format.""" points_3d = [] for measurement in raw_lidar_measurements: xyz_coords = calculate_xyz_from_measurement(measurement) points_3d.append(xyz_coords) return np.array(points_3d) def estimate_orientation(imu_readings): """Estimate device orientation using IMU readings.""" quaternion_representation = compute_quaternion(imu_readings) euler_angles = quaternion_to_euler(quaternion_representation) return euler_angles ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

宛如新生

转发即鼓励,打赏价更高!哈哈。

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

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

打赏作者

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

抵扣说明:

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

余额充值