跳到正文

Wiki

Humble與Jazzy導航的差異

約 4 分鐘閱讀

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

1.參考的官方 Jazzy 示例

  • /opt/ros/jazzy/share/nav2_bringup/params/nav2_params.yaml
  • /opt/ros/jazzy/share/nav2_bt_navigator/behavior_trees/navigate_to_pose_w_replanning_and_recovery.xml
  • /opt/ros/jazzy/share/nav2_bt_navigator/behavior_trees/navigate_through_poses_w_replanning_and_recovery.xml

2.修改內容

可以複製一個humble的功能包並命名為 mycar_navigation2_jazzy,然後拿這個功能包進行改動.

  1. 將功能包名保持為 mycar_navigation2_jazzy,並在相關位置補充修改邊界註釋。

    • package.xml
    • CMakeLists.txt
  2. _jazzy 包內 launch 檔案的包路徑查詢保持為 mycar_navigation2_jazzy,並補充修改邊界註釋。

    • launch/nav2.launch.py
    • launch/bringup.launch.py
    • launch/auto_slam.launch.py
  3. 對照 Jazzy 官方 bt_navigator 示例更新 params/bt.yaml

    • 刪除 Humble 時代列出的 Nav2 內建 BT 外掛列表。
    • Jazzy 會自動載入 Nav2 內建 BT 外掛,plugin_lib_names 只保留自定義 BT 外掛。
    • 沒有自定義 BT 外掛時不傳 plugin_lib_names,避免空列表被解析成無型別引數。
    • 新增 navigatorsnavigate_to_posenavigate_through_poses
    • 新增 error_code_names,用於配合 Jazzy 官方行為樹裡的 error code blackboard 變數。
  4. 對照 Jazzy 官方 pluginlib 類名更新 planner 和 behavior 外掛。

    • nav2_navfn_planner/NavfnPlanner 改為 nav2_navfn_planner::NavfnPlanner
    • nav2_behaviors/Spin 等改為 nav2_behaviors::Spin
  5. 對照 Jazzy 官方行為樹更新自定義 BT XML。

    • 新增 BTCPP_format="4"
    • 新增 PlannerSelectorControllerSelector
    • ComputePathToPoseComputePathThroughPosesFollowPath 新增 error_code_id
    • 新增 WouldAPlannerRecoveryHelpWouldAControllerRecoveryHelp
  6. 對照 Jazzy 官方 controller 引數名更新進度檢查器引數。

    • progress_checker_plugin 改為 progress_checker_plugins: ["progress_checker"]
  7. 整理 planner/controller 引數檔案的 YAML 結構。

    • 將重複的 /** 頂層鍵合併成一個。
    • global_costmaplocal_costmap 掛在同一個 /** 根鍵下,避免參數解析時覆蓋 server 引數。

3.主要修復的問題

啟動時報錯:

Failed to create navigator id navigate_to_pose. Exception: ID [ComputePathToPose] already registered

原因是 Humble 配置在 plugin_lib_names 中手動列出了 Nav2 內建 BT 外掛,而 Jazzy 已經自動載入這些內建外掛,導致 ComputePathToPose 被重複註冊。

4.使用方式

重新構建並 source:

colcon build --symlink-install --packages-select mycar_navigation2_jazzy
source install/setup.bash

啟動 Jazzy 版本:

ros2 launch mycar_navigation2_jazzy bringup.launch.py use_sim_time:=True

5.已驗證

已執行:

colcon build --symlink-install --packages-select mycar_navigation2_jazzy
ros2 launch mycar_navigation2_jazzy nav2.launch.py --show-args
ros2 launch mycar_navigation2_jazzy bringup.launch.py --show-args

另外用 timeout 做過短啟動檢查:

ros2 launch mycar_navigation2_jazzy bringup.launch.py use_sim_time:=True

結果:

  • bt_navigator 成功建立 navigate_to_posenavigate_through_poses
  • planner_server 成功載入 nav2_navfn_planner::NavfnPlanner
  • controller_server 成功載入 DWB 和所有 critics。
  • behavior_server 成功載入 nav2_behaviors::... 外掛。
  • 在沒有 Gazebo/robot_state_publisher/TF 的短啟動環境裡,最後停在等待 base_link -> map TF,這是預期的執行環境缺失,不是配置 fatal。