最近,我正与Voyage公司的朋友合作研究,以实现福特Fusion空调系统(A/C)的编程控制。目前,Voyage公司正努力打造自动驾驶的终极目标:能够以低廉的价格成本和广泛的投放范围,把世界任何地方有用车需求的人们安全自动地送达目的地。对Voyage来说,在真正实现不需司机的无人驾驶之后,必须给予后座乘客对车辆关键功能的访问控制权。

Voyage Auto:硅谷自动自动驾驶出租车初创公司,由专注机器学习、人工智能等方面的在线培训机构Udacity于2017年4月成立,在无人驾驶领域,Voyage将与谷歌、特斯拉、Uber展开竞争。目前,Voyage已完成首轮种子融资和测试车辆外观研发

CAN-Bus简介

CAN-Bus全称为“控制器局域网总线技术(Controller Area Network-Bus)”,是ISO国际标准化的串行通信协议,最早由德国BOSCH公司1983年开发,并最终成为国际标准(ISO 11898),是全球应用最广泛的现场总线之一。 在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制网络的标准协议。

现代汽车拥有大量控制系统,这些控制系统基于web技术开发并在多种微服务处理中发挥作用,如安全气囊、刹车、巡航控制、电动助力转向、音响系统、电动车窗、门、后视镜调整按钮、电池和充电系统等。这些系统需要相互通信和状态读取,因此CAN-Bus协议被开发并派上用场,如同为汽车配置了神经系统。

可以把CAN-Bus认为是汽车用来进行传感器数据传递的简单网络,它完美地集成了各种复杂部件,从而在汽车使用中展示和实现了各种我们所想所愿的各种新型功能。以下为1988年款的宝马8系,这是全球第一台采用CAN总线的汽车:

自动驾驶汽车与其CAN-Bus

随着自动驾驶技术的的飞速发展,CAN-Bus的应用概念也变得非常普及。为什么呢?因为很多自动驾驶公司并不会大规模地从头制造无人汽车,而是把关注点放在编程控制车辆方面。而通过汽车CAN-Bus协议的逆向工程分析,无人汽车工程师可以利用软件方式实现对汽车的命令发送控制,如转向、加速和刹车等。

通过使用类似激光雷达(LIDAR)这样的传感器,无人汽车就具备了超凡的“感知”世界的能力,车内微型PC可以就引导、加速、刹车等动作做出决定。因为自动驾驶技术的要求非常高,因而Voyage选择了福特Fusion电传线控方式(drive-by-wire!)来传递汽车控制讯号。可以点此阅读更多内容。

破解福特Fusion的CAN-Bus

开始破解福特Fusion温度控制系统时,《汽车黑客手册》成了我的研究参考首选。在深入之前,让我们来看看《汽车黑客手册》第2章描述的三个重要概念:总线协议、CAN总线协议、CAN帧。

CAN-Bus

CAN协议自1994年以来就成为了美国汽车和轻卡的一个行业标准,但分别在2001年和2008年才陆续成为欧盟和美国汽车工业制造的强制性标准。总体来说,CAN-Bus分为一条CAN high (CANH) 线和一条CAN low (CANL)线,通过差分信号传输,当信号传递进入时,CAN在CANH线中升压信号保持高电平,而在CANL中降压等量信号形成低电平状态。这种差分信号传输方式一般用于对噪声有容错能力要求的环境,如汽车制动系统和生产制造行业中。以下为示波器中观察到的原始CAN信号:

也就是说,通过CAN-Bus传输的数据包不是标准的,每个CAN-Bus数据包包括四个主要部分:

Arbitration ID :用于标识发起通信请求的设备ID广播消息,并且任何一个设备组件都能发起多个Arbitration ID,如果两个CAN数据包同一时间在总线Bus内传输,则Arbitration ID较小的数据包先获得总线使用权,先被传输。

Identifier extension(标识符扩展,IDE) :对标准CAN协议来说,这个数据位总是为o;

Data length code (数据长度代码,DLC): 代表数据的大小,从0到8字节不等;

Data(数据): 传输数据本身,标准CAN总线可以承载最大数据包为8字节,但有些系统也强制使用8字节进行数据包填充。

标准CAN包格式

CAN帧

