跳到正文

Wiki

導航參數

約 22 分鐘閱讀

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

1.導航參數

1.1.實車處理建議説明

下面各參數表的“實車處理建議”以當前 MID360 實物配置為準:use_imu_as_input=False、imu_en=True,建圖時不使用先驗 PCD。切換估計模型、數據格式、先驗地圖或啓動方式後,需要重新核對參數是否參與計算及是否被 launch 覆蓋。

表格中的標籤 實物測試時具體怎麼做
通常保持當前值,不作為優先調試項 初次測試沿用當前值。主要是算法工作方式或已有默認設置,沒有明確問題和理由時,不優先嚐試不同值。
上實物前必須核對並正確配置 上實物前確認實際輸入、單位和座標約定。當前值符合實物就保持,不符合則先修正,再進行正式測試。
實物運行時重點觀察,有問題再針對性調整 先用當前值測試,重點觀察地圖重影、定位漂移、有效點數量和計算負載,再結合參數作用決定是否調整以及調整方向。
按設備型號和驅動核對,通常保持當前值 對照雷達型號、驅動實現或廠家資料核對一次。設備和驅動未變時,通常沿用當前值,不反覆調試固定硬件或格式參數。
根據實際功能需求開啓或設置 根據軌跡顯示、狀態記錄、點雲保存、先驗定位等需求選擇開關或相關值;這類主要是功能選擇。
當前運行不使用這個參數,暫不調整 當前源碼或配置分支沒有使用它,改數值不會改善本輪結果。換模型、數據格式或啓用對應功能後,再檢查是否需要配置。
已確認當前值錯誤,必須修改 已有源碼、設備資料或實測證據確認當前值錯誤時使用;説明錯誤原因和正確配置方式,不為換成實物而強行修改。

“通常保持”表示初次測試不優先調這個參數;“按設備型號和驅動核對”仍需要完成一次設備適配檢查;“上實物前必須核對”則強調實際輸入、單位和座標約定必須明確。核對正確就保持,不代表每次上車都要改數值。

具體檢查事項、生效條件和源碼疑點寫在“生效條件/備註”列。當前 gravity 的模長已修正,仍需核實方向與目標參考系;gravity_init 在當前 IMU 初始化路徑中不參與計算;lidar_meas_cov 的源碼含義需要先核實,再決定是否調整。

1.2.章節目錄

1.3.通用參數修改

參數中文名 所屬節點 ros__parameters 下的參數路徑 作用 當前值 → 建議值
局部車體佔用半徑 local_costmap.local_costmap robot_radius 告訴局部避障系統,車輛在平面上需要佔多大空間。 0.2 → 0.42 m,按當前模型推算
全局車體佔用半徑 global_costmap.global_costmap robot_radius 讓全局規劃按相同車體尺寸判斷通道是否可通行。 0.2 → 0.42 m,與局部一致
局部最低障礙高差 local_costmap.local_costmap intensity_voxel_layer.min_obstacle_intensity 過濾上游給出的地面高差不足門限的點;當前近場主要用於篩選凸起,不能解釋成允許通過的坑深。 當前 0.1 m;候選 0.03~0.05 m,驗證後定值
全局最低障礙高差 global_costmap.global_costmap intensity_voxel_layer.min_obstacle_intensity 按上游地形高差篩選全局實時障礙;遠場與近場的高差計算不同,不能直接用該值判斷實際坑深。 當前 0.1 m;與局部門限一起驗證
地面樣本不足區域合成障礙開關 terrain_analysis noDataObstacle 開啓後,在初始化完成且滿足規則時,為地面樣本不足的格子合成障礙點;不測量坑深,也不能把欠數據直接判成坑。 當前 False;已確認平整的場地首測可暫保留。防坑需求下單獨驗證 True 及整條鏈路,不能將開關開啓視為可靠防坑保證。
障礙膨脹範圍 兩張代價地圖 inflation_layer.inflation_radius 設置障礙周圍多遠仍寫入膨脹代價;不等於整圈都是禁止區。 保留 0.7 m
膨脹代價衰減係數 兩張代價地圖 inflation_layer.cost_scaling_factor 控制外圍代價隨距離下降的速度;數值越大,下降越快。 保留 4.0
近場地形輸出高度上限 terrain_analysis vehicleHeight 限制輸出地形點相對估計地面的高度差。 暫保留 0.5 m,不要直接填底盤厚度
遠場地形輸出高度上限 terrain_analysis_ext vehicleHeight 限制遠場地形輸出點的高度差。 暫保留 1.0 m
體素起始高度 兩張代價地圖 intensity_voxel_layer.origin_z 設置體素窗口在對應地圖座標系中的起始高度。 平地首測保留 0.0 m;坡地另核對
每層體素高度 兩張代價地圖 intensity_voxel_layer.z_resolution 決定豎直方向每層體素的厚度。 保留 0.05 m
豎直體素層數 兩張代價地圖 intensity_voxel_layer.z_voxels 與每層高度共同決定豎直覆蓋範圍;目前總高約 0.8 m。 暫保留 16,結合需要檢測的高度驗證
局部地圖覆蓋寬、長 local_costmap.local_costmap width、height 決定車周圍滾動地圖的範圍,不是車輛尺寸。 保留 5 × 5 m
地圖格子大小 兩張代價地圖 resolution 決定二維網格精細程度;越小,計算量通常越大。 保留 0.05 m

