Apollo详解之canbus模块——代码简要分析2

CanbusComponent主程序分析

CanbusComponent::Init

CanbusComponent::Init是程序的入口函数,其功能是完成CanbusComponent的初始化。
首先通过GetProtoConfig获得配置文件信息,并保存到canbus_conf_当中。默认的配置文件modules/canbus/conf/canbus_conf.pb.txt内容为:

vehicle_parameter {
  brand: LINCOLN_MKZ
  max_enable_fail_attempt: 5
  driving_mode: COMPLETE_AUTO_DRIVE
}

can_card_parameter {
  brand: HERMES_CAN
  type: PCI_CARD
  channel_id: CHANNEL_ID_ZERO
  num_ports: 8
  interface: NATIVE
}

enable_debug_mode: false
enable_receiver_log: false
enable_sender_log: false

通过工厂模式,根据can_card_parameter参数创建指定类型的CanClient

can_client_ = can_factory->CreateCANClient(canbus_conf_.can_card_parameter());

根据vehicle_parameter参数创建指定车型的抽象工厂std::unique_ptr<apollo::canbus::AbstractVehicleFactory,并根据该工厂创建该车型的MessageManagerVehicleController

auto vehicle_object =
      vehicle_factory.CreateVehicle(canbus_conf_.vehicle_parameter());
...
message_manager_ = vehicle_object->CreateMessageManager();
....
vehicle_controller_ = vehicle_object->CreateVehicleController();

可以看出,使用工厂模式,可以实现程序的松耦合,通过配置文件的参数可以创建的基类接口不同的派生类对象。
当以上对象初始化完成后,会创建该车型需要的所有协议类对象,同时初始化CanReceiverCanSender,并且会在CanSender的容器当中添加所有需要发送的can报文。
根据命令行参数receive_guardian,可以选择是否开启守护进程,从而订阅不同的话题,命令行参数可以在modules/canbus/conf/canbus.conf中定义。
最后会调用CanClientCanReceiverCanSenderVehicleControllerStart方法,会打开can端口,分别创建三个线程:

  • CanReceiver的线程会不断接收一定数目的can报文,并根据该报文的协议将其解析为消息类型,存储在MessageManager的数据成员sensor_data_当中
  • CanSender的线程,会以各can报文规定的间隔,不断循环发送容器当中保存的所有的can报文
  • VehicleController线程会当can_sender_开启,执行发送can帧的线程时,以一定的频率,根据自动驾驶模式不断根据底盘反馈消息,检查底盘模块是否正常,若连续出错的次数超出了阈值,则进入紧急模式

CanbusComponent::Proc

该函数会以一定的频率由Cyber_RT调用,该函数会调用chassis方法,返回在MessageManager的变量sensor_data_中存储的当前时刻从底层接收的类型为Chassis的消息,其类型在modules/canbus/proto/chassis.proto中定义,然后发送给指定的话题。
另外,可根据命令行参数enable_chassis_detail_pub选择是否发送ChassisDetail消息类型至相关话题。

CanbusComponent::OnControlCommand

CanbusComponent::OnControlCommand是订阅者的回调函数,根据形参列表当中的控制消息ControlCommand,通过VehicleController更新所有发送协议的物理量,并通过CanSender更新所有发送can报文的数据

向车辆底层发送数据

CanSender线程当中,所有发送can报文会会不断循环发送给can底层,而发送can报文的更新是根据订阅相关话题得到的控制消息ControlCommand,通过回调函数CanbusComponent::OnControlCommand完成的。
首先,向车辆底层发送的消息类型为ControlCommand,通过订阅者订阅相关话题得到。
然后会调用回调函数CanbusComponent::OnControlCommand,在其中,方法VehicleController::Update会根据控制消息类型ControlCommand更新所有发送协议的物理量,物理量更新完毕后,会调用CanSender<SensorType>::Update,根据各个can报文的协议的物理量,根据协议更新所有发送can报文的数据。
自动驾驶模式COMPLETE_AUTO_DRIVE是通过控制消息当中的control_command.pad_msg().action()控制的,当其为control::DrivingAction::START时,会打开自动驾驶模式。需要主要的是,在打开自动驾驶模式时,canbus模块会在CheckResponse函数中,根据底盘反馈信息检查相关模块的工作情况。
该回调函数调用完成后,所有向车辆底层发送的can报文的数据会根据ControlCommand完成更新。

