TEB轨迹规划算法教程-常见问题
TEB轨迹规划算法教程-常见问题
说明:
- 介绍使用TEB轨迹规划算法常见问题以及解决
问题A
- 为什么我的机器人导航太靠近墙壁和/或切角?
解决:
- 在costmap配置中定义/增加通胀半径。
- 参数min_obstacle_dist可能会增加,但这可能会导致在小走廊或门中出现不希望的导航行为(请参阅轨迹中的间隙)。
- 本地规划器“遵循”全局规划中一个移动的虚拟目标。
- 因此,全局规划的中间位置显着影响本地规划的空间行为。
- 通过定义膨胀半径,全局规划更倾向于最低成本,因此规划与墙壁分离更高。
- 注意,teb_local_planner本身不考虑膨胀半径。
- 由此产生的运动是时间最优的w.r.t. 虚拟目标。
- 如果您希望更多地遵循全局路径,请参阅全局路径跟踪。
- 如果您的机器人撞到墙壁,您应该增加min_obstacle_dist或设置适当的足迹(请参阅本教程)。
问题B:
- 为什么我的机器人不能正确地遵循全球计划?
解决:
- 默认规划标准是时间最优性,但您可以轻松自定义它。
- 默认情况下,遵循全局规划是通过定位从本地代价地图范围内的中间全局规划位置获取的移动虚拟目标来实现的(特别是具有长度max_global_plan_lookahead_dist的全局计划的子集,但绝不会超出本地代价地图的边界)。
- 当前机器人位置和虚拟目标之间的本地规划受到优化,例如,最小化过渡时间。
- 如果机器人更愿意遵循全局规划而不是在最短时间内达到(虚拟)目标,那么第一个策略可能是显着减少max_global_plan_lookahead_dist。
- 但是不推荐这种方法,因为它减少了预测/计划范围并削弱了避开障碍的能力(虚拟目标在当前版本中是固定的,因此不需要优化)。相反,为了考虑全局路径跟踪,teb_local_planner能够沿全局计划注入吸引子(via-points)(吸引子之间的距离:global_plan_viapoint_sep,吸引力:weight_viapoint)。
- 有关详细信息,请参阅教程遵循全局计划(Via-Points)。
问题C:
- 导致以下行为的原因是什么?
解决:
- 参数min_obstacle_dist选择得太高。
- 只是一个例子:如果参数min_obstacle_dist设置为1米的距离,机器人会尝试与门的每一侧保持至少1米的距离。
- 但是如果门的宽度只有1米,优化器仍将计划通过门的中心(局部最小值:避障的结果是在中心相互抵消)。
- 但是为了满足每个姿势的最小距离,优化器沿着轨迹移动计划的姿势(含间隙!)。
- 目前,规划器未检测到此情况。 但是,如果存在任何冲突,可行性检查可能会检测到这种情况。
- 如果你真的必须与障碍物保持很远的距离,你就无法开过那扇门。
- 然后,您还必须正确配置您的全局规划(机器人足迹,膨胀半径等),以通过它进行全局规划。
- 否则减小最小距离,直到轨迹不包含任何大间隙。
问题D:
- 如果目标姿态在机器人后面,并且开始和目标姿态的方向相似,为什么机器人要切换方向?
解决:
- 如果目标是在本地地图里,它应该正常工作。否则,取决于全局规划者如何选择中间取向。
- teb_local_planner选择全局计划中的姿势作为中间目标,直到达到实际目标(全局计划的最后一个姿势)。
- 但是,由于并非所有全局规划都指定有效方向而仅指定位置(例如,navfn),因此teb_local_planner默认覆盖全局计划方向(参数global_plan_overwrite_orientation)。
- 它实现了前向定向运动,使得姿势的方向始终指向连续姿势。 这种前向模式足以满足许多应用。
- 但是,在某些情况下,您可能希望具有不同的行为。
- 请参考下图,其中机器人应沿着走廊后退。 选择目标方向与开始方向类似:
你可能会同意,在这种情况下改变方向是不合适的。
但是,您可以设置global_plan_overwrite_orientation=false 来考虑全局规划中的取向。
使用global_planner取代navfn的规划器提供了多种选择方向的策略。
在撰写时,实施以下策略:
- None 无 (只有全局方向)
- Forward 前进(方向指向路径上的下一个点)
- Interpolate 插值(方向是开始和目标姿势的线性混合)
- ForwardThenInterpolate (向前方向直到最后一个直线,然后线性混合直到目标姿势).
下图显示了在选择Interpolate模式的情况下teb_local_planner在上一个场景中的行为:
- Interpolate模式在这里表现得很完美。
- 但是,让我们假设走廊包含曲线,在这种情况下,插值不是我们想要的,因为它只是评估开始和目标方向。
- 向后是合适的(Forward + pi),但是,这还没有在global_planner包中实现(至少在这个pull请求被合并之前)。
- 在实际应用中,我们有时可能需要前进模式,有时需要后退模式,因此您需要提出更智能的策略,例如: 走廊检测(注意,只有全局规划器可以使用全局地图执行此操作)。
- 目前,您需要为此编写自己的全局规划器,或者您可以扩展全局规划器包。
- 注意,teb_local_planner参数allow_init_with_backwards_motion需要设置为true,以便开始和当前中间目标之间的轨迹(例如,从采样独特拓扑中获得)也用向后方向初始化(仅在目标落后于开头时具有相似性) 方向)。
- 这也允许机器人在本地代价地图中正确后退,即使除了最后的中间方向之外的所有方向都是向前的。
问题E:
- 计算本地规划对我的机器人来说需要太长时间。 我可以加快规划吗?
解决:
- 规划受到计算要求的优化。
- 然而,计算时间受许多参数的影响,并且通常可以通过专用的自调整参数集来实现令人满意的导航行为。
- 以下列表提供了显着影响计算时间的参数的简要概述和含义。
本地costmap_2d配置
- Local costmap_2d configuration (a rolling window is highly recommended!)
- width/height:
- 局部代价地图的大小:意味着最大轨迹长度和考虑了多少占用的单元(对计算时间的主要影响,但是如果太小:短预测/计划范围降低了自由度,例如用于避障)。
- resolution:
- 局部代价地图的分辨率:精细分辨率(小值)意味着需要优化的许多障碍(对计算时间的主要影响)。
teb_local_planner的障碍/代价地图参数:
costmap_obstacles_behind_robot_dist
由于局部代价地图以当前机器人位置为中心,因此不必考虑机器人后面的所有障碍物。
为了允许安全的转弯行为,该值应该是非零的。 较高的值包括更多优化障碍。
obstacle_poses_affected
考虑轨迹上的最近邻居的数量(增加每个障碍物的距离计算的数量)。
对于小障碍物和点障碍物,该值可以很小(<10)。
如果轨迹在靠近障碍物时不够平滑,则再次增加该值。
footprint_model
机器人足迹模型影响运行时间,因为距离计算的复杂性增加(如果可能,避免多边形足迹)。
可以通过激活rviz中的teb标记来显示足迹。
通过注册/激活costmap_converter插件,还可以将costmap-obstacle预处理移动到另一个线程中。
这些插件旨在将局部代价地图单元(许多点障碍)转换为几何图元(点,线,多边形)。
还可以过滤障碍物内部的冗余单元或单元。
但到目前为止,可用的转换插件仍处于试验阶段,有许多更有效的方法可以预先处理成本映射。
轨迹显示:
- dt_ref
- 确定所需的轨迹分辨率:小值导致精细分辨率,从而更好地逼近动力学模型,但必须优化许多点(对优化时间的主要影响)。
- 太高的值(> 0.6s)可能导致不再可行的轨迹,因为动力学模型的近似性差(特别是在类似汽车的机器人的情况下)。
- max_global_plan_lookahead_dist
- 限制到虚拟目标的距离(沿着全局规划)并且因此限制经受优化的姿势的数量(姿势之间的时间距离约为dt_ref秒)。
- 但长度也受当地costmap大小的限制
优化参数:
- no_inner_iterations
- 每个“内迭代”中的解算器调用数。 高度影响计算时间,但也影响解决方案的质量。
- no_outer_iterations
- 每个采样间隔的外部迭代次数,指定调整轨迹的频率以计算dt_ref的频率以及更新障碍与计划姿势之间的关联的频率。
- 每次迭代都会调用求解器。 该值显着影响计算时间以及收敛性。
- weight_acc_lim_*
- 您可以通过将权重设置为0.0来忽略加速度限制。 通过这样做,可以降低优化的复杂性并因此减少计算时间。
替代轨迹的并行计划:
- enable_homotopy_class_planning
- 如果计算多个备选项时只有计时问题,请将备用计划设置为false或首先使用max_number_classes限制备选项的数量。
- max_number_classes
- 限制可以优化的替代轨迹的数量。 通常有两种选择就足够了(避免在左侧或右侧出现障碍)。
- 还有关于roadmap_graph(roadmap_graph_ *)的采样的其他参数,如果在启用同伦类计划且最大值的情况下计算时间仍然太长,则可以调整这些参数。
- 上述两个是可以替换的。
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号