2020年12月22日星期二
上接上一篇文章https://www.cnblogs.com/shenqiren/p/14169216.html ,这篇是参考上一篇文章的步骤进行一次尝试,如果最后可以执行的话我会再系统地写一遍所有步骤(大概)。
这篇文章除了是测试自己上一篇文章对不对,同时也是对其中一些问题进行了修改,又提出了一些新的问题和思考。
目录
DBC修改
轮速反馈
在DBC中新加一个0x305的报文,名字叫VCU_Vehicle_Status_3。在这个报文里放一些需要的信息在里面,主要的想法是在里面加入一些由VCU整合后的反馈信息。
在里面我打算加入轮速反馈以及油门反馈。
油门反馈
这个打算将0x304中的信号重新写一下,将原来的制动反馈改为8bits,然后在16-24位插入一个throttle_rpt的信号,作为油门反馈。
制动反馈
在DBC中将制动压力反馈改为了百分比,需要在VCU中除以一下最大制动压力。
挡位反馈
在0x303中加入8位挡位反馈,value table如下所示:
这样就可以在代码中加入挡位反馈的内容了。
EPB驻车反馈
在0x303中加入8位的状态反馈,value table如下所示:
这样就可以在代码中加入挡位反馈的内容了。
iECU有效性设定(ENABLE)
这里先不对gear/park/_en_ctrl进行设定了,对应代码中应该删除这部分。但是我们需要把其他几个信号的0/1在value table中设定为XX_DISABLE/XX_ENABLE。
需要修改代码中的ENABLE。
挡位控制
需要修改代码中关于value table的使用。
制动请求
这里本来就是百分比的控制方法,但是需要说一下,所有的comment中不能有汉字或者换行和回车,这是Apollo中规定的。
驱动请求
Value table已经按照之前的设想修改了,如图所示:
需要修改代码中的value table的表达。
转向请求
关于转向请求左正右负的问题,我觉得可以先不修改,因为这只是模拟而已。不过还是需要注意一点,因为我看转向反馈在304里是左正右负的,这可能会导致一些问题的出现,后续需要统一一下。
车辆自检
对0x301中的0/1进行修改,新建的value table如下所示:
统计有用的DBCmessage
发送信号:0x501/0x502/0x503/0x504/0x505
接收信号: 1) 电机的反馈:0x10/0x20/0x30/0x40/0x60/0x70/0x80/0x90
2) 状态的VCU反馈:0x301/0x303/0x304或许还会有0x305
本节完
2020年12月22日 16:47
于宁波天尚元振狮路365号工厂二楼
代码修改(tsy_controller.cc)
参考之前的博客:https://www.cnblogs.com/shenqiren/p/14169216.html 进行修改,可能直接复制粘贴网站上的代码会有TAB不对齐的问题,百度一下Vscode自动对齐就好了。不过在修改过程中我发现了一个问题,那就是如果自己按照DBC中的名字一个一个的敲实在是费时费力,而且还容易出错。
这里开始对之前遗留的一些问题做了修改,算是配适tsy_controller.cc的第二版吧。
轮速反馈
这里改用305的唯一信号了。
- //5 wheel spd
- if (tsy.has_vcu_vehicle_status_3_305()) {
- if (tsy.vcu_vehicle_status_3_305().has_rpm_fl_rpt()) {
- chassis_.mutable_wheel_speed()->set_wheel_spd_fl(
- tsy.vcu_vehicle_status_3_305().rpm_fl_rpt());
- }
- if (tsy.vcu_vehicle_status_3_305().has_rpm_fr_rpt()) {
- chassis_.mutable_wheel_speed()->set_wheel_spd_fr(
- tsy.vcu_vehicle_status_3_305().rpm_fr_rpt());
- }
- if (tsy.vcu_vehicle_status_3_305().has_rpm_rl_rpt()) {
- chassis_.mutable_wheel_speed()->set_wheel_spd_rl(
- tsy.vcu_vehicle_status_3_305().rpm_rl_rpt());
- }
- if (tsy.vcu_vehicle_status_3_305().has_rpm_rr_rpt()) {
- chassis_.mutable_wheel_speed()->set_wheel_spd_rr(
- tsy.vcu_vehicle_status_3_305().rpm_rr_rpt());
- }
- }
油门反馈
这里突然想到一个问题,我们的DBC中0x304油门反馈的数据范围好像不是0-100。
- // 10 brake 0x304
- if (tsy.has_vcu_vehicle_status_2_304() &&
- tsy.vcu_vehicle_status_2_304().has_vehicle_brake_pressure()) {
- chassis_.set_brake_percentage(static_cast<float>(
- tsy.vcu_vehicle_status_2_304().vehicle_brake_pressure()));
- } else {
- chassis_.set_brake_percentage(0);
- }
- /* 下面是原来用0x142的传感器反馈的,这里为了测试就改用0x304了
- if (tsy.has_dbsf_status_142() &&
- tsy.dbsf_status_142().has_dbsf_hp_pressure()) {
- chassis_.set_brake_percentage(static_cast<float>(
- tsy.dbsf_status_142().has_dbsf_hp_pressure()));
- } else {
- chassis_.set_brake_percentage(0);
- }
- */
制动反馈
问题同上,DBC好像还是0-8,而不是0-100。
- // 10 brake 0x304
- if (tsy.has_vcu_vehicle_status_2_304() &&
- tsy.vcu_vehicle_status_2_304().has_vehicle_brake_pressure()) {
- chassis_.set_brake_percentage(static_cast<float>(
- tsy.vcu_vehicle_status_2_304().vehicle_brake_pressure()));
- } else {
- chassis_.set_brake_percentage(0);
- }
挡位反馈
这里在0x303中定义了一个挡位反馈,仅用于调试使用,VCU中暂时没有这个逻辑。
- // 23, previously 11 gear 0x303中定义挡位反馈
- if (tsy.has_vcu_vehicle_status_1_303() &&
- tsy.vcu_vehicle_status_1_303().has_gear_rpt()) {
- Chassis::GearPosition gear_pos = Chassis::GEAR_INVALID;
- if (tsy.vcu_vehicle_status_1_303().gear_rpt() ==
- Vcu_vehicle_status_1_303::GEAR_RPT_INVALID) {
- gear_pos = Chassis::GEAR_INVALID;
- }
- if (tsy.vcu_vehicle_status_1_303().gear_rpt() ==
- Vcu_vehicle_status_1_303::GEAR_RPT_NEUTRAL) {
- gear_pos = Chassis::GEAR_NEUTRAL;
- }
- if (tsy.vcu_vehicle_status_1_303().gear_rpt() ==
- Vcu_vehicle_status_1_303::GEAR_RPT_REVERSE) {
- gear_pos = Chassis::GEAR_REVERSE;
- }
- if (tsy.vcu_vehicle_status_1_303().gear_rpt() ==
- Vcu_vehicle_status_1_303::GEAR_RPT_DRIVE) {
- gear_pos = Chassis::GEAR_DRIVE;
- }
- if (tsy.vcu_vehicle_status_1_303().gear_rpt() ==
- Vcu_vehicle_status_1_303::GEAR_RPT_PARKING) {
- gear_pos = Chassis::GEAR_PARKING;
- }
- chassis_.set_gear_location(gear_pos);
- } else {
- chassis_.set_gear_location(Chassis::GEAR_NONE);
- }
EPB驻车反馈
- // 13 parking brake
- if (tsy.has_vcu_vehicle_status_1_303() &&
- tsy.vcu_vehicle_status_1_303().has_epb_rpt()) {
- if (tsy.vcu_vehicle_status_1_303().epb_rpt() ==
- Vcu_vehicle_status_1_303::EPB_RPT_EPB_ON) {
- chassis_.set_parking_brake(true);
- } else {
- chassis_.set_parking_brake(false);
- }
- } else {
- chassis_.set_parking_brake(false);
- }
这里是只有true与false,所以把EPB的0和2的状态都当作false,这在具体信号中规定了。
// config detail: {'bit': 24, 'enum': {0: 'EPB_RPT_EPB_NONE', 1: 'EPB_RPT_EPB_ON', 2: 'EPB_RPT_EPB_OFF'}, 'is_signed_var': False, 'len': 8, 'name': 'epb_rpt', 'offset': 0.0, 'order': 'intel', 'physical_range': '[0|2]', 'physical_unit': '', 'precision': 1.0, 'type': 'enum'}
Vcu_vehicle_status_1_303::Epb_rptType Vcuvehiclestatus1303::epb_rpt(const std::uint8_t* bytes, int32_t length) const {
Byte t0(bytes + 3);
int32_t x = t0.get_byte(0, 8);
Vcu_vehicle_status_1_303::Epb_rptType ret = static_cast<Vcu_vehicle_status_1_303::Epb_rptType>(x);
return ret;
}
iECU有效性(ENABLE)
这里有一点点小问题,怎么我的value table里的名字变得这么长了?
// config detail: {'bit': 0, 'enum': {0: 'IECU_CONTROL_REQUEST_FLAG_IECU_DISABLE', 1: 'IECU_CONTROL_REQUEST_FLAG_IECU_ENABLE'}, 'is_signed_var': False, 'len': 8, 'name': 'iECU_Control_Request_Flag', 'offset': 0.0, 'order': 'intel', 'physical_range': '[0|1]', 'physical_unit': 'N/A', 'precision': 1.0, 'type': 'enum'}
void Iecucontrolflag501::set_p_iecu_control_request_flag(uint8_t* data,
Iecu_control_flag_501::Iecu_control_request_flagType iecu_control_request_flag) {
int x = iecu_control_request_flag;
Byte to_set(data + 0);
to_set.set_value(x, 0, 8);
}
- ErrorCode TsyController::EnableAutoMode() {
- if (driving_mode() == Chassis::COMPLETE_AUTO_DRIVE) {
- AINFO << "already in COMPLETE_AUTO_DRIVE mode";
- return ErrorCode::OK;
- }
- return ErrorCode::OK;
- // set enable
- iecu_control_flag_501_->set_iecu_control_request_flag(
- Iecu_control_flag_501::IECU_CONTROL_REQUEST_FLAG_IECU_ENABLE)
- iecu_control_steering_502_->set_iecu_steering_valid(
- Iecu_control_steering_502::IECU_STEERING_VALID_STR_ENABLE);
- iecu_control_ibc_503_->set_iecu_ibc_valid(
- Iecu_control_ibc_503::IECU_IBC_VALID_BRK_ENABLE);
- iecu_control_power_504_->set_iecu_power_valid(
- Iecu_control_power_504::IECU_POWER_VALID_POW_ENABLE);
- can_sender_->Update();
- const int32_t flag =
- CHECK_RESPONSE_STEER_UNIT_FLAG | CHECK_RESPONSE_SPEED_UNIT_FLAG;
- if (!CheckResponse(flag, true)) {
- AERROR << "Failed to switch to COMPLETE_AUTO_DRIVE mode.";
- Emergency();
- set_chassis_error_code(Chassis::CHASSIS_ERROR);
- return ErrorCode::CANBUS_ERROR;
- }
- set_driving_mode(Chassis::COMPLETE_AUTO_DRIVE);
- AINFO << "Switch to COMPLETE_AUTO_DRIVE mode ok.";
- return ErrorCode::OK;
- }
这和我前面DBC中定义的完全不对劲啊。
挡位控制
- // NEUTRAL, REVERSE, DRIVE
- void TsyController::Gear(Chassis::GearPosition gear_position) {
- if (driving_mode() != Chassis::COMPLETE_AUTO_DRIVE &&
- driving_mode() != Chassis::AUTO_SPEED_ONLY) {
- AINFO << "This drive mode no need to set gear.";
- return;
- }
- // ADD YOUR OWN CAR CHASSIS OPERATION
- switch (gear_position) {
- case Chassis::GEAR_NEUTRAL: {
- iecu_control_power_504_->set_iecu_power_gear(Iecu_control_power_504::IECU_POWER_GEAR_NEUTRAL_CMD);
- break;
- }
- case Chassis::GEAR_REVERSE: {
- iecu_control_power_504_->set_iecu_power_gear(Iecu_control_power_504::IECU_POWER_GEAR_REVERSE_CMD);
- break;
- }
- case Chassis::GEAR_DRIVE: {
- iecu_control_power_504_->set_iecu_power_gear(Iecu_control_power_504::IECU_POWER_GEAR_DRIVE_CMD);
- break;
- }
- case Chassis::GEAR_PARKING: {
- iecu_control_power_504_->set_iecu_power_gear(Iecu_control_power_504::IECU_POWER_GEAR_PARK_CMD);
- break;
- }
- /*
- case Chassis::GEAR_LOW: {
- gear_66_->set_gear_low();
- break;
- }
- 并没有设计低速档,所以这段不用。
- */
- case Chassis::GEAR_NONE: {
- iecu_control_power_504_->set_iecu_power_gear(Iecu_control_power_504::IECU_POWER_GEAR_NEUTRAL_CMD);
- break;
- }
- case Chassis::GEAR_INVALID: {
- AERROR << "Gear command is invalid!";
- iecu_control_power_504_->set_iecu_power_gear(Iecu_control_power_504::IECU_POWER_GEAR_NEUTRAL_CMD);
- break;
- }
- default: {
- iecu_control_power_504_->set_iecu_power_gear(Iecu_control_power_504::IECU_POWER_GEAR_NEUTRAL_CMD);
- break;
- }
- }
- }
制动请求
不需要修改。
驱动请求
油门控制
- // drive with old acceleration
- // gas:0.00~99.99 unit:
- void TsyController::Throttle(double pedal) {
- if (driving_mode() != Chassis::COMPLETE_AUTO_DRIVE &&
- driving_mode() != Chassis::AUTO_SPEED_ONLY) {
- AINFO << "The current drive mode does not need to set throttle pedal.";
- return;
- }
- iecu_control_power_504_->set_iecu_total_or_distribute(
- Iecu_control_power_504::IECU_TOTAL_OR_DISTRIBUTE_POW_TOTAL);
- iecu_control_power_504_->set_torque_or_speed_or_acc(
- Iecu_control_power_504::IECU_TORQUE_OR_SPEED_OR_ACC_POW_TORQUE);
- iecu_control_power_504_->set_iecu_torque_control(pedal);
- }
这就离谱,我只担心会不会字符太长超出了限制。
加速度控制
- // confirm the car is driven by acceleration command or throttle/brake pedal
- // drive with acceleration/deceleration
- // acc:-7.0 ~ 5.0, unit:m/s^2
- void TsyController::Acceleration(double acc) {
- 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;
- }
- iecu_control_power_504_->set_iecu_total_or_distribute(
- Iecu_control_power_504::IECU_TOTAL_OR_DISTRIBUTE_POW_TOTAL);
- iecu_control_power_504_->set_torque_or_speed_or_acc(
- Iecu_control_power_504::IECU_TORQUE_OR_SPEED_OR_ACC_POW_ACC);
- iecu_control_power_504_->set_iecu_acc_or_de_control(acc);
- }
转向请求
我突然明白为什么devkit的这段里面存在一个M_PI了,应该是他原始的单位是弧度rad,并非角度°。
M_PI * 180
- // tsy default, -470 ~ 470, left:+, right:-
- // need to be compatible with control module, so reverse
- // steering with old angle speed
- // angle:-99.99~0.00~99.99, unit:, left:-, right:+
- void TsyController::Steer(double angle) {
- if (driving_mode() != Chassis::COMPLETE_AUTO_DRIVE &&
- driving_mode() != Chassis::AUTO_STEER_ONLY) {
- AINFO << "The current driving mode does not need to set steer.";
- return;
- }
- const double real_angle = params_.max_steer_angle() * angle / 100.0;
- // reverse sign
- iecu_control_steering_502_->set_iecu_ftire_angle_cmd(real_angle);
- iecu_control_steering_502_->set_iecu_ftire_speed_cmd(200);
- }
车辆自检
- bool TsyController::CheckChassisError() {
- ChassisDetail chassis_detail;
- message_manager_->GetSensorData(&chassis_detail);
- if (!chassis_detail.has_tsy()) {
- AERROR_EVERY(100) << "ChassisDetail has no tsy vehicle info."
- << chassis_detail.DebugString();
- return false;
- }
- Tsy tsy = chassis_detail.tsy();
- // steer fault
- if (tsy.has_vcu_vehicle_diagnosis_301()) {
- if (Vcu_vehicle_diagnosis_301::FSTEERING_STATE_FSTR_FAULT ==
- tsy.vcu_vehicle_diagnosis_301().fsteering_state()) {
- return true;
- }
- }
- // drive fault
- if (tsy.has_vcu_vehicle_diagnosis_301()) {
- if (Vcu_vehicle_diagnosis_301::FLMOTOR_STATE_FL_FAULT ==
- tsy.vcu_vehicle_diagnosis_301().flmotor_state()) {
- return true;
- }
- if (Vcu_vehicle_diagnosis_301::FRMOTOR_STATE_FR_FAULT ==
- tsy.vcu_vehicle_diagnosis_301().frmotor_state()) {
- return true;
- }
- if (Vcu_vehicle_diagnosis_301::RLMOTOR_STATE_RL_FAULT ==
- tsy.vcu_vehicle_diagnosis_301().rlmotor_state()) {
- return true;
- }
- if (Vcu_vehicle_diagnosis_301::RRMOTOR_STATE_RR_FAULT ==
- tsy.vcu_vehicle_diagnosis_301().rrmotor_state()) {
- return true;
- }
- }
- // brake fault
- if (tsy.has_vcu_vehicle_diagnosis_301()) {
- if (Vcu_vehicle_diagnosis_301::DBSF_STATE_DBSF_FAULT ==
- tsy.vcu_vehicle_diagnosis_301().dbsf_state()) {
- return true;
- }
- }
- // gear fault
- /*
- 挡位并没有错误码,也不知道酷黑是哪里来的这个信号。
- */
- // park fault
- if (tsy.has_vcu_vehicle_diagnosis_301()) {
- if (Vcu_vehicle_diagnosis_301::EPB_STATE_EPB_FAULT ==
- tsy.vcu_vehicle_diagnosis_301().epb_state()) {
- return true;
- }
- }
- return false;
- }
本节完
2020年12月23日 11:41
于宁波天尚元振狮路365号工厂二楼