---
name: nav2-integration
description: 导航2 (Nav2) 集成技能 - Nav2 配置、行为树、路径规划、避障、定位适配
argument-hint: Nav2配置 OR 导航集成 OR 行为树导航 OR Nav2避障
user-invocable: true
---
# Navigation2 (Nav2) 集成技能
> 用于将 Navigation2 导航堆栈集成到 ROS2 机器人项目中,涵盖配置、调参和定制开发
---
## 何时使用
当需要以下帮助时使用此技能:
- 将 Nav2 集成到机器人项目
- 配置行为树(Behavior Tree)
- 调优路径规划和避障参数
- 多机器人导航
- Nav2 与定位系统(SLAM)集成
---
## 快速参考
### Nav2 架构
```
Nav2 堆栈
├── planner_server # 全局路径规划 (NavFn, Smac, Theta*)
├── controller_server # 局部路径跟踪 (DWB, TEB, RPP)
├── smoother_server # 路径平滑
├── behaviors_server # 行为树 (备份、等待、旋回)
├── bt_navigator # 行为树导航器
├── navigatorLifecycle # 生命周期管理
└── recovery_server # 恢复行为
```
### 核心话题
| 话题 | 类型 | 说明 |
|------|------|------|
| `/navigate_to_pose` | action | 导航到目标点 |
| `/compute_path_to_pose` | action | 计算路径 |
| `/goal_pose` | geometry_msgs/PoseStamped | 2D 导航目标 |
| `/local_costmap/costs` | nav_msgs/OccupancyGrid | 本地代价地图 |
---
## ROS2 launch 集成
### 最小启动配置
```python
# launch/nav2_bringup.launch.py
from launch import LaunchDescription
from launch_ros.actions import Node
from nav2_common.launch import RewrittenYaml
import os
def generate_launch_description():
# 导航参数文件
nav2_params = os.path.join(
get_package_share_directory('nav2_bringup'),
'params/nav2_params.yaml'
)
# 替换参数
configured_params = RewrittenYaml(
source_file=nav2_params,
root_key='',
param_rewrites={
'robot_base_frame': 'base_link',
'use_sim_time': 'false',
}
)
return LaunchDescription([
# Nav2 生命周期节点
Node(
package='nav2_controller',
executable='controller_server',
name='controller_server',
parameters=[configured_params],
remappings=[
('/cmd_vel', '/diff_driver_base_controller/cmd_vel_unstamped'),
],
),
Node(
package='nav2_planner',
executable='planner_server',
name='planner_server',
parameters=[configured_params],
),
Node(
package='nav2_behaviors',
executable='behavior_server',
name='behavior_server',
parameters=[configured_params],
),
Node(
package='nav2_bt_navigator',
executable='bt_navigator',
name='bt_navigator',
parameters=[configured_params],
),
Node(
package='nav2_lifecycle_manager',
executable='lifecycle_manager',
name='lifecycle_manager',
parameters=[{'autostart': True}],
),
])
```
### 订阅 SLAM 定位
```yaml
# nav2_params.yaml
amcl:
ros__parameters:
use_sim_time: false
alpha1: 0.2
alpha2: 0.2
alpha3: 0.2
alpha4: 0.2
alpha5: 0.2
base_frame: base_link
global_frame: map
robot_frame: base_link
bt_navigator:
ros__parameters:
default_nav_to_pose_bt_xml: $(find-pkg-share nav2_bt_navigator)/behavior_trees/navigate_to_pose_w_replanning_and_ifcovery_bt.xml
plugin_lib_names:
- nav2_compute_path_to_pose_action_bt_node
- nav2_follow_path_action_bt_node
- nav2_back_up_action_bt_node
- nav2_spin_action_bt_node
- nav2_wait_action_bt_node
- nav2_clear_costmap_service_bt_node
```
---
## 行为树 (Behavior Tree)
### 自定义行为树 XML
```xml
```
### Python 自定义行为节点
```python
# my_bt_nodes.py
from nav2_behaviors.plugins.backup import BackUp
class CustomBackUp(BackUp):
def onConfigure(self) -> bool:
self->state->setInput("speed", 0.1) # 自定义速度
self->state->setInput("time_allowed", 10.0)
return True
```
注册到插件库:
```xml
```
---
## 局部路径跟踪
### DWB Controller 配置
```yaml
dwb_controller:
ros__parameters:
min_vel_x: 0.0
min_vel_theta: -1.5
max_vel_x: 0.5
max_vel_y: 0.5
max_vel_theta: 1.5
min_speed_xy: 0.0
max_speed_xy: 0.5
acc_lim_x: 2.5
acc_lim_y: 2.5
acc_lim_theta: 3.2
# TEB 配置(备选)
teb_local_planner:
ros__parameters:
max_vel_x: 0.5
max_vel_theta: 1.5
max_accel: 2.5
wheelbase: 0.5
cmd_angle_instead_rotvel: true
```
### 跟踪前沿(FollowWaypoints)
```python
from nav2_msgs.action import FollowWaypoints
from rclpy.action import ActionClient
class WaypointFollower:
def __init__(self):
self._action_client = ActionClient(
self, FollowWaypoints, '/follow_waypoints'
)
def follow_waypoints(self, poses: list):
goal = FollowWaypoints.Goal()
goal.poses = poses
self._action_client.wait_for_server()
self._action_client.send_goal_async(goal)
```
---
## 代价地图配置
### 全局代价地图
```yaml
global_costmap:
global_costmap:
ros__parameters:
footprint_padding: 0.05
plugin_lib_names:
- nav2_layered_plugins.CostmapPlugin
update_frequency: 1.0
publish_frequency: 1.0
global_frame: map
robot_base_frame: base_link
resolution: 0.05
track_unknown_space: true
plugins:
- plugin: nav2_costmap_2d_plugins.StaticLayer
- plugin: nav2_costmap_2d_plugins.ObstacleLayer
observation_sources: scan
scan:
topic: /scan
max_obstacle_height: 2.0
clearing: true
- plugin: nav2_costmap_2d_plugins.VoxelLayer
enabled: true
```
### 本地代价地图
```yaml
local_costmap:
local_costmap:
ros__parameters:
update_frequency: 5.0
publish_frequency: 2.0
global_frame: odom
robot_base_frame: base_link
resolution: 0.05
rolling_window: true
width: 3
height: 3
plugins:
- plugin: nav2_costmap_2d_plugins.ObstacleLayer
```
---
## 多机器人导航
### 命名空间隔离
```python
# launch/multi_robot.launch.py
def generate_multi_robot_launch(robot_names: list):
nodes = []
for name in robot_names:
# 每个机器人有独立的节点组
ns = f'/{name}'
nodes.extend([
Node(
package='nav2_bringup',
executable='navigation_launch',
name='nav2_bringup',
namespace=ns,
parameters=[f'{name}_nav2_params.yaml'],
remappings=[
('/cmd_vel', f'{ns}/cmd_vel'),
('/scan', f'{ns}/scan'),
],
),
])
return LaunchDescription(nodes)
```
### 坐标系管理
```yaml
# 每个机器人使用独立的 map frame
amcl:
ros__parameters:
global_frame: $(var robot_name)/map
robot_base_frame: $(var robot_name)/base_link
```
---
## 故障排查
| 问题 | 原因 | 解决方案 |
|------|------|----------|
| 机器人不动 | 局部路径跟踪失败 | 检查 `/cmd_vel` 是否到达电机驱动 |
| 代价地图全红 | 传感器数据异常 | 检查 scan 话题是否有数据 |
| 路径绕远 | 全局规划器问题 | 切换 planner_plugin 或调参 |
| BT 超时 | 计算太慢 | 减小地图分辨率,简化行为树 |
| 恢复行为不停 | 环境确实不可通行 | 添加障碍物清理或手动干预 |
### 调试命令
```bash
# 查看 Nav2 状态
ros2 action list -t
# 查看代价地图
ros2 topic echo /local_costmap/costmap
# 发送导航目标
ros2 action send_goal /navigate_to_pose nav2_msgs/action/NavigateToPose "{pose: {header: {frame_id: map}, pose: {position: {x: 2.0, y: 1.0}}}}"
# 运行时修改参数
ros2 param set /bt_navigator plugin_lib_names "['nav2_compute_path_to_pose_action_bt_node', 'nav2_follow_path_action_bt_node']"
# 查看行为树状态
ros2 topic echo /bt_navigator/transition_log
```
---
## 相关技能
- `navigation/slam` — SLAM 定位系统
- `navigation/obstacle-avoidance` — 动态避障
- `navigation/path-planning` — 路径规划算法
- `wheeled_vehicle/navigation` — 轮式车辆导航
- `quadruped/navigation` — 四足机器人导航
- `humanoid/navigation` — 人形机器人导航