一辆车内有多种CAN总线,为了实现A/C系统的打开和关闭,我们需要找到正确的CAN运行总线,以福特Fusion来说,其中至少标记有4个总线,其中3个为运行500kbps的高速率CAN总线HS1、HS2、HS3,1个为运行125kbps的中速CAN总线MS。

OBD-II接口具备两种这类型CAN总线:HS1和HS2,但为了以防一些恶意命令,它们都是被阻断状态的。但在来自Voyage的Alan帮助下,我们彻底把OBD-II这个限制问题翻转解决了,我们发现了直接访问HS1、HS2、HS3和MS的方式。关键在于OBD-II接口背后,一个所有总线汇总,叫做网关模块(Gateway Module)的部件上。以下为Voyage第一辆无人驾驶出租车Homer后座控制接口概览:

由于A/C系统可以通过汽车的媒体界面(SYNC)进行更改,所以,我们直奔MS中速总线而去。但是我们如何才能让电脑可以读写CAN数据包呢?答案就是SocketCAN,这是一个由大众公司向Linux内核基金会研发的开源CAN驱动和网络栈协议集。

我们可以把车辆的GND、MSCANH、MSCANL3条线连接到Kvaser Leaf Light HSv2CANable设备中,然后在另一端,使用安装有较新版本Linux内核的电脑连接,把CAN总线作为网络设备识别加载:

modprobe can
modprobe kvaser_usb
ip link set can0 type can bitrate 1250000
ifconfig can0 up

Kvaser Leaf Light HSv2亚马逊售价300美金,CANable在Tindie售价25美金,以下为中速总线MSCAN部件图:

GND:地线,公共接地线;

MSCAN:中速总线,也称飞思卡尔控制器局域网总线,是BOSCH公司定义的CAN2.0和CAN3.0协议下的CAN总线控制器,是当前汽车控制器中流行的CAN控制框架。MSCANH、MSCANL为其高电平和低电平线。

Kvaser Leaf Light HSv2是一个用于CAN的单通道USB接口,它能够方便地把几个接口连接到标准的PC机上。

加载之后,我们可以尝试使用candump can0命令,分析其中的流量情况:

can0  33A   [8]  00 00 00 00 00 00 00 00                                                                      can0  415   [8]  00 00 C4 FB 0F FE 0F FE                                                                      can0  346   [8]  00 00 00 03 03 00 C0 00                                                                      can0  348   [8]  00 00 00 00 00 00 00 00                                                                      can0  167   [8]  72 7F FF 10 00 19 F8 00                                                                      can0  3E0   [8]  00 00 00 00 80 00 00 00                                                                      can0  167   [8]  72 7F FF 10 00 19 F7 00                                                                      can0  34E   [8]  00 00 00 00 00 00 00 00                                                                      can0  358   [8]  00 00 00 00 00 00 00 00                                                                      can0  3A4   [8]  00 00 00 00 00 00 00 00                                                                      can0  216   [8]  00 00 00 00 82 00 00 00                                                                      can0  3AC   [8]  FF FF FF FF FF FF FF FF                                                                      can0  415   [8]  00 00 C8 FA 0F FE 0F FE                                                                      can0  083   [8]  00 00 00 00 00 01 7E F4                                                                      can0  2FD   [8]  D4 00 E3 C1 08 52 00 00                                                                      can0  3BC   [8]  0C 00 08 96 01 BB 27 00                                                                      can0  167   [8]  72 7F FF 10 00 19 F7 00                                                                      can0  3BE   [8]  00 20 AE EC D2 03 54 00                                                                      can0  333   [8]  00 00 00 00 00 00 00 00                                                                      can0  42A   [8]  D6 5B 70 E0 00 00 00 00                                                                      can0  42C   [8]  05 51 54 00 90 46 A4 00                                                                      can0  33B   [8]  00 00 00 00 00 00 00 00                                                                      can0  42E   [8]  93 00 00 E1 78 03 CD 40                                                                      can0  42F   [8]  7D 04 00 2E 66 04 01 77                                                                      can0  167   [8]  72 7F FF 10 00 19 F7 00                                                                      can0  3E7   [8]  00 00 00 00 00 00 00 00                                                                      can0  216   [8]  00 00 00 00 82 00 00 00                                                                      can0  415   [8]  00 00 CC F9 0F FE 0F FE                                                                      can0  3A5   [8]  00 00 00 00 00 00 00 00                                                                      can0  3AD   [8]  FF FF FF FF FF FF FF FF                                                                      can0  50B   [8]  1E 12 00 00 00 00 00 00