从车辆底层获取数据

CanReceiver线程当中,不断通过CanClient从底层接收指定数目的can报文,并通过MessageManager,根据该报文的协议ID将所有接收到的can报文解析为ChassisDetail消息类型,存储在MessageManagersensor_data_当中,因此sensor_data_反映了当前时刻从底层获得的底盘数据ChassisDetail
CanbusComponent::Proc当中,通过调用chassis函数,根据MessageManagersensor_data_当中存储的当前时刻从底层获得的底盘数据ChassisDetail,得到底盘消息类型Chassis,并将其通过发布者发布给相关的话题

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Apollo的DBC文件可以通过工具转换成CAN总线的模板代码。这个过程需要使用专门的工具,例如CANdb++或者Vector CANalyzer等。转换完成后,可以得到符合CAN总线通信协议的代码,可以直接用于开发CAN总线通信功能。 ### 回答2: Apollo是由百度开发的一个自动驾驶平台,其中包括了各种功能,例如定位、感知、控制等等。为了实现自动驾驶,需要将车辆的各种数据通过CAN总线进行传输。CAN总线可以把各个部件之间的数据进行高效、可靠、实时的传输。 在Apollo平台中,DBC文件是CAN总线的描述文件。它描述了CAN总线上所有消息和信号的详细信息,包括消息的ID、数据长度、周期、发送者和接收者等等。这些信息都非常重要,因为在开发自动驾驶系统时,需要使用这些信息来编写控制车辆的代码。 为了将DBC文件转换成CAN总线模板代码,需要使用Apollo提供的工具。具体步骤如下: 第一步:打开Apollo Studio,在“CAN总线”界面中点击“新建”,选择“CAN节点”或“CAN设备”作为总线类型。 第二步:在弹出的对话框中,选择DBC文件,并设置节点的参数,例如波特率、发送模式、接收模式、过滤器等等。 第三步:点击“生成”按钮,Apollo会自动生成C++代码,包括消息的发送和接收函数、定时器、过滤器等等。这些代码可以作为开发车辆控制系统的基础,方便开发者进行自定义的编写。 第四步:使用生成的代码,编写车辆控制系统的逻辑,例如调用传感器获取数据、分析数据、计算控制指令等等。通过CAN总线发送命令,实现对车辆的控制。 需要注意的是,转换DBC文件是一个很重要的步骤,因为它直接影响到车辆控制系统的实现效果。开发者需要仔细阅读DBC文件,并检查生成的代码是否符合要求。如果存在任何问题,都需要及时进行调整和修正,以确保车辆控制系统的稳定和安全。 ### 回答3: DBC(Database CAN)文件是一种CAN数据通信协议的描述文件,用于描述不同的CAN消息和信号。而CAN Bus模板代码是一种代码结构,用于实现CAN总线通信协议,将数据从一个设备传输到另一个设备。 将Apollo的DBC文件转换成CAN Bus模板代码,需要经过以下步骤: 1. 导入DBC文件 首先,需要使用DBC编辑器,例如CanKingdom或Vector CANoe,将Apollo的DBC文件导入到编辑器中。这将允许您查看CAN数据通信协议的各个方面,包括CAN消息和信号的定义,以及消息的发送和接收节点。 2. 创建CAN Bus模板代码 接下来,使用CAN代码生成器创建CAN总线模板代码,根据您的需求,生成一个底层CAN的驱动程序,或使用现有的库(如果适用的话)。可以生成与目标平台或硬件一致的CAN代码。 3. 添加CAN消息和信号 使用所选的CAN代码生成器,将定义在DBC文件中的CAN消息和信号添加到CAN总线模板代码。这可以通过手动编写代码或使用GUI工具完成,具体取决于所选的工具和库。在添加CAN消息和信号时,请确保它们与DBC文件中的定义相匹配,以保持数据传输方面的准确性。 4. 测试和调试 完成上述步骤后,使用适当的CAN测试工具来测试CAN总线通信协议,并验证数据的传输。可以使用CAN分析器或测试工具,例如CanKingdom或Vector CANoe,来查看CAN数据通信协议的信息。 总之,将Apollo的DBC文件转换成CAN总线模板代码需要使用DBC编辑器和CAN代码生成器,进行导入DBC文件、创建CAN模板代码、添加CAN消息和信号和测试和调试这几个步骤,这样可以确保CAN通信的稳定性和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值