Back to Apollo

canbus-vehicle-lincoln

modules/canbus_vehicle/lincoln/README_cn.md

11.0.07.4 KB
Original Source

canbus-vehicle-lincoln

介绍

  • canbus-vehicle-lincoln 包是lincoln mkz车型底盘协议适配的实现包,它不是一个单独的组件,是继承自canbus包内的车型工厂类AbstractVehicleFactory和车辆控制器类VehicleController的具体实现,是canbus模块的一个插件。Lincoln车型所实现的方法调用逻辑是由canbus组件的调用逻辑定义的,相关流程可参考canbus组件说明文档
  • 下图是lincoln车型包的实现框架流程。

  • 在lincoln车型实现中,有3个独立的线程需要关注:

    (1) CanSender发送控制报文线程:Apollo发送至车辆底盘的CAN数据称为控制报文,由CanSender创建独立线程,按照协议报文周期进行发送,而所发送的报文数据则由CanSender::Update方法进行更新;

    (2) CANReceiver接收底盘控制报文线程:车辆发出的底盘信息CAN数据称为反馈报文,由CanReceiver创建独立线程进行接收(接收方式有阻塞或非阻塞,取决于使用的是哪种CanClient,MessageManager调用ProtocolData的Prase方法,解析收到的底盘数据,并更新Lincoln.proto数据;

    (3) 底盘状态实时监控线控:在LincolnController中,会创建一个单独的看门狗线程,SecurityDogThreadFunc()方法实现对底盘的驾驶模式、底盘故障进行实时监控,如果底盘被监控到退出自动驾驶(被接管)或底盘存在故障,会执行Emergency()方法,将所有控制报文初始化,并将Chassis::DrivingMode置为Emergency或Chassis_Error。

  • Lincoln车型的协议报文都是继承父类ProtocolData,控制报文和反馈报文继承实现的方法不同,区分一个报文是控制还是反馈报文,就看它实现了哪些方法。

    方法说明控制报文反馈报文
    GetPeriod定义报文周期×
    Reset定义报文的默认数据×
    UpdateData定义报文的更新数据×
    UpdateData_Heartbeat定义心跳信号的更新内容×
    Prase定义报文的协议数据解析× 或 √

    Brake60是控制报文协议解析,Brake61是反馈报文协议解析。

  • /apollo/chassischannel是通过VehicleController中Chassis方法,将必要的ProtocolData协议的Parse数据写入到apollo::Chassis中进行发布;

  • /apollo/chassis_detailchannel是调用ProtocolData的Parse后,写入到对应车型Proto数据中,查看对应车型的Proto文件进行查询,并进行发布该车型proto类型的数据。

  • CanClient客户端是CAN卡硬件驱动的实例,它是被不同的使用CAN总线协议的传感器共享的。如果现有的CAN卡驱动不满足使用,可以通过继承CanClient类在drivers/canbus/can_client的文件夹中实现新的CAN卡驱动。

文件组织结构及说明

因为每一类车型的文件组织结构相同,这里以lincoln车型为例进行说明,其它车型的目录结构可以自行查看。

shell
modules/canbus_vehicle/
└── lincoln                                 // lincoln车型协议及车辆控制等实现文件
    ├── BUILD                               // 构建规则文件
    ├── cyberfile.xml                       // 包管理配置文件
    ├── lincoln_controller.cc               // lincoln车型控制器实现文件
    ├── lincoln_controller.h                // lincoln车型控制器声明文件
    ├── lincoln_controller_test.cc          // lincoln车型控制器单元测试文件
    ├── lincoln_message_manager.cc          // lincoln车型发送/接收报文管理器实现文件
    ├── lincoln_message_manager.h           // lincoln车型发送/接收报文管理器声明文件
    ├── lincoln_message_manager_test.cc     // lincoln车型发送/接收报文管理器单元测试文件
    ├── lincoln_vehicle_factory.cc          // lincoln车型车型工厂实现文件
    ├── lincoln_vehicle_factory.h           // lincoln车型车型工厂声明文件
    ├── lincoln_vehicle_factory_test.cc     // lincoln车型车型工厂单元测试文件
    ├── docs/                               // 说明文档相关文件
    ├── README_cn.md                        // 包说明文档
    ├── proto/                              // 车型协议变量定义文件夹
    │   ├── BUILD                           // 构建规则文件
    │   └── lincoln.proto                   // lincoln车型协议变量类型定义文件
    ├── protocol/                           // 协议解析实现文件夹
    │   ├── brake_60.cc                     // 制动报文控制协议解析实现文件
    │   ├── brake_60.h                      // 制动报文控制协议解析实现文件
    │   ├── brake_60_test.cc                // 制动报文控制协议解析单元测试文件
    │   ├── brake_61.cc                     // 制动报文反馈协议解析实现文件
    │   ├── brake_61.h                      // 制动报文反馈协议解析实现文件
    │   ├── brake_61_test.cc                // 制动报文反馈协议解析单元测试文件
    │   .
    │   .
    │   .
    └── testdata                            // 单元测试测试数据文件夹

模块输入输出与配置

canbus-vehicle-lincoln插件

输入

Channel名称类型描述
/apollo/controlapollo::control::ControlCommandcanbus模块订阅该消息,LincolnVehicleFactory继承AbstractVehicleFactory基类方法UpdateCommand(ControlCommand)传入该参数,作为lincoln车型插件的输入
/apollo/chassis_controlapollo::ChassisCommandcanbus模块订阅该消息,LincolnVehicleFactory继承AbstractVehicleFactory基类方法UpdateCommand(ChassisCommand)传入该参数,作为lincoln车型插件的输入

输出

Channel名称类型描述
/apollo/chassis_detailapollo::lincoln::Lincolnlincoln车辆底盘详细信息,展示底盘总线报文解析数据

配置文件

文件路径类型/结构说明

| modules/canbus/conf/canbus.conf | command line flags | 命令行参数配置 |

Flags

flagfile类型描述
canbus_gflags.ccflagsCanbus组件flags定义文件
canbus_gflags.hdeclareCanbus组件flags声明文件

使用方式

修改车型包加载配置

modules/canbus/conf/canbus.conf中,修改--load_vehicle_library--load_vehicle_class_name参数,加载Lincoln车型包,在包管理和源码下配置参数不同:

  • // 包管理下
--load_vehicle_library=/opt/apollo/neo/lib/modules/canbus_vehicle/lincoln/liblincoln_vehicle_factory_lib.so
--load_vehicle_class_name=LincolnVehicleFactory
  • // 源码下
--load_vehicle_library=/apollo/bazel-bin/modules/canbus_vehicle/lincoln/liblincoln_vehicle_factory_lib.so
--load_vehicle_class_name=LincolnVehicleFactory
使用 mainboard 启动
shell
mainboard -d modules/canbus/dag/canbus.dag
使用 cyber_launch 启动
shell
cyber_launch start modules/canbus/launch/canbus.launch