跳到正文

Wiki

local_costmap(區域性障礙代價地圖)

約 43 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

1.local_costmap(區域性障礙代價地圖)

1.1.實車先看:地圖上的障礙來自哪裡

當前區域性代價地圖是以gimbal_yaw_fake位置為中心、在odom中表達的約5×5 m滾動網格。 它按順序合成靜態二維地圖、即時地形障礙和障礙周圍的膨脹代價,供controller_server使用。

/map二维占用图 → static_layer ──────────────────────────────┐
                                                         │
terrain_map(odom系地形点,intensity为离地高差)            │
    → 观测缓冲:TF、来源高度筛选、雷达原点                  │
    → intensity_voxel_layer:高度、高差、量程与体素筛选 ───┤
                                                         ↓
                                        inflation_layer → 局部合成代价地图
                                                         ├─ controller_server读内存中的地图
                                                         └─ costmap/costmap_updates/costmap_raw供订阅者

本塊直接接收近場terrain_map;全域性代價地圖接收terrain_map_ext,下一塊再整理。pointcloud_to_laserscan生成的obstacle_scan用於二維建圖,本區域性障礙層不經過那份二維掃描。因此修改掃描轉換器的高差門檻,不會直接修改這裡的門檻。地形分析分工、二維掃描轉換

實車上看到的現象 先核對什麼 當前配置怎樣理解
以為區域性地圖覆蓋車周圍5 m半徑 width、height與量程 5 m是整張網格的邊長,各軸只約覆蓋中心兩側2.5 m;量程5 m不能擴充套件網格
2 m內的高障礙仍沒有進入此層 origin_z、z_resolution、z_voxels 當前體素高度是odom中的[0,0.8) m,超過0.8 m的點不能進入標記;2 m高度門檻只是前置過濾
上坡高處或下坡低處的障礙消失 odom高度基準、兩級高度視窗、體素視窗 高度視窗固定在odom,不隨底盤z跟著升降;地形高差正確也可能被絕對高度裁掉
寫了track_unknown_space=True,未探測區卻像空閒 引數所在層級 當前版本讀取節點頂層track_unknown_space;寫在intensity_voxel_layer內沒有配置到它,頂層預設False
改unknown_threshold看不到效果 自定義層的使用路徑 本實現沒有用它計算未知列/二維未知狀態;不能套用標準VoxelLayer的解釋
障礙已經移開,卻繼續殘留 最新terrain_map、上游衰減、觀測緩衝與靜態層 本層每輪重建,最新觀測仍可能含上游歷史點;資料停止時預設還會複用最後一份觀測
以為cost_scaling_factor越大越保守 膨脹公式與當前控制器用法 越大,外圍軟代價衰減越快;當前PID只抽樣檢查高代價值,不用這套軟梯度給軌跡打分

本次容器內nav2_costmap_2d、nav2_voxel_grid均為1.1.20,pb_nav2_plugins為1.0.1。本地自定義層實現與標頭檔案和上游提交e6778ca44d9e88aa612a3c6c87d536a8cfa21705一致;以下按該版本核對。自定義層實現、體素換算與類定義

1.2.引數

下面保留髮送的完整引數與原註釋。實物/模擬段只有use_sim_time不同;原始碼預設值及配置建議另列。

local_costmap:
  local_costmap:
    ros__parameters:
      use_sim_time: False
      update_frequency: 10.0
      publish_frequency: 5.0
      global_frame: odom
      robot_base_frame: gimbal_yaw_fake
      rolling_window: true
      width: 5
      height: 5
      resolution: 0.05
      robot_radius: 0.2
      plugins: ["static_layer", "intensity_voxel_layer", "inflation_layer"]
      intensity_voxel_layer:
        plugin: pb_nav2_costmap_2d::IntensityVoxelLayer
        enabled: true
        track_unknown_space: true
        footprint_clearing_enabled: true
        publish_voxel_map: false
        combination_method: 1
        mark_threshold: 0
        origin_z: 0.0
        unknown_threshold: 5
        z_resolution: 0.05
        z_voxels: 16
        min_obstacle_height: 0.0
        max_obstacle_height: 2.0
        min_obstacle_intensity: 0.1
        max_obstacle_intensity: 2.0
        observation_sources: terrain_map
        terrain_map:
          data_type: PointCloud2
          # '<robot_namespace>' keyword shall be replaced with 'namespace' where user defined.
          # It doesn't need to start with '/'
          topic: <robot_namespace>/terrain_map
          sensor_frame: front_mid360
          min_obstacle_height: 0.0
          max_obstacle_height: 2.0
          obstacle_max_range: 5.0
          obstacle_min_range: 0.2
      static_layer:
        plugin: "nav2_costmap_2d::StaticLayer"
        map_subscribe_transient_local: True
      inflation_layer:
        plugin: "nav2_costmap_2d::InflationLayer"
        cost_scaling_factor: 4.0
        inflation_radius: 0.7
      always_send_full_costmap: False

兩個local_costmap層級用於匹配名稱空間和節點名。例如機器人名稱空間為/red_standard_robot1時,當前controller_server建立的代價地圖節點為/red_standard_robot1/local_costmap/local_costmap;釋出話題通常位於/red_standard_robot1/local_costmap下面。座標系字串不會隨這個名稱空間自動加字首。

1.2.1.ros__parameters(更新、座標、網格與機器人輪廓)

