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

#include <neolix_edu_controller.h>

类 apollo::canbus::neolix_edu::Neolix_eduController 继承关系图:
apollo::canbus::neolix_edu::Neolix_eduController 的协作图:

Public 成员函数

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

额外继承的成员函数

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

详细描述

在文件 neolix_edu_controller.h39 行定义.

构造及析构函数说明

◆ ~Neolix_eduController()

apollo::canbus::neolix_edu::Neolix_eduController::~Neolix_eduController ( )
virtual

在文件 neolix_edu_controller.cc128 行定义.

128{}

成员函数说明

◆ AddSendMessage()

void apollo::canbus::neolix_edu::Neolix_eduController::AddSendMessage ( )
overridevirtual

add the sender message.

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

在文件 neolix_edu_controller.cc44 行定义.

44 {
45 can_sender_->AddMessage(Adsbrakecommand46::ID, ads_brake_command_46_, false);
46 can_sender_->AddMessage(Adsdiagnosis628::ID, ads_diagnosis_628_, false);
47 can_sender_->AddMessage(Adsdrivecommand50::ID, ads_drive_command_50_, false);
48 can_sender_->AddMessage(Adsepscommand56::ID, ads_eps_command_56_, false);
50 ads_light_horn_command_310_, false);
51}

◆ chassis()

Chassis apollo::canbus::neolix_edu::Neolix_eduController::chassis ( )
overridevirtual

calculate and return the chassis.

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

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

在文件 neolix_edu_controller.cc154 行定义.

