| by YoungTimes | No comments

自动驾驶运动规划-Reeds Shepp曲线

相比于Dubins Car只允许车辆向前运动,Reeds Shepp Car既允许车辆向前运动,也允许车辆向后运动。

1、车辆模型

车辆运动模型仍然采用Simple Car Model,但增加对车辆运动方向的描述,运动方程如下:

$\dot{x} = u_1 cos{\theta}$

$\dot{y} = u_1 sin{\theta}$

$\dot{\theta} = u_1 u_2$

其中,$u_1 \in \{-1, 1\}$,$u_2 \in [-tan \phi_{max}, tan \phi_{max}]$。当$u_1 = 1$时,表示车辆向[……]

继续阅读

Read More
| by YoungTimes | No comments

自动驾驶运动预测(Motion Prediction)

运动预测(Motion Prediction)模块主要解决自动驾驶车辆与周围环境中的其它运动物体(车辆、行人等)的协同交互问题。该模块对感知模块所检测到的运动物体进行未来一段时间内行为意图的预测,并将预测的结果转化为时间维度和空间维度的轨迹。以这些障碍车、行人、非机动车等运动物体的预测轨迹作为输入,自动驾驶车辆可以做出更加合理的驾驶决策,规划出更加合理、安全的车辆运动行为。

比如如果我们预测到其它车辆要并入到我们的车道,那我们就需要提前考虑减速,预测的准确性越高,决策就越准确,无人驾驶的可靠性也就越高。

由于道路上运动物体的行为是复杂多变、彼此相互影响的,这就要求预测模块能够提[……]

继续阅读

Read More
| by YoungTimes | No comments

自动驾驶运动规划-Dubins曲线

直观的了解下Dubins曲线,一个理想条件下,不挂倒挡一把实现移车入库的老司机。

1、Simple Car模型

如下图所示,Simple Car模型是一个表达车辆运动的简易模型。Simple Car模型将车辆看做平面上的刚体运动,刚体的原点位于车辆后轮的中心;x轴沿着车辆主轴方向,与车辆运动方向相同;车辆在任意一个时刻的姿态可以表述为(x, y, $\theta$)。车辆的运动速度为s;方向盘的转角为$\phi$,它与前轮的转角相同;前轮和后轮中心的距离为L;如果方向角的转角固定,车辆会在原地转圈,转圈的半径为$\rho$。

在一个很短的时间$\Delta t$内,可[……]

继续阅读

Read More
| by YoungTimes | No comments

自动驾驶路径规划-双向Dijkstra算法

经典的Dijkstra算法是一种Graph Based的单源最短路径规划算法,可以解决带权重有向图的最短路径规划问题。双向Dijkstra算法是对经典Dijkstra算法的一种优化方法,其主要思想就是从起点和终点同时开始搜索,从而达到提升算法执行效率的效果。实际效果表明,在大部分情况下,双向Dijkstra算法均优于经典的Dijkstra算法。

先直观的感受一下,Dijkstra算法和双向Dijkstra算法的区别。

1、双向Dijstra算法思想

双向Dijstra算法的思想是:

1) 分别从路径搜索的起点s和路径搜索的终点t同时执行前向的Dijkstra算法和后[……]

继续阅读

Read More
| by YoungTimes | No comments

自动驾驶路径规划-Dijkstra算法

自动驾驶路径规划-Graph-Based的BFS最短路径规划》中提到我们可以将地图抽象为Graph的数据结构,然后利用Graph的广度优先遍历算法(Breadth-First Search, BFS)解决无权重的High-Level的地图级别的规划。但是实际应用场景中,地图中各个路径所代表的Graph的边的权重都是不同的,比如距离长的Edge权重就应该比较低;交通拥堵的Edge权重就应该低等等。对于有权重的Graph如何进行最短路径规划呢,Dijkstra算法可以解决这个问题。

1、什么是Dijkstra算法

Dijkstra算法是一种有权图(Graph)的单源最短路径求解算[……]

继续阅读

Read More
| by YoungTimes | No comments

Mobileye自动驾驶安全能力解读

安全性(Safety)是自动驾驶的首要目标和追求,但是在如下图所示的复杂场景中,人类司机会做出违反道路交通规则的限制的危险驾驶行为,从而达到快速通行的目的。对于自动驾驶车辆来说,如何在保证安全性的前提下,也能够处理如此复杂的道路交通环境呢?

1、如何定义车辆的安全驾驶能力(Driving Safely)

1.1 Miles Driven定义安全驾驶能力

一种常见的理论是自动驾驶汽车安全行驶的里程越多,它就越安全。但事实上,你在简单道路场景(右图)上安全行驶数十亿公里,也不能代表它能在复杂道路场景(左图)安全运行一公里;所以安全行驶里程数不足以成为界定自动驾驶安全能力的指标[……]

继续阅读

Read More
| by YoungTimes | No comments

自动驾驶路径规划-Graph-Based的BFS最短路径规划

自动驾驶运动规划(Motion Planning)中提到Mission Planner关注High-Level的地图级别的规划,通过Graph Based的图搜索算法实现自动驾驶路径的规划。今天看看如何用Python实现Graph Based的BFS最短路径规划。

1、Graph的基础定义及Python表达

在数学或者计算机数据结构的教材中,Graph由Node(或者vertices)组成,Node之间以Edge连接(如下图所示)。如果Node之间的连接是没有方向的,则称该Graph为无向图(Undirected Graph);反之,如果Node之间的连接是有方向的,则称为该G[……]

继续阅读

Read More
| by YoungTimes | No comments

PostgreSQL-复制指定数据表结构和数据

在实际项目中,可能需要复制指定表结构和数据,或者备份指定数据表,在PostgreSQL中可以通过以下命令实现:

[……]

继续阅读

Read More
| by YoungTimes | No comments

未知环境下的Lidar概率占位栅格图(Occupancy Grid Map) Python代码实现

自动驾驶Mapping-占位栅格图(Occupancy Grid Map)中介绍了概率占位栅格地图(Probabilistic Occupancy Grid)的原理,并推导了如何利用贝叶斯理论(Bayes Theorem)更新生成概率占位栅格地图。下面看看如何用Python代码实现未知环境中的运动车辆上安装的激光雷达(lidar)生成概率占位栅格图。

1、构建环境地图和车辆运动模型

在生成栅格地图之前,首先需要构造一个用于车辆运动的环境地图(这个地图是用于仿真的真值,对于车辆来说是未知的环境)。我们用0和1值来构造M*N的环境地图,0表示可行驶区域,1表示占用区域。

然后[……]

继续阅读

Read More
| by YoungTimes | No comments

C++多线程-条件变量(Condition Variables)实现线程间事件(Event)通知机制

在实际的业务应用中,经常遇到需要多个线程协同的场景:

场景一:线程A挂起等待某个独占资源释放,线程B也在挂起等待某个独占资源释放,线程C在使用独占资源,使用完成后,唤醒线程A或者线程B进入工作状态。

场景二:线程A生产某种资源,线程B负责消费资源,没有资源供线程B消费时,线程B挂起,线程A生产出新资源后,唤醒线程B。这也是经典的”生产者-消费者“模型。

条件变量(Condition Variables)可以帮助我们实现这一能力。

1、条件变量(Condition Variables)的工作机制

1)必须有Mutex与条件变量(Condition Variables[……]

继续阅读

Read More