但是,这相当于观察声音信号振幅一样,很难从中发现动作和行为模式。在此,我们需要使用工具cansniffer对频率进行等效化分析,cansniffer显示的一串数据包ID号,可以帮助我们在CAN帧数据区变化时进行准确定位。有了这个功能,我们就能分辨出哪些数据包是应该丢弃的,而哪些又是与我们问题相关的。

CANSniffer:一款收发CAN格式数据包的分析软件,通过串口与外部设备交互,用于分析串口数据包。

以下是cansniffer在MS中速总线的抓包示例,我们正在对所有通过串口的数据包进行过滤,只需要CAN id为355、356和358的数据包。同时,通过按下汽车空气调节按钮后观察数据包变化情况,发现001C00000000代表了该按钮的开关作用。

控制汽车空调系统(A/C系统)

接下来就是把A/C系统功能连接到我们运行于汽车内的微型PC,该PC为机器人操作系统(ROS),而幸运的是,利用前述提及的SocketCAN和ROS中的一个模块,就能很容易实现连接和操作。而且用socketcan_bridge方式可以将我们的CAN数据帧转换成ROS可接收的消息格式。完美!

以下就是A/C系统功能数据包解码方式的一个示例:

if frame.id == 0x356:
raw_data = unpack('BBBBBBBB', frame.data)
fan_speed = raw_data[1] / 4
driver_temp = parse_temperature(raw_data[2:4])
passenger_temp = parse_temperature(raw_data[4:6])

由此生成的数据被存储在名为CelsiusReport.msg的文件中:

bool auto
bool system_on
bool unit_on
bool dual
bool max_cool
bool max_defrost
bool recirculation
bool head_fan
bool feet_fan
bool front_defrost
bool rear_defrost string driver_temp
string passenger_temp

在按下汽车A/C系统相关功能的按钮之后,我们将得到以下这个对应的代码清单:

CONTROL_CODES = {
'ac_toggle': 0x5C,
'ac_unit_toggle': 0x14,
'max_ac_toggle': 0x38,
'recirculation_toggle': 0x3C,
'dual_temperature_toggle': 0x18,
'passenger_temp_up': 0x24,
'passenger_temp_down': 0x28,
'driver_temp_up': 0x1C,
'driver_temp_down': 0x20,
'auto': 0x34,
'wheel_heat_toggle': 0x78,
'defrost_max_toggle': 0x64,
'defrost_toggle': 0x4C,
'rear_defrost_toggle': 0x58,
'body_fan_toggle': 0x04,
'feet_fan_toggle': 0x0C,
'fan_up': 0x2C,
'fan_down': 0x30,
}

现在,我们就可以直接将以上字符串对应的数据代码发往ROS节点,由它将这些数据信息转换成汽车可以识别的特殊代码:

rostopic pub /celsius_control celsius/CelsiusControl ac_toggle

研究结果

好了,我们可以向CAN总线发送相应的CAN代码了,这种代码控制方式与我们调节汽车空调A/C系统的外置按钮是一样的效果。这也意味着,在无人驾驶汽车的后座,我们可以实现以手机APP方式远程控制改变汽车的车内温度了。成功了!

当然了,这只是我们对Voyage自动驾驶汽车用户体验度进行探索研究的一小步。如果你也对无人驾驶技术的研发有经验,Voyage正诚聘英才,点此查看

