跳到正文

Wiki

bt_navigator(行為樹導航任務調度)

約 35 分鐘閱讀

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

1.bt_navigator(行為樹導航任務調度)

1.1.實車先看:收到目標後,誰負責規劃、行走和恢復

bt_navigator按照行為樹XML組織導航任務:請求規劃、請求跟蹤路徑,並在失敗時按樹中的分支嘗試恢復。 實際路徑由planner_server計算,正常行走速度由controller_server計算,恢復動作由behavior_server執行;本塊參數決定如何組織這些調用。

當前工程的主要關係為:

单点目标 → NavigateToPose → 单点行为树
多点目标 → NavigateThroughPoses → 多点行为树
                                ├─ ComputePath… → planner_server
                                ├─ FollowPath → controller_server
                                │                    → velocity_smoother
                                └─ 失败恢复:清代价地图/BackUp → 对应服务器

导航速度 → fake_vel_transform → 实际云台系cmd_vel → 串口 → MCU执行底盘运动

這裏的“多點”指NavigateThroughPoses動作中按順序經過一組位姿,不等同於waypoint_follower的FollowWaypoints流程。

實車上看到的現象 先核對什麼 怎樣理解
導航棧無法激活、提示XML或插件加載失敗 XML路徑是否展開、文件是否存在、動態庫是否匹配版本、樹中引用的服務器是否已啓動 有YAML不等於已經成功加載行為樹;樹創建時還會建立動作/服務客户端
誤以為每秒重規劃100次 bt_loop_duration與XML中的RateController 當前樹檢查目標週期10 ms,重新發起規劃受XML的3 Hz節拍限制;正在運行的規劃任務仍會繼續被檢查
導航超過0.1秒,以為應當超時退出 default_server_timeout 100 ms主要約束請求響應,不是整條路徑的執行時限
失敗後沒有原地旋轉或等待 實際XML,而不只是plugin_lib_names 兩棵默認樹均未放入Spin、Wait;已加載插件不表示執行該動作
雲台轉動後機械人位置/速度表現異常 map至gimbal_yaw_fake的TF、odometry、fake_vel_transform和MCU換系 本節點的robot_base_frame是虛擬參考系;不能把它理解成直接控制雲台角度
單點可用,多點規劃反覆失敗 RemovePassedGoals的XML座標端口 當前多點XML未指定robot_base_frame,該BT節點默認使用base_link,並不自動繼承本塊的gimbal_yaw_fake

當前容器ysu_ros_humble中,nav2_bt_navigator、nav2_behavior_tree、nav2_util均為1.1.20,BehaviorTree.CPP為3.8.7。以下按這些版本及本地工程配置核對;官方在線文檔包含後續發行版內容,不能直接把新版本參數和插件加載規則套到Humble。

1.2.參數

1.2.1.ros__parameters(ROS節點參數)

1.2.1.1.參數表

下面保留當前實物配置。仿真段僅use_sim_time=True不同;兩段的其餘參數及47項插件列表一致。

