跳到正文

Wiki

controller_server(路徑跟蹤、進度檢查與到達判定)

約 45 分鐘閱讀

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

1.controller_server(路徑跟蹤、進度檢查與到達判定)

1.1.實車先看:速度怎樣算出,什麼情況下停止或報失敗

controller_server接收FollowPath任務,用當前位姿、里程計速度和區域性代價地圖呼叫跟蹤外掛,釋出速度,並檢查是否有移動進展及是否到達路徑終點。 當前FollowPath外掛是pb_omni_pid_pursuit_controller::OmniPidPursuitController:先選前視點,用PID求一個平移速度標量,再沿前視點方向分成vx、vy。

Humble筆記裡的FollowPath示例介紹了DWB的critics、軌跡取樣和加速度限制。本工程採用全向PID跟蹤器,下面按這個外掛的實際實現解釋引數,不把那套評分器引數套進來。

當前主要鏈路為:

行为树FollowPath → controller_server
                     ├─ TF/local_costmap → 当前虚拟参考点位姿
                     ├─ odometry → 速度阈值过滤 → 速度前视距离
                     ├─ 路径转到gimbal_yaw_fake → 选前视点
                     ├─ 平移PID → 曲率减速 → 终点减速 → vx、vy
                     ├─ progress_checker → 是否有足够位置移动
                     └─ general_goal_checker → 是否到达路径终点

cmd_vel_controller → velocity_smoother → cmd_vel_nav2_result
                   → fake_vel_transform → 实际云台系cmd_vel → 串口/MCU

本節點的機器人參考點由local_costmap.robot_base_frame決定,當前為gimbal_yaw_fake;位姿在local_costmap.global_frame中取得,當前為odom。本塊沒有另一個robot_base_frame引數。進度、到達距離以及前視點都要按這套參考點理解,不能只看bt_navigator的同名設定。

實車上看到的現象 先核對什麼 當前配置應怎樣理解
以為0.5 m/s以下不能橫移 min_y_velocity_threshold與輸出速度 此項過濾輸入里程計的y速度,不直接禁止輸出vy;它會影響速度前視計算
改lookahead_dist=2.0卻看不到變化 use_velocity_scaled_lookahead_dist 當前啟用速度前視,距離為過濾後平面速度×1 s,再夾到0.5~1.0 m;固定2 m當前不用
改progress_checker_plugins卻沒有切換檢查器 Humble的實際引數名 1.1.20讀取單數progress_checker_plugin;當前恰好由預設ID選到progress_checker
已到位置,朝向沒對齊也成功 yaw_goal_tolerance與enable_rotation 6.28是rad,大於π,正常最短yaw誤差均能通過;當前旋轉PID關閉
終點前抖動、衝過或突然反向 PID輸出、前視點跳變、終點減速與上游速度 平移誤差是前視點距離;導數可正可負,速度下限允許負標量;不能只提高D就當作增加阻尼
彎道沒有按註釋降到一半 曲率倍率、減速速度下限與變化速率 0.5是目標保留倍率;當前曲率階段另有1.0 m/s減速下限,並不能把已經更慢的速度抬高
介面顯示PID新值,行為仍沒變 動態回撥與內部PID物件 增益成員更新後沒有重建PID;速度上下限的動態分支為空;需重新配置/重啟驗證

本次容器內nav2_controller、nav2_core、nav2_util均為1.1.20,PID外掛安裝包為1.0.4。本地控制器實現、PID實現及控制器標頭檔案與北極熊上游提交b542c5794b91fba2bb3fe2cbdc72fcf854fedb1a逐字一致;以下按對應程式碼核對。當前控制器原始碼、PID原始碼

1.2.引數

下面保留本次傳送的完整實物引數,包含原註釋。模擬段只有use_sim_time=True不同。原始碼缺口和建議另列,不直接替換這裡的原值。

controller_server:
  ros__parameters:
    use_sim_time: False
    odom_topic: odometry
    controller_frequency: 20.0
    min_x_velocity_threshold: 0.001
    min_y_velocity_threshold: 0.5
    min_theta_velocity_threshold: 0.001
    failure_tolerance: 0.3
    progress_checker_plugins: ["progress_checker"]
    goal_checker_plugins: ["general_goal_checker"]
    controller_plugins: ["FollowPath"]
    progress_checker:
      plugin: "nav2_controller::SimpleProgressChecker"
      required_movement_radius: 0.5
      movement_time_allowance: 10.0
    general_goal_checker:
      stateful: True
      plugin: "nav2_controller::SimpleGoalChecker"
      xy_goal_tolerance: 0.15
      yaw_goal_tolerance: 6.28
    FollowPath:
      plugin: "pb_omni_pid_pursuit_controller::OmniPidPursuitController"
      translation_kp: 3.0
      translation_ki: 0.1
      translation_kd: 0.3
      enable_rotation: false
      rotation_kp: 3.0
      rotation_ki: 0.1
      rotation_kd: 0.3
      transform_tolerance: 0.1
      min_max_sum_error: 1.0
      lookahead_dist: 2.0
      use_velocity_scaled_lookahead_dist: true
      lookahead_time: 1.0
      min_lookahead_dist: 0.5
      max_lookahead_dist: 1.0
      use_interpolation: false
      use_rotate_to_heading: false
      use_rotate_to_heading_treshold: 0.1
      min_approach_linear_velocity: 0.5
      approach_velocity_scaling_dist: 1.0
      v_linear_min: -2.5
      v_linear_max: 2.5
      v_angular_min: -3.0
      v_angular_max: 3.0
      curvature_min: 0.4                                # 低曲率阈值,低于此值不减速。
      curvature_max: 0.7                                # 高曲率阈值,高于此值大幅减速。
      reduction_ratio_at_high_curvature: 0.5            # 高曲率时的速度降低比例。 0.5 (即减速 50%)
      curvature_forward_dist: 0.7                       # 前向距离,用于曲率计算
      curvature_backward_dist: 0.3                      # 后向距离,用于曲率计算
      max_velocity_scaling_factor_rate: 0.9             # 速度缩放因子的最大变化率

