说起全国大学生智能汽车竞赛,古月君有滔滔不绝的内容可以分享,自大二开始,我从懵懂少年跟着师兄比赛,到自己挑大梁拿到国一,再到带队挣得全国前三,基本就是大学本科的青春。
再说到ROS,古月君就要泪流满面了,告别智能车竞赛,我就结识了ROS,然后一用就是8年,从移动机器人到机械臂,从博客《ROS探索总结》到图书《ROS机器人开发实践》,更是我的青春!
所以看到19年创意组的题目,古月君还是有点激动的,这里就给大家梳理一下技术要点,祝大家拿到好成绩!
一、思路梳理
赛题要求并不复杂,一辆ROS小车在如下赛道上自动行驶,避开随机摆放的障碍物(锥桶)到达终点,速度快者为胜。
这是一个简易化的无人驾驶场景,不仅要求小车具备一定智能避障的能力,还要快速完成比赛。类似的工作有一些可参考的开源项目,比如MIT的racecar项目:
参考链接:RACECAR
另外台湾还有一个Hypha ROS Workshop,也做了一个类似的racecar开源项目:
该项目的具体资料欢迎关注微信公众号“古月居”,后台回复“racecar”下载
上边的赛题和视频乍看上去并不复杂,仔细一想涉及的问题还挺多:
1. 测试时的地图如何构建?构建地图的精度是否会对后续的工作产生影响?
2. 如何快速识别障碍物并且让小车切换路径完成自主避障?
3.小车如何知道自己所在的位置?又如何规划一条到达目标位置的最优路径?
4.小车可以完全按照最优路径前进么?如果偏离航向怎么办?
5.小车的软硬件如何实现?怎么让它跑的又快又稳?
6….
列出这些问题后是不是感觉一头雾水?我们用一个简化的场景来理一理思路。
古月君毕业后找到一份工作,对公司周围一无所知有些忐忑,万一第一天上班就迟到了可不妙,于是决定在正式上班前去公司周围踩下点,慢慢溜达着把附近的情况熟悉了一下,默默规划一下明天上班的捷径。 于是第二天古月君有条不紊的向公司进发,心想按照昨天规划好的路一定可以很快到达公司。可惜刚走了一小段,意外发生了,前方临时修路不能走,古月君心里一慌,但很快淡定下来,还好昨天来踩过点,旁边还有一条小路,虽然会远一点,但可以绕过施工路段到公司。于是古月君就一路小跑,顺利从这条小路到达了公司,虽然比预期晚了一点,不过还是第一个到公司的新人,感觉自己棒棒哒,走上人生巅峰不是梦了!
好啦,古月君还是要从梦里清醒过来,回到正题,上边的场景其实就是这次的赛题内容:
这样我们就通过对比,梳理得到了赛题需要研究的关键技术:
1. ROS小车平台的搭建:解决怎么做车的问题
2. 定位:解决车在哪的问题
3. SLAM建图:解决赛道地图信息的问题
4. 全局路径规划:解决最优路径规划的问题
5. 本地路径规划:解决动态躲避障碍物的问题
只有明确了这些关键技术,我们才能各个突破,实现目标。当然,ROS是实现以上关键技术的核心工具。
二、ROS是什么
赛题中的关键技术都离不开ROS,那ROS是什么呢?
1. ROS的核心是一个分布式、低耦合的通讯机制;
2. ROS提供多种机器人开发工具,可以快速实现数据可视化、机器人仿真等功能;
3. ROS开源社区中包含大量机器人应用功能,可以帮助我们快速开发功能原型;
4. ROS已经成为一个庞大的生态系统,包含机器人领域的方方面面,同时也得到了越来越多第三方工具的支持,为机器人开发提供了系统化的解决方案。
ROS发展迅猛,已经成为机器人领域的事实标准,基于ROS开发的百度Apollo无人车更是在春晚舞台上得到了广泛赞誉。
三、ROS小车的实现架构
再来看下ROS小车的实现架构,官方已经提供了如下架构的小车:
- 主控电脑是整个系统的“大脑”,负责处理外部传感器采集传来的信息,进行各种功能计算,并向下传达控制指令;
- 激光雷达是系统的“眼睛”,通过光线的反射原理,测量周围障碍物与自身的距离信息;
- 姿态传感器是系统的“前庭”, 检测自身的运动状态和空间位姿;
- 单片机是系统的“脊髓”,接收主控下发的控制指令,驱动执行器完成相应的运动。
搭载以上架构的车模已经由组委会提供,大家拿到后应该很快就可以把硬件平台搭建起来,重要的是理解各部分之间的关系。
四、ROS小车的定位
小车的定位有很多种方法,常见的方法如下:
1. 里程计定位:通过编码器获取电机/车轮在单位时间内的旋转圈数,计算得到速度,再积分得到位置;
2. 姿态传感器:姿态传感器可以感知小车的线加速度和角加速度,利用积分同样可以得到速度和位置;
3. 视觉定位:通过激光检测小车和周围物体的距离变化,计算位置;
前两种方法均会产生积分误差,第三种则不会。在实际应用中,为提高定位精度,我们往往会通过滤波算法来融合多传感器的信息,比如ROS中的robot_pose_ekf,就可以通过扩展卡尔曼滤波的方式,将以上三种定位信息融合到一起。
另外在ROS中也常用amcl来实现定位。amcl是一种自适应(或kld采样)的蒙特卡罗定位方法,这是一种概率统计方法,针对已有地图使用粒子滤波器跟踪一个机器人的姿态。
参考链接:
五、SLAM建立环境地图
SLAM问题可以描述为:机器人在未知环境中从一个未知位置开始移动,在移动过程中根据位置估计和地图进行自身定位,同时建造增量式地图,实现机器人的自主定位和导航。
想象一个盲人在一个未知的环境里,如果想去感知周围的大概情况,他需要伸展双手作为他的“传感器”,不断探索四周是否有障碍物。
当然这个“传感器”有量程范围,他还需要不断移动,同时在心中尽量整合已经感知到的信息。当感觉新探索的环境好像是之前遇到过的某个位置,他就可以校正心中整合好的地图,同时也可以校正自己当前所处的位置。
作为一个盲人,感知能力毕竟有限,所以他探索的环境信息会存在误差,而且根据自己的确定程度,可以为探索到的障碍物设置一个概率值,概率越大就表示这里有障碍物的可能性越大。
这样一个盲人探索未知环境的场景,基本可以表示SLAM算法的主要过程。
ROS 开源社区中汇集了多种SLAM 算法,都可以直接使用或进行二次开发,其中最为常用和成熟的是 gmapping 功能包。
gmapping 包集成了 Rao-Blackwellized 粒子滤波算法,为开发者隐去了复杂的内部实现。
gmapping功能包需要订阅机器人的深度数据、 IMU 信息和里程计信息,同时完成一些必要参数的配置,即可创建并输出基于概率的二维栅格地图。
参考链接:
六、ROS小车的自主导航
ROS有一套完整的导航功能框架,框架中大部分功能都可以使用ROS中原有的包,我们只需要封装好传感器信息,就可以像搭积木一样,把整个系统给搭建起来了。
想实现ROS小车的自主导航,用ROS中路径规划的功能包——move_base就可以搞定啦,它由两大规划器组成:
1. 全局路径规划(global planner)
根据给定的目标位置和全局地图进行总体路径的规划。在导航中,使用Dijkstra或A*算法进行全局路径的规划,计算出小车到目标位置的最优路线,作为机器人的全局路线。
2. 本地实时规划(local planner)
在实际情况中,小车往往无法严格按照全局路线行驶,所以需要针对地图信息和机器人附近随时可能出现的障碍物,规划每个周期内应该行驶的路线,使之尽量符合全局最优路径。
本地的实时规划由local_planner模块实现,使用Dynamic Window Approaches算法搜索躲避和行进的多条路经,综合各评价标准(是否会撞击障碍物,所需要的时间等)选取最优路径,并且计算行驶周期内的线速度和角速度,避免与动态出现的障碍物发生碰撞。
参考链接:
七、单片机驱动系统
定位、建图和导航都可以在上层的控制器中运行,最终运算的结果还是需要落实到具体的执行器上,在这里就是小车的舵机和电机,这就是单片机需要完成的驱动功能。
比如控制器规划得到小车的线速度和角速度,那么单片机收到指令后就需要控制舵机转向、电机旋转,这个部分当然会涉及到大家熟悉的PID控制,和智能汽车竞赛的其他组别内容一致,此处就不再赘述。
篇幅有限,这里先为大家梳理创意组中ROS小车的关键技术点,在具体实现的时候当然要具体挖掘每个点的潜力。
ROS是机器人开发中的重要工具,现在相关的资料也很多,ROS小车按照这些资料应该可以很快跑起来,但是也一定会发现很多问题。大家面对的是来自全国各地的高手,除了调整参数之外,算法优化和改进也是非常重要的,这部分更需要大家结合机器人理论来完成实践。
最后,如果大家对ROS有任何疑问,欢迎关注古月居网站和微信公众号“古月居”,或参考古月君的ROS秘笈——《ROS机器人开发实践》。