bt_navigator:
  ros__parameters:
    use_sim_time: False
    global_frame: map
    robot_base_frame: gimbal_yaw_fake
    odom_topic: odometry
    bt_loop_duration: 10
    default_server_timeout: 100
    wait_for_service_timeout: 1000
    default_nav_to_pose_bt_xml: $(find-pkg-share pb2025_nav_bringup)/behavior_trees/navigate_to_pose_w_replanning_and_recovery.xml
    default_nav_through_poses_bt_xml: $(find-pkg-share pb2025_nav_bringup)/behavior_trees/navigate_through_poses_w_replanning_and_recovery.xml
    plugin_lib_names:
      - nav2_compute_path_to_pose_action_bt_node
      - nav2_compute_path_through_poses_action_bt_node
      - nav2_smooth_path_action_bt_node
      - nav2_follow_path_action_bt_node
      - nav2_spin_action_bt_node
      - nav2_wait_action_bt_node
      - nav2_assisted_teleop_action_bt_node
      - nav2_back_up_action_bt_node
      - nav2_drive_on_heading_bt_node
      - nav2_clear_costmap_service_bt_node
      - nav2_is_stuck_condition_bt_node
      - nav2_goal_reached_condition_bt_node
      - nav2_goal_updated_condition_bt_node
      - nav2_globally_updated_goal_condition_bt_node
      - nav2_is_path_valid_condition_bt_node
      - nav2_initial_pose_received_condition_bt_node
      - nav2_reinitialize_global_localization_service_bt_node
      - nav2_rate_controller_bt_node
      - nav2_distance_controller_bt_node
      - nav2_speed_controller_bt_node
      - nav2_truncate_path_action_bt_node
      - nav2_truncate_path_local_action_bt_node
      - nav2_goal_updater_node_bt_node
      - nav2_recovery_node_bt_node
      - nav2_pipeline_sequence_bt_node
      - nav2_round_robin_node_bt_node
      - nav2_transform_available_condition_bt_node
      - nav2_time_expired_condition_bt_node
      - nav2_path_expiring_timer_condition
      - nav2_distance_traveled_condition_bt_node
      - nav2_single_trigger_bt_node
      - nav2_goal_updated_controller_bt_node
      - nav2_is_battery_low_condition_bt_node
      - nav2_navigate_through_poses_action_bt_node
      - nav2_navigate_to_pose_action_bt_node
      - nav2_remove_passed_goals_action_bt_node
      - nav2_planner_selector_bt_node
      - nav2_controller_selector_bt_node
      - nav2_goal_checker_selector_bt_node
      - nav2_controller_cancel_bt_node
      - nav2_path_longer_on_approach_bt_node
      - nav2_wait_cancel_bt_node
      - nav2_spin_cancel_bt_node
      - nav2_back_up_cancel_bt_node
      - nav2_assisted_teleop_cancel_bt_node
      - nav2_drive_on_heading_cancel_bt_node
      - nav2_is_battery_charging_condition_bt_node

前10項為本次配置;最後兩項為相關源碼默認值,YAML未顯式配置,不代表需要把它們追加到當前文件。

參數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
use_sim_time False;仿真True 不適用,布爾 上實物前必須核對並正確配置 選擇ROS時鐘,影響TF、任務時間和部分超時計算 不適用 不適用 整套launch會重寫已有鍵;實物、仿真及相關節點須採用對應時間域;BT主循環另用WallRate
global_frame map 不適用,座標系名稱 上實物前必須核對並正確配置 指定本導航器查詢機械人當前位姿的全局參考系 不適用 不適用 需要map與機械人參考系之間的有效TF;不會由此參數創建map、加載地圖或完成重定位
robot_base_frame gimbal_yaw_fake 不適用,座標系名稱 上實物前必須核對並正確配置 指定本導航器跟蹤的機械人參考點與方向 不適用 不適用 當前由fake_vel_transform提供虛擬系;不是底盤實體link或實際雲台機械角;部分BT節點另有自己的XML座標端口
odom_topic odometry 不適用,話題名稱 上實物前必須核對並正確配置 訂閲Odometry的速度,建立約0.3 s窗口的速度均值,供預計剩餘時間等使用 不適用 不適用 相對話題名隨節點命名空間解析;不是從消息pose代替TF定位;本工程上游速度含義和時間差分問題見sensor_scan_generation
bt_loop_duration 10 ms,BT檢查週期 通常保持當前值,不作為優先調試項 設置行為樹運行時反覆檢查各節點狀態的目標週期 檢查更稀,通常減少調度負擔,取消/分支響應可能更遲 檢查更密,通常增加負擔,耗時較長時可能反覆提示超過節拍 當前目標約100 Hz,不保證實測達到;不直接設置規劃器、控制器或雷達頻率;應為正整數
default_server_timeout 100 ms,請求響應超時 實物運行時重點觀察,有問題再針對性調整 為BT動作/服務客户端提供默認響應等待上限 更容忍短時響應延遲,失敗確認也可能更遲 更快判超時,也更容易在負載高時誤失敗 當前0.1 s;動作主要等目標確認及取消相關響應,服務等請求結果;不是路徑總執行時限;XML的server_timeout可覆蓋
wait_for_service_timeout 1000 ms,服務器發現等待 通常保持當前值,不作為優先調試項 創建BT節點客户端時,等待動作/服務服務器出現 更容忍啓動發現延遲,缺服務器時加載等待更長 更快發現缺項,也可能在啓動尚未就緒時加載失敗 當前每次等待上限1 s,不是整棵樹啓動總超時或運行中請求超時;命名空間/服務器名錯誤不能靠延長解決
default_nav_to_pose_bt_xml pb2025_nav_bringup包內單點XML,路徑見上方 不適用,文件路徑 上實物前必須核對並正確配置 為NavigateToPose選擇默認行為樹 不適用 不適用 launch展開find-pkg-share;動作請求可指定另一棵樹;當前默認樹包含重規劃、清圖及自定義空閒方向移動恢復
default_nav_through_poses_bt_xml pb2025_nav_bringup包內多點XML,路徑見上方 不適用,文件路徑 上實物前必須核對並正確配置 為NavigateThroughPoses選擇默認行為樹 不適用 不適用 當前有RemovePassedGoals radius=0.7 m;其默認base_link需要單獨核對/顯式配置,不由本塊robot_base_frame自動替換
plugin_lib_names 上方47個動態庫名稱 不適用,字符串列表 上實物前必須核對並正確配置 加載動態庫,註冊XML可引用的BT節點類型 不適用 不適用 當前47項均參與庫加載;兩棵默認樹實際引用其中11項;增加庫不會自動增加動作,缺庫即使未入樹也可能導致配置失敗
transform_tolerance 0.1,源碼默認;YAML未配置 s,TF查詢等待時間 通常保持當前值,不作為優先調試項 本導航器及有關BT節點查詢機械人位姿時等待TF 可等更久,缺TF時處理延遲也可能增加 更快結束缺失變換的查詢 當前經getCurrentPose傳給TF查詢timeout;不是允許定位誤差、角度誤差或機械外參誤差
always_reload_bt_xml False,源碼默認;YAML未配置 不適用,布爾 根據實際功能需求開啓或設置 收到導航目標時,決定相同路徑的行為樹是否也重新讀取、創建 不適用 不適用 False會複用同一路徑的已加載樹;True有助於XML調試,但增加加載開銷;不等於運行任務中實時監聽文件修改
1.2.1.2.參數詳解
1.2.1.2.1.use_sim_time(時鐘選擇與launch覆蓋)

