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)?=p?xsign((p?x)?(p?s))=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((p?x)?(p?s)) 是為了判斷體素處于障礙物的前方還是后方,如下圖所示:
在這里插入圖片描述

事實上,論文中并沒有完全將 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)=? ? ??z21?z21?δ??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.pswp.cn/bicheng/81680.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81680.shtml
英文地址,請注明出處:http://en.pswp.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 如何…