| by msbeta | No comments

Mobileye自动驾驶安全能力解读

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

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

1.1 Miles Driven定义安全驾驶能力

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

继续阅读

Read More
| by msbeta | 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 msbeta | No comments

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

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

[……]

继续阅读

Read More
| by msbeta | 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 msbeta | 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
| by msbeta | No comments

Waymo-自动驾驶长尾问题挑战

尽管Waymo已经在开放道路上积累超过10 Million Miles,Waymo的工程师们仍然发现有层出不穷的新自动驾驶场景待解决。

1、自动驾驶长尾场景举例

场景一:一个骑自行车的人手中拿着一个Stop Sign标识牌。我们不知道它何时会举起标识牌。无人车必须理解这种场景,即使他举起了Stop Sign标识牌,自动驾驶汽车也不应该停下来。

场景二: 迎面而来的车辆上装载的塑料管子撒了一地,自动驾驶汽车必须学会应对这种突发情况,并且避开它们对无人车行驶的影响。

场景三:由于道路施工等因素,路面布满锥桶。无人车必须正确识别这些场景,在布满路面锥桶的场景下实现合[……]

继续阅读

Read More
| by msbeta | No comments

Lanelets: 高效的自动驾驶地图表达方式

LaneLets是自动驾驶领域高精度地图的一种高效表达方式,它以彼此相互连接的LaneLets来描述自动驾驶可行驶区域,不仅可以表达车道几何,也可以完整表述车道拓扑,同时可以集成交通规则和人的驾驶习惯。

如上图所示,每个Lanelet由left bound和right bound组成,left/right bound有一系列点序列组成,因此可以以任意精度逼近任意车道形状。

1. 用于Routing的Lanelets Graph

为了能够基于Lanelets进行路径规划,我们可以构建Lanelets邻接图结构。当Lanelets A的左右边界的终点与Lanelets B的左[……]

继续阅读

Read More
| by msbeta | No comments

C++11多线程-如何用带参数的类成员函数作为线程启动函数

1、使用非静态类成员函数作为线程启动函数

假设存在如下Task类,它有一个名为execute()的非静态成员函数。

现在我们计划用Task的类的成员函数execute()函数作为线程的启动函数。由于execute()是静态函数,为了调用该函数,我们必须首先实例化一个Task对象。

然后,利用该对象创建线程启动函数。

由此,我们可以得到类的非静态成员函数作为线程启动函数的完整代码:

输出结果如下:

2、使用静态成员函数作为线程启动函数

由于静态函数不依赖于任何类对象,所以我们可以直接将静态成员函数作为线程启动函数,而不必传递对象指针。[……]

继续阅读

Read More
| by msbeta | No comments

c++编程之路-decltype关键字

1. decltype关键字的用途是什么

给定变量的名称或者表达式,decltype返回变量或者表达式的类型。如下所示:

2.decltype主要应用场景是模板函数

decltype在实际的开发中主要用于模板函数中,函数的返回值依赖于模板参数类型的情况。如下authAndAccess函数的返回值类型依赖于Container的元素类型。

此处的返回值auto并非类型推导的意思,而是C++ 11中的函数返回类型后置的表达方式,表明函数的返回类型在参数列表之后。函数返回类型后置的优势在于我们可以用函数的参数来指定返回值。

在c++ 14中auto关键字可以独立用[……]

继续阅读

Read More
| by msbeta | No comments

C++基础-如何在函数中传递原生数组的长度

1. 原生数组在C/C++中退化问题

在C/C++中数组不会按值传递,它传递第一个元素的指针,下列三个声明是等价的:

void func(int* a);

void func(int a[]);

void func(int a[10]);

对于编译器而言,所有的声明都被视为:

void func(int* a);

数组长度不是参数类型的一部分,函数不知道传递给它的数组的实际长度,当编译器对实参类型进行参数类型检查时,并不检查数组的长度。

2. 如何在函数中传递数组的长度

在很多情况下,我们需要知道数组的长度,怎么实现呢?

2.1 一种[……]

继续阅读

Read More