1.2.1.1.參數列
引數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
use_sim_time False;模擬True 不適用,布林 上實物前必須核對並正確配置 選擇ROS時鐘,供TF、訊息與釋出判斷使用 不適用 不適用 經工程launch重寫;應與點雲及TF使用同一時間域;內部更新迴圈另用WallRate
update_frequency 10.0 Hz,目標更新頻率 實物執行時重點觀察,有問題再針對性調整 控制內部地圖合成迴圈,當前目標100 ms/輪 理想情況下更快處理變化,計算與鎖負擔增加 內部障礙變化響應可能更遲 不提高輸入點雲取樣頻率,也不保證每輪有新觀測;當前回撥不重建該更新執行緒節拍
publish_frequency 5.0 Hz,目標釋出頻率 通常保持當前值,不作為優先除錯項 控制地圖話題釋出的時間門檻 訂閱者可能更及時,釋出負擔增加 話題顯示/訂閱更新更稀,內部地圖仍可按10 Hz更新 釋出判斷在更新迴圈中;不保證實際5 Hz;控制器直接讀記憶體,部分行為讀地圖話題或服務
global_frame odom 不適用,座標系名稱 上實物前必須核對並正確配置 指定這張區域性網格的座標參考系 不適用 不適用 點雲最終轉到此係;static_layer仍需將/map的map系轉換到odom;高度門檻也按該系z計算
robot_base_frame gimbal_yaw_fake 不適用,座標系名稱 上實物前必須核對並正確配置 指定滾動中心、控制器參考點與輪廓的機體系 不適用 不適用 與當前虛擬參考系設計配合;圓形輪廓中心在此原點,不能預設等於車體幾何中心
rolling_window true 不適用,布林 通常保持當前值,不作為優先除錯項 隨機器人位置移動平面網格原點 不適用 不適用 滾動平面視窗不會使origin_z隨車升降,也不讓網格軸隨底盤yaw旋轉;False為固定視窗
width 5 m,網格x方向總邊長 實物執行時重點觀察,有問題再針對性調整 控制區域性地圖x方向覆蓋範圍 可保留更遠的已有障礙和路徑,網格與計算增多 範圍變小,更容易在視窗外裁掉路徑/障礙 當前按5/0.05=100格;不是5格或5 m半徑;本版本使用正整數米
height 5 m,網格y方向總邊長 實物執行時重點觀察,有問題再針對性調整 控制區域性地圖y方向覆蓋範圍 覆蓋更寬,網格與計算增多 側方範圍變小,橫移時可用環境更少 這裡的height是平面y邊長,不是體素z高度;當前100格
resolution 0.05 m/平面格,5 cm 實物執行時重點觀察,有問題再針對性調整 設定x、y格子邊長 格子更粗、格數更少,細障礙和窄通道表達可能變差 格子更細、計算及快取增多,但不能補回上游丟點 當前100×100共10000格;兩方向解析度減半時格數約4倍;不等於定位精度
robot_radius 0.2 m,未填充輪廓的圓半徑 上實物前必須核對並正確配置 沒有顯式footprint時,以此半徑生成圓形輪廓 車體佔用與膨脹內圈變大,狹窄通道更受限 佔用變小,可能低估真實車體/雲臺包絡 當前無顯式footprint,另有預設0.01 m padding;不是雷達盲區或膨脹半徑,應按實際包絡核對
plugins static_layer、intensity_voxel_layer、inflation_layer 不適用,有序ID列表 上實物前必須核對並正確配置 按順序載入併合成三層 不適用 不適用 當前先靜態、再即時障礙、最後膨脹;各ID需有plugin類名;增刪與換順序會改變合成路徑
always_send_full_costmap False 不適用,布林 根據實際功能需求開啟或設定 選擇OccupancyGrid每次強制全圖或按條件使用增量 不適用 不適用 False遇到尺寸、解析度或滾動原點變化仍發全圖;costmap_raw有訂閱者時始終發完整原始代價圖;不改變內部障礙判定
1.2.1.2.引數詳解
1.2.1.2.1.update_frequency、publish_frequency與always_send_full_costmap(內部10 Hz與話題5 Hz各負責什麼)

內部更新迴圈以WallRate執行,呼叫各層updateBounds、updateCosts合成地圖。controller_server通過持有的local_costmap物件直接讀取這張地圖;它的20 Hz控制迴圈與本塊10 Hz更新各自執行,部分控制輪次可能讀到同一輪地圖結果。

publish_frequency控制更新迴圈中是否到了釋出時間,不是獨立的5 Hz釋出定時器;實際受更新時間、負載和ROS時鐘影響。若以2.5 m/s運動,理想100 ms更新間隔內已移動0.25 m,即5個當前格距;這是時間尺度計算,不是本次實車測量。調頻率需要結合整條感知和執行鏈延遲。更新與釋出迴圈(1.1.20)

False不會保證只發增量:網格原點滾動、尺寸或解析度變化時,OccupancyGrid會走全圖分支;幾何資訊不變且有更新範圍時,才可能發costmap_updates。costmap_raw不走這個增量選擇,有訂閱者就準備完整nav2_msgs/Costmap。使用地圖話題的行為與讀取服務的行為,還應各自核對資料介面。釋出選擇

1.2.1.2.2.global_frame、robot_base_frame與rolling_window(odom中的移動視窗)

網格軸按odom的x、y表達,中心跟蹤gimbal_yaw_fake的平面位置,平面原點以格距對齊滾動;它不是隨底盤姿態旋轉的車體圖。當前虛擬系的方向與速度轉換關係見fake_vel_transform。

