自动驾驶技术之——无人驾驶中的CAN总线
CAN 是 的缩写,中文名为控制器局域 络,是ISO国际标准化的串行通信协议,是一种用于实时应用的串行通讯协议总线,它可以使用双绞线来传输信 ,是世界上应用最广泛的现场总线之一。
现代汽车拥有大量控制系统,这些控制系统基于web技术开发并在多种微服务处理中发挥作用,如安全气囊、刹车、巡航控制、电动助力转向、音响系统、电动车窗、门、后视镜调整按钮、电池和充电系统等。这些系统需要相互通信和状态读取,因此CAN协议被开发并派上用场,如同为汽车配置了神经系统。
可以把CAN认为是汽车用来进行传感器数据传递的简单 络,它完美地集成了各种复杂部件,从而在汽车使用中展示和实现了各种我们所想所愿的各种新型功能。以下为1988年款的宝马8系,这是全球第一台采用CAN总线的汽车.
信息的传输采用CAN通信协议,通过CAN控制器来完成。各 络节点一般为带有微控制器的智能节点完成现场的数据采集和基于CAN协议的数据传输,节点可以使用带有在片CAN控制器的微控制器,或选用一般的微控制器加上独立的CAN控制器来完成节点功能。传输介质可采用双绞线、同轴电缆或光纤。
如果需要进一步提高系统的抗干扰能力,还可以在控制器和传输介质之间加接光电隔离,电源采用DC-DC变换器等措施。这样可方便构成实时分布式测控系统。微控制器,或选用一般的微控制器加上独立的CAN控制器来完成节点功能。传输介质可采用双绞线、同轴电缆或光纤。如果需要进一步提高系统的抗干扰能力,还可以在控制器和传输介质之间加接光电隔离,电源采用DC-DC变换器等措施。这样可方便构成实时分布式测控系统。
自动驾驶系统如何解析CAN总线的数据
本段主要讨论无人驾驶系统获取到CAN消息后,如何根据CAN协议,解析出想要的数据p>
从CAN总线中解析出传感器的信息,是每个自动驾驶工程师,甚至每一个汽车电子工程师必备的技能。
4.timestamp(CAN消息的时间戳)
时间戳表示的是收到该CAN消息的时刻。通过连续多帧的时间戳,可以计算出CAN消息的发送周期,也可以用于判断CAN消息是否被持续收到。
综上,每帧CAN消息中最重要的部分其实是data,即88的bool值。所谓解析CAN消息,其实就是解析这88个bool类型的值。
认识CAN协议
目前业界的CAN协议,都是以后缀名为dbc的文件进行存储的。德国Vector公司提供CANdb++ Editor是一款专门用于阅读dbc文件的软件。
如下图所示,为本人提供的车辆的dbc文件。
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系统)
接下来就是把A/C系统功能连接到我们运行于汽车内的微型PC,该PC为机器人操作系统(ROS),而幸运的是,利用前述提及的SocketCAN和ROS中的一个模块,就能很容易实现连接和操作。而且用socketcan_bridge方式可以将我们的CAN数据帧转换成ROS可接收的消息格式。完美!
以下就是A/C系统功能数据包解码方式的一个示例:
由此生成的数据被存储在名为CelsiusReport.msg的文件中:
在按下汽车A/C系统相关功能的按钮之后,我们将得到以下这个对应的代码清单:
现在,我们就可以直接将以上字符串对应的数据代码发往ROS节点,由它将这些数据信息转换成汽车可以识别的特殊代码:
解析CAN信
由于彩色方块图与data是一一对应的,我们将两个图叠加,将得到如下图所示的data图。
2.Factor为小数的物理量
对于Factor不为1的物理量,比如Position,需要使用移位的方法进行解析,但解析公式保持不变。以百度 Apollo提供的源码为例进行讲解。
这里的bytes即为CAN消息中的data,首先将Position信 所在的行取出来,将第1行的8个bool值存储在变量t1中,将第二行的8个bool值存储在变量t0中。由于在这条CAN消息中,Position同时占据了高8位和低8位,因此需要将第一行和第二行的所有bool位拿来计算,高8位存储在32位的变量x中,低8位存储在32位的变量t中。
现在需要将高8位和低8位拼接,将高8位左移8位,然后与低8位求或运算,即可得到Position的二进制值。随后进行的左移16位,再右移16位的操作是为了将32位的变量x的高16位全部初始化为0。之后将x乘以Factor再加上Offset即可得到真实的Position值,给真实值加上单位meter,即可获取实际的物理量。
与CAN类似的通信协议
VCU、雷达等通过CAN总线传递信 ,随着CAN的负载越来越高,很多传感器选择了其他通信方式。比如激光雷达的点云数据量太过庞大,使用的是局域 的方式进行传递;再比如GPS和惯导使用的是串口进行通信。
虽然通信方式和通信协议千差万别,但解析的方法都是一样的。
最后,提醒一下,由于不同ID的CAN消息的结构不一样,因此工程师在写解析代码时,需要十分仔细,否则会给后续处理带来想不到的bug。
文章知识点与官方知识档案匹配,可进一步学习相关知识OpenCV技能树OpenCV基础OpenCV简介11526 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!