前言

本来这期内容是讲解我们设计的仿真思路的,但是为了不影响比赛公平性,这部分内容就放在提交代码之后啦~~ 这两天很多同学问了我很多问题,其中比较多见的问题就是对TEB的参数如何整定,很多人不知道从何入手,也不知道自己车的现象是哪些参数导致的。所以这期就来讲解一下TEB算法和DWA算法的区别,以及如何去调节TEB的参数。

正文

由于去年的比赛和今年的比赛我们使用的规划算法不同,所以我会说明一下我对这两个算法的用后体验叭,当然还是着重讲解一下我们今年使用的TEB算法的参数调节经验。

DWA算法

DWA算法是比较普遍使用的,但是这个算法对我们的比赛题目来说并不是最合适的算法。
# Differential-drive robot configuration - necessary? 差分机器人配置参数
  holonomic_robot: false
   #是否为全向机器人。 值为false时为差分机器人; 为true时表示全向机器人
其中的参数很明显的说明了DWA算法针对的机器人模型是差分机器人,或者全向机器人,这些机器人都是至少能够做到原地自转的。不过由于我们比赛采用的是阿克曼模型的车模,所以严格来说这套算法是不太适合的。再加之整个比赛是以竞速为目标的,因此在使用该算法调参的过程中,会有很多矛盾的地方。 比如比赛中,像上图这种地形,最佳的路径其实应该是近似一条直线的。但是DWA的算法则有一个矛盾的点,就是由于针对的模型不匹配,导致无法设置转向半径这个很重要的参数。因此想让这种弯道的路径变得尽可能接近直线,只有通过减小墙体的膨胀系数才能实现。否则路线则会接近地图上这条弯道的弧度,不过减小膨胀层又会面临另一个问题,那就是无法很好的避开障碍物。这就让人陷入两难的境地了。 不过一般用于slam的智能车,为了使定位精准,运动灵活都会采取差速机器人的模型,所以DWA也是普遍运用的一种算法。 下面进入重点,我们这次比赛用到的TEB算法。

TEB算法

其实去年比赛就有一些队伍发现了DWA算法的不适配性,并转而采用了TEB算法,我依稀记得当时卓大大公众号上的视频里有个队伍的车能够倒车避让障碍,我当时是很佩服的,因为那时候对ROS的了解甚少,不知道还有其他可用的算法包,而且当时也觉得倒车这种行为反而会很费时间,并不是好方法,也就没有去研究。不过事实证明,TEB算法是能更好的被阿克曼模型利用的。 我有提到过TEB比DWA更适合竞速更适合阿克曼模型,就是因为TEB的有个很重要的参数,就是最小转向半径,这个也是阿克曼模型的特色。但为什么说TEB适合竞速呢,其实是因为weight_optimaltime这个参数。 下面我开始介绍TEB相关参数,以及我的调参经验。

上面是关于轨迹的一些参数,包括分辨率,采样点数等,不过这些参数我都没改,也没动,所以我觉得并不是特别关键的参数了。

上面这些是关于机器人的参数,这些就开始会影响车的行驶效果了。max_vel_x和acc_lim_x是速度与加速度的约束,整个车模运行过程中的加速过程和减速过程都会受这两个参数的制约,如果电机性能好,可以直接把acc_lim_x设置为0,表示没有约束。 后面的角速度和角加速度约束也是同理,制约舵机转向的速度和加速度,左右转动的过程也都受这个限制。但是不代表你限制高了,转向的速度就快了,还有高速的转向也可能会带来振荡! max_vel_x_backwards是最大倒车速度,这个参数是不能设置为0或者负数的,否则会导致错误,TEB是不能够完全禁止倒车的,只能把倒车的惩罚提高,也就是提高前进的权重,但是不管权重多高,当你参数不合适,无法规划出前进的决策时,还是会出现停滞或者倒车的结果的。除非你速度控制不用规划器发布的/cmd_vel话题。 min_turning_radius就是最小转向半径了,这个参数还是比较重要的!可以大致估算,不过转向半径肯定在一米以内,可以按需设置,转向半径如果大了,U形弯就会外道入弯,能比较轻松过弯,不过小弯道的时候也会贴外侧,这样会比较浪费时间,但是如果小了,小弯会贴内,节省时间,但是U形弯就会内侧入弯,那就有可能过不了弯了。所以需要自己调节一下。 wheelbase是驱动轴和转向轴之间的距离,根据车模实际情况设置就好。 cmd_angle_instead_rotvel是是否将收到的角速度消息转换为操作上的角度变化。设置成True时,话题cmd_vel.angular.z内的数据是舵机角度。 然后后面有些参数我基本没动过的,我就不做讲解了,不过不是因为不重要,而是我不刻意调节那些参数也能达到比较好的效果。

