经典文献阅读之--DLO

本文介绍了一种新型激光雷达里程计(DLO)方案,该方案能在计算资源受限的平台上实现快速而精准的定位。通过一系列算法创新,如速度优先处理流程、自适应关键帧选择及NanoGICP高效匹配等,确保了系统在复杂环境中也能维持良好的性能。

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

0. 简介

这篇SLAM论文《Direct LiDAR Odometry: Fast Localization with Dense Point Clouds》作为NASA喷气推进实验室CoSTAR团队研究和开发的新作,收到了学术界广泛的关注。其主要用作DARPA地下挑战的里程计,提出了一种能够实现高速高精度处理高速实时处理密集点云的激光里程计(LO)的思路,下面是他们的Github开源代码

1. 文章贡献

文中提出了一种轻量前端激光雷达里程计解决方案,用于在计算能力受限的机器人平台上,具有快速和精确的定位能力,我们的直接激光雷达里程计(DLO)方法包括几个关键的算法上的创新,这些创新优先考虑计算效率,并使用稠密的、预处理最少的点云实时提供准确的姿势估计。以下是文章的主要创新点:

  1. 提出了一个定制的速度优先的处理流程,这个流程可以实时精确的估计位姿,对预处理的需求比较小,并且IMU是可选项。
  2. 提出了一个新的关键帧系统,可以根据环境信号自适应的选择关键帧,并且可以通过凸优化快速的生成子图。
  3. 从实验中发展出几个重要的算法见解,以进一步降低计算开销,从而产生了NanoGICP(定制的迭代最接近点解算器,用于轻量级点云扫描与交叉对象数据共享匹配)。

下图展示了该激光雷达里程计应用的两个计算资源有限的机器人平台(A) 定制的四旋翼平台,顶部有一个驱逐OS1激光雷达传感器。(B) Boston Dynamics Spot机器人,装有负载和带防护装置的Velodyne VLP-16。(C) 使用我们的轻型里程计方法在这些机器人上绘制的石矿的俯视图
在这里插入图片描述

2. 整体思路

整个系统是通过RANSAC排除离群点和用IMU来获得旋转先验,然后获得帧到帧的相对位姿。这个相对位姿之后传播到世界坐标系,并且用于二级GICP的初始化值。
在这里插入图片描述

2.1 预处理

在预处理过程中只使用了两个滤波器:首先,通过原点周围大小为1立方米的盒子滤波器删除机器人自身可能返回的所有点云。然后,生成的点云通过分辨率为0.25m的三维体素网格滤波器发送,以便在保持周围环境中的主要结构的同时,略微减少后续任务的数据采样。在这项工作中,我们不校正运动失真,因为非刚性变换可能会带来计算负担,我们直接使用稠密点云,而不是提取特征,平均而言,每帧点云包含了预处理后得到1000点。

2.2 基于GICP(Generalized-ICP)的位姿计算

这部分分成了两步,第一步是提供瞬时的位姿估计(帧间位姿), 第二步是提供优化的位姿(帧图优化)。这部分也就是下文最后提到的NanoGICP高效匹配。为了促进点云扫描与交叉对象数据共享匹配,文中提出开发了NanoGICP,这是一个自定义迭代最近点解算器,本质上是将开源的FastGICP和NanoFLANN两个包进行合并,使用NanoGICP的NanoFLANN来高效构建KD-tree, 然后通过FastGICP进行高效匹配。
在这里插入图片描述

A. 帧间匹配

基于激光雷达的里程计可被视为通过比较连续点云和内存中的点云来恢复SE(3)变换来解析机器人自我运动的过程。此过程通常分两个阶段运行,首先是提供最佳初始值,随后将其优化为与先前关键帧位置保持其全局一致。

目标函数为下式,其中 X ^ k L \hat{\mathbf{X}}_{k}^{\mathcal{L}} X^kL代表了在 s s s时刻和 t t t时刻的位姿相对变换, P k s \mathcal{P}_{k}^{\mathrm{s}} Pks代表了source的扫描的点云, P k t \mathcal{P}_{k}^{\mathrm{t}} Pkt代表了target的扫描的点云( P k t = P k − 1 s \mathcal{P}_{k}^{\mathrm{t}}=\mathcal{P}_{k-1}^{\mathrm{s}} Pkt=Pk1s这代表了 k k k时刻的target点云与 k − 1 k-1 k1时刻的source点云)。

X ^ k L = arg ⁡ min ⁡ x k L E ( X k L P k s , P k t ) \hat{\mathbf{X}}_{k}^{\mathcal{L}}=\underset{\mathbf{x}_{k}^{\mathcal{L}}}{\arg \min } \mathcal{E}\left(\mathbf{X}_{k}^{\mathcal{L}} \mathcal{P}_{k}^{\mathrm{s}}, \mathcal{P}_{k}^{\mathrm{t}}\right) X^kL=xkLargminE(XkLPks,Pkt)