這些參數分為六類:車體尺寸、低矮凸起篩選、坑窪與欠數據處理、障礙膨脹、豎直感知範圍和地圖網格。它們的取值依據不同,不能全部按底盤長寬直接計算。

車體尺寸:為什麼兩處 robot_radius 建議設為 0.42 m

當前模型的底盤碰撞盒是 0.525 × 0.525 m,參考點位於底盤平面中心。用圓形輪廓表示車輛時,需要覆蓋四個角,因此半徑至少為:

R = √((0.525/2)² + (0.525/2)²)
  ≈ 0.371 m

取 0.42 m,相當於在模型外接圓基礎上留約 5 cm 餘量。這個餘量用於應對定位、地圖離散化和控制誤差,是第一版測試的工程起點,並非已經測定的誤差上限。

局部、全局代價地圖應使用一致的車體尺寸:全局負責規劃能通過的路線,局部負責跟蹤和碰撞判斷。當前 0.2 m 半徑不足以包住模型底盤;降低車速也不能彌補這個幾何尺寸錯誤。

低矮凸起篩選:為什麼 min_obstacle_intensity 需要驗證

這裏接收的是地形分析點雲,intensity 表示算法計算的地面高差,單位是米。近場先計算“點高度減去估計地面高度”;擴展節點自身遠場對這個差值取絕對值。它是相對於局部估計地面的結果,不一定等於從正常路面量出來的真實凸起高度或坑深。

當前 0.1 相當於 10 cm。假設地面估計正確,且其他篩選條件滿足:地面上高5 cm的凸起點會低於該門限,高15 cm的點則達到這道門限。因而,幾釐米高、車輛卻不能通過的物體可能沒有進入實時障礙地圖。這不表示深度小於10 cm的坑允許通過,也不保證更深的坑一定被識別。

0.03~0.05 m 是平地低速測試的候選範圍,用來檢查能否保留這些低矮障礙。最終門限應同時滿足:

  • 必須繞開的最低障礙能夠被保留。
  • 正常地面起伏和測量噪聲不會大量變成假障礙。

例如,若 3 cm 高的物體必須繞開,最終採用 0.05 m 就可能將它過濾掉。局部、全局地圖的兩個門限應一起核對,避免兩張地圖對同一障礙判斷不同。

坑窪與欠數據處理:noDataObstacle 能做什麼,不能做什麼

坑窪要區分兩種情況:

  • 雷達看到了坑底。 當前 terrain_analysis.ros__parameters.considerDrop=False,近場低於估計地面的負高差點會被過濾。降低 min_obstacle_intensity 不能恢復已經被上游刪掉的點。即使以後考慮開啓 considerDrop,地面估計、坑底能否被看到和下游高度篩選仍會影響結果,不能把取絕對值當作完整的防坑檢測。
  • 雷達沒有看到坑底或地面。 此時沒有有效點可用來計算坑深。noDataObstacle 針對的是這類地面樣本不足的區域,但遮擋、掃描盲區、點雲稀疏和點被前級過濾,同樣可能造成樣本不足;欠數據不等於已經發現真實坑洞。