實物默認False,仿真默認True。navigation_launch.py通過RewrittenYaml重寫use_sim_time,並用ParameterFile加載;本節點已有該鍵,因此能夠被覆蓋。運行時究竟使用哪個值,應按當前啓動參數和有效節點參數判斷,不能只看實物YAML裏的False。

ROS時鐘用於TF和任務時間,也用於BT客户端部分請求的已等待時間。BT主循環則用rclcpp::WallRate,當前RateController的節拍用真實高精度時鐘;仿真暫停/變速時,不能認為把use_sim_time設為True後,所有內部等待與檢查節拍都跟着仿真時間同比變化。BT運行循環(1.1.20)、RateController實現

1.2.1.2.2.global_frame 與 robot_base_frame(在哪裏看機械人,跟蹤哪個參考點)

當前導航器查詢的是gimbal_yaw_fake原點在map中的位姿,用於導航反饋等。map至該系的變換需要上游定位、底盤位姿、機械TF以及fake_vel_transform共同組成;這裏的參數不會替這些節點建立變換。導航器座標與反饋接線(1.1.20)

按前面的工程約定,gimbal_yaw_fake與實際gimbal_yaw原點重合,方向抵消輸入里程計yaw。在平面運動、輸入和機械TF正確時,它的水平朝向與odom對齊;機械人位置仍在移動。它不是map,也不與odom原點重合;源碼只抵消yaw,坡道上的roll/pitch仍需核對。詳見fake_vel_transform。

這套配置為全向移動與雲台獨立掃描服務。只把此項改成base_footprint,並不會同步修改控制器、代價地圖、behavior_server或後面的速度換系;若要改變整套參考系,應先檢查各處職責與原點偏置。

同名ROS參數不會自動替換每個BT節點的XML輸入端口。 有些節點從導航器複製的ROS參數讀取座標,有些從XML端口讀取,而且端口帶自己的默認值。當前多點樹的RemovePassedGoals就是後一種,具體問題見下文。

座標系名稱也不會因為ROS節點有namespace而自動加前綴。應按實際TF frame名稱配置;namespace主要影響節點、相對話題、服務和動作名稱。

1.2.1.2.3.odom_topic(用於速度反饋,不代替TF定位)

本工程odometry由sensor_scan_generation發佈,位姿參考系預期為odom,child_frame_id為gimbal_yaw;本節點卻跟蹤gimbal_yaw_fake,兩者名稱不同有各自的用途,不能要求只為字符串一致就改話題或子系。

