Comma.ai开发了一款驾驶助理openpilot,它是如何工作的?

2018-05-06 20:09:14 432

“神奇小子”GEorge Hotz 创办的自动驾驶初创公司 Comma.ai 在Medium 撰文分享了其开发的一款开源驾驶助理openpilot。

  据雷锋网了解,Comma.ai 发布的第一款产品 Comma One 因为无法证明其安全性,一个月后被美国公路交通安全管理局叫停。随后 Hotz 转换思路,将 Comma.ai 的自动驾驶软件进行开源,甚至还提供了一份硬件组装指南,指导极客用户自己动手打造一个即插即用的辅助驾驶套件。

  openpilot 便是这一思路下的产物。具体来说,openpilot能实现对油门、刹车和方向的自主控制,控制时长最高可达 6 分钟(使用时驾驶员请注意观察路况)。我们来看看 openpilot是如何工作的,也希望业内的行家来评判这种方式是否靠谱。

  

KVASER自上世纪八十年代初就开始对分布式嵌入控制系统进行专门研究。几年后,控制器区域网络(CAN)协议发布,第一枚CAN芯片也研发成功。Kvaser的创始人很快地认识到CAN的众多优异特性以及它将对分布式控制网络的未来产生的影响。他们做出了将Kvaser的资源投入到开发CAN解决方案的战略决策,使公司成为最早涉足现在几乎无处不在的CAN行业的公司之一。

更多信息请联系KVASER产品市场专员:

徐瑾jeneexu@westpac-hk.com.hk134 8087 60870755-8826 2987

威柏电子创办于1992年,为富士电机功率半导体中国最大代理,公司致力于汽车级功率半导体推广,包括EV电动汽车电驱用IGBT模块,汽车级IPM模块,DC-link母线电容,EV/HEV DC/DC OBC用碳化硅等核心功率器件。
由2005年开始已陆续跟汽车行业相关的制造商开始合作:知名分立电子组件制造商 – VISHAY, 德国汽车技术供货商 - BOSCH ,瑞典CAN 硬件专家- KVASER 及 国内IGBT驱动生产商- 青铜剑更于 2015年于中山设立技术中心; 主要是为汽车及新能源 的方案配套上作出技术支持。 


  使用中的openpilot

  如何与汽车交流?

  现在的市售车辆中,大多数都是通过多条控制器局域网路(CAN)总线将车辆的多个模组连接在一起的。其中一条 CAN 总线会连接在汽车自诊系统(OBD-II)上,其他的则大多数被隐藏在车辆内部面板之下。

  

  图1:panda

  openpilot 可以用 NEO 或 panda 作为 CAN 的接口。由于 openpilot 采用开源设计,因此它还能支持OpenXC、Kvaser 或者 CANBus Triple。

  在 openpilot 最先支持的本田思域和 ILX 两款车上,所有的通讯只需要两条 CAN 总线就能完成,一条是车辆 CAN 总线,一条则为雷达 CAN 总线。不过,其他车辆可能会有所不同。

  

汽车能说哪国语言?

其实 CAN 是一种非常简单的协议,只靠一条总线,任何设备都能给局域网路上的其他设备发送信息。信息内会含有标识符,标准的 CAN 协议识别符长度为 11 比特,扩展版则为 29 比特。一条信息最长为 8 字节。


  标准的 CAN 信息

  标识符会决定如何解析信息,而DBC文件是指定解析方法的标准方式。下面这段代码就是从参与测试本田思域的 DBC 文件中截取出来的,从中我们可以看出转向控制包是如何解析的:

  BO_ 228 STEERING_CONTROL: 5 ADAS

  SG_ STEER_TORQUE : 7|16@0- (1,0) [-3840|3840] "" EPS

  SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS

  SG_ CHECKSUM : 39|4@0+ (1,0) [0|15] "" EPS

  SG_ COUNTER : 33|2@0+ (1,0) [0|3] "" EPS

  这段代码第一行的信息标识符是 228 或 0xE4,其他四行则展示了将四个字段打包填充进 5 字节信息的方法。

  如果想看到更多解析 CAN 信息的代码,可以在 GitHub 上搜索 can_parser.py 和 dbc.py。

  

如何完成精确的转向?

恐怕你已经注意到,转向控制包并未指定车轮转向的精确方位,它控制的是传导到车轮上的扭矩。这确实是许多车辆转向时的控制方式,不过这里还需要额外加入一些控件来打造闭环控制系统。此外,CAN 总线上也已经整合了车辆的转向角度。


  BO_ 330 STEERING_SENSORS: 8 EPS

  SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] “deg” NEO

  这样一来,预定角度、当前角度和扭矩控制都齐全了,很适合打造 PID 回路。不过,由于扭矩较小,因此只使用 PI 回路就行。

  如果想看到更多 PI 回路的执行方法,可以在 GitHub 上搜索 latcontrol.py。

  

ROS 2.0

说了这么多,我们也该谈谈 openpilot 的架构。


  初看下来,它与 ROS非常相似,不过后者 有些臃肿,而且自定义的消息传递系统和输入系统也不招人喜欢。

  在 openpilot 上,开发者用了 ZMQ 发布/订阅模型来处理信息传递,输入上则用到了 cap’n proto。有趣的是,ROS 进化到 2.0 时代后,也会用到相同的解决方案。

  

车辆抽象层

在设计指出,研发人员就希望 openpilot 能与不同的车辆进行“交流”。如果想了解车辆抽象层的相关代码,可以到 GitHub 上搜索 car.capnp。


  

自适应巡航(纵向)

在 openpilot 中,开发者将油门/刹车与转向进行了分离。纵向控制上与传统车辆无异,这里也没有用到神经网络。


  开发者还在 GitHub 上公布了 radard.py 的相关代码,它可以用来解析车辆雷达传来的信息。同时,它还与视觉系统进行了基本的融合,最高可以回传两辆前车的位置信息。

  有了这些信息,自适应巡航系统就能决定行驶时车速的高低了。

  

视觉系统(横向)

visiond 负责控制神经网络,不过由于商业模式的原因,这部分采用闭源设计,但 API 是开源的。


  struct ModelData {

  frameId @0 :UInt32;

  path @1 :PatHData;

  leftLane @2 :PathData;

  rightLane @3 :PathData;

  lead @4 :LeaDData;

  ...

  借助视觉系统,openpilot 可以顺利完成路线规划,同时对左右车道和前车的方位,它也能了如指掌。

  借助 pathplanner.py 代码,各种路线选择被整合到了一起,随后它会完成最佳方案的选择。同时,latcontrol.py 代码还会为车辆设定路途中的目标点,随后汽车会跟着这些目标点前行。当然,现在这套系统还有很大的进步空间,未来会加入更多复杂的控制策略。

  

整合

manager.py 负责控制车辆的启动和停止。Boardd、sensord 和 visiond 三个代码都可以与外界进行交流,loggerd 则负责记录数据供机器学习使用,plannerd 则负责告诉车辆目的地在哪。controlsd 是与车辆交流的主过程,车辆启动后它就会一同运行起来。


0755-88267606 00852-2763 5991 021-5489 1460