noDataObstacle 的完整配置位置是:

terrain_analysis:
  ros__parameters:
    noDataObstacle: False

它的兩種取值含義是:

  • False:本節點不為欠數據格合成額外障礙點。靜態地圖、其他障礙來源或下游未知區域策略仍可能阻止通行,不能因此斷言“沒有點就一定能走”。
  • True:完成無數據處理初始化後,將地面高度樣本數不足 minBlockPointNum 的格子作為欠數據候選,再按 noDataBlockSkipNum 的邊界跳過規則合成障礙點。當前 minBlockPointNum=10、noDataBlockSkipNum=0;它判斷的是樣本是否足夠,不是隻判斷點數是否為零,也沒有計算坑的深度。

開啓後可以讓欠數據區域更保守,但也可能把正常的遮擋或稀疏地面變成障礙,導致原本能走的區域被封住。合成點還需通過下游高度、量程和體素窗口等篩選,最後才可能進入代價地圖。因此,應分別檢查地形點雲和最終代價地圖,不能只看開關是否為 True。

該開關屬於近場 terrain_analysis,terrain_analysis_ext 沒有同名開關。擴展節點會合並近場範圍內的地形結果,因此合成點也可能隨之進入全局障礙鏈路,但這不等於遠場全範圍都具備同樣的欠數據保護。遠場對高差取絕對值,也不能保證近車的坑、斷崖或樓梯邊緣會被可靠識別。

第一版在已確認無坑和斷崖的平整場地進行低速測試時,可暫保留當前 False。若後續確實需要防坑,再單獨驗證開啓後的地形輸出、代價地圖和停車行為;既不能用10 cm門限判斷坑是否可通過,也不能把 noDataObstacle=True 當作已經具備可靠的防跌落保護。 實現細節見 近場地形分析 與 擴展地形分析。

障礙外圍代價:為什麼先保留 inflation_radius=0.7、cost_scaling_factor=4.0

這兩個值目前沿用已有配置,尚沒有證據需要為首次低速測試調整;它們不是根據底盤尺寸推算出來的唯一正確值。

inflation_radius=0.7 m 表示障礙周圍寫入膨脹代價的範圍。它大於擬採用的車體半徑,在車體碰撞邊界之外留出外圍代價區域,供規劃器考慮靠近障礙的代價。這個範圍並非全部都是硬性禁止區。

cost_scaling_factor=4.0 控制外圍代價下降的速度。數值越大,代價隨距離下降越快;數值越小,較高代價維持得更遠。

你的跟蹤控制器主要檢查高代價格子,沒有直接利用全部外圍軟代價給軌跡打分。因此,先正確配置 robot_radius;擴大膨脹範圍並不能替代車體尺寸適配,也不保證控制器自動更早減速。

豎直感知範圍:為什麼高度參數暫時保留

terrain_analysis.vehicleHeight=0.5 和 terrain_analysis_ext.vehicleHeight=1.0,限制的是輸出地形點相對估計地面的高度差。它們不表示底盤厚度,也不是車輛能跨越的台階高度。

這兩個值暫時保留,是因為單憑底盤長寬無法推出合適的高度篩選範圍。後續需要結合整車外形,檢查可能碰到車身或雲台的結構是否仍被保留。不能直接把底盤厚度 0.20 m 填進去。

兩張代價地圖的豎直體素參數則決定另一道空間窗口:

origin_z = 0.0 m
z_resolution = 0.05 m
z_voxels = 16

竖直覆盖总高 = 0.05 × 16 = 0.8 m

這些高度按對應地圖座標系解釋。當前平地首測可以先保留,但上坡、下坡或地圖高度基準變化時,需要重新核對窗口是否仍覆蓋有效障礙。即使前置篩選寫了 max_obstacle_height=2.0,點也仍要通過這道體素窗口。