區域性地圖使用odom可以減少全域性重定位修正直接作用到區域性點雲座標的影響,但靜態層仍從map系地圖取樣,需要有效map↔odom。只有odom至機器人TF,不證明三層合成所需TF已經全部可用。

視窗滾動只處理平面x、y。體素origin_z=0仍固定在odom的z基準上,機器人上坡、下坡不會自動平移這段垂直視窗。滾動原點實現

1.2.1.2.3.width、height與resolution(5×5 m,100×100格)

當前約覆蓋參考點兩側各2.5 m,角落的平面距離約3.5 m;實際原點受格距對齊,不能把邊界當成精確連續對稱的圓。5 m觀測量程用於篩點,最終落在網格外的點仍不能標記。

平面共有10000格。自定義層再為每個平面列記錄16個高度狀態,邏輯上約160000個體素;實現用每列32位打包,不是為每個體素存一份完整點雲。減小z_voxels不等於平面列快取記憶體按比例減少。

平面resolution與垂直z_resolution是獨立引數,當前恰好都為0.05 m。改變平面格距還會影響障礙合併、輪廓柵格化、膨脹和控制器區域性路徑處理;它不能增加MID360回波密度或恢復地形分析已經過濾掉的小障礙。

1.2.1.2.4.robot_radius(圍繞虛擬參考點的車體輪廓)

當前預設footprint="[]",因此用robot_radius=0.2生成近似圓形多邊形,再按預設footprint_padding≈0.01 m填充。padding按多邊形頂點方向實現,不應把最終輪廓簡單等同於精確半徑0.21 m的圓。輪廓建立與填充

該輪廓以gimbal_yaw_fake原點為中心。需按真實底盤、雷達、雲臺及其活動包絡核對0.2是否覆蓋,而不是繼承示例半徑;安裝參考點偏置也要計入。膨脹不能替代正確的車體輪廓。

如果以後改成車體矩形footprint,須處理其座標軸和真實底盤姿態:當前虛擬系在平面上抵消yaw,不會自動隨底盤轉向。可選擇覆蓋轉動包絡的輪廓,或按實際姿態提供正確的動態輪廓,不能直接填一個底盤固連矩形就認定方向已正確。

1.2.2.intensity_voxel_layer(地形高差與三維障礙篩選)

1.2.2.1.參數列(工作方式與合成)
引數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
plugin pb_nav2_costmap_2d::IntensityVoxelLayer 不適用,類名 上實物前必須核對並正確配置 載入本工程按intensity篩點的自定義障礙層 不適用 不適用 繼承ObstacleLayer,另有體素網格;每輪重建,不實現標準VoxelLayer的全部清空/未知列邏輯
enabled true 不適用,布林 通常保持當前值,不作為優先除錯項 是否讓本層處理併合成即時障礙 不適用 不適用 False停止本層標記與合成,不關閉static_layer/inflation_layer,也不自動停止所有已建立的輸入訂閱
track_unknown_space true,但層級未被讀取 不適用,布林 已確認當前值錯誤,必須修改 當前層內鍵沒有配置到真正的未知空間開關 不適用 不適用 當前1.1.20讀取節點頂層track_unknown_space;未配置頂層時預設False;錯誤在層級,具體True/False取決於未知區域處理需求
footprint_clearing_enabled true 不適用,布林 通常保持當前值,不作為優先除錯項 將本層二維輪廓內代價設為空閒 不適用 不適用 只清本層二維代價,不直接清體素位,也不能通過當前Max合成擦掉靜態牆;錯誤輪廓可能清掉車旁真實點
publish_voxel_map false 不適用,布林 根據實際功能需求開啟或設定 是否建立併發布三維體素網格話題 不適用 不適用 開啟便於核對高度格,增加發布開銷;不控制障礙計算;當前自定義層沒有執行中重建釋出器的回撥
combination_method 1 不適用,列舉 通常保持當前值,不作為優先除錯項 選擇本層二維代價與前面圖層的合成方法 不適用 不適用 當前1為Max,保留靜態障礙並新增即時障礙;0為Overwrite;此版本其他整數落入不合成分支,不套用新版列舉
unknown_threshold 5 計數;當前未參與未知列計算 當前執行不使用這個引數,暫不調整 宣告並儲存未知體素門檻,當前沒有對應使用路徑 當前無計算效果 當前無計算效果 當前內部賦值5+(16−16)=5,但從未用它清線或投影未知列;不能用它修復未知區或坡道
observation_sources terrain_map 不適用,空白分隔的來源ID字串 上實物前必須核對並正確配置 建立下方terrain_map來源的緩衝與訂閱 不適用 不適用 ID用於找來源分組;真正話題由該分組的topic決定;多來源用空白分隔,仍需XYZ與intensity欄位
1.2.2.2.參數列(高度、體素與高差)
引數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
mark_threshold 0 每個平面列內已標記高度格的數量門檻 實物執行時重點觀察,有問題再針對性調整 標記高度格數嚴格超過門檻時,該平面格成為障礙 要求更多不同高度格被佔用,可能減少零散噪聲,也漏掉薄/低障礙 更少高度格即可成為障礙;當前0已是一格即可 不按同一體素內點數累計;重複100個同高度格的點仍只算一格;門檻應小於有效z格數
origin_z 0.0 m,odom中的體素下界 上實物前必須核對並正確配置 設定整段垂直網格的起點 固定層數/格距時整段視窗上移 整段視窗下移 不隨底盤升降;低於它且已通過高度過濾的點會壓到最底格;本自定義層預設竟為16.0 m,當前顯式0不能按標準預設隨意刪除
z_resolution 0.05 m/高度格,5 cm 上實物前必須核對並正確配置 設定每個z格的厚度 固定16層時覆蓋更高,垂直表達更粗 覆蓋更矮、表達更細,可能刪掉高處點 當前16×0.05=0.8 m;應為有限正值,獨立於平面resolution
z_voxels 16 高度格數 通常保持當前值,不作為優先除錯項 指定垂直格數 合法範圍內覆蓋更高;當前已達16層上限 覆蓋變矮,更多高點越界 當前庫最多16層;減少格數不等於每列打包記憶體同比減少;不能用40層覆蓋2 m
min_obstacle_height 0.0 m,odom中點z的本層下界 上實物前必須核對並正確配置 本層標記時刪除低於0的點 下界上移,刪更多低處/下坡點 下界下移,允許更低點,但來源視窗還可能先刪掉 當前和來源下界同為0;z不代表相對區域性地面的高差,邊界可通過
max_obstacle_height 2.0 m,odom中點z的本層上界 上實物前必須核對並正確配置 本層標記時刪除高於2 m的點 前置高度視窗更寬,但不能擴大0.8 m體素視窗 降到體素有效視窗內才進一步刪掉當前可標記點 2 m不是最終有效標記高度;僅在0.8 m以上改變通常不改當前結果,z≥0.8 m仍因體素越界丟掉
min_obstacle_intensity 0.1 m,當前地形高差下界 實物執行時重點觀察,有問題再針對性調整 地形點高差至少10 cm才進入障礙標記 更多小高差被忽略,可能減輕坡面誤判,也漏低障礙 接納更多低障礙與地面噪聲/坡面誤差 此輸入intensity是離估計地面的高差,不是雷達反射強度;0.1邊界可通過
max_obstacle_intensity 2.0 m,當前地形高差上界 通常保持當前值,不作為優先除錯項 刪除高差超過2 m的點 接納更多大高差 刪掉更多大高差 當前正常近場輸出另受vehicleHeight=0.5 m限制,2 m通常不再裁剪;引數仍實際執行
1.2.2.3.引數詳解
1.2.2.3.1.高度、體素視窗與intensity(三道不同的篩選)

