Apollo 10.0
自动驾驶开放平台
apollo::canbus::devkit::DevkitController类 参考final

#include <devkit_controller.h>

类 apollo::canbus::devkit::DevkitController 继承关系图:
apollo::canbus::devkit::DevkitController 的协作图:

Public 成员函数

 DevkitController ()
 
virtual ~DevkitController ()
 
::apollo::common::ErrorCode Init (const VehicleParameter &params, CanSender<::apollo::canbus::Devkit > *const can_sender, MessageManager<::apollo::canbus::Devkit > *const message_manager) override
 
bool Start () override
 start the vehicle controller.
 
void Stop () override
 stop the vehicle controller.
 
Chassis chassis () override
 calculate and return the chassis.
 
void AddSendMessage () override
 add the sender message.
 
 FRIEND_TEST (DevkitControllerTest, SetDrivingMode)
 for test
 
 FRIEND_TEST (DevkitControllerTest, Status)
 
 FRIEND_TEST (DevkitControllerTest, UpdateDrivingMode)
 
- Public 成员函数 继承自 apollo::canbus::VehicleController<::apollo::canbus::Devkit >
virtual ~VehicleController ()=default
 
virtual common::ErrorCode Init (const VehicleParameter &params, CanSender< ::apollo::canbus::Devkit > *const can_sender, MessageManager< ::apollo::canbus::Devkit > *const message_manager)=0
 initialize the vehicle controller.
 
virtual common::ErrorCode Update (const control::ControlCommand &command)
 update the vehicle controller.
 
virtual common::ErrorCode Update (const external_command::ChassisCommand &command)
 
virtual common::ErrorCode SetDrivingMode (const Chassis::DrivingMode &driving_mode)
 set vehicle to appointed driving mode.
 
virtual bool CheckChassisCommunicationError ()
 
virtual ::apollo::canbus::Devkit GetNewRecvChassisDetail ()
 
virtual ::apollo::canbus::Devkit GetNewSenderChassisDetail ()
 
virtual Chassis::DrivingMode driving_mode ()
 

额外继承的成员函数

- Protected 成员函数 继承自 apollo::canbus::VehicleController<::apollo::canbus::Devkit >
virtual void set_driving_mode (const Chassis::DrivingMode &driving_mode)
 
- Protected 属性 继承自 apollo::canbus::VehicleController<::apollo::canbus::Devkit >
common::VehicleSignal last_chassis_command_
 
common::VehicleSignal last_control_command_
 
canbus::VehicleParameter params_
 
common::VehicleParam vehicle_params_
 
CanSender< ::apollo::canbus::Devkit > * can_sender_
 
CanReceiver< ::apollo::canbus::Devkit > * can_receiver_
 
MessageManager< ::apollo::canbus::Devkit > * message_manager_
 
bool is_initialized_
 
Chassis::DrivingMode driving_mode_
 
bool is_reset_
 
std::mutex mode_mutex_
 
uint32_t lost_chassis_reveive_detail_count_
 
bool is_need_count_
 
size_t sender_data_size_previous_
 
int64_t start_time_
 
bool is_chassis_communication_error_
 

详细描述

在文件 devkit_controller.h40 行定义.

构造及析构函数说明

◆ DevkitController()

apollo::canbus::devkit::DevkitController::DevkitController ( )
inline

在文件 devkit_controller.h43 行定义.

43{}

◆ ~DevkitController()

apollo::canbus::devkit::DevkitController::~DevkitController ( )
virtual

在文件 devkit_controller.cc138 行定义.

138{}

成员函数说明

◆ AddSendMessage()

void apollo::canbus::devkit::DevkitController::AddSendMessage ( )
overridevirtual

add the sender message.

重载 apollo::canbus::VehicleController<::apollo::canbus::Devkit > .

在文件 devkit_controller.cc48 行定义.

