# ============================================================================  # 文件头：说明这是 obstacle_nav2 使用的 Nav2 参数文件。
# nav2_params.yaml - Odometry-only obstacle navigation  # 文件名和用途：只用里程计坐标系做避障导航。
#  # 分隔说明：本配置不依赖静态地图定位。
# No static map, no AMCL, no SLAM.  # 不启动 map_server、AMCL 或 slam_toolbox。
# Both costmaps are rolling windows in odom. The launch file can rewrite every  # 局部/全局代价地图都在 odom 中滚动，launch 可重写 global_frame。
# global_frame leaf when a different connected odometry frame is required.  # 如果换成其他连续里程计坐标系，可通过 launch 参数统一替换。
# Global planner: Smac Hybrid A* (Reeds-Shepp)  # 全局规划器使用适合阿克曼/可倒车模型的 Hybrid A*。
# Local controller: MPPI (Ackermann)  # 局部控制器使用 MPPI，并按阿克曼运动模型采样。
# ============================================================================  # 文件头结束。
#  # 空行注释：下面开始 BT Navigator 配置。
bt_navigator:  # Nav2 行为树导航器节点参数。
  ros__parameters:  # ROS2 参数命名空间。
    use_sim_time: False  # 使用真实时间；仿真时才改为 True。
    global_frame: odom  # 导航全局参考坐标系；当前为无地图 odom 导航。
    robot_base_frame: base_footprint  # 机器人底盘坐标系，用于 TF 和 footprint 计算。
    odom_topic: /odom_combined  # 行为树/控制相关里程计输入话题。
    bt_loop_duration: 50  # 行为树 tick 周期，单位 ms；50ms 约等于 20Hz。
    default_server_timeout: 20  # 行为树调用服务/动作的默认超时时间，单位 s。
    # Injected by obstacle_nav2.launch.py from this package's share directory.  # launch 会把该路径重写成本包里的 Ackermann 行为树 XML。
    default_nav_to_pose_bt_xml: ""  # NavigateToPose 默认行为树 XML，启动时由 launch 注入。
    plugin_lib_names:  # 行为树可加载的 BT 节点插件列表。
      - nav2_compute_path_to_pose_action_bt_node  # 计算单目标路径的 BT action 节点。
      - nav2_compute_path_through_poses_action_bt_node  # 计算多目标路径的 BT action 节点。
      - nav2_smooth_path_action_bt_node  # 路径平滑 BT action 节点。
      - nav2_follow_path_action_bt_node  # 跟随路径 BT action 节点，会调用 controller_server。
      - nav2_spin_action_bt_node  # 原地旋转恢复动作节点；阿克曼车实际能力需谨慎。
      - nav2_wait_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  # 重新初始化全局定位服务节点；本配置通常不用 AMCL。
      - nav2_rate_controller_bt_node  # 限制子树执行频率的控制节点。
      - nav2_distance_controller_bt_node  # 按行驶距离触发子树的控制节点。
      - nav2_speed_controller_bt_node  # 按速度调节子树 tick 的控制节点。
      - nav2_truncate_path_action_bt_node  # 截断路径动作节点。
      - nav2_truncate_path_local_action_bt_node  # 截断局部路径动作节点。
      - nav2_goal_updater_node_bt_node  # 更新目标的 BT 节点。
      - nav2_recovery_node_bt_node  # 恢复行为控制节点。
      - nav2_pipeline_sequence_bt_node  # 管线式顺序执行节点。
      - nav2_round_robin_node_bt_node  # 轮询执行多个恢复行为的节点。
      - nav2_transform_available_condition_bt_node  # 检测 TF 是否可用的条件节点。
      - nav2_time_expired_condition_bt_node  # 检测时间是否过期的条件节点。
      - nav2_path_expiring_timer_condition  # 检测路径是否需要刷新/过期的条件节点。
      - nav2_distance_traveled_condition_bt_node  # 检测累计行驶距离的条件节点。
      - nav2_single_trigger_bt_node  # 只触发一次的控制节点。
      - nav2_is_battery_low_condition_bt_node  # 电量低检测条件节点。
      - nav2_navigate_through_poses_action_bt_node  # 多路点导航 action 节点。
      - nav2_navigate_to_pose_action_bt_node  # 单目标导航 action 节点。
      - nav2_remove_passed_goals_action_bt_node  # 多目标导航中移除已通过目标点。
      - nav2_planner_selector_bt_node  # 运行时选择 planner 的 BT 节点。
      - nav2_controller_selector_bt_node  # 运行时选择 controller 的 BT 节点。
      - nav2_goal_checker_selector_bt_node  # 运行时选择 goal checker 的 BT 节点。
      - nav2_controller_cancel_bt_node  # 取消 controller action 的 BT 节点。
      - nav2_path_longer_on_approach_bt_node  # 接近目标时检测路径是否异常变长。
      - nav2_wait_cancel_bt_node  # 取消等待动作的 BT 节点。
      - nav2_spin_cancel_bt_node  # 取消旋转动作的 BT 节点。
      - nav2_back_up_cancel_bt_node  # 取消倒车动作的 BT 节点。
      - nav2_drive_on_heading_cancel_bt_node  # 取消沿朝向行驶动作的 BT 节点。