BtNavigator用這個話題建立OdomSmoother,窗口為0.3 s,直接平均消息的twist各分量,沒有在這裏重新做座標變換。導航器用平面速度大小sqrt(vx²+vy²)估計剩餘時間;當前實現僅在速度大於0.01 m/s且路徑剩餘長度大於0.1 m時計算,其他情況保持默認預計時間。它不是MCU實際輪速,也不是下一條控制指令。速度窗口實現、導航反饋計算

當前上游把參考系中的位姿差分直接寫入twist,且用回調真實時間差而非消息時間差,首幀歷史也有缺口;這些已經記錄在sensor_scan_generation。純平面旋轉換軸不會改變單幀速度模長,但錯誤時間差、首幀異常,以及先平均不同方向分量再取模長,都可能影響反饋。不能憑預計剩餘時間看起來合理就證明上游速度正確。

odometry是相對名。例如節點位於/red_standard_robot1時,通常訂閲/red_standard_robot1/odometry;最終還受remapping影響。本節點的當前位置取自TF,改odom_topic不能修復map至gimbal_yaw_fake的缺失變換。

1.2.1.2.4.bt_loop_duration(10 ms檢查一次,不是100 Hz重規劃)

tick可理解為“檢查行為樹當前執行到哪裏、動作是否完成、是否需要換分支”。10 ms對應目標約100次/秒;某次樹檢查、客户端等待或其他計算超過這個週期,就達不到目標節拍,可能出現tick rate exceeded提示。

當前相關節拍分別為:

所在位置 當前設置 控制什麼
bt_navigator.bt_loop_duration 10 ms,目標約100 Hz 反覆檢查行為樹狀態
兩棵XML中的RateController hz=3.0 規劃分支完成後,再發起新一輪規劃的節拍,約0.333 s
controller_server.controller_frequency 20 Hz 路徑跟蹤器的控制循環,本塊不會修改它

RateController的子節點已經處於RUNNING時,每次外層檢查都會繼續檢查它,直到結束;因此3 Hz不是“任何情況下都每0.333秒才理一次規劃”。實際重規劃頻率還受規劃耗時、恢復分支和BT調度影響。

減小10只會讓外層檢查更密,不能讓服務器、點雲或TF自動變快。若CPU忙、定位跳變或控制斷續,應先查對應鏈路;不能把加快BT檢查當作提高導航精度。源碼讀取整數毫秒,沒有完整的非正值保護,保持正整數。週期讀取

1.2.1.2.5.default_server_timeout(100 ms等請求響應,不限制整段導航時長)

100表示100 ms,即0.1 s。需要區分動作和服務:

  • 動作客户端: 發出ComputePathToPose、FollowPath或BackUp等目標後,等待服務器確認收到/接受目標;接受之後,任務可以保持RUNNING並繼續執行,不會因為走了超過0.1秒就被此項終止。取消動作及停止時等待相關返回,也使用該響應超時。
  • 服務客户端: 例如ClearEntireCostmap,等待本次請求的服務結果;超過上限仍沒有結果時,該BT節點會失敗。

動作執行本身有另外的規則:路徑跟蹤有進度檢查;BackUp有time_allowance等。這些不能用default_server_timeout替代。動作確認與取消實現、服務響應等待實現

每個動作/服務節點可以通過XML的server_timeout端口覆蓋默認值。當前兩棵XML沒有顯式設置該端口,使用100 ms;當前安裝頭文件的端口沒有另設一個固定默認值,因此不能直接套用其他版本“端口默認值覆蓋ROS參數”的結論。

也不能認為一次tick必定阻塞100 ms。當前模板把單次等待片段限制到bt_loop_duration的一半,即5 ms;尚未到總響應上限時返回RUNNING,下次tick繼續判斷。100 ms是總請求等待尺度,5 ms是單次等待片段,兩者不矛盾;停止動作時的取消等待則有其單獨調用路徑。

實物先用100。若日誌明確出現等待目標確認/服務響應超時,先核對服務器是否正常、命名空間、計算負載與通信,再考慮適度增加;延長不會修好碰撞、無路可走或定位失敗。

1.2.1.2.6.wait_for_service_timeout(1000 ms找服務器,何時會使用)

1000表示1 s。雖然名稱帶service,當前BtActionNode也用它調用wait_for_action_server;服務節點用它調用wait_for_service。

它主要在創建XML中的動作/服務節點客户端時使用。整棵樹創建會實例化恢復分支裏的節點,即使機械人還沒有遇到失敗,也可能已經需要backup動作服務器及清圖服務可發現。但只是加載一個未被XML引用的插件庫,不等於已經實例化它對應的動作節點。客户端創建與發現等待

1 s是每次發現等待的上限,不是整套導航啓動限時。增大可容忍服務器出現較慢;若樹中action/service名字與namespace錯誤,服務器一直不會被發現,再長也無法解決。運行中已發出請求的等待,應看上一項。

1.2.1.2.7.兩項default_nav…bt_xml(默認行為樹與路徑展開)

兩條路徑指向本工程pb2025_nav_bringup包,而不是nav2_bt_navigator包的同名默認示例;文件名相同也不能據此認為樹的內容相同。

$(find-pkg-share pb2025_nav_bringup)是launch替換表達式,navigation_launch.py使用ParameterFile(allow_substs=True)才會展開成包的share目錄。YAML文件本身、普通字符串讀取以及BtNavigator的文件打開過程不會單獨解釋這段表達式;若繞過該launch直接給節點傳原始文件,應提供可用的實際路徑或相應的替換處理。

默認採用當前環境找到的安裝包。修改源碼裏的XML後,需核對安裝目錄是否為鏈接/同步副本;本次檢查兩份已安裝XML與當前源碼一致。其他機器或重建方式變化後應重新核對。

單點和多點導航動作的請求裏都有behavior_tree路徑字段:為空時用各自默認樹,提供其他路徑時加載該文件。當前導航器激活時也會加載默認XML。切換樹不等於隨意允許同時執行兩個導航任務,當前導航器還有任務互斥邏輯。單點默認路徑與目標處理、多點對應實現

兩棵當前默認樹的共同流程:

  1. PipelineSequence組織持續重規劃與路徑跟蹤。規劃請求指定planner_id="GridBased",跟蹤指定controller_id="FollowPath"。
  2. 規劃失敗時嘗試清全局代價地圖再重試,該內層RecoveryNode為number_of_retries=1;跟蹤失敗時嘗試清局部代價地圖再重試,該內層為10。
  3. 內層仍失敗後,進入外層恢復。先檢查GoalUpdated是否有新目標;否則RoundRobin輪換“清局部及全局代價地圖”與“BackUp”。外層RecoveryNode為10次恢復重試;不是整個任務至多調用所有服務器10次。

清圖調用的是代價地圖清理服務,不是刪除磁盤裏的二維地圖圖片、PCD或SLAM位姿圖。靜態層和實時障礙輸入還可能把佔用重新加入地圖。

當前樹沒有Spin、Wait、SmoothPath或IsStuck節點。 不會僅因為庫列表有這些名稱,就自動增加原地轉動、等待、路徑平滑或該卡住檢測條件。當前規劃和跟蹤結果失敗仍可觸發RecoveryNode,不依賴IsStuck必須入樹。

BackUp在XML中請求backup_dist=1.0 m、backup_speed=1.0 m/s,未寫time_allowance,BT端口默認10 s。當前behavior_server的backup後端是pb_nav2_behaviors/BackUpFreeSpace:它按代價地圖選擇空閒方向,再做平面移動,並非固定沿車後方向倒退。請求值是目標距離和速度,不能據此聲稱實車已經以該速度正確移動;具體方向、碰撞檢查與速度輸出應在後續behavior_server參數塊一起核對。

1.2.1.2.8.多點樹的RemovePassedGoals(0.7 m中間點門檻與座標端口缺項)

多點XML在ComputePathThroughPoses前放入RemovePassedGoals,radius=0.7 m。當前實現會從列表開頭依次刪除距查詢位置不超過該門檻的中間目標,至少保留最後一個目標;這不是“所有目標都只要靠近0.7 m就算導航完成”,也不是最終停車的xy_goal_tolerance。移除中間目標實現

這裏有一個可以由當前XML和安裝頭文件確認的配置缺口:

  • 本塊ROS參數設置robot_base_frame=gimbal_yaw_fake。
  • RemovePassedGoals從自己的XML輸入端口讀取座標系,默認global_frame=map、robot_base_frame=base_link。
  • 當前XML只給input_goals、output_goals、radius,沒有給兩個座標端口,因此查詢的是map至base_link,不會自動變成map至gimbal_yaw_fake。