當前完整標記流程包括:來源緩衝高度篩選、本層高度篩選、地形高差篩選、相對感測器的三維量程篩選、平面與高度格範圍,以及mark_threshold。通過其中一項不保證最終進入地圖。

點的z是odom座標;intensity是上游估計地面的高差。 假定量程、平面位置和其他條件都滿足:

點在odom中的z 地形高差intensity 當前結果
0.2 m 0.15 m 兩級高度、高差及體素範圍都通過,可標為障礙
0.2 m 0.05 m 高差不足0.1 m,被刪
0.9 m 0.15 m 0~2 m高度過濾通過,但超過當前體素上界,無法標記
-0.1 m 0.15 m 來源高度下界已刪除,尚未到體素處理

當前整數高度索引為floor((z−0)/0.05),要求索引小於16,故有效範圍為**[0,0.8) m**。z=0.8對應索引16,越界;上界不包含。這段視窗固定在odom,odom的z=0並不憑名稱保證就是實車當前地面。

上坡高處、下坡低處的障礙即使地形高差正確,也可能被高度視窗刪掉。若需要改變覆蓋,必須一起核對來源高度、本層高度、origin_z與16層限制內的z_resolution;只把max_obstacle_height從2調到3不能解決體素上界。也不能為了放行坡面就把所有危險低障礙一起過濾。實際篩點與索引轉換

1.2.2.3.2.min_obstacle_intensity與max_obstacle_intensity(是否把地形高差當障礙)

近場terrain_analysis已經把intensity改成相對估計地面的高差,當前下界0.1即10 cm。它不是“車輛能跨10 cm”,也不是坡度門檻。正常坡面若被錯誤估成15 cm凸起,滿足其他視窗時仍可能成為障礙;應先看地面估計與座標,再按真實車輛和場地調整門檻。

上游當前近場正常高差輸出受vehicleHeight=0.5 m限制,所以這裡2 m上限通常不會進一步裁剪正常點。若改輸入、上游規則或出現特殊標記點,需要重新判斷。直接改接原始雷達點雲後,intensity可能變回反射強度,不能沿用“0.1 m/2 m”的解釋。

1.2.2.3.3.mark_threshold(數高度格,不數原始點)

VoxelGrid用位記錄每個平面列的已標記高度格;已標記格數嚴格大於mark_threshold才返回可標障礙。當前0表示一格就夠。設1則至少要兩格,設2至少三格;同一高度格里再來很多點,不會增加高度格計數。標記計數實現

本層每次更新都會先重置二維圖與體素,所以門檻統計來自本輪取得的觀測內容;它不會靠連續多個更新週期逐漸湊夠格數。但最新terrain_map本身包含上游歷史點,不能把“一份最新觀測”理解成一份純即時原始掃描。

低矮物、薄障礙、稀疏回波可能只佔一個高度格,提高門檻可能讓它們消失;能否過濾噪聲應按實物觀察,不保證越大越穩。

1.2.2.3.4.track_unknown_space與unknown_threshold(層級錯誤和未使用的門檻)