#  # 空行注释：下面是 bt_navigator 的 rclcpp 辅助节点。
bt_navigator_rclcpp_node:  # BT navigator 内部 rclcpp 节点参数。
  ros__parameters:  # ROS2 参数命名空间。
    use_sim_time: False  # 该辅助节点同样使用真实时间。
#  # 空行注释：下面开始 controller_server 和 MPPI 参数。
controller_server:  # Nav2 控制服务器，负责把路径转换为速度命令。
  ros__parameters:  # ROS2 参数命名空间。
    use_sim_time: False  # 控制器使用真实时间。
    controller_frequency: 20.0  # 控制频率 20Hz；和 model_dt=0.05 对齐。
    FollowPath:  # controller 插件实例名，行为树 FollowPath 会调用它。
      plugin: "nav2_mppi_controller::MPPIController"  # 使用 Nav2 MPPI 控制器插件。
      time_steps: 36  # MPPI 预测步数；36*0.05=1.8s 预测时域。
      model_dt: 0.05  # 每个预测步长 0.05s；需接近控制周期。
      batch_size: 1000  # 每周期采样 1000 条控制序列；越大越能找到转弯解但越耗 CPU。
      vx_std: 0.22  # 前后速度采样标准差；影响速度探索范围。
      vy_std: 0.0  # 横向速度采样标准差；阿克曼车不能横移所以为 0。
      wz_std: 0.5  # 角速度采样标准差；转弯不积极时常先看这个是否太小。
      vx_max: 0.40  # 最大前进速度，单位 m/s。
      vx_min: -0.75  # 最大倒车速度下限，负值允许倒车。
      vy_max: 0.0  # 最大横向速度；阿克曼车为 0。
      wz_max: 2.0  # 最大角速度，单位 rad/s；还会受阿克曼最小转弯半径约束。
      iteration_count: 1  # 每周期优化迭代次数；MPPI 常用 1 以保证实时性。
      temperature: 0.3  # softmax 温度；越低越偏向最低代价轨迹。
      gamma: 0.015  # 控制代价权重；影响控制序列平滑和探索保守程度。
      motion_model: "Ackermann"  # 使用阿克曼运动学模型。
      visualize: false  # 是否发布 MPPI 候选轨迹 Marker；调试时可改 true。
      TrajectoryVisualizer:  # MPPI 轨迹可视化降采样参数。
        trajectory_step: 5  # 每隔几条候选轨迹显示一次，减轻 RViz 压力。
        time_step: 3  # 每条轨迹每隔几个时间步显示一次。
      AckermannConstraints:  # 阿克曼模型专用约束。
        min_turning_r: 0.4  # 最小转弯半径，单位 m；过大时车会显得不愿转弯。
      critics: ["ConstraintCritic", "CostCritic", "GoalCritic", "GoalAngleCritic", "PathAlignCritic", "PathFollowCritic", "PathAngleCritic", "PreferForwardCritic"]  # MPPI 代价函数执行顺序。
      ConstraintCritic:  # 运动学/动力学约束代价，惩罚超限控制。
        enabled: true  # 启用约束 critic。
        cost_power: 1  # 代价幂次；1 表示线性惩罚。
        cost_weight: 4.0  # 约束代价权重；过高会强烈压制急转/急变速。
      GoalCritic:  # 目标位置吸引代价。
        enabled: true  # 启用目标位置 critic。
        cost_power: 1  # 目标距离代价幂次。
        cost_weight: 3.0  # 目标位置权重。
        threshold_to_consider: 1.4  # 距目标 1.4m 内开始更明显考虑目标位置。
      GoalAngleCritic:  # 目标朝向代价。
        enabled: true  # 启用目标朝向 critic。
        cost_power: 1  # 朝向误差代价幂次。
        cost_weight: 3.0  # 目标朝向权重。
        threshold_to_consider: 1.2  # 距目标 xxm 内开始考虑最终朝向。
      PreferForwardCritic:  # 前进偏好代价。
        enabled: true  # 启用前进偏好。
        cost_power: 1  # 前进偏好代价幂次。
        cost_weight: 8.0  # 前进偏好权重；过高会不愿倒车/掉头。
        threshold_to_consider: 5.0  # 接近目标 0.5m 后才重点考虑该 critic。
      CostCritic:  # costmap 障碍物/高代价区域 critic。
        enabled: true  # 启用代价地图 critic。
        cost_power: 1  # costmap 代价幂次。
        cost_weight: 3.0  # costmap 权重；越高越远离障碍/道路边界。
        critical_cost: 300.0  # 超过该代价会被视为非常危险。
        consider_footprint: true  # 用完整车体 footprint 检查代价，而不是只看中心点。
        collision_cost: 1000000.0  # 碰撞轨迹的巨大惩罚。
        near_goal_distance: 1.0  # 近目标距离内可调整 cost critic 行为。
        trajectory_point_step: 2  # 评估轨迹时每隔 2 个点检查一次，降低计算量。
      PathAlignCritic:  # 路径贴合 critic，鼓励候选轨迹贴近全局路径。
        enabled: true  # 启用路径贴合。
        cost_power: 2  # 路径贴合代价幂次。
        cost_weight: 14.0  # 路径贴合权重；过高时车可能不愿为了转弯偏离路径。
        max_path_occupancy_ratio: 0.05  # 路径附近占据比例超过阈值时可降低该 critic 影响。
        trajectory_point_step: 4  # 路径贴合评估的轨迹点间隔。
        threshold_to_consider: 0.5  # 距目标超过 0.5m 时考虑路径贴合。
        offset_from_furthest: 20  # 从最远路径进展点再向前偏移，用于对齐目标点选择。
        use_path_orientations: true  # 不使用路径自带朝向，仅按几何路径对齐。
      PathFollowCritic:  # 路径前进 critic，鼓励沿路径向前推进。
        enabled: true  # 启用路径跟随。
        cost_power: 1  # 路径前进代价幂次。
        cost_weight: 9.0  # 路径前进权重。
        offset_from_furthest: 5  # 选择最远进展点前方 5 个点作为跟随参考。
        threshold_to_consider: 1.4  # 距目标超过 1.4m 时考虑路径前进。
      PathAngleCritic:  # 路径朝向 critic，约束车头与路径方向关系。
        enabled: true  # 启用路径朝向。
        cost_power: 1  # 路径朝向代价幂次。
        cost_weight: 6.0  # 路径朝向权重；过高可能压制可行的切弯姿态。
        offset_from_furthest: 4  # 用路径前方第 4 个点估计方向。
        threshold_to_consider: 0.5  # 距目标超过 0.5m 时考虑路径朝向。
        max_angle_to_furthest: 1.0  # 到前方路径点最大允许角度，单位 rad。
        forward_preference: true  # 偏好前进方向，false允许更灵活的路径角度。
