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

#include <ch_controller.h>

类 apollo::canbus::ch::ChController 继承关系图:
apollo::canbus::ch::ChController 的协作图:

Public 成员函数

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

额外继承的成员函数

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

详细描述

在文件 ch_controller.h40 行定义.

构造及析构函数说明

◆ ChController()

apollo::canbus::ch::ChController::ChController ( )
inline

在文件 ch_controller.h42 行定义.

42{}

◆ ~ChController()

apollo::canbus::ch::ChController::~ChController ( )
virtual

在文件 ch_controller.cc133 行定义.

133{}

成员函数说明

◆ chassis()

Chassis apollo::canbus::ch::ChController::chassis ( )
overridevirtual

calculate and return the chassis.

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

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

在文件 ch_controller.cc159 行定义.

159 {
160 chassis_.Clear();
161
162 Ch chassis_detail = GetNewRecvChassisDetail();
163
164 // 1, 2
165 // if (driving_mode() == Chassis::EMERGENCY_MODE) {
166 // set_chassis_error_code(Chassis::NO_ERROR);
167 // }
168
169 chassis_.set_driving_mode(driving_mode());
170 chassis_.set_error_code(chassis_error_code());
171 // 3
172 chassis_.set_engine_started(true);
173 // 4 engine rpm ch has no engine rpm
174 // chassis_.set_engine_rpm(0);
175 // 5 ch has no wheel spd.
176 if (chassis_detail.has_ecu_status_1_515() &&
177 chassis_detail.ecu_status_1_515().has_speed()) {
178 chassis_.set_speed_mps(
179 static_cast<float>(chassis_detail.ecu_status_1_515().speed()));
180 } else {
181 chassis_.set_speed_mps(0);
182 }
183 // 6 ch has no odometer
184 // chassis_.set_odometer_m(0);
185 // 7 ch has no fuel. do not set;
186 // chassis_.set_fuel_range_m(0);
187 // 8 throttle
188 if (chassis_detail.has_throttle_status__510() &&
189 chassis_detail.throttle_status__510().has_throttle_pedal_sts()) {
190 chassis_.set_throttle_percentage(static_cast<float>(
191 chassis_detail.throttle_status__510().throttle_pedal_sts()));
192 } else {
193 chassis_.set_throttle_percentage(0);
194 }
195 // 9 brake
196 if (chassis_detail.has_brake_status__511() &&
197 chassis_detail.brake_status__511().has_brake_pedal_sts()) {
198 chassis_.set_brake_percentage(static_cast<float>(
199 chassis_detail.brake_status__511().brake_pedal_sts()));
200 } else {
201 chassis_.set_brake_percentage(0);
202 }
203 // 10 gear
204 if (chassis_detail.has_gear_status_514() &&
205 chassis_detail.gear_status_514().has_gear_sts()) {
207
208 if (chassis_detail.gear_status_514().gear_sts() ==
210 gear_pos = Chassis::GEAR_NEUTRAL;
211 }
212 if (chassis_detail.gear_status_514().gear_sts() ==
214 gear_pos = Chassis::GEAR_REVERSE;
215 }
216 if (chassis_detail.gear_status_514().gear_sts() ==
218 gear_pos = Chassis::GEAR_DRIVE;
219 }
220 if (chassis_detail.gear_status_514().gear_sts() ==
222 gear_pos = Chassis::GEAR_PARKING;
223 }
224
225 chassis_.set_gear_location(gear_pos);
226 } else {
227 chassis_.set_gear_location(Chassis::GEAR_NONE);
228 }
229 // 11 steering
230 if (chassis_detail.has_steer_status__512() &&
231 chassis_detail.steer_status__512().has_steer_angle_sts()) {
232 chassis_.set_steering_percentage(static_cast<float>(
233 chassis_detail.steer_status__512().steer_angle_sts() * 100.0 /
235 } else {
236 chassis_.set_steering_percentage(0);
237 }
238 // 12 battery soc
239 if (chassis_detail.has_ecu_status_2_516() &&
240 chassis_detail.ecu_status_2_516().has_battery_soc()) {
241 chassis_.set_battery_soc_percentage(
242 chassis_detail.ecu_status_2_516().battery_soc());
243 }
244 // 13
245 // 14 give engage_advice based on error_code and battery low soc warn
246 if (!chassis_error_mask_ && chassis_.battery_soc_percentage() > 15.0) {
247 chassis_.mutable_engage_advice()->set_advice(
249 } else {
250 chassis_.mutable_engage_advice()->set_advice(
252 if (chassis_.battery_soc_percentage() > 0) {
253 chassis_.mutable_engage_advice()->set_reason(
254 "Battery soc percentage is lower than 15%, please charge it "
255 "quickly!");
256 }
257 }
258 // 15 set vin
259 // vin set 17 bits, like LSBN1234567890123 is prased as
260 // vin17(L),vin16(S),vin15(B),.....,vin03(1)vin02(2),vin01(3)
261 std::string vin = "";
262 if (chassis_detail.has_vin_resp1_51b()) {
263 Vin_resp1_51b vin_51b = chassis_detail.vin_resp1_51b();
264 vin += vin_51b.vin01();
265 vin += vin_51b.vin02();
266 vin += vin_51b.vin03();
267 vin += vin_51b.vin04();
268 vin += vin_51b.vin05();
269 vin += vin_51b.vin06();
270 vin += vin_51b.vin07();
271 vin += vin_51b.vin08();
272 }
273 if (chassis_detail.has_vin_resp2_51c()) {
274 Vin_resp2_51c vin_51c = chassis_detail.vin_resp2_51c();
275 vin += vin_51c.vin09();
276 vin += vin_51c.vin10();
277 vin += vin_51c.vin11();
278 vin += vin_51c.vin12();
279 vin += vin_51c.vin13();
280 vin += vin_51c.vin14();
281 vin += vin_51c.vin15();
282 vin += vin_51c.vin16();
283 }
284 if (chassis_detail.has_vin_resp3_51d()) {
285 Vin_resp3_51d vin_51d = chassis_detail.vin_resp3_51d();
286 vin += vin_51d.vin17();
287 }
288 std::reverse(vin.begin(), vin.end());
289 chassis_.mutable_vehicle_id()->set_vin(vin);
290
291 // 16 front bumper event
292 if (chassis_detail.has_brake_status__511() &&
293 chassis_detail.brake_status__511().has_front_bump_env()) {
294 if (chassis_detail.brake_status__511().front_bump_env() ==
296 chassis_.set_front_bumper_event(Chassis::BUMPER_PRESSED);
297 } else {
298 chassis_.set_front_bumper_event(Chassis::BUMPER_NORMAL);
299 }
300 } else {
301 chassis_.set_front_bumper_event(Chassis::BUMPER_INVALID);
302 }
303 // 17 back bumper event
304 if (chassis_detail.has_brake_status__511() &&
305 chassis_detail.brake_status__511().has_back_bump_env()) {
306 if (chassis_detail.brake_status__511().back_bump_env() ==
308 chassis_.set_back_bumper_event(Chassis::BUMPER_PRESSED);
309 } else {
310 chassis_.set_back_bumper_event(Chassis::BUMPER_NORMAL);
311 }
312 } else {
313 chassis_.set_back_bumper_event(Chassis::BUMPER_INVALID);
314 }
315 // 18 add checkresponse signal
316 if (chassis_detail.has_brake_status__511() &&
317 chassis_detail.brake_status__511().has_brake_pedal_en_sts()) {
318 chassis_.mutable_check_response()->set_is_esp_online(
319 chassis_detail.brake_status__511().brake_pedal_en_sts() == 1);
320 }
321 if (chassis_detail.has_steer_status__512() &&
322 chassis_detail.steer_status__512().has_steer_angle_en_sts()) {
323 chassis_.mutable_check_response()->set_is_eps_online(
324 chassis_detail.steer_status__512().steer_angle_en_sts() == 1);
325 }
326 if (chassis_detail.has_throttle_status__510() &&
327 chassis_detail.throttle_status__510().has_throttle_pedal_en_sts()) {
328 chassis_.mutable_check_response()->set_is_vcu_online(
329 chassis_detail.throttle_status__510().throttle_pedal_en_sts() == 1);
330 }
331
332 if (CheckChassisError()) {
333 chassis_.mutable_engage_advice()->set_advice(
335 chassis_.mutable_engage_advice()->set_reason(
336 "Chassis has some fault, please check the chassis_detail.");
337 }
338
339 // check the chassis detail lost
341 chassis_.mutable_engage_advice()->set_advice(
343 chassis_.mutable_engage_advice()->set_reason(
344 "ch chassis detail is lost! Please check the communication error.");
345 set_chassis_error_code(Chassis::CHASSIS_CAN_LOST);
347 }
348
349 return chassis_;
350}
virtual void set_driving_mode(const Chassis::DrivingMode &driving_mode)
optional int32 battery_soc_percentage

◆ FRIEND_TEST() [1/3]

apollo::canbus::ch::ChController::FRIEND_TEST ( ChControllerTest  ,
SetDrivingMode   
)

◆ FRIEND_TEST() [2/3]

apollo::canbus::ch::ChController::FRIEND_TEST ( ChControllerTest  ,
Status   
)

◆ FRIEND_TEST() [3/3]

apollo::canbus::ch::ChController::FRIEND_TEST ( ChControllerTest  ,
UpdateDrivingMode   
)

◆ Init()

ErrorCode apollo::canbus::ch::ChController::Init ( const VehicleParameter params,
CanSender<::apollo::canbus::Ch > *const  can_sender,
MessageManager<::apollo::canbus::Ch > *const  message_manager 
)
override

在文件 ch_controller.cc45 行定义.

48 {
49 if (is_initialized_) {
50 AINFO << "ChController has already been initiated.";
51 return ErrorCode::CANBUS_ERROR;
52 }
53
54 vehicle_params_.CopyFrom(
55 common::VehicleConfigHelper::Instance()->GetConfig().vehicle_param());
56 params_.CopyFrom(params);
57 if (!params_.has_driving_mode()) {
58 AERROR << "Vehicle conf pb not set driving_mode.";
59 return ErrorCode::CANBUS_ERROR;
60 }
61
62 if (can_sender == nullptr) {
63 AERROR << "Canbus sender is null.";
64 return ErrorCode::CANBUS_ERROR;
65 }
66 can_sender_ = can_sender;
67
68 if (message_manager == nullptr) {
69 AERROR << "protocol manager is null.";
70 return ErrorCode::CANBUS_ERROR;
71 }
72 message_manager_ = message_manager;
73
74 // sender part
75 brake_command_111_ = dynamic_cast<Brakecommand111*>(
76 message_manager_->GetMutableProtocolDataById(Brakecommand111::ID));
77 if (brake_command_111_ == nullptr) {
78 AERROR << "Brakecommand111 does not exist in the ChMessageManager!";
79 return ErrorCode::CANBUS_ERROR;
80 }
81
82 gear_command_114_ = dynamic_cast<Gearcommand114*>(
83 message_manager_->GetMutableProtocolDataById(Gearcommand114::ID));
84 if (gear_command_114_ == nullptr) {
85 AERROR << "Gearcommand114 does not exist in the ChMessageManager!";
86 return ErrorCode::CANBUS_ERROR;
87 }
88
89 steer_command_112_ = dynamic_cast<Steercommand112*>(
90 message_manager_->GetMutableProtocolDataById(Steercommand112::ID));
91 if (steer_command_112_ == nullptr) {
92 AERROR << "Steercommand112 does not exist in the ChMessageManager!";
93 return ErrorCode::CANBUS_ERROR;
94 }
95
96 throttle_command_110_ = dynamic_cast<Throttlecommand110*>(
97 message_manager_->GetMutableProtocolDataById(Throttlecommand110::ID));
98 if (throttle_command_110_ == nullptr) {
99 AERROR << "Throttlecommand110 does not exist in the ChMessageManager!";
100 return ErrorCode::CANBUS_ERROR;
101 }
102
103 turnsignal_command_113_ = dynamic_cast<Turnsignalcommand113*>(
104 message_manager_->GetMutableProtocolDataById(Turnsignalcommand113::ID));
105 if (turnsignal_command_113_ == nullptr) {
106 AERROR << "Turnsignalcommand113 does not exist in the ChMessageManager!";
107 return ErrorCode::CANBUS_ERROR;
108 }
109
110 vehicle_mode_command_116_ = dynamic_cast<Vehiclemodecommand116*>(
111 message_manager_->GetMutableProtocolDataById(Vehiclemodecommand116::ID));
112 if (vehicle_mode_command_116_ == nullptr) {
113 AERROR << "Vehiclemodecommand116 does not exist in the ChMessageManager!";
114 return ErrorCode::CANBUS_ERROR;
115 }
116
117 can_sender_->AddMessage(Brakecommand111::ID, brake_command_111_, false);
118 can_sender_->AddMessage(Gearcommand114::ID, gear_command_114_, false);
119 can_sender_->AddMessage(Steercommand112::ID, steer_command_112_, false);
120 can_sender_->AddMessage(Throttlecommand110::ID, throttle_command_110_, false);
121 can_sender_->AddMessage(Turnsignalcommand113::ID, turnsignal_command_113_,
122 false);
123 can_sender_->AddMessage(Vehiclemodecommand116::ID, vehicle_mode_command_116_,
124 false);
125
126 // need sleep to ensure all messages received
127 AINFO << "ChController is initialized.";
128
129 is_initialized_ = true;
130 return ErrorCode::OK;
131}
MessageManager< ::apollo::canbus::Ch > * message_manager_
#define AERROR
Definition log.h:44
#define AINFO
Definition log.h:42

◆ Start()

bool apollo::canbus::ch::ChController::Start ( )
overridevirtual

start the vehicle controller.

返回
true if successfully started.

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

在文件 ch_controller.cc135 行定义.

135 {
136 if (!is_initialized_) {
137 AERROR << "ChController has NOT been initiated.";
138 return false;
139 }
140 const auto& update_func = [this] { SecurityDogThreadFunc(); };
141 thread_.reset(new std::thread(update_func));
142
143 return true;
144}

◆ Stop()

void apollo::canbus::ch::ChController::Stop ( )
overridevirtual

stop the vehicle controller.

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

在文件 ch_controller.cc146 行定义.

146 {
147 if (!is_initialized_) {
148 AERROR << "ChController stops or starts improperly!";
149 return;
150 }
151
152 if (thread_ != nullptr && thread_->joinable()) {
153 thread_->join();
154 thread_.reset();
155 AINFO << "ChController stopped.";
156 }
157}

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