自定義層呼叫ObstacleLayer::onInitialize,後者讀的是節點頂層track_unknown_space;Costmap2DROS及StaticLayer也讀該頂層鍵。當前層內True沒有進入這條讀取路徑,頂層未配置時預設False,主圖和障礙層預設按FREE_SPACE重置;靜態圖的未知值也會按該設定轉為空閒。父類讀取位置、靜態未知值解釋

若要表達原配置“跟蹤未知空間”的True意圖,正確層級為:

local_costmap:
  local_costmap:
    ros__parameters:
      track_unknown_space: true

此時應移除無效的層內同名鍵,重新核對未知區在規劃與控制中的處理。若任務選擇不跟蹤未知,則應明確頂層False;錯誤是當前寫入層級,不是要求所有任務必須使用True。 這裡只提供修正說明,沒有修改工程配置。

unknown_threshold另屬自定義成員:初始化儲存5+(16−z_voxels),當前仍為5,但後續沒有用它清體素射線、統計未知列或生成二維未知狀態。調整5不會改善當前未知空間判定。成員賦值與更新路徑

即使頂層改True,本層也只是以未知預設二維格重置,再標出障礙和輪廓內空閒,不會因此自動得到標準VoxelLayer的完整射線空閒/未知推斷。沒有回波或點被過濾,不等於真實空地。

1.2.2.3.5.每輪重建、輪廓清空與清地圖服務(幾種清除各有範圍)

該自定義updateBounds先resetMaps,再拿marking observations重建障礙,最後清本層輪廓內二維代價。它不呼叫getClearingObservations或raytraceFreespace,直接把來源clearing改True也不會給當前實現補上射線清空。

footprint_clearing_enabled=True只清本層二維輪廓,不擦除已儲存的體素標記;當前Max合成也不會用FREE_SPACE覆蓋static_layer的靜態牆。輪廓、點雲自車濾除和靜態地圖錯誤應分開核對。

清地圖服務還需區分:類的isClearable=False使按區域的ClearAround/ClearExcept服務跳過它;但ClearEntirely呼叫resetLayers,會重置主圖並呼叫所有層的reset,包括本層。前面的BT使用的是ClearEntireCostmap,因此不能說它因為isClearable=False就完全不重置。重置也不丟棄上游地形快取,下一輪相同觀測/靜態圖仍可能把障礙加回來。區域與整圖服務、整圖層重置

本層內部重建不保證主圖所有舊格立即變空;合成還受各層更新範圍、滾動、靜態佔用和最新觀測影響。動態殘留應結合上游terrain_analysis衰減與實際話題觀察。

1.2.2.3.6.combination_method(當前Max保留已有障礙)

當前1呼叫updateWithMax:本層未知格跳過;已知格可以替換主圖未知格,或在代價更高時寫入。FREE_SPACE不會降低前面靜態層的已知障礙;不能簡單把255未知當作普通數字最大值來推斷全部合成結果。Max合成

0為Overwrite,可用本層非未知代價覆蓋之前的圖層;當前頂層預設不跟蹤未知、重置大量格為FREE_SPACE,改0可能擦掉靜態層的已知障礙。其他整數在當前父類switch中不做合成;新版文件中的其他列舉不代表本版本可用。

1.2.3.intensity_voxel_layer.terrain_map(地形觀測源)

1.2.3.1.參數列
引數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
data_type PointCloud2 不適用,訊息型別名稱 上實物前必須核對並正確配置 為來源建立PointCloud2訂閱及緩衝 不適用 不適用 當前自定義迭代器需要float XYZ與intensity欄位;父類可訂閱LaserScan,不代表本層改型別後仍有需要的intensity
topic <robot_namespace>/terrain_map 不適用,話題名稱 上實物前必須核對並正確配置 指定實際近場地形點雲輸入 不適用 不適用 工程bringup先展開佔位符;通常為/red_standard_robot1/terrain_map;繞過launch時原字串不會自行展開
sensor_frame front_mid360 不適用,感測器原點系名稱 上實物前必須核對並正確配置 取得量程篩選用的感測器原點 不適用 不適用 按點雲時間戳查front_mid360至odom;點座標仍按訊息header.frame_id轉換,不被強行當作雷達系點
min_obstacle_height 0.0 m,odom中點z的來源下界 上實物前必須核對並正確配置 觀測緩衝階段先刪除低於0的點 提前刪除更多低處點 允許更多低處點進入本層,仍受本層及體素限制 與上一組同名但屬獨立階段;兩處均為0,邊界可通過;只改本層下界不能恢復此處已刪點
max_obstacle_height 2.0 m,odom中點z的來源上界 上實物前必須核對並正確配置 觀測緩衝階段先刪除高於2 m的點 來源視窗擴大,後續仍可刪掉高點 降到體素有效視窗內才進一步減少當前可標記點 當前還受本層2 m和體素0.8 m上界限制;來源預設上界為0.0,不自動繼承本層2 m,不能隨意省略;在odom中篩高度
obstacle_max_range 5.0 m,相對雷達原點的三維距離 實物執行時重點觀察,有問題再針對性調整 刪除距離front_mid360原點達到/超過5 m的點 接納更遠已有點,仍受地形輸出和網格邊界限制 刪除更多遠點 當前距離包含z;等於上界也刪除;不是區域性地圖寬度或底盤周圍5 m圓
obstacle_min_range 0.2 m,相對雷達原點的三維距離 上實物前必須核對並正確配置 刪除距雷達原點不超過0.2 m的點 排掉更多近點,也可能漏掉近車障礙 保留更多近點,可能包含自車回波 當前自定義程式碼使用≤下界刪除;不是robot_radius,也不是完整車體掩膜
1.2.3.2.引數詳解
1.2.3.2.1.topic、data_type與sensor_frame(點雲座標和測距原點分別取哪裡)

