Voxblox算法

文章目录

  • 1. 算法简介
  • 2. 由 TSDF 构建 ESDF 的方法
    • 2.1. 论文解读
    • 2.2. 伪代码实现

1. 算法简介

Voxblox 算法出现于文献《Voxblox: Incremental 3D Euclidean Signed Distance Fields for On-Board MAV Planning》,PDF 链接:https://arxiv.org/pdf/1611.03631,代码实现:https://github.com/ethz-asl/voxblox。
无人机的轨迹优化需要障碍物距离信息,这些信息可以从欧几里得有符号距离场(Euclidean Signed Distance Fields, ESDF)获取。ESDF 中的每个体素都包含其到最近障碍物的欧几里得距离。论文提出了一种通过 TSDF 在线增量式构建 ESDF的方法。关于 TSDF 的概念可以参考博客:截断符号距离场TSDF。
计算 TSDF 有两种方式:射线投射(Raycasting) 和投影映射(Projection Mapping),而 Voxblox 选择的是 Raycasting,并且对 Raycasting 的过程做出了一些改进,如下所示:

Our approach, grouped raycasting, significantly speeds up raycasting without losing much accuracy. For each point in the sensor scan, we project its position to the voxel grid, and group it with all other points mapping to the same voxel. Then we take the weighted mean of all points and colors within each voxel, and do raycasting only once on this mean position.

论文采用的分组射线投射法,能在不大幅降低精度的情况下显著加快光线投射的速度。对于传感器扫描中的每一个点,将其位置投影到体素网格上,并将其与所有映射到同一体素的点归为一组。然后,对每个体素内的所有点和颜色取加权平均值,并仅在此平均位置上进行一次光线投射操作。
现在对论文中选取的射线投射法进行简要说明:
假设 d d d 表示到障碍物表面的距离, x \mathbf{x} x 是当前体素的中心位置, p \mathbf{p} p 是传感器观测到的三维点云的位置, s \mathbf{s} s 是传感器原点位置。当前体素的距离值和权重分别为 D D D W W W,则有如下方程:
d ( x , p , s ) = ∥ p − x ∥ sign ⁡ ( ( p − x ) ⋅ ( p − s ) ) w const ( x , p ) = 1 D i + 1 ( x , p ) = W i ( x ) D i ( x ) + w ( x , p ) d ( x , p ) W i ( x ) + w ( x , p ) W i + 1 ( x , p ) = min ⁡ ( W i ( x ) + w ( x , p ) , W max ⁡ ) \begin{align} d(\mathbf{x}, \mathbf{p}, \mathbf{s}) &= \|\mathbf{p} - \mathbf{x}\| \operatorname{sign}((\mathbf{p} - \mathbf{x}) \cdot (\mathbf{p} - \mathbf{s})) \tag{1} \\ w_{\text{const}}(\mathbf{x}, \mathbf{p}) &= 1 \tag{2} \\ D_{i+1}(\mathbf{x}, \mathbf{p}) &= \frac{W_i(\mathbf{x}) D_i(\mathbf{x}) + w(\mathbf{x}, \mathbf{p}) d(\mathbf{x}, \mathbf{p})}{W_i(\mathbf{x}) + w(\mathbf{x}, \mathbf{p})} \tag{3} \\ W_{i+1}(\mathbf{x}, \mathbf{p}) &= \min(W_i(\mathbf{x}) + w(\mathbf{x}, \mathbf{p}), W_{\max}) \tag{4} \end{align} d(x,p,s)wconst(x,p)Di+1(x,p)Wi+1(x,p)=pxsign((px)(ps))=1=Wi(x)+w(x,p)Wi(x)Di(x)+w(x,p)d(x,p)=min(Wi(x)+w(x,p),Wmax)(1)(2)(3)(4) 公式中的 sign ⁡ ( ( p − x ) ⋅ ( p − s ) ) \operatorname{sign}((\mathbf{p} - \mathbf{x}) \cdot (\mathbf{p} - \mathbf{s})) sign((px)(ps)) 是为了判断体素处于障碍物的前方还是后方,如下图所示:
在这里插入图片描述

