自动驾驶(三十六)---------CAN总线

         CAN总线在整个无人驾驶系统中有着十分重要的作用。除了在VCU信号需要通过CAN总线进行传输外,无人车上的某些传感器(如雷达、Mobileye)的信号传递也是通过CAN实现的。刚开始接触时无从下手,如今也了解了大致,总结如下。

        CAN消息结构中包含4个关键信息,分别是:1. uint32_t id  2. uint8_t len 3. uint8_t data[8]  4. timestamp

1. uint32_t id

       CAN消息的ID号,由于CAN总线上传播着大量CAN消息,因此两个节点进行通信时,会先看id号,以确保这是节点想要的CAN消息。

2. uint8_t len

       CAN消息的有效长度。每一帧CAN消息能够传递最多8个无符号整形数据,或者说能够传递8*8的bool类型的数据。这里的len最大值为8,如果该帧CAN消息中有些位没有数据,这里的len就会小于8。

3. uint8_t data[8]

       CAN消息的实际数据。每一帧CAN消息都包含至多8*8个bool类型的数据,因此可以通过8*8个方格,可视化CAN消息中的data。如下图所示:

                                                    自动驾驶(三十六)---------CAN总线_第1张图片

       在没有CAN协议帮助我们解析的情况下,这里的数据无异于乱码,根本无法得到有用的消息,这也是CAN消息难以破解的原因之一。

4. timestamp

        CAN消息的时间戳。时间戳表示的是收到该CAN消息的时刻。通过连续多帧的时间戳,可以计算出CAN消息的发送周期,也可以用于判断CAN消息是否被持续收到。

        综上,每帧CAN消息中最重要的部分其实是data,即8*8的bool值。所谓解析CAN消息,其实就是解析这8*8个bool类型的值。目前业界的CAN协议,都是以后缀名为dbc的文件进行存储的。德国Vector公司提供CANdb++ Editor是一款专门用于阅读dbc文件的软件。如下图所示,为Mobileye提供的车道线的dbc文件。(文末提供CANdb++ Editor安装包和Mobileye车道线的dbc文件的获取方法)

                 自动驾驶(三十六)---------CAN总线_第2张图片

       以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页,会发现很熟悉的方块阵列,如下图所示。

                                            自动驾驶(三十六)---------CAN总线_第3张图片

        工程师真正关心的恰好是这块彩色图,因为该图上的每个小方块和data中的每一个bool量一一对应。这就是CAN协议的真面目。由于彩色方块图与data是一一对应的,我们将两个图叠加,将得到如下图所示的data图。

                                               自动驾驶(三十六)---------CAN总线_第4张图片

        每个信号物理量的计算公式为:

      由于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表示置信度较高,请放心使用。

        VCU、雷达等通过CAN总线传递信号,随着CAN的负载越来越高,很多传感器选择了其他通信方式。比如激光雷达的点云数据量太过庞大,使用的是局域网的方式进行传递;再比如GPS和惯导使用的是串口进行通信。虽然通信方式和通信协议千差万别,但解析的方法都是一样的。

你可能感兴趣的:(自动驾驶)