1.2.1.ros__parameters(伺服器節拍、輸入與外掛選擇)

1.2.1.1.參數列
引數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
use_sim_time False;模擬True 不適用,布林 上實物前必須核對並正確配置 選擇ROS時鐘,影響TF、進度時間和失敗計時 不適用 不適用 整套launch重寫已有鍵;伺服器控制迴圈用WallRate,PID另用配置時算出的固定dt
odom_topic odometry 不適用,話題名稱 上實物前必須核對並正確配置 取得輸入twist的x、y及繞z角速度 不適用 不適用 當前訂閱器保留最新分量,不負責重新換系或驗證速度含義;當前位置從local_costmap的TF取得
controller_frequency 20.0 Hz 通常保持當前值,不作為優先除錯項 設定FollowPath期間控制迴圈的目標頻率,並在外掛配置時用於dt 理想檢查更密;計算負擔增加,PID離散步長也改變 檢查更稀;響應可能更遲,PID離散步長也改變 當前目標50 ms/輪,不保證實際達到;外掛固定dt=0.05 s,不測真實迴圈間隔;改頻率須重新配置外掛
min_x_velocity_threshold 0.001 m/s,輸入x分量門檻 通常保持當前值,不作為優先除錯項 將輸入vx絕對值不超過門檻的部分置零 過濾更多低速與噪聲,可能刪掉真實慢速運動 保留更多小速度,也保留更多噪聲 不限制輸出vx;過濾後的vx、vy參與前視距離;邊界等於門檻也置零
min_y_velocity_threshold 0.5 m/s,輸入y分量門檻 實物執行時重點觀察,有問題再針對性調整 將輸入vy絕對值不超過0.5 m/s的部分置零 更多橫向運動被視為零,混合運動的速度前視可能縮短 保留更多真實低速橫移,也保留更多y噪聲 不是最小可執行橫移速度;對全向實車偏大的過濾門檻需按有效速度與靜止噪聲核對,不因原示例這樣寫就認定適合
min_theta_velocity_threshold 0.001 rad/s,輸入繞z分量門檻 通常保持當前值,不作為優先除錯項 將輸入角速度絕對值不超過門檻的部分置零 過濾更多小角速度 保留更多小角速度 不限制輸出wz;當前PID前視只用平移速度,SimpleGoalChecker不檢查速度,本項不會把當前輸出旋轉變小
failure_tolerance 0.3 s,外掛連續異常容忍時間 實物執行時重點觀察,有問題再針對性調整 容忍computeVelocityCommands丟擲的PlannerException一小段時間 較長時間釋出零速度並等待恢復,跟蹤失敗上報可能更遲 更快上報持續計算失敗,短暫異常更易結束當前FollowPath 當前0.3 s,不是0.3 m;僅特定異常路徑;0立即傳播,-1為無限容忍,不能用來掩蓋問題
progress_checker_plugins ["progress_checker"] 不適用,列表 已確認當前值錯誤,必須修改 該複數鍵未被本版本用於選擇進度檢查器 不適用 不適用 1.1.20實際讀取progress_checker_plugin字串;當前靠預設ID恰好選到同名配置,未因此必然啟動失敗;建議改為單數鍵
goal_checker_plugins ["general_goal_checker"] 不適用,ID列表 上實物前必須核對並正確配置 指定載入的目標檢查器配置ID 不適用 不適用 當前僅一個,BT的FollowPath未指定goal_checker_id時會選擇它;ID與下方分組名稱須一致
controller_plugins ["FollowPath"] 不適用,ID列表 上實物前必須核對並正確配置 指定載入的路徑跟蹤外掛配置ID 不適用 不適用 當前BT明確請求controller_id=FollowPath;演算法類由FollowPath.plugin決定,ID本身不說明演算法
progress_checker_plugin "progress_checker",原始碼預設;原YAML未配置 不適用,ID字串 上實物前必須核對並正確配置 當前版本真正用於選擇單個進度檢查器的鍵 不適用 不適用 此行說明實際預設,不與複數列表疊加;按當前Humble修正鍵名後沿用這個ID
1.2.1.2.引數詳解
1.2.1.2.1.controller_frequency 與 odom_topic(目標20 Hz、固定PID步長與實際速度)

伺服器在FollowPath任務執行期間反覆算速度,目標20 Hz。它仍可能等待代價地圖變為current,或受TF、路徑變換、計算耗時影響;把20設大不能自動加快點雲、地圖或TF。伺服器控制迴圈(1.1.20)

PID外掛配置時取controller_frequency,算dt=1/20=0.05 s,此後積分、微分和曲率速度變化步長都用這個固定值。實際有一輪拖到100 ms,也不會自動把PID的dt改成0.1 s。因此調頻率既改排程目標,也改演算法離散計算;不能只當作重新整理顯示頻率。

當前odometry的位姿、速度來源與座標缺口見sensor_scan_generation。這裡的OdomSubscriber直接取最新twist分量,沒有bt_navigator那種0.3 s平均視窗,也沒有替上游修正速度表達系或時間差分。里程計訂閱實現

當前外掛用輸入平面速度決定前視距離,PID本身的誤差來自前視點位置,並非“目標速度減里程計速度”的底盤速度閉環。底盤電機執行與速度反饋仍屬下位機鏈路。

1.2.1.2.2.三項min…velocity_threshold(過濾測得的速度,不夾住輸出速度)

本版本規則為:絕對值嚴格大於門檻才保留,否則置零;正負速度都按同一絕對值規則處理。過濾函式

例如原始輸入vx=0.4、vy=0.4 m/s,平面速度約0.566 m/s。當前x保留、y清零,交給PID外掛的平面速度變為0.4 m/s;乘1 s後再經0.5 m下界夾取,前視距離變為0.5 m。若保留原輸入,這個例子會取約0.566 m。這裡只計算配置影響,不是實測結果。

純橫移0.3 m/s時,vy雖會被清零,但本來與過濾後都可能落在0.5 m前視下界,選出的前視距離未必改變。不能把“過濾了速度”簡單推導為“所有低速橫移的控制輸出都消失”。當前輸出vy仍由前視點方向與PID標量計算。

