前言
本文主要内容是——无人驾驶中的can(controller area network )总线。
can总线在整个无人驾驶系统中有着十分重要的作用。除了在vcu信号需要通过can总线进行传输外,无人车上的某些传感器(如雷达、mobileye)的信号传递也是通过can实现的。
我在无人驾驶,个人如何研究?中提到过实现一个无人驾驶系统,会有几个层级: 感知层 → 融合层 → 规划层 → 控制层 更具体一点为: 传感器层 → 驱动层 → 信息融合层 → 决策规划层 → 底层控制层
“传感器层”在之前的分享中已经介绍过了,这次主要介绍的是“驱动层”相关的内容。
正文
can通信是一套高性能、高可靠性的通信机制,目前已广泛应用在汽车电子领域。有关can的总线的原理及特性并不是本次分享的重点。本文的重点在无人驾驶系统获取到can消息后,如何根据can协议,解析出想要的数据。从can总线中解析出传感器的信息,可以说是每个自动驾驶工程师,甚至每一个汽车电子工程师必备的技能。
认识can消息
以百度推出的apollo开源的代码为例做can消息的讲解,我们先看到每一帧的can消息是如何被定义的。
可以看到这个名为canframe的消息结构中包含4个关键信息,分别是:
1. uint32_tid
can消息的id号。
由于can总线上传播着大量can消息,因此两个节点进行通信时,会先看id号,以确保这是节点想要的can消息。最初的can消息id号的范围是000-7ff(16进制数),但随着汽车电控信号的增多,需要传递的消息变多,信息不太够用了。工程师在can消息基础上,扩展了id号的范围,大大增加了id号的上限,并将改进后的can消息称为“扩展帧”,旧版can消息称为“普通帧”。
如果拿写信做比较,这个id就有点类似写在信件封面上的名字。
2. uint8_tlen
can消息的有效长度。
每一帧can消息能够传递最多8个无符号整形数据,或者说能够传递8*8的bool类型的数据。这里的len最大值为8,如果该帧can消息中有些位没有数据,这里的len就会小于8。
3. uint8_tdata[8]
can消息的实际数据。
正如刚才提到的,每一帧can消息都包含至多8*8个bool类型的数据,因此可以通过8*8个方格,可视化can消息中的data。如下图所示:
在没有can协议帮助我们解析的情况下,这里的数据无异于乱码,根本无法得到有用的消息,这也是can消息难以破解的原因之一。
4.timestamp
can消息的时间戳。
时间戳表示的是收到该can消息的时刻。通过连续多帧的时间戳,可以计算出can消息的发送周期,也可以用于判断can消息是否被持续收到。
综上,每帧can消息中最重要的部分其实是data,即8*8的bool值。所谓解析can消息,其实就是解析这8*8个bool类型的值。
认识can协议
目前业界的can协议,都是以后缀名为dbc的文件进行存储的。德国vector公司提供candb++ editor是一款专门用于阅读dbc文件的软件。
如下图所示,为mobileye提供的车道线的dbc文件。(文末提供candb++ editor安装包和mobileye车道线的dbc文件的获取方法)
以id号为0x766的lka_left_lane_a为例,这是mobileye检测无人车左侧车道线的部分信息,包括了左侧车道线的偏移量,曲率等。该帧can消息(message)中的五个信号(signal),分别是lane_type、quality、curvature、curvature_derivative、width_left_marking、position。
每个信号的具体描述显示在软件右侧,其中与解析直接相关的三个要素已用绿色框选中。
1. value type(unsigned或signed)
某些物理量在描述时是有符号的,比如温度。而描述另外一些量时,是没有符号的,即均为正数,比如说曲率。
2. factor 和 offset
这两个参数需要参与实际的物理量运算,factor是倍率,offset是偏移量。例如lane_type和quality信号的factor为1,offset为0,而其他信号的factor均为小数。具体的计算方法请往下看。
双击lka_left_lane_a,打开layout页,会发现很熟悉的方块阵列,如下图所示。
工程师真正关心的恰好是这块彩色图,因为该图上的每个小方块和data中的每一个bool量一一对应。这就是can协议的真面目。
解析can信号
由于彩色方块图与data是一一对应的,我们将两个图叠加,将得到如下图所示的data图。
每个信号物理量的计算公式为:
1.factor为1的物理量
由于lane_type和quality的factor为1,offset为0,因此十进制值为多少,实际物理量即为多少。
从图中就能直接看出quality这个信号占据两个位,二进制数11,换算为十进制是3(1*2 + 1*1);lane_type占据四个位,二进制数为0010,换算为十进制是2(0*8 + 0*4 + 1*2 + 0*1)。
所以这一帧信号表示此时的左车道线lane_type值为2,quality值为3。对于整数值,通信双方可以约定规则,比如mobileye就规定了,quality为0或者1时表示车道线的置信度较低,不推荐使用此时的值;2表示置信度中等,3表示置信度较高,请放心使用。
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和惯导使用的是串口进行通信。
虽然通信方式和通信协议千差万别,但解析的方法都是一样的。
结语
好了\(^o^)/~,这篇分享的内容基本上讲清楚了can总线消息的解析过程。这是无人驾驶系统传感器驱动层的基本理论。
由于不同id的can消息的结构不一样,因此在写解析代码时,需要十分仔细,否则会给后续处理带来想不到的bug。
三星的移动固态硬盘T7 Touch正式上线了
雷曼光电为短视频基地打造COB超高清显示屏
单片机对GPRS电路板的开关控制实现案例
DxO PhotoLab 5.1和DxO FilmPack 6.1改进了用户界面并支持多款新相机
三星正在与全球最大的芯片组代工厂商积电竞争
CAN总线在无人驾驶上的应用
未来的加密货币交易托管所将会是怎样的
电缆行波故障精确定位装置:电力线路的守护者
2020年互联网行业什么最火?谁将影响互联网“下半场”走向?
美媒称中国版C-130预警机跟美数量差不多 但性能还不行
站在CITE 2022看智慧生活:一起探索你的未来小宇宙
华为高管回应用户在飞机上用Mate 60 Pro打卫星电话:是违规行为
如何为互阻抗放大器电路选择运算放大器
苹果台式机好吗?更好的在即将出现,库克确认不放弃桌面级Mac
科大讯飞营业利润来源到底在哪里?业绩变脸利润不足5亿
“T”动力标杆发动机解析
简历中居然藏有木马 细思恐极
超级电容漏电流测试仪AT680A的性能及应用
新能源与可再生能源势必加快进入能源体系主流
摩尔定律下,真的有厂商实现了突破吗?