bringup_launch先把<robot_namespace>替換為空或“/+機器人名稱空間”,隨後引數重寫和載入;當前配置通常訂閱/red_standard_robot1/terrain_map。佔位符沒有在層原始碼中自行處理,直接啟動原始引數檔案時必須完成對應替換。

terrain_map的點座標當前在odom中。ObservationBuffer按header.frame_id把點雲轉換到global_frame;另以sensor_frame指定的原點、同一訊息時間戳取得odom中的雷達位置,再供量程計算。因此sensor_frame不會把odom點重新解釋成雷達區域性點。觀測緩衝換系與原點

顯式設定front_mid360後,訊息過濾器還要求對應感測器系可變換。TF、時間域、名稱空間和QoS都需要匹配;有地形話題不證明本層已成功接收緩衝。輸入訂閱採用SensorDataQoS,父類配置佇列深度50;佇列不是50 Hz或50 ms。

1.2.3.2.2.來源高度與量程(高度在odom,距離從雷達量)

來源高度先在轉換後的odom點座標上篩選,並保留包括intensity在內的原點欄位;本層再次檢查自己的高度門檻。當前兩級0~2 m相同,實際可標記的上界仍受0.8 m體素覆蓋制約。

量程使用sqrt((x−x_sensor)²+(y−y_sensor)²+(z−z_sensor)²),當前嚴格保留0.2~5 m之間的點。與二維掃描轉換器按底盤虛擬中心計算水平距離不同,雷達安裝偏移、雲臺轉動和上下坡會影響這個三維距離。

近場地形輸出和區域性視窗本就有限。增大量程不會擴大5×5 m網格、不能恢復上游被刪的點,也不會讓MID360取樣更遠;最小量程也不能濾掉距雷達超過0.2 m的全部自車結構。

1.2.4.static_layer(靜態二維地圖接入)

1.2.4.1.參數列
引數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
plugin nav2_costmap_2d::StaticLayer 不適用,類名 通常保持當前值,不作為優先除錯項 將訂閱到的二維佔用圖取樣到區域性滾動網格 不適用 不適用 常規導航來源為map_server,建圖時來源為slam_toolbox;讀取地圖話題,不直接讀PCD或地圖圖片檔案
map_subscribe_transient_local True 不適用,QoS耐久性選擇 上實物前必須核對並正確配置 用Transient Local、Reliable、KeepLast(1)訂閱完整地圖 不適用 不適用 釋出端需相容,才能取得保留的最近地圖;不是儲存地圖到磁碟,也不是開啟map_updates訂閱
1.2.4.2.引數詳解
1.2.4.2.1.static_layer(map圖仍要經過map↔odom變換)

靜態層訂閱完整OccupancyGrid,儲存其尺寸、解析度、原點和header.frame_id。滾動模式不會強行把主圖變成整張靜態地圖的大小;它根據當前odom格子的世界位置,查詢map_frame←odom的最新變換,到靜態圖中取樣。因此local_costmap在odom中執行,仍需正確的全域性定位變換。滾動靜態圖取樣

當前頂層track_unknown_space預設False,靜態圖未知格轉為FREE_SPACE;已知牆仍保留。沒有收到地圖或對應TF查詢失敗時,點雲這一路即使存在,也不能證明靜態層已正常合成。當前controller_server還會等待代價地圖current狀態,地圖輸入和各層狀態要一起看。

1.2.4.2.2.map_subscribe_transient_local(保留地圖訊息與更新話題各自獨立)

True讓較晚啟動的訂閱者可以從相容釋出端取得保留的最近完整地圖。若釋出端只提供Volatile耐久性或可靠性不相容,不能靠延長TF等待取得地圖;應先核對釋出端與訂閱端的QoS。地圖訂閱QoS

當前subscribe_to_updates預設False,不訂閱/map_updates;這不阻止處理隨後收到的完整/map訊息。“static”表示圖層輸入方式,不表示完整地圖永遠不能更新。

1.2.5.inflation_layer(障礙周圍的二維代價)

1.2.5.1.參數列
引數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
plugin nav2_costmap_2d::InflationLayer 不適用,類名 通常保持當前值,不作為優先除錯項 在已合成障礙附近寫入距離相關的二維代價 不適用 不適用 當前位於三層最後,使靜態牆和即時障礙都可成為膨脹源;不恢復被高度/高差篩掉的障礙
cost_scaling_factor 4.0 m⁻¹,指數衰減係數 實物執行時重點觀察,有問題再針對性調整 控制輪廓內圈之外的軟代價隨距離衰減 同樣距離的外圍代價更低、衰減更快;不加寬內圈 外圍代價更高、衰減更慢,在既定半徑內更寬地維持較高代價 不改0.7 m截斷範圍;當前PID沒有使用1~252軟代價評分,地圖顏色變化不保證控制變化
inflation_radius 0.7 m,距致命障礙格的膨脹範圍 實物執行時重點觀察,有問題再針對性調整 確定障礙周圍多遠仍寫膨脹代價 代價影響範圍擴大,計算增多,規劃若使用梯度可能更早繞開 影響範圍縮小;不能小到不足以表達所需輪廓空間 當前約14個5 cm格距;不是0.7 m全為禁止區,也不再自動加robot_radius成0.9 m
1.2.5.2.引數詳解
1.2.5.2.1.cost_scaling_factor與inflation_radius(範圍和代價下降速度)