調y門檻應先看靜止噪聲和實際低速橫移資料,尤其上游當前的twist未嚴格按child_frame_id換系;按哪個軸過濾本身也可能偏離預期。閾值不能修復座標或時間問題。theta門檻不會代替enable_rotation、旋轉限幅或雲臺機械關節限位。

1.2.1.2.3.failure_tolerance(0.3 s等待有效控制恢復)

成功計算一次速度後,伺服器更新last_valid_cmd_time。若下一次外掛計算丟擲PlannerException,當前容忍分支釋出零速度,繼續嘗試;從最後一次成功計算算起超過0.3 s仍未成功,丟擲Controller patience exceeded,讓當前FollowPath失敗。理想20 Hz下約對應6個週期,實際不是固定“允許失敗6次”。

外掛中的路徑轉換失敗、空區域性路徑或碰撞檢測可進入這條異常路徑;但是取機器人位姿失敗、進度檢查失敗發生在這段catch之外,會直接上報。代價地圖等待也不由這0.3 s限定。因此不能把它當成覆蓋全部導航問題的統一等待時間。異常範圍與計時實現

增加它只是讓特定異常分支多等待,不會越過障礙繼續發上一條非零速度;減少則更快觸發前面行為樹中的清圖與恢復。進度檢查的10 s、BT請求響應的100 ms各有不同用途。

1.2.1.2.4.三項外掛選擇(ID、類名與Humble單數鍵)

ID是下方引數分組的名稱,plugin是載入的C++類名。BT請求FollowPath時,選的是ID;此ID內部可以載入不同演算法,當前明確載入全向PID。

Nav2 1.1.20在構造及configure階段都讀取progress_checker_plugin,只選擇一個進度檢查器。當前複數progress_checker_plugins未用於此選擇,預設單數ID剛好是progress_checker,所以仍讀取下方同名的SimpleProgressChecker配置。改變複數列表的內容並不能實際切換檢查器。

沿用本版本時,建議將該鍵修正為:

progress_checker_plugin: "progress_checker"

這是配置修正示例,原引數程式碼塊仍保留髮送內容;本次沒有修改工程的nav2_params.yaml。goal_checker_plugins與controller_plugins在當前版本則確實為複數列表,不能一起改成單數。外掛鍵宣告與載入

1.2.2.progress_checker(位置移動進展檢查)

1.2.2.1.參數列
引數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
plugin nav2_controller::SimpleProgressChecker 不適用,類名 通常保持當前值,不作為優先除錯項 按機器人參考點的平面位移檢查是否有進展 不適用 不適用 當前看x、y位移,不比較離目標是否更近,不計純yaw轉動
required_movement_radius 0.5 m,重置基準所需淨位移 實物執行時重點觀察,有問題再針對性調整 當前參考點離上次基準位置超過0.5 m後重置計時 需要更大位移才算進展,慢速/小範圍移動更易超時 更小位移也能重置,定位噪聲或小抖動也更易被算進展 嚴格大於0.5 m;不是每輪要走0.5 m、目標誤差或累計路程
movement_time_allowance 10.0 s,基準未更新的允許時間 實物執行時重點觀察,有問題再針對性調整 允許當前位置基準在10 s內暫時不更新 可等更久,卡住發現也更遲 更快判無進展,低速接近和正常等待更易失敗 首次檢查建立基準;超時嚴格大於10 s;進展足夠時位置與時間同時重置
1.2.2.2.引數詳解
1.2.2.2.1.0.5 m與10 s(檢查淨位移,不要求一直接近目標)

首次檢查記住參考點位置和時間。以後,只要當前位置與該基準的平面距離超過0.5 m,就重設基準;尚未超過時,允許等待10 s。檢查取自local_costmap的機器人參考點位姿,當前為odom中的gimbal_yaw_fake原點。

因此,在原地附近反覆繞行,累計路程已經超過0.5 m,卻可能始終未離基準超過0.5 m;反之,朝錯誤方向移動0.6 m也會算“有進展”。純yaw轉動不直接算位移;若參考點與旋轉中心有偏置,位置變化須按實際TF理解。SimpleProgressChecker實現

0.5/10=0.05 m/s只能幫助估算持續直行的要求,不是此處配置了最低速度。低速接近終點、短路徑、小範圍避讓或等待可能受這組引數影響;應結合真實任務和定位噪聲觀察,不能只放寬到“永不失敗”。換一條正在跟蹤的路徑不會在當前伺服器的updateGlobalPath中自動重置進度檢查,開始一輪新的FollowPath執行才有對應reset。

1.2.3.general_goal_checker(路徑終點判定)

1.2.3.1.參數列
引數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
plugin nav2_controller::SimpleGoalChecker 不適用,類名 通常保持當前值,不作為優先除錯項 檢查路徑終點的平面位置與yaw誤差 不適用 不適用 此類忽略傳入的速度;成功不等於已驗證物理停穩,不檢查z/roll/pitch
stateful True 不適用,布林 通常保持當前值,不作為優先除錯項 本輪位置已合格後,後續只繼續檢查yaw 不適用 不適用 收到新路徑時reset重新檢查位置;當前yaw門檻極寬,通常位置通過同一次就成功
xy_goal_tolerance 0.15 m,終點平面距離容差 實物執行時重點觀察,有問題再針對性調整 參考點進入終點15 cm半徑內時,位置合格 更早滿足、更容易成功,但停車參考點偏差可能更大 要求更近,可能在噪聲、慣性和離散控制下更難完成 是x、y合成的圓形距離,不是兩軸各允許15 cm;按gimbal_yaw_fake參考點,不保證車體外形已到指定位置
yaw_goal_tolerance 6.28 rad,最短yaw誤差容差 根據實際功能需求開啟或設定 決定終點朝向誤差是否合格 正常門檻內放寬朝向;大於π後對正常yaw誤差已無進一步區別 縮到π以內才開始約束朝向;過小而無旋轉控制時可能無法完成 6.28約359.82°,最短角差絕對值不超過π,當前等效不要求朝向;不是6.28°或允許轉一整圈
1.2.3.2.引數詳解
1.2.3.2.1.xy_goal_tolerance、yaw_goal_tolerance 與 stateful(當前主要按15 cm位置判成功)