CAN总线简介:如何以编程方式控制汽车的更多相关文章

  1. shiro框架学习-7- Shiro权限控制注解和编程方式

    讲解权限角色控制 @RequiresRoles, @RequiresPermissions等注解的使用和编程式控制 配置文件的方式 使用ShiroConfig 注解方式 @RequiresRoles( ...

  2. SPI总线的特点、工作方式及常见错误解答

    1.SPI总线简介 SPI(serial peripheral interface,串行外围设备接口)总线技术是Motorola公司推出的一种同步串行接口.它用于CPU与各种外围器件进行全双工.同步串 ...

  3. 以编程方式使用 Microsoft Office Visio 2003 ActiveX 控件

    以编程方式使用 Microsoft Office Visio 2003 ActiveX 控件 2007/10/29 Mark BukovecEmpire Down Development 适用于:Mi ...

  4. VB 在Visio 2010 以编程方式创建子进程图

    在2010年Visio以编程方式创建子进程图 Office 2010  https://msdn.microsoft.com/en-us/library/gg650651.aspx   简介: 学习如 ...

  5. 【基础知识】CPU 是如何工作的 |CPU 通过总线读取内存的工作方式

    一.简单cpu  是如何工作 方式讲解 CPU 的根本任务就是执行指令,对计算机来说最终都是一串由 0 和 1 组成的序列.CPU 从逻辑上可以划分成 3 个模块,分别是控制单元.运算单元和存储单元 ...

  6. CAN总线简介

    CAN总线简介 个节点,通信波特率为5Kbps~1Mbps,在通信的过程中要求每个节点的波特率保持一致(误差不能超过5%),否则会引起总线错误,从而导致节点的关闭,出现通信异常.

  7. 如何以编程方式签署应用程序包(C ++)

    了解如何使用SignerSignEx2函数对应用包进行签名. 如果要使用Packaging API以编程方式创建Windows应用商店应用包,则还需要在部署之前对应用包进行签名.Packaging A ...

  8. C#+EntityFramework编程方式详细之Code First 数据迁移

    在前几篇的C#+EntityFramework编程方式中介绍了C#+EntityFramework编程方式Code First ,Model First以及Dtatabase First 等编程方式, ...

  9. 解决在编程方式下无法访问Spark Master问题

    我们可以选择使用spark-shell,spark-submit或者编写代码的方式运行Spark.在产品环境下,利用spark-submit将jar提交到spark,是较为常见的做法.但是在开发期间, ...

随机推荐

  1. [ML] LIBSVM Data: Classification, Regression, and Multi-label

    数据库下载:LIBSVM Data: Classification, Regression, and Multi-label 一.机器学习模型的参数 模型所需的参数格式,有些为:LabeledPoin ...

  2. MySQL安装Write configuration file 提示:configuration file template my.ini Error code-1

    在安装MySQL的时候, 在最后安装时,最后一步出现Write configuration file没成功勾选,并提示:configuration file template D:\mysql\my- ...

  3. 纹理特征描述之自相关函数法 纹理粗糙性与自相关函数的扩展成正比 matlab代码实现

    图像中通常采用自相关函数作为纹理测度 自相关函数的定义为: ​ 调用自定义函数 zxcor()对砖墙面和大理石面纹理进行分析: 自定义函数 zxcor(): function [epsilon,eta ...

  4. web安全checklist

    web安全漏洞场景分析 输入输出检验不充分 设计缺陷 环境缺陷

  5. Ingreslock后门漏洞

    一.简介 1524端口 ingreslock Ingres 数据库管理系统(DBMS)锁定服务 利用telnet命令连接目标主机的1524端口,直接获取root权限. Ingreslock后门程序监听 ...

  6. XML中不能识别&符号, 需要转义吗?

    “&”在XML中是具有特殊含义的,是转义字符的前缀,如果要想用这个字符就需要转义.遇到“&”就替换成“&amp”就好了; xml所有转义符   和 & & 大于 ...

  7. 15.sqoop数据从mysql里面导入到HDFS里面

    表数据 在mysql中有一个库userdb中三个表:emp, emp_add和emp_contact 表emp id name deg salary dept 1201 gopal manager 5 ...

  8. 关于mac配置vs code的C++环境问题

    在配置完成后,编译通过了但是在终端输出一直不出现很奇怪,求问大家这是啥问题 以下是我的配置

  9. Golang Module快速入门

    前言: 在Golang1.11之前的版本中,官方没有提供依赖和包管理工具.开发者通常会使用vendor或者glide的方式来管理依赖(也有直接使用GOPATH多环境方式),而在Golang1.11之后 ...

  10. Python的IDE之Jupyter的使用

    Python的IDE之Jupyter的使用 今天给大家分享的是Jupyter安装和基本使用教程,同时在我安装的过程中遇到了一些问题,解决方法,一并和大家分享 一.Jupyter介绍 Jupyter N ...