` 现在很多餐厅,都用上了送餐机器人,机器人能端着盘子蹭蹭蹭地自动上菜。
送餐机器人
这个有点厉害呀,无人餐厅的第一步就靠它们了吧! 不过仔细看,这不是巡线小车吗?只要事先铺设好路线,它就会跟着指引线走。 但很多情况下,地上都没有指引线(比如室外),那要如何找路呢?目前有两种方式。 第一种:找参照物,规划好机器人的运动线路。比如下图,机器人从1向西运动x →距离西墙还有y时,右转90度→向北运动z ,到2。
参照物导航
这里假设运动距离和转向角度测量都是精准的,但其实是不可能的。 那么,问题又来了,如果机器人遇到障碍物,或者被人为挪动了,起点就会错乱。我们把“遇障碍”叫动态路径规划,“被挪动”叫机器人绑架问题。 我们就要用另一种方法——感知式系统。它会先得到地图(事先得到或者自己建立),然后对地图解析推理,得到最佳的路。就像手机导航,从地图中找路。 它能做更复杂的操作,比如自主定位、自主导航。像智能扫地机器人、无人车等就是用了感应式系统。
感应式系统导航
今天就来教大家用感知式系统导航。 宾夕法尼亚大学的Vijay Kumar教授在Coursera公开课上讲过,任何系统的导航,都由四部分组成:
状态估计(State Estimation):实现机器人的定位和感知; 建图(Mapping):建立所在环境的地图(如果事先没有给地图的话); 规划(Planning):制定能走的路; 控制(Control):控制机器人按照导航走。 定位(状态估计)和建图 这两部分经常被一起提起,他们就是大名鼎鼎的SLAM(Simultaneous Localization And Mapping,同步建图与定位)。 我们用一个最简单的一维定位问题,来看机器人如何定位。
红色曲线是传感器得出的位置分布概率 黑色曲线是传感器和已知的地图信息,一起得出的位置分布概率
在这个问题里,三个门的相对位置是已知的。机器人一开始不知道自己在哪,所以黑线(表示概率)没有起伏。(a图)
前进时,机器人发现了一扇门,它立马确定自己在一扇门旁边,但不知道哪一扇。所以机器人在三扇门位置的概率都升高了。(b图)
考虑到误差等因素,其在其他位置的概率并没有等于0。 我们继续走,发现了另一扇门。根据两扇门的相对位置(地图提供),机器人确定自己在第二扇门的旁边。(d图)
现在,机器人基本确定了自己的位置,完成了定位。无人车在3D地图中,也是靠这种方法定位。
无人车激光雷达生成定位地图 那万一机器人走进沟里、爬树上了怎么办?我们也有对策。平面中,常用二维栅格地图,地图会被切成一个个小格。
我们可以用“0”和“1”来表示这个格子是否可以通过,最终得到了相应的地图。 格子越小,地图就越精确,不过占用的存储空间也就越大。 接下来就要建图(建立地图),过程涉及到概率的知识,这里不展开讲。
白色为可通行范围 黑色为障碍物边缘
有兴趣的同学可以参考Sebastian Thrun(谷歌无人车之父)的《ProbabilisticRobotics》第九章,有很详细的讲解(本书的中文版《概率机器人》已在17年5月出版)。 最后放一个移植的Gmapping开源方案的SLAM,大家随意感受一下什么是SLAM。
右下为机器人在建立的地图中走
规划 现在有了定位和地图,可以开始导航了。就像手机导航一样,我们需要知道起点和终点,然后找到一条路。关键就在“路”的选择上,需要考虑很多因素。 举个栗子,我在西安上学,打算自驾去拉萨看布达拉宫。小学学过,两点之间直线最短,我就沿着直线跑。
跑着跑着发现不对头,这路都是土路、山路、峡谷,耗油量反而更高了!于是规划出另一条路,尽量绕开山坡,同时保证路径最短。
机器人的运动同理,需要考虑全局规划(路径短)和局部规划(绕障碍),最后得到最佳的路径。
无人机规划路径
经典的规划算法有A*、D*、RRT、RPM等,其中D*和RRT算法比较有代表性。 下面的是D*算法的仿真,红点是临时加入的“障碍物”,可以看出它有抗动态干扰的能力。NASA的火星车就使用了D*算法。
D*算法
RRT算法是一种基于采样的路径规划算法,它也能抗干扰,而且消耗资源更少。
黑线规划出的所有的路径 红色是连接终点和起点的路径
控制 控制就是让机器人动起来,并且动得很精准,主要包括对底盘的运动控制和电机的PID控制。
实战一下 对导航有基本认识后,我们来现学现卖一把。 以我们为RoboMaster ICRA参赛队开源的RoboRTS为例。RoboRTS可以让机器人在已知地图中,实现自主定位和导航,还能对特定目标(装甲板)识别、跟踪和打击。 从github网站上下载源代码,按照网站上的说明进行编译即可运行。 链接:https://github.com/RoboMaster/RoboRTS
代码分析 我们简单分析源代码,主要分为perception(感知)、decision(决策)和planning(规划),包含了我们上面讲的定位、规划等。 perception部分主要实现了定位和感知功能。(地图已知,不需要进行mapping;感知用于探测步兵机器人的装甲板,提供打击目标) decision部分进行决策,将任务交给planning部分进行规划路径,实现整车的运动。
编译程序 运行tools目录下的run_simulator.sh,可以得到Rviz输出:
这里将地图换成了RoboMaster赛场。物理模型是通过stage进行模拟,感兴趣的同学可以自行学习相关知识。 我们查看其具体情况:
程序运行后,系统里共有六个节点: LocalizationNode节点结合tf信息(这里tf可以理解为传感器信息)以及map_serve节点提供的map信息(事先保存的地图),确定自身的位置; decision_node节点进行决策后,由local_planner_node节点和global_planner_node节点共同作用进行运动路径规划。
路径规划
上图中,红点代表机器人(如果放得足够大,会发现是许多小箭头),黄线的代表模拟的激光雷达采集到的数据; 绿线代表全局路径(global_planner_node节点得出),红线代表局部路径(local_planner_node节点得出),机器人导航就实现了。 ◆◆◆ 以上只介绍了系统的基本知识。想要研发自己的机器人,还需要补充ROS系统、C++编程等方面的知识,希望大家再接再厉,早日做出最牛的机器人!
`
|