內部代價值與釋出後的OccupancyGrid佔用值不同:

內部代價 含義
0 空閒
1~252 非致命的軟代價,越高通常越不希望經過
253 輪廓內切半徑範圍的高代價
254 致命障礙
255 未知狀態

設d為距致命障礙格的實際平面距離、r_ins為實際填充輪廓的內切半徑。障礙處為254,內圈為253,內圈之外到膨脹範圍內按下面計算後取整數:

cost = 252 × exp(−cost_scaling_factor × (d − r_ins))

所以4變大時,外圍代價更快降低;變小時,較高軟代價維持得更遠。0.7決定影響範圍,4決定範圍內的衰減,不能把兩個引數當同一作用。代價公式(1.1.20)

僅為說明公式,假設r_ins=0.2 m、d=0.4 m:當前4對應約113,改為8約50,改為2約169。實際輪廓含padding、柵格化和最近障礙距離,不能把這個假設值當執行讀數。

0.7 m以內並非全部致命或253,也不是保證車體距牆至少0.7 m。輪廓定義、真實包絡、地圖誤差和路徑使用方式都影響實際通過距離。

1.2.5.2.2.當前PID怎樣使用這些代價(軟梯度不等於已經參與避障評分)

當前OmniPidPursuitController從區域性路徑抽10個點,檢查落格代價是否達到INSCRIBED_INFLATED_OBSTACLE,即≥253;它不按1~252的軟梯度給候選軌跡打分。改變區域性cost_scaling_factor或擴大外圍軟代價,可能改變RViz顏色,卻沒有直接改變本外掛的碰撞通過條件。

robot_radius及padding改變的內切半徑會影響253內圈;靜態牆/即時障礙本身也參與高代價檢查。全域性路徑又由另一張global_costmap規劃,其膨脹設定需下一塊單獨核對,不能把兩張地圖的引數影響混為一談。當前控制器地圖使用方式

前文還記錄了抽樣數量及地圖外點的處理缺口。這裡的膨脹範圍不是完整車體掃掠碰撞檢查的替代,也不補回本障礙層遺漏的高度點。

1.2.6.相關原始碼預設項(原YAML未顯式配置)

1.2.6.1.參數列

以下12項補充真正讀取的節點頂層設定、觀測緩衝與未知膨脹行為;不表示本次已向工程YAML追加。

引數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
track_unknown_space False,節點頂層原始碼預設 不適用,布林 上實物前必須核對並正確配置 決定主圖、障礙層預設未知表示及靜態未知格解釋 不適用 不適用 真正被讀取的鍵;與前面層內未生效的True不同,需明確實際未知區策略
footprint "[]",原始碼預設 不適用,輪廓頂點字串 上實物前必須核對並正確配置 指定顯式多邊形輪廓,空值時使用圓半徑 不適用 不適用 當前用robot_radius;有效多邊形會優先使用;還可通過footprint話題更新,須核對參考系
footprint_padding 約0.01,原始碼預設 m,輪廓填充量 上實物前必須核對並正確配置 在輪廓外增加填充,影響內切半徑和清輪廓區域 有效輪廓增大 有效輪廓減小 不是補償未量出的完整車體尺寸;按頂點實現,不能簡單保證圓半徑恰好加0.01
transform_tolerance 0.3,節點頂層原始碼預設 s,TF查詢等待 通常保持當前值,不作為優先除錯項 供機器人位姿、觀測緩衝和靜態層等取得變換 可等待更久,也可能增加延遲 更快結束缺失TF查詢 不允許0.3 rad/m誤差,也不補償外參;執行中改頂層值不會自動更新已構建的所有緩衝成員
intensity_voxel_layer.terrain_map.marking True,父類預設 不適用,布林 通常保持當前值,不作為優先除錯項 將此來源加入標記觀測列表 不適用 不適用 當前自定義層使用該標記列表;關閉後此來源不再貢獻障礙
intensity_voxel_layer.terrain_map.clearing False,父類預設 不適用,布林 當前執行不使用這個引數,暫不調整 父類可把來源加入清空列表,本自定義更新未使用該列表 不適用 不適用 改True不會自動開啟本層射線清空;對應raytrace量程也不會因新增配置就參與當前處理
intensity_voxel_layer.terrain_map.observation_persistence 0.0,父類預設 s,觀測快取保留設定 通常保持當前值,不作為優先除錯項 決定快取一份還是一定時間內的多份觀測 正值時可能保留更多歷史觀測,動態殘留增多 正值減小時歷史視窗變短;0另走特殊分支 0表示只留最後一份,不表示最後一份在0 s後過期;不清上游terrain_map歷史
intensity_voxel_layer.terrain_map.expected_update_rate 0.0,父類預設 s,期望訊息間隔 實物執行時重點觀察,有問題再針對性調整 正值時用於判斷觀測是否按期更新 允許更長訊息間隔後仍算current 正值變小使停更更快被判斷;0關閉這項檢查 名字雖帶rate,程式碼按秒建Duration;當前停更不因這項自動變為不current
static_layer.map_topic "",層私有預設;轉用節點預設機器人namespace下的map 不適用,話題名稱 上實物前必須核對並正確配置 指定完整靜態圖話題 不適用 不適用 當前通常/red_standard_robot1/map;不是/red_standard_robot1/local_costmap/map;以實際namespace/重對映為準
static_layer.subscribe_to_updates False,原始碼預設 不適用,布林 根據實際功能需求開啟或設定 是否另外接收map_topic加_updates的增量圖 不適用 不適用 False仍接收後續完整地圖;與地圖Transient Local訂閱設定獨立
inflation_layer.inflate_unknown False,原始碼預設 不適用,布林 根據實際功能需求開啟或設定 控制已知障礙膨脹到未知格時是否寫入軟代價 不適用 不適用 False也可能在未知格寫入≥253的內圈代價;不等於把未知格都當膨脹源
inflation_layer.inflate_around_unknown False,原始碼預設 不適用,布林 根據實際功能需求開啟或設定 是否將未知格本身也作為膨脹起點 不適用 不適用 當前不主動圍繞未知格膨脹;與上一項是不同步驟,頂層未知策略變化後需重新核對
1.2.6.2.觀測停更與預設未知狀態

