将 note 笔记库同步到 note_sync,AI_compiler 作为 submodule
This commit is contained in:
@@ -0,0 +1,211 @@
|
||||
``` bash
|
||||
root@nvidia:~/ros2_ws# ros2 topic echo /goal_pose
|
||||
header:
|
||||
stamp:
|
||||
sec: 1776912839
|
||||
nanosec: 772353086
|
||||
frame_id: map
|
||||
pose:
|
||||
position:
|
||||
x: -0.2929971516132355
|
||||
y: -28.93631362915039
|
||||
z: 0.0
|
||||
orientation:
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: -0.7140266359687852
|
||||
w: 0.7001185350546718
|
||||
---
|
||||
header:
|
||||
stamp:
|
||||
sec: 1776912894
|
||||
nanosec: 349057427
|
||||
frame_id: map
|
||||
pose:
|
||||
position:
|
||||
x: 1.0191293954849243
|
||||
y: -23.940237045288086
|
||||
z: 0.0
|
||||
orientation:
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: -0.758253550259611
|
||||
w: 0.6519597790651626
|
||||
---
|
||||
header:
|
||||
stamp:
|
||||
sec: 1776912930
|
||||
nanosec: 59193832
|
||||
frame_id: map
|
||||
pose:
|
||||
position:
|
||||
x: -0.25821736454963684
|
||||
y: -26.604511260986328
|
||||
z: 0.0
|
||||
orientation:
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: -0.7286561115363753
|
||||
w: 0.6848797493872113
|
||||
---
|
||||
header:
|
||||
stamp:
|
||||
sec: 1776913007
|
||||
nanosec: 811936088
|
||||
frame_id: map
|
||||
pose:
|
||||
position:
|
||||
x: -0.5403046607971191
|
||||
y: -23.95861053466797
|
||||
z: 0.0
|
||||
orientation:
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: -0.7323575592769619
|
||||
w: 0.6809202635917743
|
||||
---
|
||||
header:
|
||||
stamp:
|
||||
sec: 1776913105
|
||||
nanosec: 601216801
|
||||
frame_id: map
|
||||
pose:
|
||||
position:
|
||||
x: -0.13717754185199738
|
||||
y: -31.840221405029297
|
||||
z: 0.0
|
||||
orientation:
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: -0.6531641242066932
|
||||
w: 0.7572163672618966
|
||||
---
|
||||
|
||||
```
|
||||
|
||||
雷达同步问题
|
||||
```
|
||||
ros2_ws\src\rslidar_sdk\config\config.yaml
|
||||
use_lidar_clock: false
|
||||
```
|
||||
|
||||
|
||||
```
|
||||
---
|
||||
⚠️ 警告1:No goal checker was specified in parameter 'current_goal_checker'. Server will use only plugin loaded
|
||||
general_goal_checker
|
||||
|
||||
含义
|
||||
|
||||
这是配置缺失类警告,不影响功能,只是提示你没有显式指定当前使用的目标检查器,系统自动用了第一个加载的general_goal_check
|
||||
er。
|
||||
根因
|
||||
|
||||
ROS2 Humble及以上版本的Nav2新增了current_goal_checker强制配置项,你的配置里只定义了goal_checker插件,但没有指定当前使
|
||||
用哪一个。
|
||||
✅ 解决方案
|
||||
|
||||
在controller_server的ros__parameters下添加一行即可:
|
||||
controller_server:
|
||||
ros__parameters:
|
||||
current_goal_checker: "general_goal_checker" # 新增这行
|
||||
controller_frequency: 20.0
|
||||
# ... 其他原有配置
|
||||
|
||||
---
|
||||
⚠️ 警告2:Behavior Tree tick rate 100.00 was exceeded!
|
||||
|
||||
含义
|
||||
|
||||
这是性能类警告,行为树默认tick频率是100Hz(每10ms执行一次),现在单次tick执行时间超过了10ms,导致频率不达标。
|
||||
根因
|
||||
|
||||
行为树中的计算密集型节点执行太慢,90%的情况是MPPI控制器计算耗时过长,小概率是系统CPU负载过高、规划器卡顿等。
|
||||
✅ 排查&解决方案
|
||||
|
||||
1. 先看CPU占用:top 看controller_server进程的CPU占比,如果超过100%就是计算量太大
|
||||
2. 优先优化MPPI参数(你的当前配置计算量过高),后面警告3会详细说
|
||||
3. 实在优化不了可以调大BT的tick间隔,在bt_navigator下加:
|
||||
bt_navigator:
|
||||
ros__parameters:
|
||||
bt_loop_duration: 20 # 从10ms改成20ms,频率降到50Hz,不推荐,优先优化控制器
|
||||
|
||||
---
|
||||
⚠️ 警告3:Control loop missed its desired rate of 20.0000Hz
|
||||
|
||||
含义
|
||||
|
||||
这是核心性能警告,控制器要求20Hz的控制频率(每50ms输出一次速度指令),现在单次循环执行超过了50ms,频率不达标。
|
||||
⚠️ 这个问题必须优先解决:控制频率低于15Hz会导致MPPI控制不稳定,甚至出现急刹、撞障碍物的情况。
|
||||
根因
|
||||
|
||||
你的MPPI配置计算量过大,两个核心参数超标:
|
||||
FollowPath:
|
||||
batch_size: 2000 # 单次迭代采样2000条轨迹,计算量极大
|
||||
time_steps: 56 # 每条轨迹预测56步(0.05*56=2.8秒预测时长)
|
||||
- 2000的batch_size在Jetson NX级别的嵌入式平台单次计算就要60-80ms,肯定达不到50ms的要求
|
||||
- 额外加重负载的配置:local costmap的obstacle_max_range: 20.0,local
|
||||
costmap本身只有6m×6m,处理20米内的点云完全是浪费CPU
|
||||
✅ 解决方案(按优先级)
|
||||
|
||||
1. 调小MPPI计算量(优先保证控制频率达标):
|
||||
FollowPath:
|
||||
batch_size: 1000 # 降到800-1200,轨迹采样数减半,性能提升一倍,效果下降不明显
|
||||
time_steps: 40 # 降到32-40,预测时长2秒足够,履带车速度慢不需要太长预测
|
||||
2. 缩小local costmap障碍物检测范围:
|
||||
# local_costmap的voxel_layer下的scan配置
|
||||
obstacle_max_range: 10.0 # 从20米改成10米,足够覆盖6m的local costmap范围
|
||||
3. 验证效果:改完后用ros2 topic hz /cmd_vel_nav看频率,稳定在18Hz以上就算合格
|
||||
|
||||
---
|
||||
❌ 错误1:Failed to create a plan from potential when a legal potential was found. This shouldn't happen.
|
||||
|
||||
含义
|
||||
|
||||
这是Navfn规划器内部错误:规划器已经算出了从起点到终点的势场(理论上存在可行路径),但实际提取路径的时候失败了。
|
||||
根因
|
||||
|
||||
结合你的配置,最可能的几个原因:
|
||||
4. 可行通道太窄:你的膨胀半径是1.8m,车身本身宽1.8m,通道宽度必须大于3.6m才能通过,如果路径上有窄于这个宽度的通道,膨
|
||||
胀后就没有可行空间了
|
||||
5. 起点/终点落在膨胀区内:虽然势场是通的,但膨胀后的代价太高,路径提取的时候找不到合法的起点/终点
|
||||
6. 膨胀半径过大:1.8m的膨胀半径刚好是车身宽度,没有冗余,稍微有点障碍物就会把通道堵死
|
||||
7. 全局costmap噪点过多:点云误检的障碍物挡住了路径
|
||||
✅ 排查&解决方案
|
||||
|
||||
8. 排查路径情况:规划失败时,在rviz上看起点到终点的通道宽度,是不是小于3.6m
|
||||
9. 优化膨胀半径(如果通道普遍较窄):
|
||||
# 全局和局部costmap的inflation_radius都可以降到1.5m(只要大于车身最大半长1.2m就满足SMAC优化要求)
|
||||
inflation_radius: 1.5
|
||||
10. 优化Navfn参数:
|
||||
GridBased:
|
||||
tolerance: 1.0 # 从0.5米改成1.0米,允许终点有更大的容忍范围
|
||||
11. 终极方案:换规划器:如果经常走窄通道,把Navfn换成nav2_smac_planner/SmacPlanner,对窄通道的支持好很多
|
||||
12. 检查全局costmap噪点:如果有很多误检的小障碍物,调大mark_threshold过滤噪点
|
||||
|
||||
---
|
||||
❌ 错误2:Failed to get result for follow_path in node halt!
|
||||
|
||||
含义
|
||||
|
||||
这是次生错误,不影响功能,只是日志提示:行为树在终止(halt)的时候,尝试获取follow_path节点的执行结果,但结果不存在。
|
||||
根因
|
||||
|
||||
完全是前面的规划失败导致的连锁反应:规划失败后整个导航任务提前终止,follow_path节点还没来得及产生结果就被强制停止了。
|
||||
✅ 解决方案
|
||||
|
||||
解决前面的规划失败问题后,这个错误会自动消失,不需要单独处理。
|
||||
|
||||
---
|
||||
🎯 解决优先级建议
|
||||
|
||||
13. 【最高优先级】先解决控制循环频率不够的问题,直接影响导航安全性
|
||||
14. 【次高优先级】解决规划失败的问题,影响导航可用性
|
||||
15. 【低优先级】解决剩下的配置类警告,不影响功能只是优化日志
|
||||
|
||||
额外优化建议
|
||||
|
||||
你现在的voxel层mark_threshold: 10有点太高了,需要10个点才能标记障碍物,容易漏检小障碍物,建议调到3-5更合适:
|
||||
voxel_layer:
|
||||
mark_threshold: 3 # 从10改成3,平衡噪点过滤和小障碍物检测
|
||||
```
|
||||
@@ -0,0 +1,356 @@
|
||||
# Navigation2 详解:nav2_bringup 与 nav2_gps_waypoint_follower_demo
|
||||
|
||||
## 1. Navigation2 整体介绍
|
||||
Navigation2(简称Nav2)是ROS2生态中最成熟的开源导航框架,是ROS1 Navigation Stack的官方继任者,专为移动机器人自主导航设计。
|
||||
|
||||
### 1.1 核心功能
|
||||
- **定位**:支持AMCL、SLAM(Cartographer、SLAM Toolbox等)、GPS/RTK等多源定位
|
||||
- **全局路径规划**:支持A*、Dijkstra、NavFn等多种规划算法
|
||||
- **局部路径跟踪**:支持DWA、TEB、MPPI、Pure Pursuit等跟踪算法
|
||||
- **避障与行为树**:通过行为树实现复杂导航逻辑,支持动态障碍物规避
|
||||
- **重规划与恢复行为**:导航失败时自动执行恢复策略(旋转、回退、清图等)
|
||||
- **多机器人支持**:支持命名空间隔离的多机器人导航
|
||||
|
||||
### 1.2 整体架构
|
||||
Nav2采用模块化插件式设计,核心模块包括:
|
||||
```
|
||||
├── 感知层
|
||||
│ ├── 传感器数据处理(LiDAR、Camera、IMU、GPS等)
|
||||
│ └── 障碍物检测/语义分割
|
||||
├── 定位层
|
||||
│ ├── AMCL(蒙特卡洛定位)
|
||||
│ ├── SLAM 建图
|
||||
│ └── 多传感器融合定位
|
||||
├── 地图层
|
||||
│ ├── 代价地图(全局/局部)
|
||||
│ ├── 图层插件(静态层、障碍层、膨胀层、社会层等)
|
||||
├── 规划层
|
||||
│ ├── 全局路径规划器
|
||||
│ └── 平滑器
|
||||
├── 控制层
|
||||
│ ├── 局部路径规划器
|
||||
│ └── 轨迹跟踪控制器
|
||||
├── 行为决策层
|
||||
│ ├── 行为树执行器
|
||||
│ └── 恢复行为管理器
|
||||
└── 接口层
|
||||
├── RViz 可视化
|
||||
├── Action/Topic API
|
||||
└── 配置参数系统
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. nav2_bringup 包详解
|
||||
nav2_bringup是Nav2的官方启动集成包,提供了开箱即用的启动文件、配置模板和参数集合,是快速部署Nav2系统的入口。
|
||||
|
||||
### 2.1 代码结构
|
||||
```
|
||||
nav2_bringup/
|
||||
├── bringup/ # 启动相关核心目录
|
||||
│ ├── launch/ # 启动文件集合
|
||||
│ │ ├── bringup_launch.py # 主启动文件,集成所有导航模块
|
||||
│ │ ├── localization_launch.py # 单独启动定位模块(AMCL/SLAM)
|
||||
│ │ ├── navigation_launch.py # 单独启动导航模块(规划/控制/行为树)
|
||||
│ │ ├── rviz_launch.py # 启动RViz可视化
|
||||
│ │ ├── slam_launch.py # 启动SLAM建图
|
||||
│ │ └── urdf_launch.py # 加载机器人URDF模型
|
||||
│ ├── params/ # 参数配置文件目录
|
||||
│ │ ├── nav2_params.yaml # 导航全模块默认参数
|
||||
│ │ ├── nav2_params_no_odom.yaml # 无里程计场景参数
|
||||
│ │ ├── nav2_slam_params.yaml # SLAM模式参数
|
||||
│ │ └── robot_localization/ # 传感器融合参数模板
|
||||
│ └── rviz/ # RViz配置文件
|
||||
│ └── nav2_default_view.rviz # Nav2默认RViz配置
|
||||
├── docker/ # Docker部署相关文件
|
||||
├── scripts/ # 辅助脚本
|
||||
├── CMakeLists.txt
|
||||
├── package.xml
|
||||
└── README.md
|
||||
```
|
||||
|
||||
### 2.2 核心启动文件说明
|
||||
|
||||
#### 2.2.1 bringup_launch.py
|
||||
这是最常用的一站式启动文件,集成了完整的导航流程,支持参数配置:
|
||||
```python
|
||||
# 关键参数
|
||||
'namespace': '', # 多机器人命名空间
|
||||
'use_sim_time': False, # 是否使用仿真时间
|
||||
'rviz_config_file': '', # RViz配置文件路径
|
||||
'params_file': '', # 导航参数文件路径
|
||||
'autostart': True, # 启动后自动激活导航栈
|
||||
'use_composition': True, # 使用组件化节点(减少进程数,提高性能)
|
||||
'use_respawn': False, # 节点崩溃时自动重启
|
||||
'map': '', # 静态地图文件路径(.yaml/.pgm)
|
||||
'slam': False, # 是否启用SLAM模式
|
||||
'localization_type': 'amcl' # 定位方式:amcl/slam_toolbox等
|
||||
```
|
||||
启动示例:
|
||||
```bash
|
||||
# 仿真环境启动导航
|
||||
ros2 launch nav2_bringup bringup_launch.py use_sim_time:=True map:=/path/to/map.yaml
|
||||
|
||||
# 真机环境启用SLAM建图
|
||||
ros2 launch nav2_bringup bringup_launch.py slam:=True params_file:=/path/to/my_params.yaml
|
||||
```
|
||||
|
||||
#### 2.2.2 localization_launch.py
|
||||
单独启动定位模块,适合只需要定位不需要完整导航的场景:
|
||||
```bash
|
||||
# 仅启动AMCL定位
|
||||
ros2 launch nav2_bringup localization_launch.py map:=/path/to/map.yaml use_sim_time:=True
|
||||
```
|
||||
|
||||
#### 2.2.3 navigation_launch.py
|
||||
单独启动导航模块(规划/控制/行为树),适合定位已由其他系统提供的场景:
|
||||
```bash
|
||||
# 仅启动导航模块,使用已有的定位信息
|
||||
ros2 launch nav2_bringup navigation_launch.py params_file:=/path/to/my_params.yaml
|
||||
```
|
||||
|
||||
### 2.3 配置文件详解
|
||||
nav2_params.yaml是核心参数配置文件,采用分层结构,每个模块单独配置:
|
||||
```yaml
|
||||
amcl:
|
||||
ros__parameters:
|
||||
base_frame_id: "base_footprint" # 机器人基坐标系
|
||||
global_frame_id: "map" # 全局坐标系
|
||||
odom_frame_id: "odom" # 里程计坐标系
|
||||
max_particles: 2000 # 最大粒子数
|
||||
min_particles: 500 # 最小粒子数
|
||||
update_min_a: 0.2 # 角度变化超过0.2rad时更新
|
||||
update_min_d: 0.25 # 位移超过0.25m时更新
|
||||
|
||||
bt_navigator:
|
||||
ros__parameters:
|
||||
use_sim_time: False
|
||||
bt_xml_filename: "navigate_w_replanning_and_recovery.xml" # 行为树文件
|
||||
|
||||
global_costmap:
|
||||
global_costmap:
|
||||
ros__parameters:
|
||||
update_frequency: 1.0
|
||||
publish_frequency: 1.0
|
||||
global_frame: map
|
||||
robot_base_frame: base_footprint
|
||||
resolution: 0.05
|
||||
plugins:
|
||||
- {name: static_layer, type: "costmap_2d::StaticLayer"}
|
||||
- {name: obstacle_layer, type: "costmap_2d::ObstacleLayer"}
|
||||
- {name: inflation_layer, type: "costmap_2d::InflationLayer"}
|
||||
|
||||
local_costmap:
|
||||
local_costmap:
|
||||
ros__parameters:
|
||||
update_frequency: 5.0
|
||||
publish_frequency: 2.0
|
||||
global_frame: odom
|
||||
robot_base_frame: base_footprint
|
||||
width: 3
|
||||
height: 3
|
||||
resolution: 0.05
|
||||
rolling_window: true # 局部代价地图随机器人移动
|
||||
|
||||
planner_server:
|
||||
ros__parameters:
|
||||
expected_planner_frequency: 1.0
|
||||
planner_plugins: ["GridBased"]
|
||||
GridBased:
|
||||
plugin: "nav2_navfn_planner/NavfnPlanner" # 默认使用NavFn规划器
|
||||
use_astar: true # 启用A*算法
|
||||
|
||||
controller_server:
|
||||
ros__parameters:
|
||||
controller_frequency: 20.0
|
||||
min_x_velocity_threshold: 0.001
|
||||
min_y_velocity_threshold: 0.5
|
||||
controller_plugins: ["FollowPath"]
|
||||
FollowPath:
|
||||
plugin: "nav2_regulated_pure_pursuit_controller/RegulatedPurePursuitController" # 默认使用Pure Pursuit控制器
|
||||
```
|
||||
|
||||
### 2.4 最佳实践
|
||||
1. **不要直接修改默认参数文件**:将nav2_params.yaml复制到自己的工作空间进行修改,通过`params_file`参数传入
|
||||
2. **组件化启动**:默认启用`use_composition:=True`可以显著减少内存占用和通信开销
|
||||
3. **分层配置**:将通用参数和机器人特定参数分开存放,便于维护
|
||||
4. **仿真与真机分离**:使用`use_sim_time`参数区分仿真和真机环境,分别配置不同的参数值
|
||||
|
||||
---
|
||||
|
||||
## 3. nav2_gps_waypoint_follower_demo 详解
|
||||
这是Nav2官方提供的室外导航示例,演示了如何结合GPS/RTK定位实现全局航点跟随功能,适用于无人车、巡检机器人等室外场景。
|
||||
|
||||
### 3.1 代码结构
|
||||
该包位于navigation2_tutorials仓库中,结构如下:
|
||||
```
|
||||
nav2_gps_waypoint_follower_demo/
|
||||
├── bringup/
|
||||
│ ├── launch/
|
||||
│ │ ├── gps_waypoint_follower_launch.py # Demo主启动文件
|
||||
│ │ ├── rviz.launch.py # RViz启动
|
||||
│ │ └── dual_ekf.launch.py # 双EKF传感器融合启动
|
||||
│ ├── params/
|
||||
│ │ ├── dual_ekf.yaml # 传感器融合参数
|
||||
│ │ ├── nav2_params.yaml # 导航参数(适配GPS场景)
|
||||
│ │ └── waypoint_follower_params.yaml # 航点跟随器参数
|
||||
│ ├── rviz/
|
||||
│ │ └── gps_waypoint.rviz # GPS导航专用RViz配置
|
||||
│ └── worlds/
|
||||
│ └── gps_world.world # 仿真世界文件(含GPS插件)
|
||||
├── config/
|
||||
│ └── sample_waypoints.yaml # 示例航点配置文件
|
||||
├── src/
|
||||
│ └── gps_waypoint_logger.cpp # 航点到达日志节点(可选)
|
||||
├── CMakeLists.txt
|
||||
├── package.xml
|
||||
└── README.md
|
||||
```
|
||||
|
||||
### 3.2 核心组件说明
|
||||
GPS航点跟随系统主要由三个核心部分组成:
|
||||
1. **传感器融合模块**(robot_localization):融合GPS、IMU、轮式里程计数据,输出全局定位
|
||||
2. **导航栈模块**:基于全局定位进行路径规划和跟踪
|
||||
3. **航点跟随器**:按照预设的GPS航点序列依次导航
|
||||
|
||||
#### 3.2.1 双EKF传感器融合
|
||||
demo使用两个扩展卡尔曼滤波器(EKF)实现多传感器融合:
|
||||
```yaml
|
||||
# dual_ekf.yaml 核心配置
|
||||
ekf_filter_node_odom:
|
||||
ros__parameters:
|
||||
frequency: 30.0
|
||||
sensor_timeout: 0.1
|
||||
two_d_mode: true
|
||||
publish_tf: true
|
||||
odom_frame: odom
|
||||
base_link_frame: base_link
|
||||
world_frame: odom
|
||||
# 融合IMU和轮式里程计,输出odom->base_link变换
|
||||
imu0: /imu/data
|
||||
odom0: /wheel/odometry
|
||||
|
||||
ekf_filter_node_map:
|
||||
ros__parameters:
|
||||
frequency: 30.0
|
||||
sensor_timeout: 0.1
|
||||
two_d_mode: true
|
||||
publish_tf: true
|
||||
odom_frame: odom
|
||||
base_link_frame: base_link
|
||||
world_frame: map
|
||||
# 融合GPS数据,输出map->odom变换
|
||||
odom1: /gps/fix
|
||||
odom1_differential: false
|
||||
odom1_relative: false
|
||||
```
|
||||
- 第一个EKF(odom系):融合IMU和轮式里程计,提供短时间内高精度的局部定位,无漂移
|
||||
- 第二个EKF(map系):融合GPS数据,提供全局绝对定位,修正长期漂移
|
||||
|
||||
#### 3.2.2 导航参数适配(nav2_params.yaml)
|
||||
GPS导航场景需要对默认导航参数进行调整:
|
||||
```yaml
|
||||
amcl:
|
||||
ros__parameters:
|
||||
# GPS导航场景下禁用AMCL,使用EKF融合提供定位
|
||||
use_sim_time: False
|
||||
# AMCL相关参数全部注释或删除
|
||||
|
||||
global_costmap:
|
||||
global_costmap:
|
||||
ros__parameters:
|
||||
# GPS模式下不使用静态地图,使用动态生成的代价地图
|
||||
plugins:
|
||||
- {name: obstacle_layer, type: "costmap_2d::ObstacleLayer"}
|
||||
- {name: inflation_layer, type: "costmap_2d::InflationLayer"}
|
||||
# 代价地图大小足够覆盖所有航点范围
|
||||
width: 1000
|
||||
height: 1000
|
||||
resolution: 0.1
|
||||
rolling_window: false # 全局代价地图固定,不随机器人移动
|
||||
origin_x: -500
|
||||
origin_y: -500
|
||||
|
||||
planner_server:
|
||||
ros__parameters:
|
||||
# 使用适合长距离规划的算法
|
||||
GridBased:
|
||||
plugin: "nav2_navfn_planner/NavfnPlanner"
|
||||
use_astar: true
|
||||
allow_unknown: true # 允许在未知区域规划路径
|
||||
|
||||
controller_server:
|
||||
ros__parameters:
|
||||
# 使用适合高速行驶的控制器
|
||||
FollowPath:
|
||||
plugin: "nav2_mppi_controller/MPPIController" # 或者TEB控制器
|
||||
max_vel_x: 5.0 # 室外场景允许更高速度
|
||||
```
|
||||
|
||||
#### 3.2.3 航点跟随器配置
|
||||
```yaml
|
||||
# waypoint_follower_params.yaml
|
||||
waypoint_follower:
|
||||
ros__parameters:
|
||||
loop: False # 航点是否循环执行
|
||||
waypoint_timeout: 300.0 # 单个航点导航超时时间(秒)
|
||||
stop_on_failure: True # 某个航点导航失败时停止
|
||||
action_server_name: "follow_waypoints"
|
||||
# 航点到达阈值
|
||||
goal_tolerance_x: 0.5
|
||||
goal_tolerance_y: 0.5
|
||||
goal_tolerance_yaw: 0.25
|
||||
```
|
||||
|
||||
### 3.3 航点配置
|
||||
sample_waypoints.yaml是预设的GPS航点文件,格式如下:
|
||||
```yaml
|
||||
waypoints:
|
||||
- latitude: 37.7749
|
||||
longitude: -122.4194
|
||||
yaw: 0.0 # 到达后的朝向(弧度)
|
||||
frame_id: "wgs84" # GPS坐标系
|
||||
- latitude: 37.7750
|
||||
longitude: -122.4195
|
||||
yaw: 1.57
|
||||
frame_id: "wgs84"
|
||||
- latitude: 37.7751
|
||||
longitude: -122.4196
|
||||
yaw: 3.14
|
||||
frame_id: "wgs84"
|
||||
```
|
||||
航点使用WGS84坐标系(标准GPS坐标),也可以配置为UTM坐标系。
|
||||
|
||||
### 3.4 运行流程
|
||||
1. **启动仿真/真机驱动**:加载机器人模型、传感器驱动、GPS插件
|
||||
2. **启动传感器融合**:`ros2 launch nav2_gps_waypoint_follower_demo dual_ekf.launch.py`
|
||||
3. **启动导航栈**:`ros2 launch nav2_gps_waypoint_follower_demo gps_waypoint_follower_launch.py`
|
||||
4. **加载航点**:`ros2 run nav2_waypoint_follower waypoint_follower --ros-args -p waypoint_file:=/path/to/sample_waypoints.yaml`
|
||||
5. **启动航点跟随**:通过RViz发送FollowWaypoints action请求,或者用命令行启动:
|
||||
```bash
|
||||
ros2 action send_goal /follow_waypoints nav2_msgs/action/FollowWaypoints "{waypoints: []}"
|
||||
```
|
||||
|
||||
### 3.5 关键注意事项
|
||||
1. **GPS信号质量**:室外场景下需要确保GPS信号良好,RTK定位能达到厘米级精度,普通GPS只有米级精度,可能影响导航效果
|
||||
2. **坐标系转换**:需要正确配置WGS84到UTM再到机器人本地坐标系的转换参数
|
||||
3. **航点规划**:航点之间需要有可行路径,避免有障碍物阻挡
|
||||
4. **动态障碍物**:室外场景需要配置合适的障碍物检测和避障参数
|
||||
5. **TF树检查**:确保`map->odom->base_link`的TF变换正确发布,这是GPS导航的基础
|
||||
|
||||
---
|
||||
|
||||
## 4. 常用调试技巧
|
||||
1. **查看TF树**:`ros2 run tf2_tools view_frames`,检查坐标系变换是否正确
|
||||
2. **检查定位质量**:`ros2 topic echo /gps/fix` 查看GPS信号质量,`ros2 topic echo /odometry/filtered` 查看融合后的定位输出
|
||||
3. **可视化调试**:在RViz中显示全局/局部代价地图、规划路径、当前目标点等信息
|
||||
4. **参数动态调整**:使用`ros2 param`命令动态修改参数,无需重启导航栈
|
||||
5. **日志分析**:查看`/tf`, `/cmd_vel`, `/plan`等话题的输出,排查导航失败原因
|
||||
|
||||
---
|
||||
|
||||
## 参考资料
|
||||
- [Navigation2 官方文档](https://navigation.ros.org/)
|
||||
- [nav2_bringup 源码](https://github.com/ros-navigation/navigation2/tree/main/nav2_bringup)
|
||||
- [GPS Waypoint Follower 教程](https://navigation.ros.org/tutorials/docs/gps_waypoint_follower.html)
|
||||
- [navigation2_tutorials 仓库](https://github.com/ros-navigation/navigation2_tutorials)
|
||||
Reference in New Issue
Block a user