1、canbus文件
canbus相关的代码有三个文件夹,分别是canbus(主程序)、canbus_vehicle(车辆类型工厂)、drivers/canbus(硬件驱动)
其中canbus文件夹是canbus模块的主程序入口,构造函数为周期触发的函数,周期执行。该模块包括了函数的输入,输出,在vehicle内,定义VehicleController,用以调取车辆对应的类型。除了common、conf的配置内容外,其他均可不用修改。
class CanbusComponent final : public apollo::cyber::TimerComponent {
2、canbus_vehicle
为车辆类型的存储工厂,根据车辆类型存放,一种车型一个文件夹,内容为上一节中DBC生成的代码。
参考案例如上图,其中ge3_controller为之前讲述的canbus/vehicle调用的实例车型的最终函数侧,protocol内为报文的接口函数侧。主要修改的文件为ge3_controller,其中需要修改的函数如下:
chassis函数的作用是解析底盘反馈报文,赋值至chassis话题,其中的赋值内容根据chassis话题内容定义和报文内的定义进行匹配转换赋值。
以speed_mps为例:
if (chassis_detail.has_vehicle_speed_rpt_6f() &&
chassis_detail.vehicle_speed_rpt_6f().has_vehicle_speed()) {
chassis_.set_speed_mps(static_cast<float>(
chassis_detail.vehicle_speed_rpt_6f().vehicle_speed()));
} else {
chassis_.set_speed_mps(0);
}
brake函数例子:(根据自己协议的相关转化关系进行转化)
void GemController::Brake(double pedal) {
// double real_value = params_.max_acc() * acceleration / 100;
// TODO(QiL) Update brake value based on mode
if (driving_mode() != Chassis::COMPLETE_AUTO_DRIVE &&
driving_mode() != Chassis::AUTO_SPEED_ONLY) {
AINFO << "The current drive mode does not need to set acceleration.";
return;
}
brake_cmd_6b_->set_brake_cmd(pedal / 100.0);
}
tips:编写自己车型的函数时,可以参考apollo自带的车型的例子进行修改,新增一个就编译一下,方便定位问题。
4、drivers/canbus
drivers/canbus为硬件驱动,can_client为can卡方式,可在canbus/conf内进行选择。can_common为can的sender和receiver接口,可不做修改。
以上为canbus模块所修改的地方,修改完以上模块的代码后,CANBUS模块基本上就可以正常运行了。接下来就可以开展control与planning的模块了。