observation_persistence=0只刪除比最新觀測更舊的觀測,保留最後一份;expected_update_rate=0直接將緩衝判為current。於是點雲停止到達時,本層可能繼續每輪重建同一份舊地形,而不是自動清空障礙或停止控制。還需結合靜態層、其他層狀態和完整系統的資料監測判斷,不能只看地圖話題仍釋出。快取保留與current判斷

如果以後設定正的expected_update_rate,按秒的訊息間隔理解,再核對正常資料週期與延遲;不能填10就當成10 Hz。只改變buffer保留時間也不去除terrain_map內部已經累計的歷史點。

1.2.7.動態引數、啟動來源與驗證範圍

1.2.7.1.動態修改的實際範圍

自定義層沒有另寫覆蓋體素、高差和釋出器的動態回撥,使用父類ObstacleLayer的回撥;因此執行中引數設定成功,不代表所有成員已經更新。

引數類別 當前實現 應怎樣核對
robot_radius、footprint_padding、footprint、publish_frequency 節點回調會更新相應輪廓或釋出門檻 核對實際輪廓、膨脹內圈及地圖話題;動態輪廓須符合當前參考系
width、height、resolution 當前未鎖尺寸時回撥重建網格,並呼叫各層matchSize 注意觀察快取與範圍變化;width/height採用正整數,resolution為正double
update_frequency、global_frame、rolling_window、plugins、track_unknown_space、always_send_full_costmap 當前沒有完整動態聯動更新路徑 重新配置/重啟後核對有效行為,不僅看引數列表
intensity_voxel_layer.enabled、footprint_clearing_enabled、兩項層高度、combination_method 父類回撥更新對應成員 分支改變後核對實際合成;層高度變了不會同時重建來源高度過濾
origin_z、z_resolution、z_voxels、mark_threshold、unknown_threshold、兩項intensity、publish_voxel_map 當前自定義層無對應動態更新分支 重新配置/重啟;unknown_threshold重啟後也仍無當前使用路徑
terrain_map的話題、型別、原點系、來源高度、量程、快取及期望間隔 初始化時建訂閱器和ObservationBuffer 重新配置/重啟,不能只修改成員外的同名ROS值
static_layer地圖話題、Transient Local、subscribe_to_updates 當前回撥明確拒絕這類執行中修改 修改配置並重新啟動訂閱後驗證
inflation_radius、cost_scaling_factor及未知膨脹開關 膨脹層回撥更新、必要時重算快取並重新膨脹 核對實際代價圖及當前消費者是否使用軟梯度

頂層transform_tolerance有成員更新分支,但已經建立的來源緩衝、訊息過濾器和靜態層各有初始化時儲存的值;不能認為一次改值讓所有TF等待同步變化。節點回調、父類層回撥

1.2.7.2.啟動與核對範圍
啟動方式 本塊來源與關係
整套reality config/reality/nav2_params.yaml,經bringup替換topic佔位符、navigation_launch重寫時鐘並載入
整套simulation config/simulation/nav2_params.yaml,本塊僅use_sim_time=True不同
元件/獨立程序 local_costmap由controller_server內部建立,讀取同套名稱空間下的節點引數;不是這份YAML自己啟動一個程序
slam=True 靜態層接建圖產生的完整/map;即時地形層仍用terrain_map
slam=False 靜態層接map_server的/map;即時地形層仍用terrain_map,地圖定位依賴small_gicp等提供map↔odom
  • 本次已核對: 當前包版本、外掛註冊與liblayers.so存在;自定義層安裝標頭檔案與本地一致,本地實現與上游固定提交一致;Nav2的體素、合成與膨脹安裝標頭檔案匹配1.1.20;兩份local_costmap段與安裝副本一致,模擬僅時鐘不同。
  • 原始碼能確認: 40項原配置的讀取/使用條件;層內未知開關位置無效、unknown_threshold未參與計算;當前odom垂直標記區間[0,0.8) m;按不同高度格計標記;每輪重建但不射線清空;區域與整圖清理不同;預設舊觀測複用、膨脹方向和全圖/增量釋出條件。
  • 本次驗證範圍: 未啟動新的地圖或導航任務,未觀察執行節點有效引數、坡道點、未知區、動態障礙消失時間或車旁碰撞;視窗、體素和膨脹例子是配置/原始碼計算。
  • 實物待核實: odom地面高度基準、上下坡與高低障礙是否過視窗、真實車體輪廓與虛擬參考點、點雲欄位與TF時間、觀察源停更處理、靜態圖對齊/QoS、未知區策略、動態殘留以及控制器實際地圖使用。