事实上,论文中并没有完全将 w w w 恒设置为 1。对处于障碍物后方的体素的权重进行了调整,调整公式如下:
w quad ( x , p ) = { 1 z 2 − ϵ < d 1 z 2 1 δ − ϵ ( d + δ ) − δ < d < − ϵ 0 d < − δ , \begin{equation} w_{\text{quad}}(\mathbf{x}, \mathbf{p}) = \begin{cases} \dfrac{1}{z^2} & -\epsilon < d \\ \dfrac{1}{z^2} \dfrac{1}{\delta - \epsilon} (d + \delta) & -\delta < d < -\epsilon \\ 0 & d < -\delta, \end{cases} \tag{5} \end{equation} wquad(x,p)= z21z21δϵ1(d+δ)0ϵ<dδ<d<ϵd<δ,(5)其中, v v v 表示体素的尺寸, z z z 是传感器测量到的深度值, δ = 4 v \delta = 4v δ=4v 是截断距离, ϵ = v \epsilon = v ϵ=v
为什么会障碍物后方的体素的权重做出这样的调整?直观上来看,这会减少没有被直接观察到的体素(位于障碍物表面后方的体素)的影响,论文表示这会取得更好的效果。

2. 由 TSDF 构建 ESDF 的方法

2.1. 论文解读

One of the key improvements we have made is to use the distance stored in the TSDF map, rather than computing the distance to the nearest occupied voxel.

论文的一个关键改进是:利用 TSDF 中存储的距离信息来重建 ESDF,而不是直接计算到最近占用体素的距离。我们知道在 TSDF 网格中,如果一个体素在截断范围 [ − d t r u n c , d t r u n c ] [-d_{trunc}, d_{trunc}] [dtrunc,dtrunc] 以内(即该体素靠近障碍物表面),体素中存储的 TSDF 数值(该数值反应了该体素到障碍物表面的距离)是比较准确的。

each voxel had an occupied or free status that the algorithm could not change. Instead, we replace this concept with a fixed band around the surface: ESDF voxels that take their values from their co-located TSDF voxels, and may not be modified. The size of the fixed band is defined by TSDF voxels whose distances fulfill |vT.d| < γ, where γ is the radius of the band.

与以往的算法会为每个体素都分配一个被占用或空闲的状态不同的是,Voxblox 基于障碍物表面定义一个固定区域,固定区域内的 ESDF 体素的距离值取自其相应位置上的 TSDF 体素,并且不能被修改。固定区域的大小由距离满足 ∣ v T . d ∣ < γ |v_T.d| < γ vT.d<γ 的 TSDF 体素来定义,其中 γ γ γ 是该区域的半径。

The general algorithm is based on the idea of wavefronts – waves that propagate from a start voxel to its neighbors (using 26-connectivity), updating their distances, and putting updated voxels into the wavefront queue to further propagate to their neighbors.

Voxblox 选取了一种波前传播的方式进行体素距离信息的更新,即以一个体素为起点,找到该体素的 26 个邻居,更新它们存储的距离信息,然后以这 26 个邻居为起点,重复之前的过程。

We use two wavefronts: raise and lower. A voxel gets added to the raise queue when its new distance value from the TSDF is higher than the previous value stored in the ESDF voxel. This means the voxel, and all its children, need to be invalidated. The wavefront propagates until no voxels are left with parents that have been invalidated.
The lower wavefront starts when a new fixed voxel enters the map, or a previously observed voxel lowers its value. The distances of neighboring voxels get updated based on neighbor voxels and their distances to the current voxel. The wavefront ends when there are no voxels left whose distance could decrease from its neighbors.

在具体实现中,Voxblox 通过维护两个队列:raise 和 lower 来进行体素距离信息更新。

  • raise 队列作用:存储需要废除距离信息的体素(当 TSDF 网格中一个体素的新距离值大于对应 ESDF 网格中对应位置的体素存储的距离值时,这说明之前计算的距离值是不准确的)。PROCESSRAISEQUEUE 函数作用:逐个遍历 raise 队列中的体素,将遍历到的体素和以该体素为父体素的所有体素的距离值都作废(设置为 d m a x d_{max} dmax),后续重新计算。
  • lower 队列的作用:存储需要更新距离信息的体素。PROCESSLOWERQUEUE 函数中会对 lower 中的体素重新计算距离信息,即以当前遍历到的体素为基准,更新其邻居体素的距离信息,当不再有体素的距离能够从其相邻体素那里减小时,就结束该过程。

we do not update unknown voxels. For each voxel, we store the direction toward the parent, rather than the full index of the parent.

算法不会更新未知的体素。对于每个体素,只存储其指向父体素的方向信息,而非父体素的完整索引。
TSDF 构建 ESDF 的思路大致如下图所示:
在这里插入图片描述

2.2. 伪代码实现

伪代码中的 v T v_T vT 表示 TSDF 网格中的体素,而 v E v_E vE 表示 ESDF 网格中相同位置上的体素。
在这里插入图片描述
问题:上述伪代码中, v T v_T vT 为固定体素,但 v E . d < v T . d v_E.d < v_T.d vE.d<vT.d v E v_E vE 是未被观测到的体素时,为什么设置 v E . d v_E.d vE.d s i g n ( v T . d ) ⋅ d m a x sign(v_T.d)·d_{max} sign(vT.d)dmax 而不是直接设为 v E . d = v T . d v_E.d = v_T.d vE.d=vT.d
回答:在 TSDF 中体素存储的是局部距离信息,例如传感器观测到的障碍物表面附近的距离值(范围通常在 [ − d t r u n c , d t r u n c ] [-d_{trunc}, d_{trunc}] [dtrunc,dtrunc] 内)。而 ESDF 中体素存储的是每个体素到最近障碍物的实际欧几里得距离(带符号,正负分别表示障碍物的前方或者后方)。 s i g n ( v T . d ) sign(v_T.d) sign(vT.d) 保证了 v E . d v_E.d vE.d 的符号与 v T . d v_T.d vT.d 一致。 v T . d v_T.d vT.d 是局部的 TSDF 值,仅反映传感器观测到的局部障碍物信息,无法代表全局距离。例如,如果 v T v_T vT 是三维空间中的一个点( v T . d v_T.d vT.d = +0.1m),但实际该点到障碍物的距离是 +5m,则直接使用 v T . d v_T.d vT.d 会导致 ESDF 错误(低估距离)。将 v E . d v_E.d vE.d 设置为 s i g n ( v T . d ) ⋅ d m a x sign(v_T.d)·d_{max} sign(vT.d)dmax 表示该体素点的数值由周围体素点来更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/81680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机图形学基础--Games101笔记(一)数学基础与光栅化

文章目录 数学基础向量插值三角形插值双线性插值 平面定义法线-点表示 第一部分&#xff1a;光栅化坐标变换二维变换3D变换视图变换&#xff08;MVP&#xff09;投影变换 光栅化采样抗锯齿&#xff08;反走样&#xff09;可见性&#xff08;遮挡&#xff09; 着色与纹理Blinn-P…

@RequestParam 和 @RequestBody、HttpServletrequest 与HttpServletResponse

在Java Web开发中&#xff0c;RequestParam、RequestBody、HttpServletRequest 和 HttpServletResponse 是常用的组件&#xff0c;它们用于处理HTTP请求和响应。下面分别介绍它们的使用场景和使用方法&#xff1a; 1. RequestParam RequestParam 是Spring MVC框架中的注解&am…

【硬核数学】2. AI如何“学习”?微积分揭秘模型优化的奥秘《从零构建机器学习、深度学习到LLM的数学认知》

在上一篇中&#xff0c;我们探索了线性代数如何帮助AI表示数据&#xff08;向量、矩阵&#xff09;和变换数据&#xff08;矩阵乘法&#xff09;。但AI的魅力远不止于此&#xff0c;它最核心的能力是“学习”——从数据中自动调整自身&#xff0c;以做出越来越准确的预测或决策…

10.15 LangChain v0.3重磅升级:Tool Calling技术颠覆大模型工具调用,效率飙升300%!

LangChain v0.3 技术生态与未来发展:支持 Tool Calling 的大模型 关键词:LangChain Tool Calling, 大模型工具调用, @tool 装饰器, ToolMessage 管理, Few-shot Prompting 1. Tool Calling 的技术革新 LangChain v0.3 的工具调用(Tool Calling)功能标志着大模型应用开发进…

[架构之美]从PDMan一键生成数据库设计文档:Word导出全流程详解(二十)

[架构之美]从PDMan一键生成数据库设计文档&#xff1a;Word导出全流程详解&#xff08;二十&#xff09; 一、痛点 你是否经历过这些场景&#xff1f; 数据库字段频繁变更&#xff0c;维护文档耗时费力用Excel维护表结构&#xff0c;版本混乱难以追溯手动编写Word文档&#…

Image and depth from a conventional camera with a coded aperture论文阅读

Image and depth from a conventional camera with a coded aperture 1. 研究目标与实际意义1.1 研究目标1.2 实际问题与产业意义2. 创新方法:编码光圈设计与统计模型2.1 核心思路2.2 关键公式与模型架构2.2.1 图像形成模型2.2.2 深度可区分性准则2.2.3 统计模型与优化框架2.2…

JMeter 教程:使用 HTTP 请求的参数列表发送 POST 请求(form 表单格式)

目录 ✅ 教程目的 &#x1f6e0;️ 准备工作 &#x1f4c4; 操作步骤 第一步&#xff1a;新建测试计划 第二步&#xff1a;添加 HTTP 请求 第三步&#xff1a;添加参数列表&#xff08;表单参数&#xff09; 第四步&#xff1a;添加结果查看器 第五步&#xff1a;运行测…

交易所开发:构建功能完备的金融基础设施全流程指南

交易所开发&#xff1a;构建功能完备的金融基础设施全流程指南 ——从技术架构到合规安全的系统性解决方案 一、开发流程&#xff1a;从需求分析到运维优化 开发一款功能完备的交易所需要遵循全生命周期管理理念&#xff0c;涵盖市场定位、技术实现、安全防护和持续迭代四大阶…

【数据结构篇】排序1(插入排序与选择排序)

注&#xff1a;本文以排升序为例 常见的排序算法&#xff1a; 目录&#xff1a; 一 直接插入排序&#xff1a; 1.1 基本思想&#xff1a; 1.2 代码&#xff1a; 1.3 复杂度&#xff1a; 二 希尔排序&#xff08;直接插入排序的优化&#xff09;&#xff1a; 2.1 基本思想…

Cursor日常配置指南

文章目录 整体说明一、简单介绍1.1、简介1.2、功能 二、日常配置2.1、Profiles 简介2.2、Cursor 配置2.2.1、通用设置&#xff08;General&#xff09;2.2.2、功能设置&#xff08;Features&#xff09;2.2.2.1、长上下文&#xff08;Large context&#xff09;2.2.2.2、代码索…

客户体验数据使用的三种视角——旅程视角

企业收集到大量的客户体验数据之后&#xff0c;应该如何应用&#xff1f;有哪些主要的使用场景和分析视角呢&#xff1f;接下来&#xff0c;体验家团队将通过三篇文章陆续介绍体验数据的三种应用场景&#xff0c;以帮助企业更有效地利用体验数据进行改进。 这三个场景分别是…

大语言模型怎么进行记忆的

大语言模型怎么进行记忆的 大语言模型(LLM)本身是无状态的,每次输入独立处理,但可通过以下方式实现对话记忆及长期记忆能力: 模型架构改进 显式记忆模块: 记忆网络(Memory Networks) :在模型里嵌入可读写的记忆单元,像键值存储 (Key - Value Memory)或动态记忆矩…

Spring Boot 与 RabbitMQ 的深度集成实践(三)

高级特性实现 消息持久化 在实际的生产环境中&#xff0c;消息的可靠性是至关重要的。消息持久化是确保 RabbitMQ 在发生故障或重启后&#xff0c;消息不会丢失的关键机制。它涉及到消息、队列和交换机的持久化配置。 首先&#xff0c;配置队列持久化。在创建队列时&#xf…

成功案例丨GEZE与Altair合作推动智能建筑系统开发

Altair 作为计算智能领域的全球领导者&#xff0c;将分别在北京、上海、成都、深圳举办 “AI驱动&#xff0c;仿真未来”Altair 区域技术交流会。届时将汇聚行业专家与先锋企业&#xff0c;共同探讨仿真智能化如何赋能工业创新&#xff0c;分享最新仿真与 AI 技术的应用实践。欢…

DDoS与CC攻击:谁才是服务器的终极威胁?

在网络安全领域&#xff0c;DDoS&#xff08;分布式拒绝服务&#xff09;与CC&#xff08;Challenge Collapsar&#xff09;攻击是两种最常见的拒绝服务攻击方式。它们的目标都是通过消耗服务器资源&#xff0c;导致服务不可用&#xff0c;但攻击方式、威胁程度和防御策略存在显…

循环中使用el-form

循环中使用el-form 主要是校验问题 el-table 的数据 :data“ruleForm.tableData” :prop“‘tableData.’ $index ‘.name’” :rules“rules.name” <el-button type"primary" click"addNewData">新增项目</el-button><el-form :model&…

SAP学习笔记 - 开发13 - CAP 之 添加数据库支持(Sqlite)

上一章学习了CAP开发准备&#xff0c;添加Service。 SAP学习笔记 - 开发12 - CAP 之 开发准备&#xff0c;添加服务-CSDN博客 本章继续学习CAP开发 - 添加数据库支持&#xff08;Sqlite&#xff09;。 目录 1&#xff0c;数据库准备 - H2 内存数据库 - Sqlite数据库 a&…

【数据结构与算法】——图(三)——最小生成树

前言 本将介绍最小生成树以及普里姆算法&#xff08;Prim&#xff09;和克鲁斯卡尔&#xff08;Kruskal&#xff09; 本人其他博客&#xff1a;https://blog.csdn.net/2401_86940607 图的基本概念和存储结构&#xff1a;【数据结构与算法】——图&#xff08;一&#xff09; 源…

Flink运维要点

一、Flink 运维核心策略 1. 集群部署与监控 资源规划 按业务优先级分配资源&#xff1a;核心作业优先保障内存和 CPU&#xff0c;避免资源竞争。示例&#xff1a;为实时风控作业分配专用 TaskManager&#xff0c;配置 taskmanager.memory.process.size8g。 监控体系 集成 Prom…

面试点补充

目录 1. 搭建lnmp Linux 系统基础命令 nginx相关命令 MySQL 相关命令 PHP 相关命令 验证命令 下载并部署 Discuz! X3.4 论坛 到 Nginx 网站 2. 脑裂 2.1 脑裂的定义 2.2 脑裂产生的原因 1. 主备节点之间的心跳线中断 2. 优先级冲突 3. 系统或服务负载过高 2.3 如何…