其中 E \mathcal{E} E为误差函数,这里被定义为:

E ( X k L P k s , P k t ) = ∑ i N d i T ( C k , i t + X k C C k , i s X k L ) − 1 d i d i = p i t − X k L p i s , p i s ∈ P k s , p i t ∈ P k t \mathcal{E}\left(\mathbf{X}_{k}^{\mathcal{L}} \mathcal{P}_{k}^{\mathrm{s}}, \mathcal{P}_{k}^{\mathrm{t}}\right)=\sum_{i}^{N} d_{i}^{\mathrm{T}}\left(\mathcal{C}_{k, i}^{\mathrm{t}}+\mathbf{X}_{k}^{\mathcal{C}} \mathcal{C}_{k, i}^{\mathrm{s}} \mathbf{X}_{k}^{\mathcal{L}}\right)^{-1} d_{i}\\ d_{i}=p_{i}^{t}-\mathbf{X}_{k}^{L} p_{i}^{\mathrm{s}}, p_{i}^{\mathrm{s}} \in \mathcal{P}_{k}^{\mathrm{s}}, p_{i}^{\mathrm{t}} \in \mathcal{P}_{k}^{\mathrm{t}} E(XkLPks,Pkt)=iNdiT(Ck,it+XkCCk,isXkL)1didi=pitXkLpis,pisPks,pitPkt

其中 d i = p i t − X k L p i s , p i t ∈ P k t , p i s ∈ P k s d_{i}=p_i^t-\mathbf{X}_{k}^{\mathcal{L}}p_i^s,p_i^t\in\mathcal{P}_{k}^{\mathrm{t}}, p_i^s\in\mathcal{P}_{k}^{\mathrm{s}} di=pitXkLpispitPkt,pisPks表示了点云中的两个点的距离差。 C k , i s , C k , i t \mathcal{C}_{k, i}^{\mathrm{s}}, \mathcal{C}_{k, i}^{\mathrm{t}} Ck,is,Ck,it指的是两个点云中每个点 i i i对应的估计协方差矩阵。

B. 帧图匹配

…详情请参照古月居

### DLO 运行机制或执行流程 分布式日志处理(Distributed Log Processing, 简称 DLO)是一种常见的大数据技术架构组件,用于高效收集、传输和存储大规模的日志数据。以下是有关 DLO 的运行机制及其执行流程的详细介绍: #### 1. 数据采集阶段 在这一阶段,DLO 使用多种方式从不同来源捕获日志数据。通常会通过代理程序或者直接集成到应用程序中完成日志提取工作。例如,在 Kubernetes 集群环境中,可以通过 `apiserver` 参数配置来监控特定的服务状态[^2]。 #### 2. 日志传输过程 为了确保高可用性和可靠性,DLO 架构设计了专门的数据管道来进行日志消息传递。该环节涉及多个节点之间的协作以及可能出现的各种异常情况处理,比如网络波动导致的任务失败可能会引发 ExecutionException 异常[^1]。此时需要具备重试机制或其他补偿措施保障整个系统的稳定性。 #### 3. 存储管理部分 当接收到客户端发送过来的日志条目之后,DLO 将它们持久化保存至指定位置以便后续查询分析使用 。考虑到性能因素 ,一般会选择支持随机读写的文件系统作为底层支撑平台; 同时也会采用分片(sharding) 技术提高扩展能力满足日益增长的需求规模. 另外值得注意的是如果涉及到敏感信息保护则还需要考虑加密手段防止未经授权访问泄露风险.[^4] #### 4. 查询与检索功能 最后一步就是提供灵活便捷的方式让用户能够快速定位所需内容 .这不仅依赖于强大的索引构建算法还离不开合理布局物理磁盘分布减少I/O延迟时间从而提升整体效率效果显著 . ```python def dlo_process(logs): try: collected_logs = collect_from_sources(logs) transmitted_data = transmit_to_storage(collected_logs) store_in_database(transmitted_data) except Exception as e: handle_exception(e) def collect_from_sources(sources): pass # 实现具体的采集逻辑 def transmit_to_storage(data): pass # 定义如何安全可靠地传送到目标端 def store_in_database(info): pass # 描述存入数据库的具体操作 def handle_exception(error_message): pass # 设计合理的错误恢复策略 ``` 以上代码片段展示了简化版的 DLO 流程实现思路 ,其中包含了基本组成部分并预留接口供实际开发人员根据项目需求定制细节部分 .
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

敢敢のwings

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

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

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

打赏作者

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

抵扣说明:

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

余额充值