若當前TF中沒有base_link,查詢會失敗,使多點規劃分支返回FAILURE;即使存在,也需確認其原點是否就是預期判定參考點。前面的模型與導航主鏈使用base_footprint、gimbal_yaw及gimbal_yaw_fake,不能憑庫已經存在就跳過這個檢查。端口默認值(1.1.20)

若沿用本工程虛擬參考點,XML可明確寫成:

<RemovePassedGoals input_goals="{goals}"
                   output_goals="{goals}"
                   radius="0.7"
                   global_frame="map"
                   robot_base_frame="gimbal_yaw_fake"/>

這是相應XML的配置建議,不是本次已修改或已運行驗證的結果。只改本塊ROS參數並不能補上XML端口。若換global_frame,兩個位置也應一起核對;以後使用DistanceController、GoalReached等其他帶座標端口的BT節點時,同樣不能假定自動繼承。

1.2.1.2.9.plugin_lib_names(動態庫名稱、XML標籤與執行動作的區別)

列表中每項是動態庫名稱,Linux下通常對應lib名稱.so文件;XML寫的是庫註冊的BT節點標籤。兩者不是同一個字符串。例如nav2_follow_path_action_bt_node註冊FollowPath,實際跟蹤算法則來自controller_server中的FollowPath插件配置。

Humble 1.1.20的BehaviorTreeEngine逐項加載這裏配置的庫並註冊節點類型;列表參與加載,不按當前XML自動過濾。47個庫中本次均找到對應安裝文件,但文件存在不等於所有庫加載、樹創建和導航執行已經運行通過。動態庫加載實現

下面逐項列出當前配置;“入樹”指XML中存在該節點,恢復節點仍要滿足失敗分支條件才執行。兩棵默認樹合計引用11個庫,其餘36個庫已配置加載,但沒有對應節點進入這兩棵樹。

1.2.1.3.插件列表詳解(當前默認樹引用的11個庫)
動態庫名稱 註冊的XML節點 作用 當前默認樹中的用途
nav2_compute_path_to_pose_action_bt_node ComputePathToPose 請求規劃到單個目標的路徑 單點樹使用;planner_id=GridBased
nav2_compute_path_through_poses_action_bt_node ComputePathThroughPoses 請求依次經過一組目標的路徑 多點樹使用;planner_id=GridBased
nav2_follow_path_action_bt_node FollowPath 請求控制器跟蹤給定路徑 兩樹使用;controller_id=FollowPath;算法仍由controller_server選擇
nav2_back_up_action_bt_node BackUp 請求backup動作服務器執行恢復移動 兩樹的恢復分支使用;當前後端是自定義BackUpFreeSpace
nav2_clear_costmap_service_bt_node ClearEntireCostmap、ClearCostmapExceptRegion、ClearCostmapAroundRobot 調用代價地圖清理服務 兩樹只使用ClearEntireCostmap;另外兩個標籤沒有入樹
nav2_goal_updated_condition_bt_node GoalUpdated 判斷當前目標或目標列表是否更新 兩樹恢復分支檢查;有新目標時可結束當前恢復分支並重試導航
nav2_rate_controller_bt_node RateController 按給定節拍重新觸發子分支 兩樹規劃分支hz=3.0;不設底盤速度
nav2_recovery_node_bt_node RecoveryNode 主子節點失敗時執行恢復子節點,再按次數重試 兩樹均有外層和內層;重試次數屬於XML端口
nav2_pipeline_sequence_bt_node PipelineSequence 在後續子節點運行時繼續檢查前面的子節點 兩樹組織重規劃與跟蹤的流水執行
nav2_round_robin_node_bt_node RoundRobin 輪換選擇子分支 兩樹在清圖組合與BackUp之間輪換
nav2_remove_passed_goals_action_bt_node RemovePassedGoals 刪除已接近的列表前部中間目標,保留最後一個 僅多點樹使用;radius=0.7 m;需核對默認base_link端口
1.2.1.4.插件列表詳解(當前默認樹未引用的36個庫)

以下是已配置的可用節點類型。當前未入樹,不能依靠修改這些庫名稱開啓相應功能;今後採用其他XML時,需要重新判斷節點是否使用、端口是否正確和服務器是否存在。

