Navigation2和TEB局部规划器调参问题及解决办法
1. 局部栅格地图更新太慢导致转向时点云抖动或者移动障碍物导致的局部占据栅格会长时间停留导致无法路径规划。原因voxel_layer时3D体素的处理计算开销很大会产生更新延迟。解决将voxel_layer的插件换成obstacle_layer obstacle_layer是纯 2D 射线投射计算极快匹配传感器实时帧率。场景适用性voxel_layer 适用需要区分高低障碍物、台阶、悬空杂物的场景室内高差复杂、巡检机器人代价是计算慢、动态转向易留拖影。obstacle_layer 适用地面移动机器狗 / AGV 仅检测地面障碍、以局部实时避障为核心的场景更新速度快彻底解决转向点云抖动残留的栅格导致的路径规划失效问题。2. 局部地图 inflation_radius 膨胀半径设置地图膨胀半径越大碰撞圆出现得越早、视觉范围越大。​3. 若经常出现上图卡在拐角的情况。全局和局部地图的膨胀区太小导致机器人的局部路径太靠近障碍物障碍物检测时发现会撞到障碍物导致导航失败。Teb的采样间距太大可以调小一下两个参数。global_plan_viapoint_sep: 0.01 #空间间隔米 → 全局参考路径的几何采样dt_ref: 1.0 #dt_ref: TEB 相邻两个轨迹点之间期望时间间隔4. Yaw 角左右摇摆分析与调参建议最小角速度过高。min_vel_theta: 0.8 # ← 这是罪魁祸首min_vel_x: 0.4 # ← 也偏高问题所在 机器人只需要一个很小的角速度修正比如 0.15 rad/s就能对齐路径但 TEB 被约束不能输出低于 0.8 rad/s 的角速度。于是机器人旋转了 0.8 rad/s 的量——过头了。下一周期 TEB 发现偏过来了又输出 -0.8 rad/s 反向修正——又过头了。如此反复yaw 角就在路径两侧来回摆。强迫机器人高速转向。weight_max_vel_theta: 100.0 # ← 过高这个权重告诉优化器尽量让角速度接近最大值。它和 min_vel_theta: 0.8 叠加后机器人几乎被迫以高速旋转。调整为20.采样间隔太小。最主要的问题dt_ref: 1.0 #dt_ref: TEB 相邻两个轨迹点之间期望时间间隔调大dt_ref后整条预测轨迹上位姿点数量大幅减少global_plan_viapoint_sep: 0.01 #空间间隔米 → 全局参考路径的几何采样global_plan_viapoint_sep越小越紧贴全局参考路径不会大幅偏离。但是可能会有锯齿导致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_factor0.01时膨胀层向外代价降低的最慢膨胀层也就越大但是最大不超过inflation_radius的大小。原始障碍栅格绝对禁区向外扩展 robot_radius模拟机器人本体占用区域再向外扩展 inflation_radius额外预留安全缓冲带​6当全局的footprint大于局部的footprint时比较容易避开拐角的障碍物。local_costmap:ros__parameters:robot_radius: 0.15global_costmap:ros__parameters:robot_radius: 0.2​​7. 调节这个参数可以解决强制走大弧导致的速度很慢且卡住。weight_kinematics_turning_radius: 1.58. 想要优先掉头转向而不是倒车过去allow_init_with_backwards_motion: False # 是否允许机器人倒退运动weight_kinematics_forward_drive: 100.0 #前向运动权重,越高算法越不希望机器人倒退越低算法越容易让机器人倒退,实际是倒车的动作越多。9. 全局路径总是穿过动态障碍物或者是相对于全局静态地图实际障碍物有所更新的地方将global_costmap的obstacle_layer的enable设置为true。开启后全局地图静态地图实时激光雷达观测的地图可以使全局规划器重新规划绕开新的障碍物。10. Optimaltime为规划所需的时间越大走的速度越快倾向于不掉头直接走因为这样省时间。11. Min_obstacle_distTEB 内部 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的优势解释costmap footprintlocal/global_costmap 里的作用构建代价地图时代表机器人本体外形用来做障碍物膨胀、碰撞预检测。工作流程激光雷达观测障碍物 → 根据 footprint inflation_radius 向外膨胀障碍物区域。如果机器人中心进入这块膨胀区就判定会碰撞。影响全局规划路径、nav2 碰撞检测、恢复行为spin/backup碰撞判断TEB 内部 verticesTebController 下的机器人多边形作用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多边形】碰撞校验 ↓ 下发速度指令给机器狗模式 1costmap footprint TEB verticescostmap 轮廓左右宽 3cm 地图上禁区更大。 现象 全局规划会主动避开较窄区域 即便几何上 TEB 多边形可以通过但是 costmap 已经标记危险TEB 很难生成贴近障碍的轨迹。适合预留摆动裕量防止机器狗步态晃动撞墙代价有效通行宽度变小0.5m 窄门更容易被判定不可通行。模式 2costmap footprint TEB vertices工程标准推荐两套一模一样。 全局规划判断标准 TEB 局部规划判断标准逻辑统一行为可预测最容易调试。 想要安全余量不去修改轮廓调节inflation_radius/min_obstacle_dist。模式 3costmap footprint TEB vertices不推荐地图禁区画的更小但是 TEB 机器人轮廓更大。 重大风险 全局规划算出一条路径认为可以通过TEB 仿真行走时发现碰撞不断拒绝轨迹、持续震荡、频繁规划失败。 也就是全局觉得能过局部规划一直卡死。下面是不同规划器的路径特征theta*tebtheta*mppi

相关新闻