ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SLAM技术全景拆解:从滤波到图优化与激光视觉融合

SLAM技术全景拆解:从滤波到图优化与激光视觉融合 最近在整理无人驾驶和移动机器人定位相关的内容时发现很多初学者对 SLAMSimultaneous Localization and Mapping同步定位与建图这套体系最大的困惑不是单点算法不会用而是坐标系、滤波、图优化、传感器融合这几条线串不起来。网上的资料大多是“视觉 SLAM 十四讲”式的分章讲解或者直接丢一个开源框架让你跑真正能打通“为什么用滤波、为什么转图优化、激光和视觉怎么融合”的闭环教程并不多。这篇文章我会按照一条主线来拆解坐标系与标定 → 滤波类 SLAM → 图优化与因子图 → 激光视觉融合 → 实战 Demo。不管你是刚接触 SLAM 的学生还是已经在做机器人、无人驾驶相关项目的开发者这篇文章的目标都是让你读完能建立起完整的技术框架并且能自己动手跑一个简单的融合定位示例。文章会覆盖高频知识点卡尔曼滤波、扩展卡尔曼滤波EKF、粒子滤波、滑动窗口滤波、因子图优化、外参标定、多帧点云积累、前端里程计与后端优化的关系等。涉及代码的部分我会给出可运行的示例尽量做到“拿到就能跑跑完能理解”。1. SLAM 与无人驾驶定位为什么它是核心中的核心1.1 什么是 SLAMSLAM 全称是 Simultaneous Localization and Mapping翻译过来就是“同步定位与建图”。它要解决的是一个经典问题一个移动的传感器平台车、机器人、无人机在未知环境中如何一边确定自己的位置一边构建环境地图这两个问题互相依赖定位需要地图建图需要准确的位姿。所以 SLAM 必须同时求解而不是先定位再建图。在无人驾驶场景中定位精度直接决定车辆能不能安全行驶在城市道路、隧道、地下停车场等复杂场景中。对于 L3 级以上的自动驾驶系统业内人士对定位精度的要求通常是厘米级到分米级。单纯靠 GPS 远远不够——城市峡谷里卫星信号被遮挡误差可能直接到十几米隧道里干脆没有信号。这时候就需要 SLAM 结合视觉、激光雷达、IMU惯性测量单元等多种传感器来提供高精度的连续定位。1.2 SLAM 在无人驾驶中的定位链路完整的无人驾驶定位系统通常分为两层全局定位通过 GPS、高精地图匹配等方式确定车辆在全球坐标系中的大致位置。局部定位与建图通过 SLAM 持续估计车辆相对于周围环境的位姿并生成/更新局部地图弥补 GPS 信号丢失或误差过大的场景。SLAM 输出的位姿位置 姿态还会被下游路径规划、决策控制模块使用。因此SLAM 的实时性和鲁棒性直接关系到整个系统的安全。1.3 视觉 SLAM 与激光 SLAM按传感器类型划分SLAM 主要有两大分支分支核心传感器优点缺点视觉 SLAM单目/双目/RGB-D 相机成本低、信息丰富、可做语义对光照敏感、深度估计困难、易受纹理缺失影响激光 SLAM2D/3D 激光雷达精度高、测距直接、不受光照影响成本高、点云稀疏时特征少、缺乏语义信息两者结合就是激光视觉融合 SLAM用视觉弥补激光的语义与纹理不足用激光弥补视觉的深度与光照敏感问题这也是当前无人驾驶和高级辅助驾驶系统中比较主流的发展方向。2. 坐标系与标定所有融合定位的第一步2.1 常用坐标系做 SLAM 和传感器融合首先要弄清楚各个坐标系之间的转换关系。常见的有世界坐标系World/W固定在地面上的全局坐标系是所有位姿估计的基准。车体坐标系Body/Base固定在被测车辆/机器人本体上通常原点在车辆后轴中心或 IMU 中心。传感器坐标系Sensor相机、激光雷达、IMU 各自有独立的坐标系。像素坐标系Pixel视觉图像中的二维像素坐标。SLAM 的核心工作之一就是把不同传感器坐标系下的测量值统一到同一个坐标系下。2.2 刚体变换与位姿表示两个坐标系之间的关系可以用一个 4×4 的齐次变换矩阵表示T | R t | | 0 1 |其中 R 是 3×3 旋转矩阵t 是 3×1 平移向量。一个三维点 P 从一个坐标系变换到另一个坐标系P T * P在代码中工程上通常用四元数Quaternion表示旋转避免欧拉角的万向锁问题。比如一个常见的变换示例import numpy as np from scipy.spatial.transform import Rotation as R # 构造一个平移 (1, 2, 3)旋转为绕 Z 轴 90 度 t np.array([1.0, 2.0, 3.0]) quat [0.0, 0.0, 0.7071, 0.7071] # [x, y, z, w] rot R.from_quat(quat) T np.eye(4) T[:3, :3] rot.as_matrix() T[:3, 3] t # 原始点 p np.array([0.0, 0.0, 0.0, 1.0]) p_transformed T p print(变换后的点, p_transformed[:3])这段代码演示了如何用四元数构造齐次变换矩阵并完成点云的坐标变换。实际项目中这个操作会被大量重复执行所以一定要理解清晰。2.3 外参标定以相机-激光雷达为例说到激光视觉融合必须面对外参标定问题。所谓外参就是两个传感器坐标系之间的相对位姿。使用 Kalibr 做相机内参标定是比较通用的流程。大体步骤如下打印棋盘格或 AprilGrid 标定板。录制一段相机拍摄标定板的 rosbag 数据。使用 Kalibr 工具检查数据质量并标定内参焦距、主点、畸变系数。对于激光雷达与相机的外参标定更常用的开源工具是lidar_camera_calibration或者Autoware 的标定工具。核心思路是通过提取标定板在点云中的平面和图像中的角点将 3D-2D 对应点代入 PnP 求解得到外参矩阵。强调一点标定结果的精度直接影响后续所有融合算法的效果。外参误差哪怕只有 1 厘米、1 度在远距离融合时都会被放大成很大的投影误差。所以工程上建议定期校核外参特别是车辆收到颠簸或碰撞后。3. 滤波类 SLAM从卡尔曼滤波到粒子滤波3.1 为什么 SLAM 需要滤波传感器数据都带有噪声。激光雷达测距有高斯噪声相机位姿估计有漂移IMU 有零偏和积分累积误差。滤波的作用就是把多个带噪声的测量融合起来估计出更准确的系统状态通常是位姿。在 SLAM 中“滤波”这个词有两大含义状态估计滤波如卡尔曼滤波KF、扩展卡尔曼滤波EKF、粒子滤波PF用于在线递归地估计机器人位姿。信号滤波如中值滤波、高斯滤波、低通滤波用于对原始传感器数据进行去噪和数据预处理。这两类滤波你都会在 SLAM 工程中遇到。本节我们先讲状态估计滤波信号滤波会放到第 5 节传感器数据处理中结合实战讲解。3.2 卡尔曼滤波KF卡尔曼滤波适用于线性高斯系统。它的核心思想是用状态预测和观测更新两步交替进行得到最优状态估计。预测利用运动模型预测当前状态和协方差。更新利用观测模型校正预测结果。下面是一个一维卡尔曼滤波的完整 Python 示例import numpy as np import matplotlib.pyplot as plt # 真实值位置随时间匀速变化 dt 0.1 v 1.0 # 速度 true_pos np.arange(0, 100) * v * dt # 带噪声的观测 np.random.seed(42) noise_std 0.3 measurements true_pos np.random.normal(0, noise_std, sizelen(true_pos)) # 卡尔曼滤波参数 x 0.0 # 初始状态 P 1.0 # 初始协方差 A 1.0 # 状态转移矩阵简单位置模型 H 1.0 # 观测矩阵 Q 0.01 # 过程噪声 R 0.09 # 观测噪声即 noise_std^2 filtered_pos [] for z in measurements: # 预测 x_pred A * x P_pred A * P * A Q # 更新 K P_pred * H / (H * P_pred * H R) x x_pred K * (z - H * x_pred) P (1 - K * H) * P_pred filtered_pos.append(x) # 绘制对比 plt.figure(figsize(10, 4)) plt.plot(true_pos, labelTrue, linewidth2) plt.plot(measurements, labelMeasurement, alpha0.6) plt.plot(filtered_pos, labelFiltered, linewidth2) plt.legend() plt.title(1D Kalman Filter) plt.xlabel(Step) plt.ylabel(Position) plt.grid(True) plt.savefig(kalman_demo.png, dpi120)运行这段代码后你会得到三条曲线真实位置、带噪声的观测、滤波后的位置。滤波输出明显比原始观测平滑这就是卡尔曼滤波的效果。参数 Q 和 R 的意义Q 是过程噪声协方差表示你有多信任运动模型。Q 越大滤波越跟随观测。R 是观测噪声协方差表示你有多信任传感器。R 越大滤波越平滑但响应越慢。3.3 扩展卡尔曼滤波EKF真实 SLAM 系统中运动模型和观测模型都是非线性的。比如车辆的运动模型包含角度更新θ θ ω*dt这里 cos/sin 就是非线性项。直接把卡尔曼滤波套用会失效因此需要对非线性函数做一阶泰勒展开也就是求雅可比矩阵这就是扩展卡尔曼滤波EKF。EKF 的步骤和 KF 基本一致只是状态转移和观测方程变成了非线性函数并在当前估计点做线性化x_pred f(x, u) P_pred F * P * F^T Q其中 F 是 f 对 x 的雅可比矩阵。在 SLAM 中EKF 通常维护一个包含位置、姿态、速度、陀螺零偏等状态的大向量计算量随路标点数量增长呈平方级因此在小场景 SLAM 中适用但在大规模环境中会力不从心。3.4 粒子滤波粒子滤波不假设系统是高斯分布而是用一组带权重的随机粒子来近似后验概率分布。它特别适合非高斯、非线性系统也适合全局定位问题。粒子滤波的核心步骤初始化在地图范围内随机撒粒子。预测每个粒子按运动模型移动。权重更新根据激光、视觉等观测计算每个粒子的权重。重采样去掉低权重粒子复制高权重粒子维持粒子数量。2D SLAM 中经典的Gmapping算法就是基于粒子滤波实现的适合小场景室内建图。不过在大规模环境中粒子滤波需要的粒子数会指数增长容易退化和耗尽这也是它后来被图优化方法取代的原因之一。3.5 滑动窗口滤波滑动窗口滤波在 SLAM 中的含义是只维护最近 N 帧位姿和观测丢掉更早的信息。这本质上是一种“有界记忆”的优化策略常用于视觉惯性里程计VIO中。它比 EKF 更接近非线性优化比全局 BA光束平差法计算量更小专门用于实时性要求高的场景。滑动窗口滤波器有两大关键操作边缘化Marginalization当某个关键帧被移出窗口时把它包含的信息通过 Schur 补变成先验约束保留下来而不是直接丢弃。信息矩阵维护窗口内的状态量构成信息矩阵增量更新时只修改局部子块提升计算效率。这里的“滑动窗口”和你可能查到的信号处理中的“滑动窗口滤波”不同。前者是状态估计的窗口化优化策略后者是对一段连续信号取均值/中值的滤波算法。两者名字相似但完全不是一件事。4. 图优化与因子图主流 SLAM 的后端核心4.1 为什么从滤波转向图优化EKF-SLAM 在路标数量多时计算量是平方级增长且线性化只做一次容易累积线性化误差。粒子滤波则面临粒子耗尽问题。图优化把 SLAM 后端建模成一个图的最小二乘问题图的节点相机/机器人位姿、路标点。图的边两个节点之间由运动模型或观测模型产生的约束。后端优化的目标就是调整所有节点的位姿和路标位置使所有边的残差平方和最小。图优化的优势在于可以反复线性化迭代求解精度更高。利用稀疏性可以处理大规模场景。容易引入回环检测边的约束消除累积漂移。4.2 图优化的数学形式假设一共有 m 个约束边每个约束边的残差为 e_ij图优化的目标就是min Σ e_ij^T Ω_ij e_ij其中 Ω_ij 是信息矩阵即协方差矩阵的逆表示这条边的置信度。信息矩阵越大这条约束在优化中被信任的程度越高。求解方式通常是用高斯牛顿法Gauss-Newton或列文伯格-马夸尔特法Levenberg-Marquardt。每次迭代会构建一个线性方程H * Δx -b其中 H 是 Hessian 矩阵的近似。得益于 SLAM 图的稀疏性H 矩阵可以被分解成稀疏结构使用 Schur 消元等技术加速求解。4.3 因子图与滑动窗口的关系因子图Factor Graph是图优化的一种特殊表示用二分图建模圆圈代表变量节点位姿、路标。方块代表因子节点约束。因子图比普通位姿图表达更灵活可以自然地表达 IMU 预积分因子、回环因子、先验因子等。GTSAM 库就是以因子图为核心开发的。在视觉惯性导航系统中因子图配合滑动窗口使用窗口内的位姿作为变量节点IMU 预积分、视觉重投影、回环检测形成因子节点。当新帧加入时窗口最老的帧被边缘化它的信息变成先验因子加入优化。这就是现代 SLAM 后端的经典范式滑窗 因子图 边缘化。4.4 常用图优化工具工具库特点适用场景g2o经典图优化库支持位姿图与 BA视觉 SLAM、激光 SLAM 后端GTSAM因子图库支持 ISAM2 增量优化大规模增量优化、VIO/SLAMCeresGoogle 通用最小二乘库需要定制化残差或大规模优化这里不深入讲每个库的 API实际工程中建议从LIO-SAM / FAST-LIO / ORB-SLAM3这几个开源框架入手阅读它们的后端实现比单纯看理论更快建立工程直觉。5. 激光视觉融合高精度定位建图的关键路径5.1 为什么要融合激光与视觉激光雷达直接获取高精度三维点云但点云稀疏、缺颜色和语义信息相机能获取稠密纹理但对光照和运动模糊敏感。两者融合的互补性非常明显激光提供深度与几何结构为视觉特征提供尺度。视觉提供纹理与语义帮助激光点云做识别和动态物体剔除。视觉特征可以形成重投影约束校正激光里程计的漂移。融合定位之后建图也能获得更好的效果例如三维语义地图、动态物体滤除后的高精点云地图等。5.2 松耦合与紧耦合激光视觉融合按耦合程度可分为融合方式说明代表方案松耦合激光和视觉分别估计位姿再做加权融合简单的 EKF 融合紧耦合两类传感器的原始观测在同一优化框架中联合优化LVI-SAM、R3LIVE紧耦合的精度通常更高但计算量也更大。工程上如果算力受限松耦合也能满足部分场景需求。5.3 时间同步与数据预处理在写融合代码之前必须先解决两个工程问题时间同步和空间同步。时间同步激光雷达、相机、IMU 各自的帧率不同触发时间也不同。需要找到每个相机帧对应的最近一帧点云通常通过时间戳差值查找。空间同步所有传感器的数据都要变换到同一个坐标系一般以车体坐标系或 IMU 坐标系为参考。另外点云在车辆运动过程中会畸变——激光雷达扫描一圈需要时间车辆已经向前移动了一段距离。因此需要用 IMU 或里程计数据对点云做运动畸变校正也就是去畸变处理。5.4 多帧点云积累与 SLAM 效果可视化标题中提到的“ARS548 多帧积累来做 SLAM 的效果可视化”是一个很实用的调试技巧。ARS548 是 4D 毫米波雷达输出的是目标级或点云级数据单帧点云往往比较稀疏。为了直观看到 SLAM 建图效果通常会把连续多帧点云按里程计位姿变换到世界坐标系下叠加起来。下面是一个简化思路的 Python 示例演示如何用位姿将多帧点云转换到世界坐标系并绘制import numpy as np import matplotlib.pyplot as plt def transform_points(points, T): 将 Nx3 点云按齐次变换矩阵 T (4x4) 变换 ones np.ones((points.shape[0], 1)) points_h np.hstack([points, ones]) transformed_h (T points_h.T).T return transformed_h[:, :3] # 模拟三帧点云 np.random.seed(0) cloud_frames [] for i in range(3): cloud np.random.rand(100, 3) * 5 cloud_frames.append(cloud) # 模拟位姿每帧平移 (1, 0, 0) poses [np.eye(4)] for i in range(1, 3): T np.eye(4) T[0, 3] i * 1.0 poses.append(T) # 多帧积累 world_points [] for i, cloud in enumerate(cloud_frames): cloud_world transform_points(cloud, poses[i]) world_points.append(cloud_world) world_points np.vstack(world_points) # 可视化 fig plt.figure(figsize(8, 6)) ax fig.add_subplot(111, projection3d) ax.scatter(world_points[:, 0], world_points[:, 1], world_points[:, 2], s0.5, cr, labelaccumulated cloud) ax.set_title(Multi-frame Point Cloud Accumulation) ax.set_xlabel(X) ax.set_ylabel(Y) ax.set_zlabel(Z) plt.legend() plt.savefig(accumulation_demo.png, dpi120)运行结果可以看到三帧点云在 X 方向上平移叠加形成更大范围的点云地图。这只是可视化思路实际 SLAM 中的位姿来自前端里程计估计如果你使用 ARS548 雷达还需要处理目标航迹与点云的匹配关系。5.5 信号滤波在传感器预处理中的角色虽然这里讲的是 SLAM但点云去噪、IMU 信号平滑、图像降噪同样离不开“滤波”这个基本功。中值滤波常用于去除图像椒盐噪声或点云离群点。高斯滤波常用图像平滑减少边缘检测时的噪声响应。低通滤波LPF对 IMU 加速度和角速度信号做平滑消除高频振动干扰。高通滤波HPF提取车辆加速/减速的趋势用于运动模型。在工程调试中如果发现 SLAM 轨迹抖动明显首先要检查的就是传感器预处理链路点云有没有去畸变IMU 有没有低通滤波图像有没有抑制运动模糊这些问题不解决后端的图优化再厉害也救不回来。6. 实战一个简单的激光视觉融合定位 Demo这一节我们做一个简化但完整可运行的融合定位 Demo。核心思路分别用激光点云计算帧间位姿激光里程计用视觉特征计算另一个位姿视觉里程计最后在因子图后端里融合两个位姿约束。为了便于演示我们把范围缩小为读取模拟数据 → 构造激光约束 → 构造视觉约束 → 联合优化 → 输出位姿轨迹。6.1 环境准备与项目结构示例语言使用 Python 3核心依赖为numpyscipyg2o 的 Python 绑定或使用 gtsam 的 Python 接口如果你不想安装 g2o 绑定也可以先跳过优化部分直接用加权平均模拟融合结果。这里为了展示图优化我以 g2o 文件格式作为演示。建议项目结构slam_fusion_demo/ ├── data/ │ ├── lidar_poses.npy │ ├── camera_poses.npy │ └── landmarks.npy ├── fuse.py ├── optimize.g2o └── README.md6.2 生成模拟数据import numpy as np np.random.seed(42) # 模拟 50 帧位姿 N 50 true_poses [] for i in range(N): T np.eye(4) T[0, 3] i * 0.5 T[1, 3] 0.5 * np.sin(i * 0.1) true_poses.append(T) # 激光里程计真实位姿 小噪声 lidar_poses [] for T in true_poses: T_noisy T.copy() T_noisy[:3, 3] np.random.normal(0, 0.02, 3) lidar_poses.append(T_noisy) # 视觉里程计真实位姿 较大噪声 camera_poses [] for T in true_poses: T_noisy T.copy() T_noisy[:3, 3] np.random.normal(0, 0.08, 3) camera_poses.append(T_noisy) np.save(data/lidar_poses.npy, lidar_poses) np.save(data/camera_poses.npy, camera_poses)6.3 构造 g2o 文件并优化g2o 文件是一种文本格式的图优化描述文件。每一行VERTEX_SE3: id x y z qx qy qz qw EDGE_SE3: id1 id2 dx dy dz dqx dqy dqz dqw I11 I12 I13 ... I66下面我们把激光和视觉的帧间约束写成 g2o 边import numpy as np from scipy.spatial.transform import Rotation as R def to_g2o_quat(T): rot R.from_matrix(T[:3, :3]) qx, qy, qz, qw rot.as_quat() return qx, qy, qz, qw def write_pose_graph(frames, edges, filename): with open(filename, w) as f: for i, T in enumerate(frames): qx, qy, qz, qw to_g2o_quat(T) f.write(fVERTEX_SE3:QUAT {i} {T[0,3]:.6f} {T[1,3]:.6f} {T[2,3]:.6f} f{qx:.6f} {qy:.6f} {qz:.6f} {qw:.6f}\n) for (i, j, T_rel, info_val) in edges: dx T_rel[0, 3] dy T_rel[1, 3] dz T_rel[2, 3] qx, qy, qz, qw to_g2o_quat(T_rel) f.write(fEDGE_SE3:QUAT {i} {j} f{dx:.6f} {dy:.6f} {dz:.6f} f{qx:.6f} {qy:.6f} {qz:.6f} {qw:.6f} ) for k in range(6): for l in range(6): f.write(f{info_val if k l else 0:.2f} ) f.write(\n)边信息矩阵的值上面代码里的info_val对应约束权重。激光约束的信息矩阵可以设大一些例如 100.0视觉约束设小一些例如 10.0代表我们更信任激光里程计。6.4 运行优化实际运行 g2o 优化时你可以直接用命令行工具或在 Python 中使用g2o库import g2o solver g2o.SolverOptimizableGraph(g2o.LinearSolverEigenDense) optimizer g2o.SparseOptimizer() optimizer.set_solver(solver) optimizer.load(optimize.g2o) optimizer.initialize_optimization() optimizer.set_verbose(True) optimizer.optimize(30) optimizer.save(optimized.g2o)优化后你可以从optimized.g2o中读取优化后的位姿绘制轨迹与真值、激光里程计、视觉里程计对比通常会看到图优化融合后的轨迹比单一传感器更接近真值。6.5 结果说明这个 Demo 的核心并不是教你写一个产品级的 SLAM 系统而是帮你建立“激光约束 视觉约束 后端优化”的最小闭环。真实工程中你会用 ICP迭代最近点或 NDT正态分布变换计算激光帧间位姿用特征匹配 PnP 计算视觉位姿再用 IMU 预积分提供帧间约束最后在因子图后端统一优化。7. 常见问题与排查思路做 SLAM 开发时很多问题看起来玄学其实都有规律可循。问题现象常见原因排查与解决思路轨迹漂移严重回环检测失效、里程计噪声过大检查回环检测阈值增加激光/视觉约束的权重查看前端里程计输出是否平滑点云地图出现重影多帧点云位姿不准确认去畸变是否开启确认外参是否准确检查时间同步误差视觉特征匹配失败光照变化大、纹理弱换特征点ORB 换 SuperPoint、增加图像增强、降低匹配阈值后端优化发散图中有错误约束、信息矩阵设置不合理剔除错误回环约束降低异常约束信息矩阵初始化位姿是否正确实时性不足后端优化耗时太长缩小滑窗大小采用增量优化如 ISAM2把优化放到子线程外参标定后误差大标定数据采集质量差多角度、多距离采集避免标定板过远或反光校准后做投影误差验证这里特别强调一下外参和时间同步问题。在很多项目中你会发现代码逻辑完全正确但融合结果就是不对最后排查下来 70% 是传感器时间戳没对齐20% 是外参标定结果有偏差只有 10% 是算法本身的问题。8. SLAM 工程落地的最佳实践8.1 传感器选型与配置室外大场景优先选择 3D 激光雷达机械式/固态式配置时确认线数、视场角和帧率。视觉传感器注意帧率、曝光方式和畸变类型。IMU 要关注加速度计和陀螺仪的量程与零偏稳定性。8.2 标定与校核流程在工程团队中建议把传感器标定做成例行流程而不是只做一次。具体做法出厂/装机后执行完整内外参标定。每次车辆维修、碰撞后复检外参。使用自动标定工具定期校核避免人工标定误差。8.3 时间同步与数据链路时间同步是融合定位中的隐形杀手。工程上常见方案使用 PTP精确时间协议或 NTP 统一设备时间。在数据采集端记录各传感器时间戳处理时按时间戳查找邻域对应帧。使用硬件同步信号触发如激光雷达通过 PPS 信号同步相机曝光。8.4 退化场景处理激光雷达在长直走廊、隧道、空旷广场等几何退化场景中点云的约束会退化导致位姿估计漂移。对策有融合视觉特征在几何退化时保留视觉约束。融合 IMU用 IMU 短时积分撑过退化区域。增加轮速计约束。提前在场景中布置反光柱等人工特征。8.5 可视化与调试好的可视化能极大提高排查效率。推荐方案Rviz2 / FoxgloveROS 生态常用可视化工具。EVO用于评估 SLAM 轨迹精度支持绘制 ATE/RPE 曲线。PlotJuggler快速查看 IMU、里程计的时序数据。如果你在做 ARS548 等多帧积累可视化建议把单帧点云、累计点云、估计轨迹一起显示便于观察建图效果。9. 总结与后续学习路线通过对坐标系、滤波、图优化、激光视觉融合这几个模块的拆解你应该已经建立了 SLAM 的完整技术地图先通过坐标变换把不同传感器统一到同一空间中。用滤波或非线性优化持续估计最优位姿。在后端用图优化或因子图统一处理多源约束。用视觉纹理和激光几何互补提升定位建图的精度与鲁棒性。下一步进阶学习建议按以下顺序投入精读《视觉 SLAM 十四讲》把李群李代数、非线性优化基础补扎实。通读一个开源激光 SLAM 框架如 A-LOAM、LIO-SAM、FAST-LIO掌握激光里程计实现。通读一个视觉惯性 SLAM 框架如 VINS-Mono、ORB-SLAM3重点理解滑窗与边缘化。动手做一个多传感器融合 Demo把外参标定、点云去畸变、位姿估计、图优化串成完整链路。阅读因子图与增量优化的论文如 iSAM2从理论上理解为什么现代 SLAM 选择图优化而不是滤波。如果说有什么忠告那就是不要只调包一定要亲手把坐标变换和残差求导写一遍这个过程能帮你避掉一半的工程坑。如果这篇文章对你搭建 SLAM 知识体系有帮助可以收藏备用也欢迎在实际项目中遇到问题时回来对照排查思路逐步形成自己的一套 SLAM 调试方法。
返回列表