地圖網格:為什麼先保留 5 × 5 m 和 0.05 m

局部地圖的 width=5、height=5 表示整張滾動地圖覆蓋約 5 × 5 m,中心兩側各約 2.5 m。這是觀察和計算範圍,與車輛外形大小無關。

resolution=0.05 m 表示每個格子邊長為 5 cm。局部地圖大約包含:

(5 / 0.05) × (5 / 0.05) = 100 × 100 个格子

這組設置可以作為低速首測的起點。減小格距能表達更細的障礙,但會增加計算量;擴大地圖範圍同樣會增加處理開銷。目前先觀察實際障礙表達與計算負載,再決定是否調整。

全局地圖最終使用的格距還可能受靜態地圖影響,應以運行時實際地圖信息為準。

1.4.測試

1.4.1.低速測試

以下用於第一版實車導航測試:保留北極熊算法源碼和原有 launch 接線,通過導航參數降速,並在自己的串口節點增加最終限幅。限制的是目標指令,實車速度和停車響應仍需驗證。

1. 導航參數

配置文件:src/pb2025_sentry_nav/pb2025_nav_bringup/config/reality/nav2_params.yaml。表中的 FollowPath 參數位於 controller_server.ros__parameters.FollowPath 下。

參數 建議值 作用與説明
FollowPath.v_linear_min/max -0.2 / 0.2 m/s 限制路徑跟蹤控制器輸出的線速度標量,之後再分解成 vx、vy。這裏的負值是反向輸出邊界,不是要求至少跑 0.2 m/s。
FollowPath.min_approach_linear_velocity 0.03 m/s 接近終點減速時使用的最低速度參考,避免過早降得太低。它不是全程最低速度,到點後仍應停車。
controller_server.min_y_velocity_threshold 0.001 m/s 將里程計中絕對值很小的橫向速度視為零,用於過濾噪聲。不限制下發速度;設成 0.5 會把正常低速橫移也當成靜止。
velocity_smoother.max_velocity [0.14, 0.14, 0.2] 分別限制 vx、vy、wz 的正向最大值。前兩項單位為 m/s,第三項為 rad/s;兩個平移分量同時達到上限時,合速度約為 0.198 m/s。
velocity_smoother.min_velocity [-0.14, -0.14, -0.2] 分別限制 vx、vy、wz 的負向邊界,允許後退、右移和反向旋轉。不是最低運動速度,零速度仍然允許。
velocity_smoother.max_accel [0.15, 0.15, 0.3] 限制各軸加速的快慢,使起步更平緩。前兩項單位為 m/s²,第三項為 rad/s²。
velocity_smoother.max_decel [-0.3, -0.3, -0.6] 限制正常減速的快慢,按此組件要求填寫負值。絕對值越大,允許減速越快;絕對值過小會增加停止時間和距離。
velocity_smoother.velocity_timeout 0.2 s 超過這段時間沒收到上游速度,就把目標速度設為零,再按減速度限制降速。不是保證 0.2 秒內停住。
FollowPath.enable_rotation false 正常路徑跟蹤時輸出的導航角速度 wz_nav2 為零;這個開關不禁止手柄或其他來源請求底盤旋轉。
fake_vel_transform.init_spin_speed 0.0 rad/s 自旋速度的啓動初值。之後收到非零 cmd_spin 仍會改變自旋速度,首測不要額外發布自旋指令。

x、y 各設 0.14,是因為平滑器按軸限速,對角合速度約為 sqrt(0.14² + 0.14²) = 0.198 m/s,沿單軸移動的上限則為 0.14 m/s。 當前 enable_rotation=false 且自旋項為零時,正常跟蹤下發的底盤角速度為零。

2. 恢復動作單獨降速,保持原 launch 接線

以下兩個行為樹都使用相同的低速恢復參數:

  • src/pb2025_sentry_nav/pb2025_nav_bringup/behavior_trees/navigate_to_pose_w_replanning_and_recovery.xml
  • src/pb2025_sentry_nav/pb2025_nav_bringup/behavior_trees/navigate_through_poses_w_replanning_and_recovery.xml