#  # 空行注释：下面是 controller_server 的 rclcpp 辅助节点。
controller_server_rclcpp_node:  # controller server 内部 rclcpp 节点参数。
  ros__parameters:  # ROS2 参数命名空间。
    use_sim_time: False  # 使用真实时间。
#  # 空行注释：下面开始局部代价地图配置。
local_costmap:  # 局部代价地图顶层命名空间。
  local_costmap:  # Nav2 costmap node 名称。
    ros__parameters:  # ROS2 参数命名空间。
      update_frequency: 5.0  # 局部 costmap 更新频率 5Hz。
      publish_frequency: 2.0  # 局部 costmap 发布频率 2Hz。
      transform_tolerance: 0.5  # TF 允许延迟 0.5s。
      global_frame: odom  # 局部 costmap 参考坐标系。
      robot_base_frame: base_footprint  # 机器人底盘坐标系。
      use_sim_time: False  # 使用真实时间。
      rolling_window: true  # 使用跟随机器人移动的滚动窗口。
      width: 3  # 局部 costmap 宽 3m。
      height: 3  # 局部 costmap 高 3m。
      resolution: 0.05  # 栅格分辨率 5cm。
      footprint: "[[0.14, 0.085], [0.14, -0.085], [-0.14, -0.085], [-0.14, 0.085]]"  # 车体矩形轮廓，单位 m。
      footprint_padding: 0.02  # footprint 额外膨胀 2cm，提供安全余量。
      track_unknown_space: false  # 不把未知区域作为需要跟踪的未知空间。
      plugins: ["obstacle_array_layer", "inflation_layer"]  # 局部 costmap 插件顺序。
      obstacle_array_layer:  # 自定义障碍物数组层。
        plugin: "obstacle_nav2::ObstacleArrayLayer"  # 使用 obstacle_nav2 包里的自定义 costmap layer。
        enabled: true  # 启用障碍物层。
        topic: /obstacles  # 从 obstacle_scanner 发布的障碍物话题读取。
        obstacle_timeout: 0.5  # 障碍物 0.5s 未更新后过期。
        transform_tolerance: 0.2  # 障碍物坐标 TF 容忍时间 0.2s。
        default_obstacle_radius: 0.05  # 默认障碍物半径 5cm。
        minimum_obstacle_radius: 0.02  # 障碍物最小半径 2cm。
        maximum_obstacle_radius: 0.06  # 局部层障碍物最大半径 6cm。
        extra_inflation: 0.02  # 自定义层额外障碍膨胀 2cm。
      inflation_layer:  # 标准 Nav2 膨胀层。
        plugin: "nav2_costmap_2d::InflationLayer"  # 使用 Nav2 内置 InflationLayer。
        cost_scaling_factor: 3.0  # 膨胀代价衰减速度；越大衰减越快。
        inflation_radius: 0.15  # 局部障碍膨胀半径 20cm。
      always_send_full_costmap: True  # 每次发布完整 costmap，便于调试但带宽更高。
  local_costmap_client:  # 局部 costmap 参数客户端节点。
    ros__parameters:  # ROS2 参数命名空间。
      use_sim_time: False  # 使用真实时间。
  local_costmap_rclcpp_node:  # 局部 costmap 内部 rclcpp 节点。
    ros__parameters:  # ROS2 参数命名空间。
      use_sim_time: False  # 使用真实时间。