動態庫名稱 註冊的XML節點 作用 當前配置下的説明
nav2_smooth_path_action_bt_node SmoothPath 請求smoother_server平滑路徑 未入樹;啓動smoother_server不表示當前路徑必經平滑
nav2_spin_action_bt_node Spin 請求spin動作服務器執行轉動 未入樹;與fake_vel_transform疊加底盤自旋不是同一入口
nav2_wait_action_bt_node Wait 請求wait動作等待指定時間 未入樹;不由wait_for_service_timeout開啓
nav2_assisted_teleop_action_bt_node AssistedTeleop 請求帶碰撞檢查的輔助遙控行為 未入樹;不等同於普通手柄節點已經啓用
nav2_drive_on_heading_bt_node DriveOnHeading 請求按指定方向/距離移動的行為 未入樹;不直接選擇正常路徑跟蹤算法
nav2_is_stuck_condition_bt_node IsStuck 依據里程計變化判斷疑似卡住 未入樹;此版本主要檢查x速度的突變減速,不是通用的靜止超時檢測
nav2_goal_reached_condition_bt_node GoalReached 檢查目標與查詢位置之間的平面距離 未入樹;不替代當前controller_server的目標檢查器,也不檢查最終yaw誤差
nav2_globally_updated_goal_condition_bt_node GlobalUpdatedGoal 用其內部記錄檢測目標/目標列表變化 未入樹;XML標籤是GlobalUpdatedGoal,不能按庫名猜成GloballyUpdatedGoal
nav2_is_path_valid_condition_bt_node IsPathValid 調用規劃器提供的路徑有效性檢查服務 未入樹;當前沒有這項獨立檢查分支
nav2_initial_pose_received_condition_bt_node InitialPoseReceived 檢查黑板中的initial_pose_received標誌 未入樹;不會自動接入small_gicp或證明定位成功
nav2_reinitialize_global_localization_service_bt_node ReinitializeGlobalLocalization 請求重新初始化全局定位的服務 未入樹;當前small_gicp不因加載此庫就自動提供該接口
nav2_distance_controller_bt_node DistanceController 按機械人移動距離重新觸發子分支 未入樹;不是底盤行駛距離命令;啓用需核對自己的座標端口
nav2_speed_controller_bt_node SpeedController 按當前速度調整子分支觸發節拍 未入樹;不是直接限速或速度控制器
nav2_truncate_path_action_bt_node TruncatePath 按距離截短路徑末端 未入樹;當前沒有由它設定提前停車點
nav2_truncate_path_local_action_bt_node TruncatePathLocal 根據參考位姿提取/截短局部路徑段 未入樹;不替代代價地圖的局部窗口
nav2_goal_updater_node_bt_node GoalUpdater 接收目標更新並傳給子分支 未入樹;動態目標跟隨需在XML中接線
nav2_transform_available_condition_bt_node TransformAvailable 檢查指定兩系的變換是否存在 未入樹;本版本找到過一次後會記住成功,不是持續TF新鮮度檢查
nav2_time_expired_condition_bt_node TimeExpired 判斷指定計時門檻是否到達 未入樹;不等同於default_server_timeout
nav2_path_expiring_timer_condition PathExpiringTimer 根據路徑更新情況和時間門檻判斷是否需更新 未入樹;庫名本身沒有_bt_node後綴,不能擅自補後綴
nav2_distance_traveled_condition_bt_node DistanceTraveled 判斷自記錄位置起是否移動到指定距離 未入樹;是條件判斷,不下發運動指令
nav2_single_trigger_bt_node SingleTrigger 使子分支在一次進入期間執行一輪 未入樹;不是讓整套導航永遠只運行一次
nav2_goal_updated_controller_bt_node GoalUpdatedController 在首次執行或目標變化時觸發子分支,並繼續處理運行狀態 未入樹;是裝飾節點,不是GoalUpdated條件的同名替代
nav2_is_battery_low_condition_bt_node IsBatteryLow 按電池消息與閾值判斷電量低 未入樹;不因庫加載就自動回充
nav2_navigate_through_poses_action_bt_node NavigateThroughPoses 在另一棵樹中作為客户端請求多點導航動作 未入樹;本節點提供多點導航服務器不依賴在自己的樹中嵌入此標籤
nav2_navigate_to_pose_action_bt_node NavigateToPose 在另一棵樹中作為客户端請求單點導航動作 未入樹;不能為“開啓單點功能”就把自己調用自己的標籤放入默認樹
nav2_planner_selector_bt_node PlannerSelector 從話題/默認輸入選規劃器ID,輸出到黑板 未入樹;當前XML直接指定GridBased
nav2_controller_selector_bt_node ControllerSelector 從話題/默認輸入選控制器ID 未入樹;當前XML直接指定FollowPath
nav2_goal_checker_selector_bt_node GoalCheckerSelector 從話題/默認輸入選目標檢查器ID 未入樹;當前沒有這項話題選擇流程
nav2_controller_cancel_bt_node CancelControl 請求取消正在執行的FollowPath動作 未入樹;不表示普通任務取消失效,動作節點停止時另有取消邏輯
nav2_path_longer_on_approach_bt_node PathLongerOnApproach 接近終點且新路徑明顯變長時觸發子分支 未入樹;不自動增加繞障或等待流程
nav2_wait_cancel_bt_node CancelWait 請求取消Wait動作 未入樹;沒有自行執行等待的作用
nav2_spin_cancel_bt_node CancelSpin 請求取消Spin動作 未入樹;不取消cmd_spin附加自旋
nav2_back_up_cancel_bt_node CancelBackUp 請求取消BackUp動作 未入樹;當前BackUp節點停止時自身已有取消路徑
nav2_assisted_teleop_cancel_bt_node CancelAssistedTeleop 請求取消AssistedTeleop動作 未入樹;不直接關閉普通手柄節點
nav2_drive_on_heading_cancel_bt_node CancelDriveOnHeading 請求取消DriveOnHeading動作 未入樹;不替代正常路徑跟蹤的取消
nav2_is_battery_charging_condition_bt_node IsBatteryCharging 按電池消息判斷是否正在充電 未入樹;不表示本工程已有充電控制與電池接線