參數 原始值 → 低速測試值 作用與説明
backup_speed 1.0 → 0.10 m/s 限制恢復動作請求的平移速度。當前插件是 BackUpFreeSpace,會選擇空閒方向移動,未必固定向車後方退。
backup_dist 1.0 → 0.20 m 限制一次恢復動作的目標移動距離。只降低速度不會同時縮短移動距離。
<BackUp backup_dist="0.20" backup_speed="0.10"/>

本輪沿用實車默認的 use_composition=True。該分支中,恢復速度經過雲台座標變換後到達串口,但繞過 velocity_smoother; 因此,上表中的平滑器加減速度參數不約束這條恢復路徑。 Nav2 Humble 官方默認啓動接線同樣讓恢復動作繞過速度平滑器,本輪不要求修改 launch 將恢復動作接入平滑器。 非組合啓動分支不在本輪驗證範圍內。

3. 串口最終限幅與斷流保護

修改文件:src/serial_comm/src/serial_comm.cpp。 以下兩項是速度回調中的 C++ 常量,不屬於 nav2_params.yaml;CMD_VEL_TIMEOUT 是串口節點自己的接收超時門限。

參數 低速測試值 作用與説明
MAX_LINEAR_SPEED 0.2 m/s 對最終下發的平移合速度 hypot(vx, vy) 限幅;超限時同比縮小兩個分量,保持方向。覆蓋經過該串口出口的速度來源。
MAX_ANGULAR_SPEED 0.2 rad/s 限制最終下發的底盤角速度,包括疊加後的自旋。首測希望禁止所有串口旋轉指令時,可以設為 0.0。
CMD_VEL_TIMEOUT 200 ms 本節點超過該時間未收到速度消息,就把速度有效位置零,並把本次發送的 vx、vy、wz 清零。與上游平滑器的 velocity_timeout 是兩個獨立門限。

速度保護按以下順序執行:

  1. 收到速度時,先檢查 vx、vy、wz 是否都是有限值;任一字段為 NaN/Inf,就清零速度並標記為無效,不刷新有效指令的接收時間。
  2. 在 double 精度下計算平移合速度,超限則同比縮小 vx、vy;再限制 wz,最後轉換成協議使用的 float32。
  3. 在發送定時器中檢查接收超時,過期後同時發送無效標誌和零速度,保留原協議結構及雲台角度字段。

vx、vy 表示底盤平移速度在雲台 yaw 座標系下的分量,單位為 m/s;wz 是底盤角速度,單位為 rad/s;rel_pitch、rel_yaw 是雲台目標相對角,單位為 rad。串口速度限幅不會替代正常加減速控制。

4. 加載與測試

修改 C++ 後,需要在實際運行環境重新編譯並重啓 serial_comm。導航 YAML 和行為樹 XML 也需要重新加載:若安裝目錄使用符號鏈接,重啓導航即可;若安裝目錄是複製文件,則先重新安裝對應包。修改控制器速度上限後應重啓導航,使 PID 重新讀取上下限。

啓動後核對實際參數;使用命名空間時,為節點名加上對應前綴:

ros2 param get /controller_server FollowPath.v_linear_max
ros2 param get /controller_server min_y_velocity_threshold
ros2 param get /velocity_smoother max_velocity
ros2 param get /velocity_smoother velocity_timeout
ros2 topic info /cmd_vel --verbose

對應預期為 0.2、0.001、[0.14, 0.14, 0.2]、0.2。檢查 /cmd_vel 發佈者,避免獨立啓動的手柄轉換節點與導航直接競爭同一個出口;需要手柄接管時,應使用明確的指令仲裁。

先架空核對方向、單位、零指令和斷流停車,再落地進行短距離單目標測試。重點觀察實際速度、取消導航、到點停車以及恢復動作結束後的表現;保持硬件急停可用。

本輪保留的 fake_vel_transform 舊速度緩存問題尚未修改:串口超時只能檢測自己是否持續收到消息,無法識別上游重發的舊非零指令。 因此,串口限速和斷流清零不能代替對整套導航取消、到點停車行為的驗證。