#  # 空行注释：下面开始全局代价地图配置。
global_costmap:  # 全局代价地图顶层命名空间。
  global_costmap:  # Nav2 global costmap node 名称。
    ros__parameters:  # ROS2 参数命名空间。
      update_frequency: 1.0  # 全局 costmap 更新频率 1Hz。
      publish_frequency: 1.0  # 全局 costmap 发布频率 1Hz。
      transform_tolerance: 0.5  # TF 允许延迟 0.5s。
      global_frame: odom  # 全局 costmap 参考坐标系；此处仍为 odom 滚动窗口。
      robot_base_frame: base_footprint  # 机器人底盘坐标系。
      use_sim_time: False  # 使用真实时间。
      rolling_window: true  # 全局 costmap 也采用滚动窗口，不依赖静态地图。
      width: 10  # 全局 costmap 宽 10m。
      height: 10  # 全局 costmap 高 10m。
      resolution: 0.05  # 栅格分辨率 5cm。
      footprint: "[[0.14, 0.085], [0.14, -0.085], [-0.14, -0.085], [-0.14, 0.085]]"  # 车体矩形轮廓，单位 m。
      footprint_padding: 0.02  # footprint 额外膨胀 2cm。
      track_unknown_space: false  # 不跟踪未知空间，适合无静态地图滚动导航。
      plugins: ["obstacle_array_layer", "inflation_layer"]  # 全局 costmap 插件顺序。
      obstacle_array_layer:  # 自定义障碍物数组层。
        plugin: "obstacle_nav2::ObstacleArrayLayer"  # 使用 obstacle_nav2 自定义 layer。
        enabled: true  # 启用障碍物层。
        topic: /obstacles  # 障碍物输入话题。
        obstacle_timeout: 0.5  # 障碍物数据过期时间 0.5s。
        transform_tolerance: 0.2  # 障碍物 TF 容忍时间 0.2s。
        default_obstacle_radius: 0.05  # 默认障碍物半径 5cm。
        minimum_obstacle_radius: 0.02  # 障碍物最小半径 2cm。
        maximum_obstacle_radius: 0.50  # 全局层允许更大的障碍物半径，最大 50cm。
        extra_inflation: 0.02  # 自定义层额外膨胀 2cm。
      inflation_layer:  # 标准 Nav2 膨胀层。
        plugin: "nav2_costmap_2d::InflationLayer"  # 使用 Nav2 内置 InflationLayer。
        cost_scaling_factor: 3.0  # 膨胀代价衰减速度。
        inflation_radius: 0.55  # 全局障碍膨胀半径 55cm，规划会更保守。
      always_send_full_costmap: True  # 每次发布完整全局 costmap。
  global_costmap_client:  # 全局 costmap 参数客户端节点。
    ros__parameters:  # ROS2 参数命名空间。
      use_sim_time: False  # 使用真实时间。
  global_costmap_rclcpp_node:  # 全局 costmap 内部 rclcpp 节点。
    ros__parameters:  # ROS2 参数命名空间。
      use_sim_time: False  # 使用真实时间。