位置檢查使用dx²+dy²≤0.15²。進入該圓後,stateful=True會記住“位置已通過”,隨後不再重複位置條件,直到檢查器reset。伺服器接收新路徑時會reset,因此不能把這個狀態理解成永久記住曾經到過終點。

yaw採用angles::shortest_angular_distance,誤差落在約[-π,π]中,再判斷其絕對值是否嚴格小於容差。6.28大於π,所以正常有效姿態都能通過;與enable_rotation=False配合,當前正常導航無需為了停車對齊指定朝向。SimpleGoalChecker實現

若以後把yaw容差收緊,須一起核對旋轉輸出、真實反饋參考系和任務要求,不能只把它改小就期待機器人自動轉正。gimbal_yaw_fake的水平軸在平面條件下與odom對齊,底盤自轉不等於該虛擬參考系隨底盤yaw轉動。

SimpleGoalChecker不檢查實測速度;當前伺服器成功後按預設publish_zero_velocity=True發零速度,然後仍要經過平滑、換系、序列埠與MCU。15 cm表示估計參考點滿足判定,不是定位精度保證,也不是整車最終靜止誤差的實測結果。

1.2.4.FollowPath(全向PID路徑跟蹤)

1.2.4.1.平移、旋轉與TF參數列

以下增益單位按“位置誤差m/角度誤差rad,輸出m/s/rad/s,dt用s”的本實現解釋;不是裝置單位或ROS引數系統強制的單位約束。

引數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
plugin pb_omni_pid_pursuit_controller::OmniPidPursuitController 不適用,類名 上實物前必須核對並正確配置 載入本工程全向PID跟蹤器 不適用 不適用 需匹配安裝外掛與介面;當前輸出平移標量再分解vx、vy,旋轉另有開關
translation_kp 3.0 s⁻¹ 實物執行時重點觀察,有問題再針對性調整 前視點距離誤差的比例貢獻 未限幅時同樣距離給更強速度貢獻,更易飽和或越過目標 比例貢獻減弱,可能更慢或更難克服阻力 不是直接給3 m/s;誤差通常隨前視點變化;當前執行中改成員不會更新內部PID
translation_ki 0.1 s⁻² 實物執行時重點觀察,有問題再針對性調整 距離誤差積分的速度貢獻 積分影響更強,長期殘留與任務切換影響可能更大 積分影響更弱;設0移除積分對輸出的貢獻 平移誤差是非負距離,不是帶符號的橫向偏差;積分內部另有固定限幅,未按本YAML門檻配置
translation_kd 0.3 無量綱 實物執行時重點觀察,有問題再針對性調整 前視距離誤差變化率的速度貢獻 誤差變化貢獻更強,前視點跳變可產生更大沖擊/負標量 對誤差變化更不敏感,也會減弱已有動態作用 差分除以固定0.05 s;不能概括成越大越穩定;首次pre_error=0
enable_rotation false 不適用,布林 通常保持當前值,不作為優先除錯項 是否用旋轉PID計算本跟蹤器的wz 不適用 不適用 當前本外掛wz恆為0;恢復Spin與cmd_spin附加自旋仍是其他入口;本開關無動態更新分支
rotation_kp 3.0 s⁻¹ 當前執行不使用這個引數,暫不調整 旋轉yaw誤差的比例貢獻 啟用旋轉後:同樣角差貢獻增強 啟用旋轉後:比例貢獻減弱 當前enable_rotation=False;需要實際參考系朝向能響應旋轉反饋;執行中增益改值也未更新內部PID
rotation_ki 0.1 s⁻² 當前執行不使用這個引數,暫不調整 旋轉yaw誤差積分貢獻 啟用後積分作用增強,殘留可能更明顯 啟用後積分作用減弱 當前不計算旋轉PID;不是雲臺電機的積分引數
rotation_kd 0.3 無量綱 當前執行不使用這個引數,暫不調整 旋轉yaw誤差變化率貢獻 啟用後對角差變化更敏感 啟用后角差變化貢獻減弱 當前不計算;與實際角速度輸入門檻及MCU控制引數不同
transform_tolerance 0.1 s,路徑/位姿TF查詢等待 通常保持當前值,不作為優先除錯項 轉換路徑與位姿時等待所需TF 可等更久,也可能拖慢控制迴圈 更快結束缺失TF的查詢 不是角度、位置容差或時間戳補償;部分轉換失敗返回值未檢查,詳見原始碼缺口
min_max_sum_error 1.0 未形成生效的單位約定 當前執行不使用這個引數,暫不調整 名稱提示積分相關限制,但當前未接入計算 當前無計算效果 當前無計算效果 只宣告、讀取和更新成員;PID內部積分限幅硬編碼±1,setSumError未被該控制器呼叫
1.2.4.2.平移與旋轉詳解
1.2.4.2.1.translation_kp、translation_ki 與 translation_kd(控制的是前視點距離)

路徑先轉到local_costmap使用的機器人系,當前為gimbal_yaw_fake。選出前視點後計算:

e = hypot(x_carrot, y_carrot)
theta = atan2(y_carrot, x_carrot)
平移PID输入:set_point=e,pv=0
PID标量 → 曲率减速 → 终点减速 → v
vx = v × cos(theta)
vy = v × sin(theta)

因此不是x、y各自獨立一套PID,也不是用里程計vx去糾正目標vx。只有一個距離誤差標量負責速度大小,方向來自前視點。速度計算與分解

dt=0.05 s時,PID先算P=kp×e,積分累加e×dt,D=kd×(e−上一輪e)/dt,最後夾到v_linear_min~v_linear_max。以首次e=0.5 m為例:P=1.5 m/s,I=0.0025 m/s,D=3.0 m/s,合計4.5025 m/s,先被上限夾到2.5 m/s,隨後才進入兩級減速。此例只展示公式,未預測最終實車速度。

前視點距離突然增大時,D可能加強加速;突然減小時,D可能為負,甚至使總標量為負。當前下限-2.5允許這種結果,負v會朝前視點的反方向輸出vx、vy。需要結合前視點跳變、實際迴圈延遲與速度鏈觀察,不能把kd簡單解釋成通用的“剎車強度”。

