31bool ShowRequestInfo(
const routing::RoutingRequest& request,
32 const TopoGraph* graph) {
33 for (
const auto& wp : request.waypoint()) {
34 const auto* node = graph->GetNode(wp.id());
35 if (node ==
nullptr) {
36 AERROR <<
"Way node is not found in topo graph! ID: " << wp.id();
39 AINFO <<
"Way point:\tlane id: " << wp.id() <<
" s: " << wp.s()
40 <<
" x: " << wp.pose().x() <<
" y: " << wp.pose().y()
41 <<
" length: " << node->Length();
44 for (
const auto& bl : request.blacklisted_lane()) {
45 const auto* node = graph->GetNode(bl.id());
46 if (node ==
nullptr) {
47 AERROR <<
"Black list node is not found in topo graph! ID: " << bl.id();
50 AINFO <<
"Black point:\tlane id: " << bl.id()
51 <<
" start_s: " << bl.start_s() <<
" end_s: " << bl.end_s()
52 <<
" length: " << node->Length();
58bool GetWayNodes(
const routing::RoutingRequest& request,
59 const TopoGraph* graph,
60 std::vector<const TopoNode*>*
const way_nodes,
61 std::vector<double>*
const way_s) {
62 for (
const auto& point : request.waypoint()) {
63 const auto* cur_node = graph->GetNode(point.id());
64 if (cur_node ==
nullptr) {
65 AERROR <<
"Cannot find way point in graph! Id: " << point.id();
68 way_nodes->push_back(cur_node);
69 way_s->push_back(point.s());
75 const std::string& error_string,
76 common::StatusPb*
const error_code) {
77 error_code->set_error_code(error_code_id);
78 error_code->set_msg(error_string);
80 ADEBUG << error_string.c_str();
82 AERROR << error_string.c_str();
86void PrintDebugData(
const std::vector<NodeWithRange>& nodes) {
87 AINFO <<
"Route lane id\tis virtual\tstart s\tend s";
88 for (
const auto& node : nodes) {
89 AINFO << node.GetTopoNode()->LaneId() <<
"\t"
90 << node.GetTopoNode()->IsVirtual() <<
"\t" << node.StartS() <<
"\t"
100 AERROR <<
"Failed to read topology graph from " << topo_file_path;
105 if (!graph_->LoadGraph(graph)) {
106 AINFO <<
"Failed to init navigator graph failed! File path: "
113 AINFO <<
"The navigator is ready.";
120void Navigator::Clear() { topo_range_manager_.
Clear(); }
123 const TopoGraph* graph,
124 std::vector<const TopoNode*>*
const way_nodes,
125 std::vector<double>*
const way_s) {
127 if (!GetWayNodes(request, graph_.get(), way_nodes, way_s)) {
128 AERROR <<
"Failed to find search terminal point in graph!";
131 black_list_generator_->GenerateBlackMapFromRequest(request, graph_.get(),
132 &topo_range_manager_);
136bool Navigator::MergeRoute(
137 const std::vector<NodeWithRange>& node_vec,
138 std::vector<NodeWithRange>*
const result_node_vec)
const {
139 for (
const auto& node : node_vec) {
140 if (result_node_vec->empty() ||
141 result_node_vec->back().GetTopoNode() != node.GetTopoNode()) {
142 result_node_vec->push_back(node);
144 if (result_node_vec->back().EndS() < node.StartS()) {
145 AERROR <<
"Result route is not continuous.";
148 result_node_vec->back().SetEndS(node.EndS());
154bool Navigator::SearchRouteByStrategy(
155 const TopoGraph* graph,
const std::vector<const TopoNode*>& way_nodes,
156 const std::vector<double>& way_s,
157 std::vector<NodeWithRange>*
const result_nodes)
const {
158 std::unique_ptr<Strategy> strategy_ptr;
159 strategy_ptr.reset(
new AStarStrategy(FLAGS_enable_change_lane_in_result));
161 result_nodes->clear();
162 std::vector<NodeWithRange> node_vec;
163 for (
size_t i = 1; i < way_nodes.size(); ++i) {
164 const auto* way_start = way_nodes[i - 1];
165 const auto* way_end = way_nodes[i];
166 double way_start_s = way_s[i - 1];
167 double way_end_s = way_s[i];
169 TopoRangeManager full_range_manager = topo_range_manager_;
170 black_list_generator_->AddBlackMapFromTerminal(
171 way_start, way_end, way_start_s, way_end_s, &full_range_manager);
173 SubTopoGraph sub_graph(full_range_manager.RangeMap());
174 const auto* start = sub_graph.GetSubNodeWithS(way_start, way_start_s);
175 if (start ==
nullptr) {
176 AERROR <<
"Sub graph node is nullptr, origin node id: "
177 << way_start->LaneId() <<
", s:" << way_start_s;
180 const auto* end = sub_graph.GetSubNodeWithS(way_end, way_end_s);
181 if (end ==
nullptr) {
182 AERROR <<
"Sub graph node is nullptr, origin node id: "
183 << way_end->LaneId() <<
", s:" << way_end_s;
187 std::vector<NodeWithRange> cur_result_nodes;
188 if (!strategy_ptr->Search(graph, &sub_graph, start, end,
189 &cur_result_nodes)) {
190 AERROR <<
"Failed to search route with waypoint from " << start->LaneId()
191 <<
" to " << end->LaneId();
195 node_vec.insert(node_vec.end(), cur_result_nodes.begin(),
196 cur_result_nodes.end());
199 if (!MergeRoute(node_vec, result_nodes)) {
200 AERROR <<
"Failed to merge route.";
208 if (!ShowRequestInfo(request, graph_.get())) {
209 SetErrorCode(ErrorCode::ROUTING_ERROR_REQUEST,
210 "Error encountered when reading request point!",
211 response->mutable_status());
216 SetErrorCode(ErrorCode::ROUTING_ERROR_NOT_READY,
"Navigator is not ready!",
217 response->mutable_status());
220 std::vector<const TopoNode*> way_nodes;
221 std::vector<double> way_s;
222 if (!Init(request, graph_.get(), &way_nodes, &way_s)) {
223 SetErrorCode(ErrorCode::ROUTING_ERROR_NOT_READY,
224 "Failed to initialize navigator!", response->mutable_status());
228 std::vector<NodeWithRange> result_nodes;
229 if (!SearchRouteByStrategy(graph_.get(), way_nodes, way_s, &result_nodes)) {
230 SetErrorCode(ErrorCode::ROUTING_ERROR_RESPONSE,
231 "Failed to find route with request!",
232 response->mutable_status());
235 if (result_nodes.empty()) {
236 SetErrorCode(ErrorCode::ROUTING_ERROR_RESPONSE,
"Failed to result nodes!",
237 response->mutable_status());
240 result_nodes.front().SetStartS(request.
waypoint().begin()->
s());
241 result_nodes.back().SetEndS(request.
waypoint().rbegin()->
s());
243 if (!result_generator_->GeneratePassageRegion(
244 graph_->MapVersion(), request, result_nodes, topo_range_manager_,
246 SetErrorCode(ErrorCode::ROUTING_ERROR_RESPONSE,
247 "Failed to generate passage regions based on result lanes",
248 response->mutable_status());
251 SetErrorCode(ErrorCode::OK,
"Success!", response->mutable_status());
253 PrintDebugData(result_nodes);
bool SearchRoute(const routing::RoutingRequest &request, routing::RoutingResponse *const response)
Navigator(const std::string &topo_file_path)
bool GetProtoFromFile(const std::string &file_name, google::protobuf::Message *message)
Parses the content of the file specified by the file_name as a representation of protobufs,...
repeated apollo::routing::LaneWaypoint waypoint