#  # 空行注释：下面开始全局规划器配置。
planner_server:  # Nav2 全局规划服务器。
  ros__parameters:  # ROS2 参数命名空间。
    planner_plugins: ["GridBased"]  # 注册一个名为 GridBased 的 planner。
    use_sim_time: False  # 使用真实时间。
    GridBased:  # GridBased planner 插件参数。
      plugin: "nav2_smac_planner/SmacPlannerHybrid"  # 使用 Smac Hybrid A* 规划器。
      downsample_costmap: false  # 不降采样 costmap，保留 5cm 精度。
      downsampling_factor: 1  # 降采样倍率为 1，即不降采样。
      tolerance: 0.25  # 目标容忍半径 25cm，目标附近可接受近似解。
      allow_unknown: false  # 不允许规划穿过未知区域。
      max_iterations: 1000000  # 最大搜索迭代次数。
      max_on_approach_iterations: 1000  # 接近目标后额外搜索迭代次数。
      max_planning_time: 5.0  # 单次规划最大时间 5s。
      motion_model_for_search: "REEDS_SHEPP"  # 搜索模型支持前进和倒车。
      angle_quantization_bins: 72  # 角度离散成 72 档，每档约 5 度。
      analytic_expansion_ratio: 3.5  # 解析扩展尝试频率比例。
      analytic_expansion_max_length: 3.0  # 解析扩展最大长度 3m。
      minimum_turning_radius: 0.60  # 规划器最小转弯半径，应和 MPPI min_turning_r 接近。
      reverse_penalty: 1.9  # 倒车惩罚；越高越不愿倒车。
      change_penalty: 1.0  # 前进/倒车方向切换惩罚。
      non_straight_penalty: 1.2  # 非直线运动惩罚；过高会让路径偏直。
      cost_penalty: 4.0  # costmap 高代价区域惩罚；越高越远离障碍。
      retrospective_penalty: 0.015  # 回溯惩罚，用于改善搜索效率/路径偏好。
      # 5 m covers the rolling planning horizon without the startup and memory  # 说明 lookup_table_size 为什么设为 5m。
      # cost of the previous 20 m (401-cell) Hybrid-A* lookup table.  # 旧的 20m 查找表启动和内存成本更高。
      lookup_table_size: 5.0  # Hybrid A* 启发式查找表尺寸 5m。
      cache_obstacle_heuristic: false  # 不缓存障碍启发式，适合滚动障碍环境。
      viz_expansions: false  # 不发布搜索扩展可视化；调试规划器时可打开。
      smooth_path: True  # 对规划结果做平滑。
      smoother:  # Smac planner 内部 smoother 参数。
        max_iterations: 1000  # 平滑器最大迭代次数。
        w_smooth: 0.3  # 平滑项权重。
        w_data: 0.2  # 保持原路径数据项权重。
        tolerance: 1.0e-10  # 平滑收敛阈值。
        do_refinement: true  # 启用额外细化。
        refinement_num: 2  # 平滑细化轮数。
#  # 空行注释：下面是 planner_server 的 rclcpp 辅助节点。
planner_server_rclcpp_node:  # planner server 内部 rclcpp 节点。
  ros__parameters:  # ROS2 参数命名空间。
    use_sim_time: False  # 使用真实时间。
#  # 空行注释：下面开始 smoother_server 配置。
smoother_server:  # Nav2 独立路径平滑服务器。
  ros__parameters:  # ROS2 参数命名空间。
    use_sim_time: False  # 使用真实时间。
    smoother_plugins: ["simple_smoother"]  # 注册 simple_smoother 插件。
    simple_smoother:  # SimpleSmoother 插件参数。
      plugin: "nav2_smoother::SimpleSmoother"  # 使用 Nav2 内置简单平滑器。
      tolerance: 1.0e-10  # 平滑收敛阈值。
      max_its: 1000  # 最大迭代次数。
      do_refinement: True  # 启用额外细化。