積分項也有本實現特徵:e是非負距離,長時間跟蹤時可不斷累計;PID先用當前積分算I,再把內部積分夾到±1,當前輸出並非始終受到嚴格的I項上限保護。控制器setPlan只更新路徑,沒有重置PID積分和上一輪誤差,任務或路徑變化時的歷史狀態要一起考慮。PID離散計算與狀態

1.2.4.2.2.enable_rotation與三項rotation增益(當前只輸出平移)

當前False使本外掛angular.z=0。正常路徑跟蹤不因此失去橫移能力;全向底盤可沿前視點方向平移。 後續fake_vel_transform仍可疊加cmd_spin,行為伺服器也有自己的恢復動作,不能據此斷言底盤在整套系統中永不轉動。

若以後啟用旋轉,預設旋轉誤差取前視位姿四元數的yaw,不是atan2(y_carrot,x_carrot)這個平移方向角;use_rotate_to_heading=True時改取當前轉換後路徑末端的yaw。需要確認虛擬參考系的朝向定義、目標路徑姿態、底盤執行以及反饋,不能把這組引數當雲臺關節控制器。

設定了 enable_rotation: false,跟蹤控制器直接輸出 wz_nav2=0; 不讓導航來控制雲臺的轉向。

1.2.4.2.3.min_max_sum_error與transform_tolerance(未接線的積分引數與真實TF等待)

min_max_sum_error=1.0不能據名稱解釋成“積分限制由1.0控制”。當前成員在configure和動態回撥中賦值,但計算路徑沒有使用;PID內部固定夾±1,控制器也沒有呼叫PID::setSumError。調整這個YAML值不會改變當前積分限制。

transform_tolerance則確實轉成TF查詢的timeout,供transformPose使用。它不移動時間戳、不補外參,也不把超時轉換自動變成正確位姿。當前部分呼叫沒有檢查返回的False,問題見後面的原始碼缺口;單純延長等待不能修復這一處理路徑。

1.2.4.3.前視點與先轉向參數列
引數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
lookahead_dist 2.0 m,固定前視半徑 當前執行不使用這個引數,暫不調整 關閉速度前視後,作為選點的固定距離 切換固定模式後:看更遠,可能更平順也更易切彎 切換後:看更近,可能更敏感或抖動 當前速度前視True覆蓋本值;0.5~1.0 m邊界也不會在固定模式自動夾住2 m
use_velocity_scaled_lookahead_dist true 不適用,布林 通常保持當前值,不作為優先除錯項 選擇速度×時間、上下界夾取的前視方式 不適用 不適用 當前採用過濾後vx、vy的模長;False才使用lookahead_dist
lookahead_time 1.0 s,速度前視係數 實物執行時重點觀察,有問題再針對性調整 將測得的平面速度換算成前視距離 未觸上下界時看更遠,可能減少方向波動也更易跨過彎角 未觸界時看更近,可能更敏感 不是預測運動1 s後的完整軌跡;到0.5/1.0 m夾限後改變可能無效果
min_lookahead_dist 0.5 m,速度前視下界 實物執行時重點觀察,有問題再針對性調整 低速時至少以0.5 m半徑尋找前視點 低速也看更遠,可能切彎或增加距離PID輸入 低速看更近,可能更敏感或受點間距影響 當前只在速度前視模式使用;需0≤min≤max;沒有足夠遠點時仍取區域性路徑末端
max_lookahead_dist 1.0 m,速度前視上界 實物執行時重點觀察,有問題再針對性調整 高速時將選點距離引數夾到1 m 允許更遠前視,但仍受區域性路徑範圍約束 更早達到上界,高速也看更近 上界限制的是選點半徑引數;關閉插值時,實際所選離散點可更遠
use_interpolation false 不適用,布林 通常保持當前值,不作為優先除錯項 是否在跨越前視圓的路徑線段上插入精確交點 不適用 不適用 當前直接選原路徑點;True分支沒有填有效姿態四元數,若配合旋轉需核對;不控制曲率取樣中的全部插值
use_rotate_to_heading false 不適用,布林 通常保持當前值,不作為優先除錯項 啟用後,以當前區域性路徑末端yaw判定是否先將平移誤差設零 不適用 不適用 該判斷不受enable_rotation開關保護;旋轉關閉卻啟用它,可能停止正常平移卻沒有wz去對齊
use_rotate_to_heading_treshold 0.1 rad,約5.73° 當前執行不使用這個引數,暫不調整 先轉向模式下,超出該yaw誤差就把平移距離誤差設零 啟用後允許更大朝向誤差再抑制平移 啟用後更小誤差也觸發 當前use_rotate_to_heading=False;拼寫treshold是原始碼實際鍵名,不擅自改為threshold;置零誤差不保證PID歷史輸出立刻為零
max_robot_pose_search_dist 約2.49,按當前網格配置推算的原始碼預設;YAML未配置 m,沿路徑搜尋視窗 通常保持當前值,不作為優先除錯項 限制尋找最近路徑點時,從剩餘路徑開頭向後搜尋的累計長度 搜尋更長,可能重新接到路徑後段或自交另一支 搜尋更短,偏離路徑後可能找不到合適段 預設取區域性地圖米制尺寸getter的較大值÷2;當前100格、0.05 m時為2.4875 m;實際值隨網格尺寸,當前無動態更新分支
1.2.4.4.前視點與先轉向詳解
1.2.4.4.1.lookahead_dist與速度前視四項(當前L=clamp(速度×1 s,0.5 m,1 m))

速度前視開啟時,採用過濾後的平面速度模長:

L = clamp(hypot(vx_odom_filtered, vy_odom_filtered) × lookahead_time,
          min_lookahead_dist, max_lookahead_dist)

純計算例:輸入有效平面速度為0、0.3、0.8、2.0 m/s時,L分別為0.5、0.5、0.8、1.0 m。固定lookahead_dist=2.0在這條分支不會使用;False才改用固定2 m,而且不會自動套用這兩個速度前視上下界。選點距離與分支

