首先主要提到的就是关于一些对比ROS做出改进的地方
在一些通信架构中,单点故障问题是我们不可忽视的,而在ROS中,通信都是经过master节点进行发布和订阅消息。很显然如果master挂掉就会出现这个单点故障的问题。而apollo中每个节点会互相保存其他节点的信息
主要优点在于序列化方式统一,不同于ROS原有的为每一个消息都实现一个序列化方法
第二个优点在于,我添加和减少一个字段并不会妨碍我原有字段的解析(下图中添加或者减少红色的字段并不会影响原有的黑色的字段解析)
其实上面这几点也就是大家平时所讨论的ROS的一些缺点,做出了一些针对性的改进
接着介绍了apollo的现有架构
Open Software Platform
这个东西我在没接触之前一度以为好像没什么了不起的,就算他可能比点云或者深度图含有更多的信息,大概开始我对他的理解就是我们平时用的高德地图百度地图看到的那种。
后来发现其实它含有超级多的信息,我的理解是含有更多的语义信息,比如说会提前告诉你前方多少米有红绿灯,人行道。或者当前马路的车道信息。这里比较重要的一点就是在没上路之前,我的车就已经知道那里大概会有什么(这里和我们平时做的扫地机有所不同,扫地机的图是当场建的)
上面写了我的一些理解,也有可能不对。。如果哪天发现理解错了我会回来改的
首先是一个导读,大概讲述什么是定位
在上面那个例子中,如果告诉你现在离树有75m,那么你知道你大概是在树周围的一个圆上面,然后告诉你离房子有64m,那么就是两个圆的交接,最后告诉你离路灯55m,那么你根据这三个信息知道了自己的位置,在三个圆的交点
这里的GPS定位也就是我们平时手机导航用的那种,但是在实际使用中,由于光速太快,所以即使是小小的时间误差也会导致定位出现偏差,这里接着提出了RTK定位,在地面建立许多个地面基站
接着用地面基站校正接收器由于时间误差引起的定位误差
惯导也就是我们平时说的IMU,主要由加速度计和陀螺仪组成,加速度主要计算x,y,z三个方向上的瞬时加速度,陀螺仪计算RPY。那么考虑到上面提到的GPS的缺点,我们组合GPS和IMU进行定位
首先提到的是我们常见的ICP(迭代最近点)算法,通过旋转和平移最小化两组点云之间的误差
接着提到了滤波算法(其实滤波真的有很多种类),这里介绍的主要由直方图滤波,卡尔曼滤波和粒子滤波。这些我之前的文章里面有介绍。
在卡尔曼滤波中,惯导用于预测,GNSS和Lidar定位用于测量更新
2018/08/09 更新
预测其他车辆或者行人的移动,还有基于车道的预测。
下面的图中是两种预测方式的不同工作的方式。
第一种是Model-Based的方法
主要是依赖马尔科夫链和观测值来进行预测(这里的马尔科夫链视频中并没有明说,是我自己猜测的,图中白车是Turn Right还是Go Straight,会根据它的后续动作改变是右转还是直行的概率。比如说如果它拐到中间那条道我们可以认为它大概率是会直行,如果它没有变道而是直走则可以认为它大概率上会右转)
第二种是Data-Driven的方法
用Machine Learning的方法根据观测值和训练数据进行预测
首先介绍的是Route Planning,也就是路由,这个看起来和我之前文章里面介绍的global planner功能类似,用来计算path。但是城市环境中(Urban Setting)情况比室内环境要更加复杂一点,首先进行从世界到图的映射,总之我们也是根据输入的地图Map,当前位置Pose和目标位置Target来进行planning。
第二步也是类似我之前文章提到的local planner的功能,从路由到轨迹。轨迹中的每一个点都有时间戳,用时间戳与预测模块结合,确保路径上每个点都没有被占用。也就是一个三维的Trajectory(2D Position + Time)。同时我们也会为每个路径上的点指定一个速度,主要是用于确保它按时到达每一个路径点
第三步就是对轨迹(Trajectory)进行评估,比如一些运动学约束(非全向也就是行进方向只能与当前朝向相同),还有高速行驶的汽车是不可以做180度大转弯的。这里顺带提一下我之前文章里面有提到的扫地机,对比一下Trajectory评估的方式,在室内环境下是用小车当前位置到global path的距离和小车当前位置到目标点的距离来综合做评估打分的。
不同于笛卡尔坐标系,Frenet坐标纵向(longitudinal axis)代表车在路上行驶的距离(不论这条路是弯曲的还是直的),横向(Lateral Axis)代表车距离路中间线的距离
也就是我们会分别对路径和速度进行规划,对于路径我们需要选择一个更平滑,安全,舒适的曲线,这里的速度也就是上面我们提到的每个路径点的速度
如下图所示,首先将马路每隔一段距离进行分段,然后在每一段里面随机选择点,将他们连接起来就得到了许多条路径。
对这么多条路径进行评估打分,代价函数可能考虑进去的因素(可能不止这些)有
1.偏离道路中心的距离
2.距离障碍物的距离
3.速度和曲率的变化
4.车辆的压力
用ST图进行速度规划,用下图的情况来说明,我们是蓝车正在向前行驶,观测到前方有一辆白色的车会掉头。这样的情况反映在下图中就是它会在t0-t1时刻占据s0-s1这段距离,也就是图中矩形。那么接下来我们pick一条不与矩形相交的速度曲线
图中可能会有很多矩形,我们也会pick不止一条不与矩形相交的速度曲线,接着我们会考虑一些速度限制(比如马路限速),或者加速度限制(汽车引擎)。
优化,二次规划
经过上面的规划我们可能已经得到了一条可行的曲线(包括路径规划和速度规划的曲线),但是注意到没有,我们之前都是在离散的情况下进行考虑的,所以得到的曲线可能并不是平滑的。所以我们需要二次规划来让曲线更加平滑
首先我们不忘初心,回顾一下三维轨迹,我们需要的也就是横向,纵向和时间。Lattice将这个三维问题分成了两个二维问题
如下图所示,一个是之前提到的ST轨迹,也就是纵向和时间。另一个是SL轨迹,也就是纵向和横向(相对于纵向移动时,横向的偏移值)