48 {
49 can_sender_->AddMessage(Throttlecommand100::ID, throttle_command_100_, false);
50 can_sender_->AddMessage(Brakecommand101::ID, brake_command_101_, false);
51 can_sender_->AddMessage(Gearcommand103::ID, gear_command_103_, false);
52 can_sender_->AddMessage(Parkcommand104::ID, park_command_104_, false);
53 can_sender_->AddMessage(Steeringcommand102::ID, steering_command_102_, false);
54 can_sender_->AddMessage(Vehiclemodecommand105::ID, vehicle_mode_command_105_,
55 false);
56}

◆ chassis()

Chassis apollo::canbus::devkit::DevkitController::chassis ( )
overridevirtual

calculate and return the chassis.

返回
a copy of chassis. Use copy here to avoid multi-thread issues.

实现了 apollo::canbus::VehicleController<::apollo::canbus::Devkit >.

在文件 devkit_controller.cc164 行定义.

164 {
165 chassis_.Clear();
166
167 Devkit chassis_detail = GetNewRecvChassisDetail();
168
169 // 1, 2
170 // if (driving_mode() == Chassis::EMERGENCY_MODE) {
171 // set_chassis_error_code(Chassis::NO_ERROR);
172 // }
173
174 chassis_.set_driving_mode(driving_mode());
175 chassis_.set_error_code(chassis_error_code());
176
177 // 3
178 chassis_.set_engine_started(true);
179 // 4 engine rpm ch has no engine rpm
180 // chassis_.set_engine_rpm(0);
181 // 5 wheel spd
182 if (chassis_detail.has_wheelspeed_report_506()) {
183 if (chassis_detail.wheelspeed_report_506().has_rr()) {
184 chassis_.mutable_wheel_speed()->set_wheel_spd_rr(
185 chassis_detail.wheelspeed_report_506().rr());
186 }
187 if (chassis_detail.wheelspeed_report_506().has_rl()) {
188 chassis_.mutable_wheel_speed()->set_wheel_spd_rl(
189 chassis_detail.wheelspeed_report_506().rl());
190 }
191 if (chassis_detail.wheelspeed_report_506().has_fr()) {
192 chassis_.mutable_wheel_speed()->set_wheel_spd_fr(
193 chassis_detail.wheelspeed_report_506().fr());
194 }
195 if (chassis_detail.wheelspeed_report_506().has_fl()) {
196 chassis_.mutable_wheel_speed()->set_wheel_spd_fl(
197 chassis_detail.wheelspeed_report_506().fl());
198 }
199 }
200 // 6 speed_mps
201 if (chassis_detail.has_vcu_report_505() &&
202 chassis_detail.vcu_report_505().has_speed()) {
203 chassis_.set_speed_mps(
204 std::abs(static_cast<float>(chassis_detail.vcu_report_505().speed())));
205 } else {
206 chassis_.set_speed_mps(0);
207 }
208 // 7 no odometer
209 // chassis_.set_odometer_m(0);
210 // 8 no fuel. do not set;
211 // chassis_.set_fuel_range_m(0);
212 // 9 throttle
213 if (chassis_detail.has_throttle_report_500() &&
214 chassis_detail.throttle_report_500().has_throttle_pedal_actual()) {
215 chassis_.set_throttle_percentage(static_cast<float>(
216 chassis_detail.throttle_report_500().throttle_pedal_actual()));
217 } else {
218 chassis_.set_throttle_percentage(0);
219 }
220 // throttle sender cmd
221 if (chassis_detail.has_throttle_command_100() &&
222 chassis_detail.throttle_command_100().has_throttle_pedal_target()) {
223 chassis_.set_throttle_percentage_cmd(static_cast<float>(
224 chassis_detail.throttle_command_100().throttle_pedal_target()));
225 } else {
226 chassis_.set_throttle_percentage_cmd(0);
227 }
228 // 10 brake
229 if (chassis_detail.has_brake_report_501() &&
230 chassis_detail.brake_report_501().has_brake_pedal_actual()) {
231 chassis_.set_brake_percentage(static_cast<float>(
232 chassis_detail.brake_report_501().brake_pedal_actual()));
233 } else {
234 chassis_.set_brake_percentage(0);
235 }
236 // brake sender cmd
237 if (chassis_detail.has_brake_command_101() &&
238 chassis_detail.brake_command_101().has_brake_pedal_target()) {
239 chassis_.set_brake_percentage_cmd(static_cast<float>(
240 chassis_detail.brake_command_101().brake_pedal_target()));
241 } else {
242 chassis_.set_brake_percentage_cmd(0);
243 }
244 // 23, previously 11 gear
245 if (chassis_detail.has_gear_report_503() &&
246 chassis_detail.gear_report_503().has_gear_actual()) {
248
249 if (chassis_detail.gear_report_503().gear_actual() ==
251 gear_pos = Chassis::GEAR_INVALID;
252 }
253 if (chassis_detail.gear_report_503().gear_actual() ==
255 gear_pos = Chassis::GEAR_NEUTRAL;
256 }
257 if (chassis_detail.gear_report_503().gear_actual() ==
259 gear_pos = Chassis::GEAR_REVERSE;
260 }
261 if (chassis_detail.gear_report_503().gear_actual() ==
263 gear_pos = Chassis::GEAR_DRIVE;
264 }
265 if (chassis_detail.gear_report_503().gear_actual() ==
267 gear_pos = Chassis::GEAR_PARKING;
268 }
269 chassis_.set_gear_location(gear_pos);
270 } else {
271 chassis_.set_gear_location(Chassis::GEAR_NONE);
272 }
273 // 12 steering
274 if (chassis_detail.has_steering_report_502() &&
275 chassis_detail.steering_report_502().has_steer_angle_actual()) {
276 chassis_.set_steering_percentage(static_cast<float>(
277 chassis_detail.steering_report_502().steer_angle_actual() * 100.0 /
278 vehicle_params_.max_steer_angle() * M_PI / 180));
279 } else {
280 chassis_.set_steering_percentage(0);
281 }
282 // steering sender cmd
283 if (chassis_detail.has_steering_command_102() &&
284 chassis_detail.steering_command_102().has_steer_angle_target()) {
285 chassis_.set_steering_percentage_cmd(static_cast<float>(
286 chassis_detail.steering_command_102().steer_angle_target()));
287 } else {
288 chassis_.set_steering_percentage_cmd(0);
289 }
290 // 13 parking brake
291 if (chassis_detail.has_park_report_504() &&
292 chassis_detail.park_report_504().has_parking_actual()) {
293 if (chassis_detail.park_report_504().parking_actual() ==
295 chassis_.set_parking_brake(true);
296 } else {
297 chassis_.set_parking_brake(false);
298 }
299 } else {
300 chassis_.set_parking_brake(false);
301 }
302 // 14 battery soc
303 if (chassis_detail.has_bms_report_512() &&
304 chassis_detail.bms_report_512().has_battery_soc_percentage()) {
305 chassis_.set_battery_soc_percentage(
306 chassis_detail.bms_report_512().battery_soc_percentage());
307 // 15 give engage_advice based on battery low soc warn
308 if (chassis_detail.bms_report_512().is_battery_soc_low()) {
309 chassis_.mutable_engage_advice()->set_advice(
311 chassis_.mutable_engage_advice()->set_reason(
312 "Battery soc percentage is lower than 15%, please charge it "
313 "quickly!");
314 }
315 } else {
316 chassis_.set_battery_soc_percentage(0);
317 }
318 // 16 sonor list
319 // to do(ALL):check your vehicle type, confirm your sonar position because of
320 // every vhechle has different sonars assembly.
321 // 08 09 10 11
322 if (chassis_detail.has_ultr_sensor_1_507()) {
323 chassis_.mutable_surround()->set_sonar08(
324 chassis_detail.ultr_sensor_1_507().uiuss8_tof_direct());
325 chassis_.mutable_surround()->set_sonar09(
326 chassis_detail.ultr_sensor_1_507().uiuss9_tof_direct());
327 chassis_.mutable_surround()->set_sonar10(
328 chassis_detail.ultr_sensor_1_507().uiuss10_tof_direct());
329 chassis_.mutable_surround()->set_sonar11(
330 chassis_detail.ultr_sensor_1_507().uiuss11_tof_direct());
331 } else {
332 chassis_.mutable_surround()->set_sonar08(0);
333 chassis_.mutable_surround()->set_sonar09(0);
334 chassis_.mutable_surround()->set_sonar10(0);
335 chassis_.mutable_surround()->set_sonar11(0);
336 }
337 // 2 3 4 5
338 if (chassis_detail.has_ultr_sensor_3_509()) {
339 chassis_.mutable_surround()->set_sonar02(
340 chassis_detail.ultr_sensor_3_509().uiuss2_tof_direct());
341 chassis_.mutable_surround()->set_sonar03(
342 chassis_detail.ultr_sensor_3_509().uiuss3_tof_direct());
343 chassis_.mutable_surround()->set_sonar04(
344 chassis_detail.ultr_sensor_3_509().uiuss4_tof_direct());
345 chassis_.mutable_surround()->set_sonar05(
346 chassis_detail.ultr_sensor_3_509().uiuss5_tof_direct());
347 } else {
348 chassis_.mutable_surround()->set_sonar02(0);
349 chassis_.mutable_surround()->set_sonar03(0);
350 chassis_.mutable_surround()->set_sonar04(0);
351 chassis_.mutable_surround()->set_sonar05(0);
352 }
353 // 0 1 6 7
354 if (chassis_detail.has_ultr_sensor_5_511()) {
355 chassis_.mutable_surround()->set_sonar00(
356 chassis_detail.ultr_sensor_5_511().uiuss0_tof_direct());
357 chassis_.mutable_surround()->set_sonar01(
358 chassis_detail.ultr_sensor_5_511().uiuss1_tof_direct());
359 chassis_.mutable_surround()->set_sonar06(
360 chassis_detail.ultr_sensor_5_511().uiuss6_tof_direct());
361 chassis_.mutable_surround()->set_sonar07(
362 chassis_detail.ultr_sensor_5_511().uiuss7_tof_direct());
363 } else {
364 chassis_.mutable_surround()->set_sonar00(0);
365 chassis_.mutable_surround()->set_sonar01(0);
366 chassis_.mutable_surround()->set_sonar06(0);
367 chassis_.mutable_surround()->set_sonar07(0);
368 }
369 // 17 set vin
370 // vin set 17 bits, like LSBN1234567890123 is prased as
371 // vin17(L),vin16(S),vin15(B),......,vin03(1),vin02(2),vin01(3)
372 std::string vin = "";
373 if (chassis_detail.has_vin_resp1_514()) {
374 Vin_resp1_514 vin_resp1_514 = chassis_detail.vin_resp1_514();
375 vin += vin_resp1_514.vin00();
376 vin += vin_resp1_514.vin01();
377 vin += vin_resp1_514.vin02();
378 vin += vin_resp1_514.vin03();
379 vin += vin_resp1_514.vin04();
380 vin += vin_resp1_514.vin05();
381 vin += vin_resp1_514.vin06();
382 vin += vin_resp1_514.vin07();
383 }
384 if (chassis_detail.has_vin_resp2_515()) {
385 Vin_resp2_515 vin_resp2_515 = chassis_detail.vin_resp2_515();
386 vin += vin_resp2_515.vin08();
387 vin += vin_resp2_515.vin09();
388 vin += vin_resp2_515.vin10();
389 vin += vin_resp2_515.vin11();
390 vin += vin_resp2_515.vin12();
391 vin += vin_resp2_515.vin13();
392 vin += vin_resp2_515.vin14();
393 vin += vin_resp2_515.vin15();
394 }
395 if (chassis_detail.has_vin_resp3_516()) {
396 Vin_resp3_516 vin_resp3_516 = chassis_detail.vin_resp3_516();
397 vin += vin_resp3_516.vin16();
398 }
399 std::reverse(vin.begin(), vin.end());
400 chassis_.mutable_vehicle_id()->set_vin(vin);
401 // 18 front bumper event
402 if (chassis_detail.has_vcu_report_505() &&
403 chassis_detail.vcu_report_505().has_frontcrash_state()) {
404 if (chassis_detail.vcu_report_505().frontcrash_state() ==
406 chassis_.set_front_bumper_event(Chassis::BUMPER_PRESSED);
407 } else {
408 chassis_.set_front_bumper_event(Chassis::BUMPER_NORMAL);
409 }
410 } else {
411 chassis_.set_front_bumper_event(Chassis::BUMPER_INVALID);
412 }
413 // 19 back bumper event
414 if (chassis_detail.has_vcu_report_505() &&
415 chassis_detail.vcu_report_505().has_backcrash_state()) {
416 if (chassis_detail.vcu_report_505().backcrash_state() ==
418 chassis_.set_back_bumper_event(Chassis::BUMPER_PRESSED);
419 } else {
420 chassis_.set_back_bumper_event(Chassis::BUMPER_NORMAL);
421 }
422 } else {
423 chassis_.set_back_bumper_event(Chassis::BUMPER_INVALID);
424 }
425
426 // 20 add checkresponse signal
427 if (chassis_detail.has_brake_report_501() &&
428 chassis_detail.brake_report_501().has_brake_en_state()) {
429 chassis_.mutable_check_response()->set_is_esp_online(
430 chassis_detail.brake_report_501().brake_en_state() == 1);
431 }
432 if (chassis_detail.has_steering_report_502() &&
433 chassis_detail.steering_report_502().has_steer_en_state()) {
434 chassis_.mutable_check_response()->set_is_eps_online(
435 chassis_detail.steering_report_502().steer_en_state() == 1);
436 }
437 if (chassis_detail.has_throttle_report_500() &&
438 chassis_detail.throttle_report_500().has_throttle_en_state()) {
439 chassis_.mutable_check_response()->set_is_vcu_online(
440 chassis_detail.throttle_report_500().throttle_en_state() == 1);
441 }
442
443 if (CheckChassisError()) {
444 chassis_.mutable_engage_advice()->set_advice(
446 chassis_.mutable_engage_advice()->set_reason(
447 "Chassis has some fault, please check the chassis_detail.");
448 }
449
450 // check the chassis detail lost
452 chassis_.mutable_engage_advice()->set_advice(
454 chassis_.mutable_engage_advice()->set_reason(
455 "devkit chassis detail is lost! Please check the communication error.");
456 set_chassis_error_code(Chassis::CHASSIS_CAN_LOST);
458 }
459
460 return chassis_;
461}
virtual void set_driving_mode(const Chassis::DrivingMode &driving_mode)

◆ FRIEND_TEST() [1/3]

apollo::canbus::devkit::DevkitController::FRIEND_TEST ( DevkitControllerTest  ,
SetDrivingMode   
)

for test

◆ FRIEND_TEST() [2/3]

apollo::canbus::devkit::DevkitController::FRIEND_TEST ( DevkitControllerTest  ,
Status   
)

◆ FRIEND_TEST() [3/3]

apollo::canbus::devkit::DevkitController::FRIEND_TEST ( DevkitControllerTest  ,
UpdateDrivingMode   
)

◆ Init()

ErrorCode apollo::canbus::devkit::DevkitController::Init ( const VehicleParameter params,
CanSender<::apollo::canbus::Devkit > *const  can_sender,
MessageManager<::apollo::canbus::Devkit > *const  message_manager 
)
override

在文件 devkit_controller.cc58 行定义.

61 {
62 if (is_initialized_) {
63 AINFO << "DevkitController has already been initiated.";
64 return ErrorCode::CANBUS_ERROR;
65 }
66 vehicle_params_.CopyFrom(
67 common::VehicleConfigHelper::Instance()->GetConfig().vehicle_param());
68
69 params_.CopyFrom(params);
70 if (!params_.has_driving_mode()) {
71 AERROR << "Vehicle conf pb not set driving_mode.";
72 return ErrorCode::CANBUS_ERROR;
73 }
74
75 if (can_sender == nullptr) {
76 return ErrorCode::CANBUS_ERROR;
77 }
78 can_sender_ = can_sender;
79
80 if (message_manager == nullptr) {
81 AERROR << "protocol manager is null.";
82 return ErrorCode::CANBUS_ERROR;
83 }
84 message_manager_ = message_manager;
85
86 // sender part
87 brake_command_101_ = dynamic_cast<Brakecommand101*>(
88 message_manager_->GetMutableProtocolDataById(Brakecommand101::ID));
89 if (brake_command_101_ == nullptr) {
90 AERROR << "Brakecommand101 does not exist in the DevkitMessageManager!";
91 return ErrorCode::CANBUS_ERROR;
92 }
93
94 gear_command_103_ = dynamic_cast<Gearcommand103*>(
95 message_manager_->GetMutableProtocolDataById(Gearcommand103::ID));
96 if (gear_command_103_ == nullptr) {
97 AERROR << "Gearcommand103 does not exist in the DevkitMessageManager!";
98 return ErrorCode::CANBUS_ERROR;
99 }
100
101 park_command_104_ = dynamic_cast<Parkcommand104*>(
102 message_manager_->GetMutableProtocolDataById(Parkcommand104::ID));
103 if (park_command_104_ == nullptr) {
104 AERROR << "Parkcommand104 does not exist in the DevkitMessageManager!";
105 return ErrorCode::CANBUS_ERROR;
106 }
107
108 steering_command_102_ = dynamic_cast<Steeringcommand102*>(
109 message_manager_->GetMutableProtocolDataById(Steeringcommand102::ID));
110 if (steering_command_102_ == nullptr) {
111 AERROR << "Steeringcommand102 does not exist in the DevkitMessageManager!";
112 return ErrorCode::CANBUS_ERROR;
113 }
114
115 throttle_command_100_ = dynamic_cast<Throttlecommand100*>(
116 message_manager_->GetMutableProtocolDataById(Throttlecommand100::ID));
117 if (throttle_command_100_ == nullptr) {
118 AERROR << "Throttlecommand100 does not exist in the DevkitMessageManager!";
119 return ErrorCode::CANBUS_ERROR;
120 }
121
122 vehicle_mode_command_105_ = dynamic_cast<Vehiclemodecommand105*>(
123 message_manager_->GetMutableProtocolDataById(Vehiclemodecommand105::ID));
124 if (vehicle_mode_command_105_ == nullptr) {
125 AERROR
126 << "Vehiclemodecommand105 does not exist in the DevkitMessageManager!";
127 return ErrorCode::CANBUS_ERROR;
128 }
129
131
132 AINFO << "DevkitController is initialized.";
133
134 is_initialized_ = true;
135 return ErrorCode::OK;
136}
MessageManager< ::apollo::canbus::Devkit > * message_manager_
void AddSendMessage() override
add the sender message.
#define AERROR
Definition log.h:44
#define AINFO
Definition log.h:42

◆ Start()

bool apollo::canbus::devkit::DevkitController::Start ( )
overridevirtual

start the vehicle controller.

返回
true if successfully started.

实现了 apollo::canbus::VehicleController<::apollo::canbus::Devkit >.

在文件 devkit_controller.cc140 行定义.

140 {
141 if (!is_initialized_) {
142 AERROR << "DevkitController has NOT been initiated.";
143 return false;
144 }
145 const auto& update_func = [this] { SecurityDogThreadFunc(); };
146 thread_.reset(new std::thread(update_func));
147
148 return true;
149}

◆ Stop()

void apollo::canbus::devkit::DevkitController::Stop ( )
overridevirtual

stop the vehicle controller.

实现了 apollo::canbus::VehicleController<::apollo::canbus::Devkit >.

在文件 devkit_controller.cc151 行定义.

151 {
152 if (!is_initialized_) {
153 AERROR << "DevkitController stops or starts improperly!";
154 return;
155 }
156
157 if (thread_ != nullptr && thread_->joinable()) {
158 thread_->join();
159 thread_.reset();
160 AINFO << "DevkitController stopped.";
161 }
162}

该类的文档由以下文件生成: