Apollo 10.0
自动驾驶开放平台
ch_vehicle_factory.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2019 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16
18
19#include "cyber/common/log.h"
24
28
29namespace apollo {
30namespace canbus {
31
32bool ChVehicleFactory::Init(const CanbusConf *canbus_conf) {
33 // Init can client
34 auto can_factory = CanClientFactory::Instance();
35 can_factory->RegisterCanClients();
36 can_client_ = can_factory->CreateCANClient(canbus_conf->can_card_parameter());
37 if (!can_client_) {
38 AERROR << "Failed to create can client.";
39 return false;
40 }
41 AINFO << "Can client is successfully created.";
42
43 message_manager_ = this->CreateMessageManager();
44 if (message_manager_ == nullptr) {
45 AERROR << "Failed to create message manager.";
46 return false;
47 }
48 AINFO << "Message manager is successfully created.";
49
50 if (can_receiver_.Init(can_client_.get(), message_manager_.get(),
51 canbus_conf->enable_receiver_log()) != ErrorCode::OK) {
52 AERROR << "Failed to init can receiver.";
53 return false;
54 }
55 AINFO << "The can receiver is successfully initialized.";
56
57 if (can_sender_.Init(can_client_.get(), message_manager_.get(),
58 canbus_conf->enable_sender_log()) != ErrorCode::OK) {
59 AERROR << "Failed to init can sender.";
60 return false;
61 }
62 AINFO << "The can sender is successfully initialized.";
63
64 vehicle_controller_ = CreateVehicleController();
65 if (vehicle_controller_ == nullptr) {
66 AERROR << "Failed to create vehicle controller.";
67 return false;
68 }
69 AINFO << "The vehicle controller is successfully created.";
70
71 if (vehicle_controller_->Init(canbus_conf->vehicle_parameter(), &can_sender_,
72 message_manager_.get()) != ErrorCode::OK) {
73 AERROR << "Failed to init vehicle controller.";
74 return false;
75 }
76
77 AINFO << "The vehicle controller is successfully"
78 << " initialized with canbus conf as : "
79 << canbus_conf->vehicle_parameter().ShortDebugString();
80
81 node_ = ::apollo::cyber::CreateNode("chassis_detail");
82
83 chassis_detail_writer_ =
84 node_->CreateWriter<::apollo::canbus::Ch>(FLAGS_chassis_detail_topic);
85
86 chassis_detail_sender_writer_ = node_->CreateWriter<::apollo::canbus::Ch>(
87 FLAGS_chassis_detail_sender_topic);
88
89 return true;
90}
91
93 // 1. init and start the can card hardware
94 if (can_client_->Start() != ErrorCode::OK) {
95 AERROR << "Failed to start can client";
96 return false;
97 }
98 AINFO << "Can client is started.";
99
100 // 2. start receive first then send
101 if (can_receiver_.Start() != ErrorCode::OK) {
102 AERROR << "Failed to start can receiver.";
103 return false;
104 }
105 AINFO << "Can receiver is started.";
106
107 // 3. start send
108 if (can_sender_.Start() != ErrorCode::OK) {
109 AERROR << "Failed to start can sender.";
110 return false;
111 }
112
113 // 4. start controller
114 if (!vehicle_controller_->Start()) {
115 AERROR << "Failed to start vehicle controller.";
116 return false;
117 }
118
119 return true;
120}
121
123 can_sender_.Stop();
124 can_receiver_.Stop();
125 can_client_->Stop();
126 vehicle_controller_->Stop();
127 AINFO << "Cleanup cansender, canreceiver, canclient, vehicle controller.";
128}
129
131 const apollo::control::ControlCommand *control_command) {
132 if (vehicle_controller_->Update(*control_command) != ErrorCode::OK) {
133 AERROR << "Failed to process callback function OnControlCommand because "
134 "vehicle_controller_->Update error.";
135 return;
136 }
137 can_sender_.Update();
138}
139
141 const apollo::external_command::ChassisCommand *chassis_command) {
142 if (vehicle_controller_->Update(*chassis_command) != ErrorCode::OK) {
143 AERROR << "Failed to process callback function OnControlCommand because "
144 "vehicle_controller_->Update error.";
145 return;
146 }
147 can_sender_.Update();
148}
149
151 Chassis chassis = vehicle_controller_->chassis();
152 ADEBUG << chassis.ShortDebugString();
153 return chassis;
154}
155
157 Ch chassis_detail = vehicle_controller_->GetNewRecvChassisDetail();
158 ADEBUG << "latest chassis_detail is " << chassis_detail.ShortDebugString();
159 chassis_detail_writer_->Write(chassis_detail);
160}
161
163 Ch sender_chassis_detail = vehicle_controller_->GetNewSenderChassisDetail();
164 ADEBUG << "latest sender_chassis_detail is "
165 << sender_chassis_detail.ShortDebugString();
166 chassis_detail_sender_writer_->Write(sender_chassis_detail);
167}
168
170 if (vehicle_controller_->CheckChassisCommunicationError()) {
171 return true;
172 }
173 return false;
174}
175
176std::unique_ptr<VehicleController<::apollo::canbus::Ch>>
177ChVehicleFactory::CreateVehicleController() {
178 return std::unique_ptr<VehicleController<::apollo::canbus::Ch>>(
179 new ch::ChController());
180}
181
182std::unique_ptr<MessageManager<::apollo::canbus::Ch>>
183ChVehicleFactory::CreateMessageManager() {
184 return std::unique_ptr<MessageManager<::apollo::canbus::Ch>>(
185 new ch::ChMessageManager());
186}
187
188} // namespace canbus
189} // namespace apollo
Defines the CanClientFactory class.
bool Init(const CanbusConf *canbus_conf) override
init vehicle factory
void Stop() override
stop canclient, cansender, canreceiver, vehicle controller
bool Start() override
start canclient, cansender, canreceiver, vehicle controller
void PublishChassisDetail() override
publish chassis for vehicle messages
Chassis publish_chassis() override
publish chassis messages
void PublishChassisDetailSender() override
publish chassis for apollo sender messages
void UpdateCommand(const apollo::control::ControlCommand *control_command) override
update control command
bool CheckChassisCommunicationFault() override
check chassis can receiver lost
CanClientFactory inherites apollo::common::util::Factory.
#define ADEBUG
Definition log.h:41
#define AERROR
Definition log.h:44
#define AINFO
Definition log.h:42
Some util functions.
std::unique_ptr< Node > CreateNode(const std::string &node_name, const std::string &name_space)
Definition cyber.cc:33
class register implement
Definition arena_queue.h:37
optional apollo::drivers::canbus::CANCardParameter can_card_parameter
optional VehicleParameter vehicle_parameter