前言

本篇主要介绍我们队今年参赛的方案以及搭建过程,这篇本来是赛前一周就写好了的,不过还是等到赛后再来发了。体验完比赛,不得不感叹一下,大佬是真的多呀,嘿嘿嘿嘿

正文

相信大家都看过了北邮大佬提供的例程了,非常细致o( ̄▽ ̄)d,因此基础的关于工程搭建,功能包使用方面便不再详细赘述。

工程文件介绍

除了官方给的模型,地图等文件,我们工程里只有四个包。
rf2o_laser_odometry是去年ROS组比赛中使用的里程计文件,激光雷达里程计,当然和去年不同的是,今年仿真,我们仅仅只用了rf2o功能包计算出来的里程计,并没有采用ekf去优化里程计的数据。顺带一提,很多同学私聊我说,加入ekf融合之后会有定位漂移,或者定位来回跳等问题,这些问题的原因大致都是ekf_params.yaml中的参数没有仔细审阅,可以看我上一期内容提到的ekf参数,当然也有使用了多个里程计信息的可能,比如把rf2o输出的里程计以及ekf优化后的里程计都用于定位,则会出现位置跳变的现象。 如果使用的是robot_pose_ekf这个包的话,就没有上面提到的参数文件了,只需要配置好就能输出数据融合后的位置。 我赛前测试过,不用ekf漂移误差在30cm+,加上ekf之后会控制在20cm内。效果还是很好的。
teb_local_planner_tutorials文件夹里面主要需要的就是teb规划器的几个参数文件,如下图,相较于去年使用的DWA规划器,我觉得TEB是更加适合阿克曼模型的,也更加适合竞速。上一期内容已经提到了TEB规划器的参数如何调,以及其跟DWA规划器参数的对比。
zj_hector包里放的就是建图算法,去年比赛时我们用的是gmapping建图算法,但是很多人,包括北邮大佬的教程里也提到,用gmapping进行建图时,会出现墙体重叠,或者漂移等状况,让建的地图不够精准。因此我们也没有使用gmapping算法。不过这次选用hector算法的原因并不是gmapping建图不准,而是hector算法只需要提供激光雷达的接口就行了,不需要里程计,也就是说hector包会直接订阅/scan话题,非常方便。并且建图效果也不错。 下图即是用hector算法建立的地图。
zj_pkg包就是放了一些我们组的控制决策部分代码,里面包括对车模关节的整合驱动,遥控器的编写,以及控制算法的编写。这部分是我们整个工程的核心。

控制方案以及思路

在上期文章的末尾,我有贴上了我们组仿真的视频,当然也可以在卓大大公众号上看到,我们的车模也存在过弯会有倒车,以及卡停的情况。这是很正常的,下面我会讲两种控制方案,各有优缺点。
方案一:采用TEB规划器的数据控制
和标题一样浅显易懂,move_base功能包是利用传感器信息来控制车模抵达目标点的。在这个仿真中,则是通过激光雷达和IMU的数据来进行规划,这次规划器采用的是TEB规划器。因此我们只需要利用move_base包发布的cmd_vel的数据来进行车模的操控。 其中linear.x就是车头方向的速度,angular.z就是舵机角度。当然前提是已经转成阿克曼模型的数据了。在最后把速度赋值给驱动的时候可以适当的乘上一个系数,或者稍微做个分段优化一下都是可以的。 这个方案的主要难点就是在于TEB规划器等各个功能包的参数,需要很好的配合起来,才能有一个比较直观的效果,不然会出现很多问题,包括车头抖动,弯道卡停,路径出错,不断撞墙等等,很多现象,其实总结起来就是对参数的不了解。 上一期的结尾视频采用的就是这种方案。
方案二:重写控制算法
这个方案我也做了测试,是可行的,不过对算法有一定的要求。下面开始介绍,这种方案则只利用规划器规划出来的路径,并不考虑cmd_vel的数据。也就是说赋值给驱动的不是cmd_vel的数据,而是你控制算法计算的结果。 在上期的结尾视频里可以看到,我们的rviz上同样显示了三个点,这三个点的意义我也在上期的内容里做了介绍。这边我也重复一下吧,大致意思就是以车模路径前方一段距离上的三个点做三角形外接圆,并求此半径,以这个数据来代替曲率,计算舵机的打角,以及对速度的控制。 当然这个方法我上期有介绍过,存在参数多,调节复杂的问题,需要花费一定的时间,不过好处就是比起TEB或者DWA,自己写的控制肯定自己更了解,也能够快速的把参数调节到自己想要的结果。 这边我说一下流程,全程的曲率计算不光是计算前方一定距离的曲率,而是计算前方一段距离的曲率并取其中最大值,也就是半径最小值,作为控制参数。这是需要注意的一点,不然当你车行驶到弯道时,前瞻已经在直道了,这时会触发加速,导致车模在弯道失控。 下面我会放上视频,13个锥桶,速度由曲率决定。全程大概36秒,大致的效果就是,不会有弯道停滞,以及倒车的情况。

因此,结论就是,如果对参数不是很熟悉的话,自己重写控制算法能够尽可能发挥车模的极限,但缺点就是耗时耗力。通过了解整个控制规划器的参数去调节车模的话,能够在短时间内达到一个非常好的效果。当然如果能够完全吃透整个规划器的参数,那一定会比自己写控制算法好得多。不过这俩个方案达到极限都需要花费一定的时间去学习琢磨。

节点话题关系图

之前有同学问我们工程运行时的话题节点关系图,这边我就直接放出来给大家做一个参考。

赛后总结

最后总结一下,这一期介绍了我们本次参赛的工程框架,仅供参考,欢迎交流学习。 这边我放上一个视频,就是在参数调节的比较好的情况下,对路中间的障碍,以及弯道内侧的障碍,是可以通过的,不过因为只花了一点时间看,所以效果并不是特别好,还是会有踩到障碍上的情况,但是可以说明这些位置的障碍并不是一定会卡死车模的。

在看完这次比赛,这部分是我加上的感想,之前就两种控制方案的介绍,经过测试都能达到40s并且快的话是可以进到30多秒的。不过显然这次比赛里出现了20秒+的神车,虽然不知道大佬的方案是什么,但从比赛的视频中倒车的迹象是能够看出TEB算法的影子的。所以,读懂控制器的参数是相当的重要了。
如果有问题的话欢迎在评论区指出,大家一起讨论,或是有什么想了解的,我一定尽可能告诉大家,喜欢的话可以点赞收藏转发一键三连,谢谢啦~~ ヾ( ̄▽ ̄)Bye~Bye~