本實現按距機器人原點的水平直線距離找第一個不小於L的路徑點,不是沿路徑累計走L米。當前關閉插值,若相鄰點距原點0.9、1.2 m而L=1 m,會選1.2 m這個點;因此1 m上界不是實際選點距離的絕對上限。沒有足夠遠點時,改選當前區域性路徑末端。

前視變遠、變近同時改變方向和PID距離誤差,不能只將其理解成平滑度旋鈕。彎道切角、終點減速過晚、低速抖動需要結合區域性路徑密度、曲率取樣和速度過濾一起看。

1.2.4.4.2.use_interpolation(當前選原路徑點;啟用後還要核對姿態)

開啟時,在圓內外相鄰點形成的線段上算與前視圓的交點,使位置更接近指定半徑。但當前這個新PoseStamped僅寫位置和header,沒有填有效的姿態四元數;當前關閉此分支且旋轉關閉,不能把它說成已影響當前旋轉輸出。以後啟用插值與旋轉時需要一起檢查。

曲率計算另用findPoseAtDistance插值取樣,其路徑不由use_interpolation控制。關閉前視插值不等於所有內部取樣都使用原離散點。

1.2.4.4.3.use_rotate_to_heading及其treshold(看末端yaw,且不檢查旋轉是否開啟)

開啟後,演算法改用當前轉換後區域性路徑末端的yaw;超過0.1 rad就將lin_dist設為0,隨後仍照常執行平移PID。區域性路徑可能只是全域性路徑的一段,因此不能一概說它檢查的是最終目標朝向,更不是前視點位置的atan2方向。

如果enable_rotation仍False,wz繼續為0,卻可能反覆觸發上述平移抑制;如果PID還有積分和導數歷史,lin_dist=0又不等於即時輸出零。這些是此組合的原始碼行為,不應按“先轉好、再直走”的註釋直接保證動作效果。當前兩開關均關閉這一問題組合。

1.2.4.4.4.max_robot_pose_search_dist(當前配置推算約2.49 m的最近路徑點搜尋)

本外掛先在剩餘路徑開頭一定累計長度內找最接近當前參考點的位置,剪掉此前的已過路徑,再取區域性地圖範圍附近的路徑去換系。預設搜尋長度取區域性地圖米制尺寸getter的較大值÷2,而不是直接把YAML的width除以2。

當前width=height=5 m、resolution=0.05 m,按100×100格推算,Costmap2D::getSizeInMeters返回(100−0.5)×0.05=4.975 m,故預設搜尋長度為2.4875 m,約2.49 m。這裡是按配置與原始碼推算,實際有效值應隨執行網格尺寸核對。地圖米制尺寸getter(1.1.20)

這與0.5~1.0 m前視半徑、曲率前後取樣距離都是不同步驟。路徑自交、機器人偏離路徑或重規劃時,應看究竟選到了哪個段;它不是全域性規劃距離限制。路徑剪裁與搜尋

1.2.4.5.速度範圍與終點減速參數列
引數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
v_linear_min -2.5 m/s,平移PID標量下界 上實物前必須核對並正確配置 限制平移PID的負向標量輸出 下界上移,如-2.5→-1,反向標量幅度更小 下界更負,允許更強的反向標量 不是vx、vy各自下界,也不是最低前進速度;負標量相對前視點方向反向;動態回撥該分支為空
v_linear_max 2.5 m/s,平移PID標量上界 上實物前必須核對並正確配置 限制未減速前的正向平移標量 允許更大的平移速度,仍受後續減速和底層限制 更早飽和在較小速度,可能改變跟蹤表現 正常有限數值下,分解後的平移模長不因同時有vx、vy而增到sqrt(2)倍;需按實車運動能力設定
v_angular_min -3.0 rad/s,旋轉PID下界 當前執行不使用這個引數,暫不調整 旋轉開啟後限制負wz輸出 下界上移,允許的負轉速幅度縮小 下界更負,允許更強負轉速 當前旋轉關閉;不限制其他行為或cmd_spin;動態回撥分支為空
v_angular_max 3.0 rad/s,旋轉PID上界 當前執行不使用這個引數,暫不調整 旋轉開啟後限制正wz輸出 允許更大正轉速 正轉速上限更低 當前旋轉關閉;3 rad/s約171.89°/s,不是3°/s或雲臺角限位
min_approach_linear_velocity 0.5 m/s,減速分支的速度下限 實物執行時重點觀察,有問題再針對性調整 防止終點減速項壓到太低,同時參與曲率階段的兩倍下限 在已有較快速度上,減速可能停在更高值 允許減速到更低,需觀察低速執行與停車 不是所有輸出至少0.5;最終取min不會主動抬高已有更慢速度;當前還使曲率下限為1.0 m/s
approach_velocity_scaling_dist 1.0 m,區域性路徑長度觸發範圍 實物執行時重點觀察,有問題再針對性調整 區域性轉換路徑長度不足1 m時啟用接近減速 更早進入該條件,但不保證等同於更遠離真實終點就減速 較短路徑才進入,可能更晚減速 觸發看區域性路徑累計長度,倍率看原點至末點直線距離/本值;宜為有限正數,注意區域性截斷
1.2.4.6.速度範圍與終點減速詳解
1.2.4.6.1.四項v…min/max(限制PID標量,不是每軸獨立速度框)

平移PID先夾在[-2.5,+2.5] m/s,再按前視點theta分解。例如有限v=2 m/s、theta=45°時,vx、vy各約1.414 m/s,合成仍為2 m/s;不是兩軸各取2 m/s。theta決定前視點方向,v的正負決定沿該方向或反方向移動。

當前enable_rotation=False,角速度上下界與旋轉增益不會參與輸出;恢復行為和附加自旋也不受這兩項夾限。應按完整速度鏈核對實車限速,而不能把這一組引數視為MCU最後一道限幅。

此外,雖然controller_server訂閱speed_limit並會呼叫外掛setSpeedLimit,這個外掛的setSpeedLimit目前只有“未實現”的告警,不會按訊息改變限速。不能用該話題的存在證明這一路限速已經生效。限速介面實現

