雷锋网按:近日,“神奇小子”George Hotz 创办的自动驾驶初创公司 Comma.ai 在Medium 撰文分享了其开发的一款开源驾驶助理 openpilot。
据雷锋网了解,Comma.ai 发布的第一款产品 Comma One 因为无法证明其安全性,一个月后被美国公路交通安全管理局叫停。随后 Hotz 转换思路,将 Comma.ai 的自动驾驶软件进行开源,甚至还提供了一份硬件组装指南,指导极客用户自己动手打造一个即插即用的辅助驾驶套件。
openpilot 便是这一思路下的产物。具体来说,openpilot 能实现对油门、刹车和方向的自主控制,控制时长最高可达 6 分钟(使用时驾驶员请注意观察路况)。我们来看看 openpilot 是如何工作的,也希望业内的行家来评判这种方式是否靠谱。
使用中的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。
说了这么多,我们也该谈谈 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 是与车辆交流的主过程,车辆启动后它就会一同运行起来。
雷锋网推荐阅读: