Navigation2和TEB局部规划器调参问题及解决办法
1. 局部栅格地图更新太慢,导致转向时,点云抖动或者移动障碍物导致的局部占据栅格会长时间停留,导致无法路径规划。 |
原因:voxel_layer时3D体素的处理,计算开销很大,会产生更新延迟。 解决:将voxel_layer的插件换成obstacle_layer ,obstacle_layer是纯 2D 射线投射,计算极快,匹配传感器实时帧率。 场景适用性: voxel_layer 适用:需要区分高低障碍物、台阶、悬空杂物的场景(室内高差复杂、巡检机器人);代价是计算慢、动态转向易留拖影。 obstacle_layer 适用:地面移动机器狗 / AGV 仅检测地面障碍、以局部实时避障为核心的场景;更新速度快,彻底解决转向点云抖动残留的栅格导致的路径规划失效问题。 |
2. 局部地图 inflation_radius 膨胀半径设置 |
地图膨胀半径越大,碰撞圆出现得越早、视觉范围越大。 |
3. 若经常出现上图,卡在拐角的情况。 |
|
4. Yaw 角左右摇摆分析与调参建议 |
|
5. 机器人的footprint与全局和局部地图膨胀层的关系 |
/local_costmap/published_footprint:由 local_costmap/robot_radius 控制 /global_costmap/published_footprint:由 global_costmap/robot_radius 控制 我用的是圆形的模型,footprint与robot_radius是一致的,为如下图所示的浅蓝色膨胀层,机器人无法进入浅蓝色的膨胀层,保证机器人不会擦碰障碍物。Inflation_radius为浅蓝色以外膨胀层,供路径提供不同的代价值,cost_scaling_factor越大,代价往外降低的越快,越小降低的越慢。当cost_scaling_factor=0.01时,膨胀层向外代价降低的最慢,膨胀层也就越大,但是最大不超过inflation_radius的大小。 原始障碍栅格:绝对禁区 向外扩展 robot_radius:模拟机器人本体占用区域 再向外扩展 inflation_radius:额外预留安全缓冲带 |
6当全局的footprint大于局部的footprint时,比较容易避开拐角的障碍物。 |
local_costmap: ros__parameters: robot_radius: 0.15 global_costmap: ros__parameters: robot_radius: 0.2 |
7. 调节这个参数,可以解决强制走大弧,导致的速度很慢,且卡住。 |
weight_kinematics_turning_radius: 1.5 |
8. 想要优先掉头转向,而不是倒车过去 |
|
9. 全局路径总是穿过动态障碍物或者是相对于全局静态地图,实际障碍物有所更新的地方 |
将global_costmap的obstacle_layer的enable设置为true。 开启后,全局地图=静态地图+实时激光雷达观测的地图,可以使全局规划器重新规划,绕开新的障碍物。 |
10. Optimaltime为规划所需的时间 |
越大走的速度越快,倾向于不掉头直接走,因为这样省时间。 |
11. Min_obstacle_dist |
TEB 内部 footprint 轮廓边缘与障碍物之间期望保持的最小安全距离。一旦距离 < min_obstacle_dist,优化器会施加巨大代价惩罚,尽力推开轨迹远离障碍。这是优化目标约束(软约束),不是物理碰撞阻断。在极端情况(通道极窄、无路可绕)下,TEB依然有可能算出距离低于该值的轨迹; 调的太小局部路径容易靠近障碍物,导致失败;太大会导致进不去较窄的门或通道。 |
12. 在空旷的场景下,局部障碍更新到全局地图后,当局部障碍消失后,全局地图一直未刷新的问题,只有当局部障碍出现在未刷新的障碍物后面时才会刷新之前的障碍物。 |
将全局地图的inf_is_valid设为 true。 inf_is_valid:是否将数值为无穷远(inf)的激光雷达数据视为有效, 由于我们三维转二维的激光代码是超过20m的点都被设置为无穷远(inf), 所以这里要设置为true, 否则若20m以外的点被设置为无穷远, 20m以内的移动障碍物消失后,空旷场景下,20m以外的障碍物数值为inf不被视为有效,故不会刷新全局地图中的障碍物,除非出现20m以内的障碍物才会被刷新。 |
13. observation_persistence设为0.25导致的,局部地图不保留,导致rviz无法显示 |
将局部地图中的observation_persistence设置为0,即可解决。 解释:observation_persistence本身是障碍物栅格保留时间,设为0.25直觉上是应该留存的更久。实则因为TF树时间戳的断裂,导致障碍物的时间戳与odom的不匹配,导致0.25s以内没有所匹配的数据,只有当设为0 s时,意思就是,只显示当前的障碍物栅格数据,故可以找到。 |
| 14. 由于速度太快可能会出现偏离路径,导致导航陷入障碍物,可以适当将teb中的机器人模型变窄,增加掉头成功的概率。 |
15. 调参costmap footprint > TEB vertices的优势 |
解释:
作用:TEB 优化轨迹时,模拟机器人沿着轨迹运动,实时检测多边形与地图障碍物距离。TEB 生成一串轨迹点(x,y,yaw),沿着这条轨迹,每隔一段时间放置机器人多边形(vertices)。 不断计算,多边形到 costmap 内障碍物的最短距离,对比 min_obstacle_dist,判断这条轨迹安不安全。 costmap footprint > TEB vertices效果: costmap 轮廓左右宽 3cm 地图上禁区更大。 现象:全局规划会主动避开较窄区域;若机器人本身已经陷入窄通道,几何上 TEB 多边形可以通过,会增大通行的可能性。 适合:预留摆动裕量,防止机器狗步态晃动撞墙 代价:有效通行宽度变小,0.5m 窄门更容易被判定不可通行。 |
激光点云 ↓ local_costmap(使用 costmap footprint 膨胀障碍)←—— global_costmap ↓ 全局规划器(Smac)【使用 costmap footprint】规划全局路径 ↓ ControllerServer(TEB) ↓ TEB优化轨迹:读取costmap障碍信息 + 使用【自身vertices多边形】碰撞校验 ↓ 下发速度指令给机器狗模式 1:costmap footprint > TEB vertices
costmap 轮廓左右宽 3cm 地图上禁区更大。 现象: 全局规划会主动避开较窄区域; 即便几何上 TEB 多边形可以通过,但是 costmap 已经标记危险,TEB 很难生成贴近障碍的轨迹。适合:预留摆动裕量,防止机器狗步态晃动撞墙代价:有效通行宽度变小,0.5m 窄门更容易被判定不可通行。
模式 2:costmap footprint == TEB vertices(工程标准推荐)
两套一模一样。 全局规划判断标准 = TEB 局部规划判断标准,逻辑统一,行为可预测,最容易调试。 想要安全余量,不去修改轮廓,调节inflation_radius/min_obstacle_dist。
模式 3:costmap footprint < TEB vertices(不推荐)
地图禁区画的更小,但是 TEB 机器人轮廓更大。 重大风险: 全局规划算出一条路径,认为可以通过;TEB 仿真行走时发现碰撞,不断拒绝轨迹、持续震荡、频繁规划失败。 也就是:全局觉得能过,局部规划一直卡死。
下面是不同规划器的路径特征:
theta*+teb
theta*+mppi