#  # 空行注释：下面开始行为服务器配置。
behavior_server:  # Nav2 恢复/行为服务器。
  ros__parameters:  # ROS2 参数命名空间。
    costmap_topic: local_costmap/costmap_raw  # 行为服务器使用的局部 costmap 原始话题。
    footprint_topic: local_costmap/published_footprint  # 行为服务器使用的机器人 footprint 话题。
    cycle_frequency: 10.0  # 行为服务器运行频率 10Hz。
    behavior_plugins: ["spin", "backup", "wait"]  # 注册旋转、倒车、等待三个行为。
    spin:  # 旋转行为参数。
      plugin: "nav2_behaviors/Spin"  # 使用 Nav2 Spin 行为。
    backup:  # 倒车行为参数。
      plugin: "nav2_behaviors/BackUp"  # 使用 Nav2 BackUp 行为。
      backup_dist: 0.8  # 默认倒车距离 0.8m。
      backup_speed: 0.18  # 默认倒车速度 0.18m/s。
    wait:  # 等待行为参数。
      plugin: "nav2_behaviors/Wait"  # 使用 Nav2 Wait 行为。
      wait_duration: 0.5  # 默认等待 0.5s。
    global_frame: odom  # 行为服务器全局参考坐标系。
    robot_base_frame: base_footprint  # 机器人底盘坐标系。
    transform_tolerance: 0.5  # TF 容忍时间 0.5s。
    use_sim_time: False  # 使用真实时间。
    simulate_ahead_time: 2.0  # 行为碰撞检查向前模拟 2s。
    max_rotational_vel: 1.0  # 行为服务器最大旋转速度 1rad/s。
    min_rotational_vel: 0.4  # 行为服务器最小旋转速度 0.4rad/s。
    rotational_acc_lim: 3.2  # 行为服务器旋转加速度限制 3.2rad/s^2。
#  # 空行注释：下面是 robot_state_publisher 参数。
robot_state_publisher:  # 机器人状态发布器。
  ros__parameters:  # ROS2 参数命名空间。
    use_sim_time: False  # 使用真实时间。
#  # 空行注释：下面开始 waypoint_follower 配置。
waypoint_follower:  # Nav2 路点跟随服务器。
  ros__parameters:  # ROS2 参数命名空间。
    loop_rate: 20  # 路点跟随循环频率 20Hz。
    use_sim_time: False  # 使用真实时间。
    stop_on_failure: false  # 单个路点失败时不停止整个任务。
    waypoint_task_executor_plugin: "wait_at_waypoint"  # 每个路点执行等待插件。
    wait_at_waypoint:  # 路点等待插件参数。
      plugin: "nav2_waypoint_follower::WaitAtWaypoint"  # 使用 Nav2 内置等待插件。
      enabled: True  # 启用到点等待。
      waypoint_pause_duration: 200  # 每个路点等待 200ms。
#  # 空行注释：下面开始 velocity_smoother 配置。
velocity_smoother:  # Nav2 速度平滑器。
  ros__parameters:  # ROS2 参数命名空间。
    use_sim_time: False  # 使用真实时间。
    smoothing_frequency: 20.0  # 速度平滑频率 20Hz。
    scale_velocities: False  # 不按比例缩放各轴速度，直接按限制裁剪。
    feedback: "OPEN_LOOP"  # 开环平滑，不用实时里程计速度闭环修正。
    max_velocity: [0.40, 0.0, 2.5]  # 最大速度 [vx, vy, wz]。
    min_velocity: [-0.75, 0.0, -2.5]  # 最小速度 [vx, vy, wz]，负 vx 允许倒车。
    max_accel: [2.5, 0.0, 3.2]  # 最大加速度 [ax, ay, aw]。
    max_decel: [-0.5, 0.0, -0.5]  # 最大减速度；负值表示减速方向限制。
    odom_topic: /odom_combined  # 平滑器读取里程计的话题。
    odom_duration: 0.1  # 里程计速度估计时间窗口 0.1s。
    deadband_velocity: [0.03, 0.0, 0.03]  # 小于死区的速度会被压到 0。
    velocity_timeout: 1.0  # 1s 未收到速度命令则停止输出。