上面这部分是关于障碍物的参数。min_obstacle_dist是与障碍物的最小期望距离,米为单位。按需设置就好了,如果你定位够精准,0.1m也是不会碰撞的,不过由于控制过程中速度的变化,以及里程计一定范围内的漂移,所以稍微设置大一些是必要的。 inflation_dist这个是障碍物周围的缓冲区,进缓冲区会导致规划器减速,不过这个值得比min_obstacle_dist大才有效。至于缓冲区给多少厘米呢,你们按需设置。 include_costmap_obstacles这个必须设置成true才能规避实时探测到的,建图时不存在的障碍物,有些同学的车规划出的路径不避障,则可以看一下这个参数是否正确。 costmap_obstacles_behind_robot_dist是考虑后方n米范围内的障碍物,设置的越大,考虑范围越广,不过相对而言计算量就越大,不过不能超过局部规划的区域,所以~~按需设置。其余几个参数就不做讲解了,并不是不重要,只是我没怎么用到。(●ˇ∀ˇ●)

上面这些参数就相当重要了,这些都是优化器的参数,都是对一些决策的权重设置。 从penalty_epsilon开始,这个参数会为速度的约束提供一个缓冲的效果,就是在到达速度限制前会产生一定的惩罚让其提前减速达到缓冲的效果。 weight_max_vel_x这个是最大速度的权重,后面还有最大角速度权重,以及加速度,角加速度权重,在整个运动过程中以主要以高速还是低速运行,则是看这些权重的分配。 weight_kinematics_forward_drive这个参数就是你们比较厌恶的倒车了,不过这个参数的意思是迫使机器人只选择前进的方向,也就是权重越大,倒车惩罚越大。这个权重的范围是0~1000,按需设置吧,不过即便是设置成1000也没有办法完全禁止停滞,倒车的效果。因为是否能前进,不仅仅只是看这个参数。还需要看转向半径,当前速度,等等一系列参数的决策。 weight_kinematics_turning_radius是机器人最小转向半径的权重,越大则越容易达到最小转向半径的情况。范围同样是0~1000,按需设置。 weight_optimaltime这个参数就是为什么我说TEB适合竞速的原因,这个参数是最优时间权重,如果大了,那么车会在直道上快速加速,并且路径规划的也会切内道,这是DWA算法只能靠膨胀缩小来实现的。这个参数越小,整个过程的车速会越稳定。我试过了0.5和2.5这两个值,差距还是蛮明显的,各位可以自己试试看体会一下,范围同样是0~1000。 剩下的权重参数我就都没怎么调了,按默认参数即可,不过也可以尝试了解之后再去调试。
TEB还提供了恢复措施,可以将卡在杂物中的机器人,或者路径规划错误的机器人恢复到正常状态,参数在TEB的末尾。 同时不光TEB的参数,move_base包中的其他yaml文件也同样值得关注,以及amcl的launch文件中的参数。
最后给大家推荐一下调参利器~~
rosrun rqt_reconfigure rqt_reconfigure
就上面这行命令就行,比在yaml里调节直观的多~~ 点上期题,工欲善其事必先利其器~~ 哈哈哈哈哈

总结

第一期内容结尾的仿真效果,是调节了TEB的参数之后达到的,并且完全采用了cmd_vel的话题,控制方面也没有自己diy。 不过整个TEB算法庞大的参数体系,的确是需要认真研究,才能够更有效得调节的,不然盲目调节自我感觉对的参数,只会从一片迷茫调到下一片迷茫。 原本近期是准备上我们仿真的方案的,我针对TEB的算法同样测试了两种控制方法,思路,以及最后的效果视频。不过由于可能会影响比赛公平性,因此等提交代码后再与大家讨论~~ 免费教学,喜欢的可以点个赞,谢谢啦~ 这次一定,这次一定~~