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

#include <ge3_controller.h>

类 apollo::canbus::ge3::Ge3Controller 继承关系图:
apollo::canbus::ge3::Ge3Controller 的协作图:

Public 成员函数

 Ge3Controller ()
 
virtual ~Ge3Controller ()
 
::apollo::common::ErrorCode Init (const VehicleParameter &params, CanSender<::apollo::canbus::Ge3 > *const can_sender, MessageManager<::apollo::canbus::Ge3 > *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.
 
 FRIEND_TEST (Ge3ControllerTest, SetDrivingMode)
 
 FRIEND_TEST (Ge3ControllerTest, Status)
 
 FRIEND_TEST (Ge3ControllerTest, UpdateDrivingMode)
 
- Public 成员函数 继承自 apollo::canbus::VehicleController<::apollo::canbus::Ge3 >
virtual ~VehicleController ()=default
 
virtual common::ErrorCode Init (const VehicleParameter &params, CanSender< ::apollo::canbus::Ge3 > *const can_sender, MessageManager< ::apollo::canbus::Ge3 > *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 void AddSendMessage ()
 
virtual ::apollo::canbus::Ge3 GetNewRecvChassisDetail ()
 
virtual ::apollo::canbus::Ge3 GetNewSenderChassisDetail ()
 
virtual Chassis::DrivingMode driving_mode ()
 

额外继承的成员函数

- Protected 成员函数 继承自 apollo::canbus::VehicleController<::apollo::canbus::Ge3 >
virtual void set_driving_mode (const Chassis::DrivingMode &driving_mode)
 
- Protected 属性 继承自 apollo::canbus::VehicleController<::apollo::canbus::Ge3 >
common::VehicleSignal last_chassis_command_
 
common::VehicleSignal last_control_command_
 
canbus::VehicleParameter params_
 
common::VehicleParam vehicle_params_
 
CanSender< ::apollo::canbus::Ge3 > * can_sender_
 
CanReceiver< ::apollo::canbus::Ge3 > * can_receiver_
 
MessageManager< ::apollo::canbus::Ge3 > * 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_
 

详细描述

在文件 ge3_controller.h37 行定义.

构造及析构函数说明

◆ Ge3Controller()

apollo::canbus::ge3::Ge3Controller::Ge3Controller ( )
inline

在文件 ge3_controller.h39 行定义.

39{}

◆ ~Ge3Controller()

apollo::canbus::ge3::Ge3Controller::~Ge3Controller ( )
virtual

在文件 ge3_controller.cc120 行定义.

120{}

成员函数说明

◆ chassis()

Chassis apollo::canbus::ge3::Ge3Controller::chassis ( )
overridevirtual

calculate and return the chassis.

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

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

在文件 ge3_controller.cc146 行定义.

146 {
147 chassis_.Clear();
148
149 Ge3 chassis_detail;
150 message_manager_->GetSensorData(&chassis_detail);
151
152 // 21, 22, previously 1, 2
154 set_chassis_error_code(Chassis::NO_ERROR);
155 }
156
157 chassis_.set_driving_mode(driving_mode());
158 chassis_.set_error_code(chassis_error_code());
159
160 // 3
161 chassis_.set_engine_started(true);
162
163 // 5
164 if (chassis_detail.has_scu_bcs_3_308()) {
165 Scu_bcs_3_308 scu_bcs_3_308 = chassis_detail.scu_bcs_3_308();
166 if (scu_bcs_3_308.has_bcs_rrwheelspd()) {
167 if (chassis_.has_wheel_speed()) {
168 chassis_.mutable_wheel_speed()->set_is_wheel_spd_rr_valid(
169 scu_bcs_3_308.bcs_rrwheelspdvd());
170 chassis_.mutable_wheel_speed()->set_wheel_direction_rr(
171 (WheelSpeed::WheelSpeedType)scu_bcs_3_308.bcs_rrwheeldirection());
172 chassis_.mutable_wheel_speed()->set_wheel_spd_rr(
173 scu_bcs_3_308.bcs_rrwheelspd());
174 }
175 }
176
177 if (scu_bcs_3_308.has_bcs_rlwheelspd()) {
178 if (chassis_.has_wheel_speed()) {
179 chassis_.mutable_wheel_speed()->set_is_wheel_spd_rl_valid(
180 scu_bcs_3_308.bcs_rlwheelspdvd());
181 chassis_.mutable_wheel_speed()->set_wheel_direction_rl(
182 (WheelSpeed::WheelSpeedType)scu_bcs_3_308.bcs_rlwheeldirection());
183 chassis_.mutable_wheel_speed()->set_wheel_spd_rl(
184 scu_bcs_3_308.bcs_rlwheelspd());
185 }
186 }
187
188 if (scu_bcs_3_308.has_bcs_frwheelspd()) {
189 if (chassis_.has_wheel_speed()) {
190 chassis_.mutable_wheel_speed()->set_is_wheel_spd_fr_valid(
191 scu_bcs_3_308.bcs_frwheelspdvd());
192 chassis_.mutable_wheel_speed()->set_wheel_direction_fr(
193 (WheelSpeed::WheelSpeedType)scu_bcs_3_308.bcs_frwheeldirection());
194 chassis_.mutable_wheel_speed()->set_wheel_spd_fr(
195 scu_bcs_3_308.bcs_frwheelspd());
196 }
197 }
198
199 if (scu_bcs_3_308.has_bcs_flwheelspd()) {
200 if (chassis_.has_wheel_speed()) {
201 chassis_.mutable_wheel_speed()->set_is_wheel_spd_fl_valid(
202 scu_bcs_3_308.bcs_flwheelspdvd());
203 chassis_.mutable_wheel_speed()->set_wheel_direction_fl(
204 (WheelSpeed::WheelSpeedType)scu_bcs_3_308.bcs_flwheeldirection());
205 chassis_.mutable_wheel_speed()->set_wheel_spd_fl(
206 scu_bcs_3_308.bcs_flwheelspd());
207 }
208 }
209 }
210
211 if (chassis_detail.has_scu_bcs_2_307() &&
212 chassis_detail.scu_bcs_2_307().has_bcs_vehspd()) {
213 chassis_.set_speed_mps(
214 static_cast<float>(chassis_detail.scu_bcs_2_307().bcs_vehspd()));
215 } else {
216 chassis_.set_speed_mps(0);
217 }
218
219 // 7
220 // ge3 only has fuel percentage
221 // to avoid confusing, just don't set
222 chassis_.set_fuel_range_m(0);
223
224 if (chassis_detail.has_scu_vcu_1_312() &&
225 chassis_detail.scu_vcu_1_312().has_vcu_accpedact()) {
226 chassis_.set_throttle_percentage(
227 static_cast<float>(chassis_detail.scu_vcu_1_312().vcu_accpedact()));
228 } else {
229 chassis_.set_throttle_percentage(0);
230 }
231 // 9
232 if (chassis_detail.has_scu_bcs_1_306() &&
233 chassis_detail.scu_bcs_1_306().has_bcs_brkpedact()) {
234 chassis_.set_brake_percentage(
235 static_cast<float>(chassis_detail.scu_bcs_1_306().bcs_brkpedact()));
236 } else {
237 chassis_.set_brake_percentage(0);
238 }
239 // 23, previously 10
240 if (chassis_detail.has_scu_vcu_1_312() &&
241 chassis_detail.scu_vcu_1_312().has_vcu_gearact()) {
242 switch (chassis_detail.scu_vcu_1_312().vcu_gearact()) {
244 chassis_.set_gear_location(Chassis::GEAR_INVALID);
245 } break;
247 chassis_.set_gear_location(Chassis::GEAR_DRIVE);
248 } break;
250 chassis_.set_gear_location(Chassis::GEAR_NEUTRAL);
251 } break;
253 chassis_.set_gear_location(Chassis::GEAR_REVERSE);
254 } break;
256 chassis_.set_gear_location(Chassis::GEAR_PARKING);
257 } break;
258 default:
259 chassis_.set_gear_location(Chassis::GEAR_INVALID);
260 break;
261 }
262 } else {
263 chassis_.set_gear_location(Chassis::GEAR_INVALID);
264 }
265
266 // 11
267 if (chassis_detail.has_scu_eps_311() &&
268 chassis_detail.scu_eps_311().has_eps_steerangle()) {
269 chassis_.set_steering_percentage(
270 static_cast<float>(chassis_detail.scu_eps_311().eps_steerangle() /
271 vehicle_params_.max_steer_angle() * M_PI / 1.80));
272 } else {
273 chassis_.set_steering_percentage(0);
274 }
275
276 // 13
277 if (chassis_detail.has_scu_epb_310() &&
278 chassis_detail.scu_epb_310().has_epb_sysst()) {
279 chassis_.set_parking_brake(chassis_detail.scu_epb_310().epb_sysst() ==
281 } else {
282 chassis_.set_parking_brake(false);
283 }
284
285 // 14, 15: ge3 light control
286 if (chassis_detail.has_scu_bcm_304() &&
287 chassis_detail.scu_bcm_304().has_bcm_highbeamst() &&
289 chassis_detail.scu_bcm_304().bcm_highbeamst()) {
290 if (chassis_.has_signal()) {
291 chassis_.mutable_signal()->set_high_beam(true);
292 }
293 } else {
294 if (chassis_.has_signal()) {
295 chassis_.mutable_signal()->set_high_beam(false);
296 }
297 }
298
299 // 16, 17
300 if (chassis_detail.has_scu_bcm_304()) {
301 Scu_bcm_304 scu_bcm_304 = chassis_detail.scu_bcm_304();
302 if (scu_bcm_304.has_bcm_leftturnlampst() &&
304 scu_bcm_304.bcm_leftturnlampst()) {
305 chassis_.mutable_signal()->set_turn_signal(
307 } else if (scu_bcm_304.has_bcm_rightturnlampst() &&
309 scu_bcm_304.bcm_rightturnlampst()) {
310 chassis_.mutable_signal()->set_turn_signal(
312 } else {
313 chassis_.mutable_signal()->set_turn_signal(
315 }
316 } else {
317 chassis_.mutable_signal()->set_turn_signal(
319 }
320 // 18
321 if (chassis_detail.has_scu_bcm_304() &&
322 chassis_detail.scu_bcm_304().has_bcm_hornst() &&
324 chassis_detail.scu_bcm_304().bcm_hornst()) {
325 chassis_.mutable_signal()->set_horn(true);
326 } else {
327 chassis_.mutable_signal()->set_horn(false);
328 }
329
330 // vin number will be written into KVDB once.
331 chassis_.mutable_vehicle_id()->set_vin("");
332 if (chassis_detail.has_scu_1_301() && chassis_detail.has_scu_2_302() &&
333 chassis_detail.has_scu_3_303()) {
334 Scu_1_301 scu_1_301 = chassis_detail.scu_1_301();
335 Scu_2_302 scu_2_302 = chassis_detail.scu_2_302();
336 Scu_3_303 scu_3_303 = chassis_detail.scu_3_303();
337 if (scu_2_302.has_vin00() && scu_2_302.has_vin01() &&
338 scu_2_302.has_vin02() && scu_2_302.has_vin03() &&
339 scu_2_302.has_vin04() && scu_2_302.has_vin05() &&
340 scu_2_302.has_vin06() && scu_2_302.has_vin07() &&
341 scu_3_303.has_vin08() && scu_3_303.has_vin09() &&
342 scu_3_303.has_vin10() && scu_3_303.has_vin11() &&
343 scu_3_303.has_vin12() && scu_3_303.has_vin13() &&
344 scu_3_303.has_vin14() && scu_3_303.has_vin15() &&
345 scu_1_301.has_vin16()) {
346 int n[17];
347 n[0] = scu_2_302.vin00();
348 n[1] = scu_2_302.vin01();
349 n[2] = scu_2_302.vin02();
350 n[3] = scu_2_302.vin03();
351 n[4] = scu_2_302.vin04();
352 n[5] = scu_2_302.vin05();
353 n[6] = scu_2_302.vin06();
354 n[7] = scu_2_302.vin07();
355 n[8] = scu_3_303.vin08();
356 n[9] = scu_3_303.vin09();
357 n[10] = scu_3_303.vin10();
358 n[11] = scu_3_303.vin11();
359 n[12] = scu_3_303.vin12();
360 n[13] = scu_3_303.vin13();
361 n[14] = scu_3_303.vin14();
362 n[15] = scu_3_303.vin15();
363 n[16] = scu_1_301.vin16();
364
365 char ch[17];
366 memset(&ch, '\0', sizeof(ch));
367 for (int i = 0; i < 17; i++) {
368 ch[i] = static_cast<char>(n[i]);
369 }
370 if (chassis_.has_vehicle_id()) {
371 chassis_.mutable_vehicle_id()->set_vin(ch);
372 }
373 }
374 }
375
376 // give engage_advice based on error_code and canbus feedback
377 if (chassis_error_mask_) {
378 if (chassis_.has_engage_advice()) {
379 chassis_.mutable_engage_advice()->set_advice(
381 chassis_.mutable_engage_advice()->set_reason("Chassis error!");
382 }
383 } else if (chassis_.parking_brake() || CheckSafetyError(chassis_detail)) {
384 if (chassis_.has_engage_advice()) {
385 chassis_.mutable_engage_advice()->set_advice(
387 chassis_.mutable_engage_advice()->set_reason(
388 "Vehicle is not in a safe state to engage!");
389 }
390 } else {
391 if (chassis_.has_engage_advice()) {
392 chassis_.mutable_engage_advice()->set_advice(
394 }
395 }
396
397 // 19 add checkresponse signal
398 if (chassis_detail.has_scu_bcs_1_306() &&
399 chassis_detail.scu_bcs_1_306().has_bcs_drvmode()) {
400 chassis_.mutable_check_response()->set_is_esp_online(
401 chassis_detail.scu_bcs_1_306().bcs_drvmode() == 1);
402 }
403 if (chassis_detail.has_scu_eps_311() &&
404 chassis_detail.scu_eps_311().has_eps_drvmode()) {
405 chassis_.mutable_check_response()->set_is_eps_online(
406 chassis_detail.scu_eps_311().eps_drvmode() == 1);
407 }
408 if (chassis_detail.has_scu_vcu_1_312() &&
409 chassis_detail.scu_vcu_1_312().has_vcu_drvmode()) {
410 chassis_.mutable_check_response()->set_is_vcu_online(
411 chassis_detail.scu_vcu_1_312().vcu_drvmode() == 1);
412 }
413
414 return chassis_;
415}
MessageManager< ::apollo::canbus::Ge3 > * message_manager_
optional bool parking_brake
Definition chassis.proto:94

◆ FRIEND_TEST() [1/3]

apollo::canbus::ge3::Ge3Controller::FRIEND_TEST ( Ge3ControllerTest  ,
SetDrivingMode   
)

◆ FRIEND_TEST() [2/3]

apollo::canbus::ge3::Ge3Controller::FRIEND_TEST ( Ge3ControllerTest  ,
Status   
)

◆ FRIEND_TEST() [3/3]

apollo::canbus::ge3::Ge3Controller::FRIEND_TEST ( Ge3ControllerTest  ,
UpdateDrivingMode   
)

◆ Init()

ErrorCode apollo::canbus::ge3::Ge3Controller::Init ( const VehicleParameter params,
CanSender<::apollo::canbus::Ge3 > *const  can_sender,
MessageManager<::apollo::canbus::Ge3 > *const  message_manager 
)
override

在文件 ge3_controller.cc43 行定义.

45 {
46 if (is_initialized_) {
47 AINFO << "Ge3Controller has already been initiated.";
48 return ErrorCode::CANBUS_ERROR;
49 }
50
51 vehicle_params_.CopyFrom(
52 common::VehicleConfigHelper::Instance()->GetConfig().vehicle_param());
53 params_.CopyFrom(params);
54 if (!params_.has_driving_mode()) {
55 AERROR << "Vehicle conf pb not set driving_mode.";
56 return ErrorCode::CANBUS_ERROR;
57 }
58
59 if (can_sender == nullptr) {
60 AERROR << "Canbus sender is null.";
61 return ErrorCode::CANBUS_ERROR;
62 }
63 can_sender_ = can_sender;
64
65 if (message_manager == nullptr) {
66 AERROR << "protocol manager is null.";
67 return ErrorCode::CANBUS_ERROR;
68 }
69 message_manager_ = message_manager;
70
71 // sender part
72 pc_bcm_201_ = dynamic_cast<Pcbcm201*>(
73 message_manager_->GetMutableProtocolDataById(Pcbcm201::ID));
74 if (pc_bcm_201_ == nullptr) {
75 AERROR << "Pcbcm201 does not exist in the Ge3MessageManager!";
76 return ErrorCode::CANBUS_ERROR;
77 }
78
79 pc_bcs_202_ = dynamic_cast<Pcbcs202*>(
80 message_manager_->GetMutableProtocolDataById(Pcbcs202::ID));
81 if (pc_bcs_202_ == nullptr) {
82 AERROR << "Pcbcs202 does not exist in the Ge3MessageManager!";
83 return ErrorCode::CANBUS_ERROR;
84 }
85
86 pc_epb_203_ = dynamic_cast<Pcepb203*>(
87 message_manager_->GetMutableProtocolDataById(Pcepb203::ID));
88 if (pc_epb_203_ == nullptr) {
89 AERROR << "Pcepb203 does not exist in the Ge3MessageManager!";
90 return ErrorCode::CANBUS_ERROR;
91 }
92
93 pc_eps_204_ = dynamic_cast<Pceps204*>(
94 message_manager_->GetMutableProtocolDataById(Pceps204::ID));
95 if (pc_eps_204_ == nullptr) {
96 AERROR << "Pceps204 does not exist in the Ge3MessageManager!";
97 return ErrorCode::CANBUS_ERROR;
98 }
99
100 pc_vcu_205_ = dynamic_cast<Pcvcu205*>(
101 message_manager_->GetMutableProtocolDataById(Pcvcu205::ID));
102 if (pc_vcu_205_ == nullptr) {
103 AERROR << "Pcvcu205 does not exist in the Ge3MessageManager!";
104 return ErrorCode::CANBUS_ERROR;
105 }
106
107 can_sender_->AddMessage(Pcbcm201::ID, pc_bcm_201_, false);
108 can_sender_->AddMessage(Pcbcs202::ID, pc_bcs_202_, false);
109 can_sender_->AddMessage(Pcepb203::ID, pc_epb_203_, false);
110 can_sender_->AddMessage(Pceps204::ID, pc_eps_204_, false);
111 can_sender_->AddMessage(Pcvcu205::ID, pc_vcu_205_, false);
112
113 // Need to sleep to ensure all messages received
114 AINFO << "Ge3Controller is initialized.";
115
116 is_initialized_ = true;
117 return ErrorCode::OK;
118}
static const int32_t ID
Definition pc_bcm_201.h:29
static const int32_t ID
Definition pc_bcs_202.h:29
static const int32_t ID
Definition pc_epb_203.h:29
static const int32_t ID
Definition pc_eps_204.h:29
static const int32_t ID
Definition pc_vcu_205.h:29
#define AERROR
Definition log.h:44
#define AINFO
Definition log.h:42

◆ Start()

bool apollo::canbus::ge3::Ge3Controller::Start ( )
overridevirtual

start the vehicle controller.

返回
true if successfully started.

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

在文件 ge3_controller.cc122 行定义.

122 {
123 if (!is_initialized_) {
124 AERROR << "Ge3Controller has NOT been initialized.";
125 return false;
126 }
127 const auto& update_func = [this] { SecurityDogThreadFunc(); };
128 thread_.reset(new std::thread(update_func));
129
130 return true;
131}

◆ Stop()

void apollo::canbus::ge3::Ge3Controller::Stop ( )
overridevirtual

stop the vehicle controller.

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

在文件 ge3_controller.cc133 行定义.

133 {
134 if (!is_initialized_) {
135 AERROR << "Ge3Controller stops or starts improperly!";
136 return;
137 }
138
139 if (thread_ != nullptr && thread_->joinable()) {
140 thread_->join();
141 thread_.reset();
142 AINFO << "Ge3Controller stopped.";
143 }
144}

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