1.2.4.6.2.min_approach_linear_velocity與approach_velocity_scaling_dist(0.5並非強制最低速度)

先計算當前區域性轉換路徑自身的累計長度;小於1 m時,取“機器人原點到這個區域性末點的直線距離÷1 m”作為接近倍率,其他情況倍率為1。它使用區域性路徑末點,不保證始終是全域性最終目標;區域性視窗或路徑剪裁也會影響觸發。

當前正向速度v進入該階段後,可按下面理解:

v_out = min(v, max(0.5, v × 接近倍率))

例如倍率0.2、進入速度1.5 m/s時,乘後0.3,減速項取下限0.5,輸出0.5;若進入速度已是0.2,最終取min仍輸出0.2,不會主動加到0.5。它不能保證解決低速死區,也不代替電機控制或停車判定。接近減速實現

對於負PID標量,該程式碼的max下限與min組合會保留原負速度,並沒有按相同倍率平滑地縮小其絕對值。反向突變要先核對D項與PID狀態,不以“存在終點減速”保證不會發生。

當前區域性地圖約5 m邊長、1 m觸發距離未超出其約2.49 m的米制尺寸半值;若以後把觸發距離設得很大,區域性截斷可能讓車一直處於減速狀態。15 cm目標容差與該減速分支也要一起看,機械制動效果仍待實測。

1.2.4.7.曲率減速參數列
引數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
curvature_min 0.4 m⁻¹,開始減速的曲率 實物執行時重點觀察,有問題再針對性調整 κ嚴格大於此值才進入曲率減速分支 更多緩彎不進入減速,起點向更急彎移動 更緩的彎也進入減速 當前約對應2.5 m半徑;需與curvature_max配套,保持min<max;不是坡度或朝向角
curvature_max 0.7 m⁻¹,最大減速倍率的曲率界 實物執行時重點觀察,有問題再針對性調整 曲率達到附近時採用配置的高曲率保留倍率 中間段同樣κ通常保留更多速度,更急彎才到最低倍率 中間段減速更強,更早到最低倍率 當前約對應1.43 m半徑;不禁止更急彎,不是最大可轉角
reduction_ratio_at_high_curvature 0.5 無量綱,目標保留倍率 實物執行時重點觀察,有問題再針對性調整 高曲率時目標速度取當前速度×0.5 保留更多速度,減速更輕 保留更少速度,目標減速更強 是保留比例,不是一般意義的“減掉比例”;實際還受變化率、1 m/s下限及後續接近減速影響
curvature_forward_dist 0.7 m,曲率前方取樣偏移 實物執行時重點觀察,有問題再針對性調整 配合前視點和後方樣本擬合三點圓 跨更長範圍,可能平滑區域性噪聲,也可能跨過彎角 更區域性,可能更敏感或遇到重複點 當前取樣中心用前視點直線距離近似路徑里程,非嚴格沿弧長以該點為中心
curvature_backward_dist 0.3 m,曲率後方取樣偏移 實物執行時重點觀察,有問題再針對性調整 取得擬合圓的後方樣本 取樣跨度更大,可能更早受前段路徑影響 跨度更小,區域性變化與退化影響可能更大 路徑不足會夾到首點/末點;三點退化時實現回退為極小曲率,不保證真實尖角被充分減速
max_velocity_scaling_factor_rate 0.9 m/s²,原始碼實際限制速度標量變化率 實物執行時重點觀察,有問題再針對性調整 曲率分支將目標減速速度向歷史標量靠攏,單次步長按本值×dt夾取 此階段能更快接近目標速度,過渡更急 此階段更緩,但減速響應也可能更遲 當前單次步長0.045 m/s;不是無量綱倍率每秒變化0.9;不是整套vx、vy或底盤加速度的統一限制
1.2.4.8.曲率減速詳解
1.2.4.8.1.曲率三項(越大越急;0.5表示目標保留一半)

演算法從區域性路徑選三點擬合圓,κ=1/R,單位1/m。當前κ≤0.4時不進入曲率減速;0.4~0.7之間將保留倍率線性從1降到0.5;κ>0.7時目標保留倍率為0.5。

例如κ=0.55時位於兩門檻中點,目標倍率為0.75;同樣有限正速度2 m/s,目標減速速度為1.5 m/s。這裡是目標,後面的速度變化步驟和下限還會改變實際輸出,不能把註釋直接當作每一輪都恰好減半。

κ越小,擬合半徑越大;它與車輛yaw角、轉速或坡道傾角不同。修改這幾項不能修復地形節點把坡面當障礙、定位漂移或機械爬坡能力。保持合理的非負曲率門檻、min<max和0~1範圍的保留倍率;當前程式碼沒有完整的組合校驗。

1.2.4.8.2.curvature_forward_dist與curvature_backward_dist(三點從哪裡來)

程式碼先算路徑各點從首點起的累計距離,卻把前視點到機器人原點的直線距離當成取樣中心裡程,再按這個量減0.3、加0.7去路徑里程陣列中插值找兩點。彎曲路徑、首點偏置或選點距離與路徑弧長不一致時,不能嚴格稱為“從前視點沿路徑後退0.3、前進0.7”。取樣與擬合實現

超出路徑範圍會夾到首末點。重複、共線或極小半徑導致擬合半徑無效時,當前實現回退R=1e9 m,所得曲率約1e-9 m⁻¹,反而基本不觸發減速。應在RViz檢視curvature_points_marker_array、lookahead_point和local_plan,判斷取樣是否對應真實轉彎;調大視窗不是必然更安全或更準。

1.2.4.8.3.max_velocity_scaling_factor_rate與兩倍最低速度(實際控制的是速度數值)

名稱中的factor容易誤導:成員last_velocity_scaling_factor_實際存的是曲率階段輸出的速度標量,而不是0~1的倍率。若κ>0.4,程式碼向目標速度最多跨過±0.9×0.05=±0.045 m/s;接著把減速項抬到至少2×min_approach_linear_velocity,即當前1.0 m/s,再與原速度取較小值。

因此,在已建立有效歷史、忽略變化過渡並只看這個階段時:原速度1.5 m/s、高曲率目標0.75,會被減速項的1.0下限限制為1.0,而非0.75;原速度0.8時最終仍為0.8,不會被主動加到1.0。進入後面的終點減速後,還可能進一步下降。

這個變化率不是底盤統一加速度上限:κ≤0.4時不做該步長限制;PID原值突然變小、最終min取值或後續接近縮放仍可能更快降低速度;方向變化引起的vx、vy變化也沒有在這裡逐軸限制。運動加減速需繼續結合velocity_smoother和MCU引數檢查。曲率減速與歷史狀態實現

1.2.5.原始碼缺口、動態修改與驗證範圍

1.2.5.1.當前需要先明確的實現問題
專案 原始碼能確認什麼 對引數整理與實車核對的影響
進度檢查器鍵名 本版本讀取單數progress_checker_plugin;當前複數鍵未用於選擇 修正鍵名,避免將默認同名碰巧可用誤認為複數列表生效;本次只給文件建議
積分限制引數 min_max_sum_error成員沒有進入計算;PID內部硬編碼±1,且先算I再夾積分 不把該YAML值當有效積分限幅,不靠反覆調它改善結果
PID與任務歷史 setPlan未重置PID積分/上一輪誤差 路徑更新和再次接目標時可能承接歷史;不能假定每個任務都是全新PID狀態
曲率首輪歷史 last_velocity_scaling_factor_無成員初始化器,configure未賦初值;當前外掛工廠用new C建立 首次就進入κ>0.4分支時會先讀未初始化的歷史標量;首次平緩路徑會先賦值而掩蓋此缺口。未有執行觸發證據,需實現修復與執行驗證,調0.9不能補初始化
TF失敗處理 轉機器人位姿到全域性路徑的失敗會拋異常;逐點轉到機器人系以及碰撞取樣換系的返回值未全部檢查 日誌有TF異常卻繼續產生輸出,不證明資料有效;延長transform_tolerance不保證修復
碰撞檢查邊界 當前抽10個區域性路徑點查代價;遇到一個點落在地圖外會立即返回未檢測到碰撞 不是完整掃掠車體軌跡的保證;需核對地圖、變換、膨脹和真實車體,不能靠PID引數覆蓋檢查缺口
動態限速介面 setSpeedLimit只告警未實現 不依靠speed_limit訊息保證此外掛已限速

這些是原始碼核對結果,實際觸發機率和實車後果尚未測量。本次僅整理文件,沒有修改控制器實現。

1.2.5.2.動態引數修改(哪些會更新,哪些只改變引數顯示)

當前有動態回撥,但並非所有設定都完整聯動:

引數類別 當前回撥行為 應怎樣驗證修改
伺服器頻率、三項輸入速度閾值、failure_tolerance 更新伺服器成員;FollowPath執行期間頂層引數修改可能因鎖被拒絕 停止任務後確認設定結果;頻率還需重新配置PID以同步固定dt
平移/旋轉PID增益 更新外層增益成員,沒有更新已建立PID物件中的增益 重新配置/重啟,讓configure重新建立PID,再驗證輸出
四項v…min/max 動態回撥的對應分支為空,既未更新內部PID限幅也未完整更新成員 重新配置/重啟;不把設定服務成功當作已改限幅
enable_rotation 未列入布林動態更新分支 重新配置/重啟後核對實際wz與參考系
前視距離、速度前視開關、前視插值、先轉向開關與門檻 相應型別匹配時會更新相關成員 仍要核對功能分支,當前固定前視/轉向門檻關閉時不產生作用
接近減速、曲率六項、TF等待 更新有關成員 核對組合、實際選點和輸出;當前缺口不會隨引數更新自動消失
max_robot_pose_search_dist configure讀取,未列入當前動態更新分支 重新配置/重啟後檢查路徑搜尋段
進度與目標檢查器數值/stateful 各自有動態更新回撥 同時考慮已有基準或位置通過狀態;新路徑/新任務的reset時機仍適用

上表按當前原始碼判斷,不表示已在執行節點上逐項試改。外掛動態回撥

1.2.5.3.啟動來源與本次核對範圍
啟動方式 本塊來源與輸出
整套reality 預設config/reality/nav2_params.yaml,經navigation_launch載入;use_sim_time預設False,可被launch重寫
整套simulation 預設config/simulation/nav2_params.yaml,本塊僅use_sim_time=True不同
元件/獨立程序 本controller_server均讀取處理後的同套引數,cmd_vel均重對映到cmd_vel_controller
slam=True/False navigation_launch均啟動本伺服器;地圖與定位來源不同,需要有效local_costmap及TF

控制器返回TwistStamped,Humble伺服器釋出時取其中twist作為Twist,所以輸出訊息本身不帶frame_id/時間戳;當前分量按gimbal_yaw_fake表達,由後續fake_vel_transform轉換到實際雲臺系。話題和namespace接線見前面的fake_vel_transform與bt_navigator。

  • 本次已核對: 當前安裝包版本、PID外掛註冊與庫路徑;伺服器及兩檢查器安裝標頭檔案與Nav2 1.1.20一致;PID兩安裝標頭檔案與本地原始碼一致;本地PID實現與上游固定提交一致;兩份controller_server配置與安裝副本一致,實物/模擬僅時鐘值不同。
  • 原始碼能確認: 輸入速度門檻的過濾物件與邊界、0.3 s異常範圍、單數進度鍵、淨位移進度判定、6.28 rad朝向放寬、當前0.5~1.0 m速度前視、未接線積分引數、曲率速度下限/步長與動態修改缺口。
  • 本次驗證範圍: 未啟動新的導航任務,未測量PID跟蹤、急彎、低速橫移、停車或恢復速度;文中的數值例是公式計算。庫與配置存在不證明當前二進位制全部行為已經執行驗證。
  • 實物待核實: 上游速度系與時間戳、虛擬參考點TF、實際控制週期與輸出斷續、前視點跳變、低速橫移過濾、終點停車及參考點偏差、曲率取樣與首輪狀態、碰撞檢查邊界、平滑器/序列埠/MCU限速和旋轉介面。