各庫與標籤的對應關係按1.1.20的動態庫構建列表及各BT節點註冊源碼核對。Sequence、ReactiveSequence、ReactiveFallback是BehaviorTree.CPP內置控制節點,因此當前XML中有這些標籤,並不要求列表另有同名Nav2動態庫。

1.2.1.4.1.讀取時機、啓動來源與驗證範圍
啓動方式 本塊參數與行為樹來源
整套reality 默認config/reality/nav2_params.yaml,可由params_file替換;navigation_launch重寫use_sim_time;XML路徑經allow_substs展開
整套simulation 默認config/simulation/nav2_params.yaml;本塊僅use_sim_time與實物段不同;相同兩棵工程XML
use_composition=True/False 本節點分別作為組件/獨立進程啓動;兩者讀取同一套處理後的參數文件
slam=True/False bringup_launch均包含navigation_launch;建圖開關不會單獨跳過bt_navigator,定位/建圖TF來源則不同
繞過工程launch直接啓動 不能假定find-pkg-share字符串已經展開;需核對參數、namespace、TF重映射與服務器啓動狀態

global_frame、robot_base_frame、odom_topic及插件列表主要在configure階段讀入;時間參數配置到BT動作服務器及黑板;默認XML在configure時選定、activate時加載。當前沒有讓運行中修改這些參數後自動重建TF使用者、里程計訂閲、插件工廠和超時成員的完整更新回調。修改後重新配置/重啓並核對有效值;標準use_sim_time的時鐘處理另屬ROS機制。

always_reload_bt_xml=False時,同一路徑的已加載樹會複用。只修改磁盤XML再發同一路徑目標,不能假定內容已更新;可在調試時配置該開關後重新配置,或重新啓動加載。True也不是在機械人執行任務途中隨文件修改即時切換流程。樹文件複用與重新加載實現

  • 本次已核對: 容器內包版本;動作/服務兩個安裝頭文件與1.1.20源碼一致;47個配置庫文件全部存在;源碼與安裝副本的實物/仿真bt_navigator段一致;兩份工程XML與安裝副本一致,XML內容與插件註冊標籤已靜態對照。
  • 源碼能確認: 三項時間單位均為ms;BT檢查與3 Hz重規劃不同;請求響應超時不限制整段導航時長;列表庫均參與加載,但默認樹只引用11項;多點RemovePassedGoals當前採用自己的base_link默認端口;BackUp調用自定義空閒方向移動後端。
  • 本次驗證範圍: 未啓動新的導航節點、未發送導航目標、未測試行為樹實際加載或恢復移動;前文Point-LIO的靜止與短距離記錄不能作為本塊通過實車導航驗證的證據。
  • 實物待核實: 有效map至gimbal_yaw_fake的TF、odometry速度與時間戳、單點/多點實際使用的樹、RemovePassedGoals的參考系和中間點移除、請求響應耗時、恢復方向及速度鏈是否符合實車接口。