154 {
155 chassis_.Clear();
156
157 Neolix_edu chassis_detail = GetNewRecvChassisDetail();
158
159 // 1, 2
160 // if (driving_mode() == Chassis::EMERGENCY_MODE) {
161 // set_chassis_error_code(Chassis::NO_ERROR);
162 // }
163
164 chassis_.set_driving_mode(driving_mode());
165 chassis_.set_error_code(chassis_error_code());
166
167 // 3
168 chassis_.set_engine_started(true);
169
170 // 3 speed_mps
171 if (chassis_detail.has_aeb_frontwheelspeed_353() &&
172 chassis_detail.has_aeb_rearwheelspeed_354()) {
173 auto wheelspeed = chassis_.mutable_wheel_speed();
174 wheelspeed->set_wheel_spd_fl(
175 chassis_detail.aeb_frontwheelspeed_353().wheelspeed_fl());
176 wheelspeed->set_wheel_spd_fr(
177 chassis_detail.aeb_frontwheelspeed_353().wheelspeed_fr());
178 wheelspeed->set_wheel_spd_rl(
179 chassis_detail.aeb_rearwheelspeed_354().wheelspeed_rl());
180 wheelspeed->set_wheel_spd_rr(
181 chassis_detail.aeb_rearwheelspeed_354().wheelspeed_rr());
182 chassis_.set_speed_mps(
183 (chassis_detail.aeb_frontwheelspeed_353().wheelspeed_fl() +
184 chassis_detail.aeb_frontwheelspeed_353().wheelspeed_fr() +
185 chassis_detail.aeb_rearwheelspeed_354().wheelspeed_rl() +
186 chassis_detail.aeb_rearwheelspeed_354().wheelspeed_rr()) /
187 4 / 3.6);
188 } else {
189 chassis_.set_speed_mps(0);
190 }
191 // 4 SOC
192 if (chassis_detail.has_vcu_vehicle_status_report_101() &&
193 chassis_detail.vcu_vehicle_status_report_101().has_vcu_display_soc()) {
194 chassis_.set_battery_soc_percentage(
195 chassis_detail.vcu_vehicle_status_report_101().vcu_display_soc());
196 } else {
197 chassis_.set_battery_soc_percentage(0);
198 }
199 // 5 steering
200 if (chassis_detail.has_vcu_eps_report_57() &&
201 chassis_detail.vcu_eps_report_57().has_vcu_real_angle()) {
202 chassis_.set_steering_percentage(static_cast<float>(
203 chassis_detail.vcu_eps_report_57().vcu_real_angle() * 100 /
204 vehicle_params_.max_steer_angle() * M_PI / 180));
205 } else {
206 chassis_.set_steering_percentage(0);
207 }
208
209 // 6 throttle
210 if (chassis_detail.has_vcu_drive_report_52() &&
211 chassis_detail.vcu_drive_report_52().has_vcu_real_torque()) {
212 chassis_.set_throttle_percentage(
213 chassis_detail.vcu_drive_report_52().vcu_real_torque() * 2);
214 } else {
215 chassis_.set_throttle_percentage(0);
216 }
217
218 // 7 brake
219 if (chassis_detail.has_vcu_brake_report_47() &&
220 chassis_detail.vcu_brake_report_47().has_vcu_real_brake()) {
221 chassis_.set_brake_percentage(
222 chassis_detail.vcu_brake_report_47().vcu_real_brake());
223 } else {
224 chassis_.set_brake_percentage(0);
225 }
226 // 8 gear
227 if (chassis_detail.has_vcu_drive_report_52() &&
228 chassis_detail.vcu_drive_report_52().has_vcu_real_shift()) {
229 chassis_.set_gear_location((apollo::canbus::Chassis_GearPosition)
230 chassis_detail.vcu_drive_report_52()
231 .vcu_real_shift());
232 }
233 // 9 epb
234 if (chassis_detail.has_vcu_brake_report_47() &&
235 chassis_detail.vcu_brake_report_47().has_vcu_real_parking_status()) {
236 if (chassis_detail.vcu_brake_report_47().vcu_real_parking_status() == 1) {
237 chassis_.set_parking_brake(true);
238 } else {
239 chassis_.set_parking_brake(false);
240 }
241 } else {
242 chassis_.set_parking_brake(false);
243 }
244
245 if (chassis_error_mask_) {
246 chassis_.set_chassis_error_mask(chassis_error_mask_);
247 }
248
249 // 10 give engage_advice based on error_code and canbus feedback
250 if (!chassis_error_mask_ && !chassis_.parking_brake() &&
251 (chassis_.throttle_percentage() == 0.0)) {
252 chassis_.mutable_engage_advice()->set_advice(
254 } else {
255 chassis_.mutable_engage_advice()->set_advice(
257 }
258
259 // 11 bumper event
260 if (chassis_detail.has_vcu_brake_report_47() &&
261 chassis_detail.vcu_brake_report_47().has_vcu_ehb_brake_state()) {
262 if (chassis_detail.vcu_brake_report_47().vcu_ehb_brake_state() ==
264 chassis_.set_front_bumper_event(Chassis::BUMPER_PRESSED);
265 chassis_.set_back_bumper_event(Chassis::BUMPER_PRESSED);
266 } else {
267 chassis_.set_front_bumper_event(Chassis::BUMPER_NORMAL);
268 chassis_.set_back_bumper_event(Chassis::BUMPER_NORMAL);
269 }
270 } else {
271 chassis_.set_front_bumper_event(Chassis::BUMPER_INVALID);
272 chassis_.set_back_bumper_event(Chassis::BUMPER_INVALID);
273 }
274
275 // 12 add checkresponse signal
276 if (chassis_detail.has_vcu_brake_report_47() &&
277 chassis_detail.vcu_brake_report_47().has_brake_enable_resp()) {
278 chassis_.mutable_check_response()->set_is_esp_online(
279 chassis_detail.vcu_brake_report_47().brake_enable_resp() == 1);
280 }
281 if (chassis_detail.has_vcu_drive_report_52() &&
282 chassis_detail.vcu_drive_report_52().has_drive_enable_resp()) {
283 chassis_.mutable_check_response()->set_is_vcu_online(
284 chassis_detail.vcu_drive_report_52().drive_enable_resp() == 1);
285 }
286 if (chassis_detail.has_vcu_eps_report_57() &&
287 chassis_detail.vcu_eps_report_57().has_drive_enable_resp()) {
288 chassis_.mutable_check_response()->set_is_eps_online(
289 chassis_detail.vcu_eps_report_57().drive_enable_resp() == 1);
290 }
291
292 if (CheckChassisError()) {
293 chassis_.mutable_engage_advice()->set_advice(
295 chassis_.mutable_engage_advice()->set_reason(
296 "Chassis has some fault, please check the chassis_detail.");
297 }
298
299 // check the chassis detail lost
301 chassis_.mutable_engage_advice()->set_advice(
303 chassis_.mutable_engage_advice()->set_reason(
304 "neolix chassis detail is lost! Please check the communication error.");
305 set_chassis_error_code(Chassis::CHASSIS_CAN_LOST);
307 }
308
309 return chassis_;
310}
virtual void set_driving_mode(const Chassis::DrivingMode &driving_mode)
optional bool parking_brake
Definition chassis.proto:94
optional float throttle_percentage
Definition chassis.proto:79

◆ FRIEND_TEST() [1/3]

apollo::canbus::neolix_edu::Neolix_eduController::FRIEND_TEST ( Neolix_eduControllerTest  ,
SetDrivingMode   
)

for test

◆ FRIEND_TEST() [2/3]

apollo::canbus::neolix_edu::Neolix_eduController::FRIEND_TEST ( Neolix_eduControllerTest  ,
Status   
)

◆ FRIEND_TEST() [3/3]

apollo::canbus::neolix_edu::Neolix_eduController::FRIEND_TEST ( Neolix_eduControllerTest  ,
UpdateDrivingMode   
)

◆ Init()

ErrorCode apollo::canbus::neolix_edu::Neolix_eduController::Init ( const VehicleParameter params,
CanSender<::apollo::canbus::Neolix_edu > *const  can_sender,
MessageManager<::apollo::canbus::Neolix_edu > *const  message_manager 
)
override

在文件 neolix_edu_controller.cc53 行定义.

56 {
57 if (is_initialized_) {
58 AINFO << "Neolix_eduController has already been initiated.";
59 return ErrorCode::CANBUS_ERROR;
60 }
61
62 vehicle_params_.CopyFrom(
63 common::VehicleConfigHelper::Instance()->GetConfig().vehicle_param());
64 params_.CopyFrom(params);
65 if (!params_.has_driving_mode()) {
66 AERROR << "Vehicle conf pb not set driving_mode.";
67 return ErrorCode::CANBUS_ERROR;
68 }
69
70 if (can_sender == nullptr) {
71 return ErrorCode::CANBUS_ERROR;
72 }
73 can_sender_ = can_sender;
74
75 if (message_manager == nullptr) {
76 AERROR << "protocol manager is null.";
77 return ErrorCode::CANBUS_ERROR;
78 }
79 message_manager_ = message_manager;
80
81 // sender part
82 ads_brake_command_46_ = dynamic_cast<Adsbrakecommand46*>(
83 message_manager_->GetMutableProtocolDataById(Adsbrakecommand46::ID));
84 if (ads_brake_command_46_ == nullptr) {
85 AERROR
86 << "Adsbrakecommand46 does not exist in the Neolix_eduMessageManager!";
87 return ErrorCode::CANBUS_ERROR;
88 }
89
90 ads_diagnosis_628_ = dynamic_cast<Adsdiagnosis628*>(
91 message_manager_->GetMutableProtocolDataById(Adsdiagnosis628::ID));
92 if (ads_diagnosis_628_ == nullptr) {
93 AERROR << "Adsdiagnosis628 does not exist in the Neolix_eduMessageManager!";
94 return ErrorCode::CANBUS_ERROR;
95 }
96
97 ads_drive_command_50_ = dynamic_cast<Adsdrivecommand50*>(
98 message_manager_->GetMutableProtocolDataById(Adsdrivecommand50::ID));
99 if (ads_drive_command_50_ == nullptr) {
100 AERROR
101 << "Adsdrivecommand50 does not exist in the Neolix_eduMessageManager!";
102 return ErrorCode::CANBUS_ERROR;
103 }
104
105 ads_eps_command_56_ = dynamic_cast<Adsepscommand56*>(
106 message_manager_->GetMutableProtocolDataById(Adsepscommand56::ID));
107 if (ads_eps_command_56_ == nullptr) {
108 AERROR << "Adsepscommand56 does not exist in the Neolix_eduMessageManager!";
109 return ErrorCode::CANBUS_ERROR;
110 }
111
112 ads_light_horn_command_310_ = dynamic_cast<Adslighthorncommand310*>(
113 message_manager_->GetMutableProtocolDataById(Adslighthorncommand310::ID));
114 if (ads_light_horn_command_310_ == nullptr) {
115 AERROR << "Adslighthorncommand310 does not exist in the "
116 "Neolix_eduMessageManager!";
117 return ErrorCode::CANBUS_ERROR;
118 }
119
121
122 AINFO << "Neolix_eduController is initialized.";
123
124 is_initialized_ = true;
125 return ErrorCode::OK;
126}
MessageManager< ::apollo::canbus::Neolix_edu > * 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::neolix_edu::Neolix_eduController::Start ( )
overridevirtual

start the vehicle controller.

返回
true if successfully started.

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

在文件 neolix_edu_controller.cc130 行定义.

130 {
131 if (!is_initialized_) {
132 AERROR << "Neolix_eduController has NOT been initiated.";
133 return false;
134 }
135 const auto& update_func = [this] { SecurityDogThreadFunc(); };
136 thread_.reset(new std::thread(update_func));
137
138 return true;
139}

◆ Stop()

void apollo::canbus::neolix_edu::Neolix_eduController::Stop ( )
overridevirtual

stop the vehicle controller.

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

在文件 neolix_edu_controller.cc141 行定义.

141 {
142 if (!is_initialized_) {
143 AERROR << "Neolix_eduController stops or starts improperly!";
144 return;
145 }
146
147 if (thread_ != nullptr && thread_->joinable()) {
148 thread_->join();
149 thread_.reset();
150 AINFO << "Neolix_eduController stopped.";
151 }
152}

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