Apollo 10.0
自动驾驶开放平台
apollo::planning::LaneFollowMap类 参考

#include <lane_follow_map.h>

类 apollo::planning::LaneFollowMap 继承关系图:
apollo::planning::LaneFollowMap 的协作图:

Public 成员函数

 LaneFollowMap ()
 
virtual ~LaneFollowMap ()=default
 
bool CanProcess (const planning::PlanningCommand &command) const override
 
bool UpdatePlanningCommand (const planning::PlanningCommand &command) override
 
bool GetRouteSegments (const common::VehicleState &vehicle_state, std::list< apollo::hdmap::RouteSegments > *const route_segments) override
 use heuristic forward length and backward length
 
bool ExtendSegments (const apollo::hdmap::RouteSegments &segments, double start_s, double end_s, apollo::hdmap::RouteSegments *const truncated_segments) const override
 
std::vector< routing::LaneWaypoint > FutureRouteWaypoints () const override
 
void GetEndLaneWayPoint (std::shared_ptr< routing::LaneWaypoint > &end_point) const override
 Get the end point of PlanningCommand.
 
hdmap::LaneInfoConstPtr GetLaneById (const hdmap::Id &id) const override
 Get the Lane with the given id.
 
bool GetNearestPointFromRouting (const common::VehicleState &state, apollo::hdmap::LaneWaypoint *waypoint) const override
 
double GetDistanceToDestination () const override
 
apollo::hdmap::LaneWaypoint GetAdcWaypoint () const override
 
- Public 成员函数 继承自 apollo::planning::PncMapBase
virtual ~PncMapBase ()=default
 
bool IsNewPlanningCommand (const planning::PlanningCommand &command) const
 Check if the routing is the same as existing one in Map
 

额外继承的成员函数

- 静态 Public 成员函数 继承自 apollo::planning::PncMapBase
static double LookForwardDistance (const double velocity)
 
static bool IsNewPlanningCommand (const planning::PlanningCommand &prev_command, const planning::PlanningCommand &new_command)
 
- Protected 属性 继承自 apollo::planning::PncMapBase
planning::PlanningCommand last_command_
 
apollo::hdmap::LaneWaypoint adc_waypoint_
 The waypoint of the autonomous driving car
 

详细描述

在文件 lane_follow_map.h 第 41 行定义.

构造及析构函数说明

◆ LaneFollowMap()

apollo::planning::LaneFollowMap::LaneFollowMap ( )

在文件 lane_follow_map.cc 第 53 行定义.

static const HDMap * BaseMapPtr()

◆ ~LaneFollowMap()

virtual apollo::planning::LaneFollowMap::~LaneFollowMap ( )
virtualdefault

成员函数说明

◆ CanProcess()

bool apollo::planning::LaneFollowMap::CanProcess ( const planning::PlanningCommand &  command) const
overridevirtual

实现了 apollo::planning::PncMapBase.

在文件 lane_follow_map.cc 第 55 行定义.

55 {
56 return command.has_lane_follow_command();
57}

◆ ExtendSegments()

bool apollo::planning::LaneFollowMap::ExtendSegments ( const apollo::hdmap::RouteSegments &  segments,
double  start_s,
double  end_s,
apollo::hdmap::RouteSegments *const  truncated_segments 
) const
overridevirtual

实现了 apollo::planning::PncMapBase.

在文件 lane_follow_map.cc 第 636 行定义.

638 {
639 if (segments.empty()) {
640 AERROR << "The input segments is empty";
641 return false;
642 }
643 CHECK_NOTNULL(truncated_segments);
644 truncated_segments->SetProperties(segments);
645
646 if (start_s >= end_s) {
647 AERROR << "start_s(" << start_s << " >= end_s(" << end_s << ")";
648 return false;
649 }
650 std::unordered_set<std::string> unique_lanes;
651 static constexpr double kRouteEpsilon = 1e-3;
652 // Extend the trajectory towards the start of the trajectory.
653 if (start_s < 0) {
654 const auto &first_segment = *segments.begin();
655 auto lane = first_segment.lane;
656 double s = first_segment.start_s;
657 double extend_s = -start_s;
658 std::vector<hdmap::LaneSegment> extended_lane_segments;
659 while (extend_s > kRouteEpsilon) {
660 if (s <= kRouteEpsilon) {
661 lane = GetRoutePredecessor(lane);
662 if (lane == nullptr ||
663 unique_lanes.find(lane->id().id()) != unique_lanes.end()) {
664 break;
665 }
666 s = lane->total_length();
667 } else {
668 const double length = std::min(s, extend_s);
669 extended_lane_segments.emplace_back(lane, s - length, s);
670 extend_s -= length;
671 s -= length;
672 unique_lanes.insert(lane->id().id());
673 }
674 }
675 truncated_segments->insert(truncated_segments->begin(),
676 extended_lane_segments.rbegin(),
677 extended_lane_segments.rend());
678 }
679 bool found_loop = false;
680 double router_s = 0;
681 for (const auto &lane_segment : segments) {
682 const double adjusted_start_s = std::max(
683 start_s - router_s + lane_segment.start_s, lane_segment.start_s);
684 const double adjusted_end_s =
685 std::min(end_s - router_s + lane_segment.start_s, lane_segment.end_s);
686 if (adjusted_start_s < adjusted_end_s) {
687 if (!truncated_segments->empty() &&
688 truncated_segments->back().lane->id().id() ==
689 lane_segment.lane->id().id()) {
690 truncated_segments->back().end_s = adjusted_end_s;
691 } else if (unique_lanes.find(lane_segment.lane->id().id()) ==
692 unique_lanes.end()) {
693 truncated_segments->emplace_back(lane_segment.lane, adjusted_start_s,
694 adjusted_end_s);
695 unique_lanes.insert(lane_segment.lane->id().id());
696 } else {
697 found_loop = true;
698 break;
699 }
700 }
701 router_s += (lane_segment.end_s - lane_segment.start_s);
702 if (router_s > end_s) {
703 break;
704 }
705 }
706 if (found_loop) {
707 return true;
708 }
709 // Extend the trajectory towards the end of the trajectory.
710 if (router_s < end_s && !truncated_segments->empty()) {
711 auto &back = truncated_segments->back();
712 if (back.lane->total_length() > back.end_s) {
713 double origin_end_s = back.end_s;
714 back.end_s =
715 std::min(back.end_s + end_s - router_s, back.lane->total_length());
716 router_s += back.end_s - origin_end_s;
717 }
718 }
719 auto last_lane = segments.back().lane;
720 while (router_s < end_s - kRouteEpsilon) {
721 last_lane = GetRouteSuccessor(last_lane);
722 if (last_lane == nullptr ||
723 unique_lanes.find(last_lane->id().id()) != unique_lanes.end()) {
724 break;
725 }
726 const double length = std::min(end_s - router_s, last_lane->total_length());
727 truncated_segments->emplace_back(last_lane, 0, length);
728 unique_lanes.insert(last_lane->id().id());
729 router_s += length;
730 }
731 return true;
732}
void SetProperties(const RouteSegments &other)
Copy the properties of other segments to current one
#define AERROR
Definition log.h:44

◆ FutureRouteWaypoints()

std::vector< routing::LaneWaypoint > apollo::planning::LaneFollowMap::FutureRouteWaypoints ( ) const
overridevirtual

实现了 apollo::planning::PncMapBase.

在文件 lane_follow_map.cc 第 115 行定义.

115 {
116 const auto &waypoints =
118 return std::vector<routing::LaneWaypoint>(
119 waypoints.begin() + next_routing_waypoint_index_, waypoints.end());
120}
planning::PlanningCommand last_command_
optional apollo::routing::RoutingResponse lane_follow_command
repeated apollo::routing::LaneWaypoint waypoint
Definition routing.proto:14
optional RoutingRequest routing_request
Definition routing.proto:27

◆ GetAdcWaypoint()

apollo::hdmap::LaneWaypoint apollo::planning::LaneFollowMap::GetAdcWaypoint ( ) const
overridevirtual

实现了 apollo::planning::PncMapBase.

在文件 lane_follow_map.cc 第 781 行定义.

781 {
782 return adc_waypoint_;
783}
apollo::hdmap::LaneWaypoint adc_waypoint_
The waypoint of the autonomous driving car

◆ GetDistanceToDestination()

double apollo::planning::LaneFollowMap::GetDistanceToDestination ( ) const
overridevirtual

实现了 apollo::planning::PncMapBase.

在文件 lane_follow_map.cc 第 785 行定义.

785 {
786 if (adc_route_index_ < 0 || adc_route_index_ >= route_indices_.size()) {
787 AERROR << "adc_route_index error, can not get distance to destination, "
788 "return 0.";
789 return 0.0;
790 }
791 const auto &routing = last_command_.lane_follow_command();
792 int adc_road_index = route_indices_[adc_route_index_].index[0];
793 int adc_passage_index = route_indices_[adc_route_index_].index[1];
794 int adc_lane_index = route_indices_[adc_route_index_].index[2];
795
796 bool get_adc_exit_waypoint =
797 routing.road(adc_road_index).passage(adc_passage_index).can_exit();
798 int start_passage_index = adc_passage_index;
799 int start_lane_index = adc_lane_index;
800 double start_lane_s = adc_waypoint_.s;
801
802 double dis_to_destination = 0.0;
803
804 for (int road_index = adc_road_index; road_index < routing.road_size();
805 ++road_index) {
806 const auto &road_segment = routing.road(road_index);
807 for (int passage_index = 0; passage_index < road_segment.passage_size();
808 ++passage_index) {
809 const auto &passage = road_segment.passage(passage_index);
810 if (!passage.can_exit()) {
811 continue;
812 }
813 // check this passsage is can_exit
814 if (!get_adc_exit_waypoint) {
815 get_adc_exit_waypoint = true;
816 // find adc waypoint in passage which can exit
817 for (int index = 0; index < passage.segment_size(); ++index) {
818 auto lane = hdmap_->GetLaneById(
819 hdmap::MakeMapId(passage.segment(index).id()));
820 double s = 0.0;
821 double l = 0.0;
822 if (!lane->GetProjection({adc_state_.x(), adc_state_.y()}, &s, &l)) {
823 continue;
824 }
825 static constexpr double kEpsilon = 0.5;
826 if (s > (lane->total_length() + kEpsilon) || (s + kEpsilon) < 0.0) {
827 continue;
828 }
829 start_passage_index = passage_index;
830 start_lane_index = index;
831 start_lane_s = s;
832 }
833 }
834
835 // add distance by lane in can_exit passage
836 if (get_adc_exit_waypoint) {
837 if (road_index == adc_road_index &&
838 passage_index == start_passage_index) {
839 for (int lane_index = start_lane_index;
840 lane_index < passage.segment_size(); ++lane_index) {
841 if (lane_index == start_lane_index) {
842 dis_to_destination +=
843 passage.segment(lane_index).end_s() - start_lane_s;
844 } else {
845 dis_to_destination += passage.segment(lane_index).end_s() -
846 passage.segment(lane_index).start_s();
847 }
848 }
849 } else {
850 for (int lane_index = 0; lane_index < passage.segment_size();
851 ++lane_index) {
852 dis_to_destination += passage.segment(lane_index).end_s() -
853 passage.segment(lane_index).start_s();
854 }
855 }
856 break;
857 }
858 }
859 }
860 return dis_to_destination;
861}
LaneInfoConstPtr GetLaneById(const Id &id) const
Definition hdmap.cc:34
apollo::hdmap::Id MakeMapId(const std::string &id)
create a Map ID given a string.
Definition hdmap_util.h:85

◆ GetEndLaneWayPoint()

void apollo::planning::LaneFollowMap::GetEndLaneWayPoint ( std::shared_ptr< routing::LaneWaypoint > &  end_point) const
overridevirtual

Get the end point of PlanningCommand.

参数
end_pointThe end point of PlanningCommand.

实现了 apollo::planning::PncMapBase.

在文件 lane_follow_map.cc 第 122 行定义.

123 {
124 if (!last_command_.has_lane_follow_command() ||
125 !last_command_.lane_follow_command().has_routing_request()) {
126 end_point = nullptr;
127 return;
128 }
129 const auto &routing_request =
131 if (routing_request.waypoint().size() < 1) {
132 end_point = nullptr;
133 return;
134 }
135 end_point = std::make_shared<routing::LaneWaypoint>();
136 end_point->CopyFrom(*(routing_request.waypoint().rbegin()));
137}

◆ GetLaneById()

hdmap::LaneInfoConstPtr apollo::planning::LaneFollowMap::GetLaneById ( const hdmap::Id &  id) const
overridevirtual

Get the Lane with the given id.

参数
idThe id of the lane.

实现了 apollo::planning::PncMapBase.

在文件 lane_follow_map.cc 第 139 行定义.

139 {
140 if (nullptr == hdmap_) {
141 return nullptr;
142 }
143 return hdmap_->GetLaneById(id);
144}

◆ GetNearestPointFromRouting()

bool apollo::planning::LaneFollowMap::GetNearestPointFromRouting ( const common::VehicleState &  state,
apollo::hdmap::LaneWaypoint *  waypoint 
) const
overridevirtual

实现了 apollo::planning::PncMapBase.

在文件 lane_follow_map.cc 第 501 行定义.

502 {
503 waypoint->lane = nullptr;
504 std::vector<hdmap::LaneInfoConstPtr> lanes;
505 const auto point = PointFactory::ToPointENU(state);
506 std::vector<hdmap::LaneInfoConstPtr> valid_lanes;
507 for (auto lane_id : all_lane_ids_) {
508 hdmap::Id id = hdmap::MakeMapId(lane_id);
509 auto lane = hdmap_->GetLaneById(id);
510 if (nullptr != lane) {
511 valid_lanes.emplace_back(lane);
512 }
513 }
514
515 // Get nearest_waypoints for current position
516 std::vector<hdmap::LaneWaypoint> valid_way_points;
517 for (const auto &lane : valid_lanes) {
518 if (range_lane_ids_.count(lane->id().id()) == 0) {
519 ADEBUG << "not in range" << lane->id().id();
520 continue;
521 }
522 if (route_segments_lane_ids_.size() > 0 &&
523 route_segments_lane_ids_.count(lane->id().id()) == 0) {
524 ADEBUG << "not in last frame route_segments: " << lane->id().id();
525 continue;
526 }
527 double s = 0.0;
528 double l = 0.0;
529 {
530 if (!lane->GetProjection({point.x(), point.y()}, &s, &l)) {
531 continue;
532 }
533 ADEBUG << lane->id().id() << "," << s << "," << l;
534 // Use large epsilon to allow projection diff
535 static constexpr double kEpsilon = 0.5;
536 if (s > (lane->total_length() + kEpsilon) || (s + kEpsilon) < 0.0) {
537 continue;
538 }
539 double lane_heading = lane->Heading(s);
540 if (std::fabs(common::math::AngleDiff(lane_heading, state.heading())) >
541 M_PI_2 * 1.5) {
542 continue;
543 }
544 }
545
546 valid_way_points.emplace_back();
547 auto &last = valid_way_points.back();
548 last.lane = lane;
549 last.s = s;
550 last.l = l;
551 ADEBUG << "distance:" << std::fabs(l);
552 }
553 if (valid_way_points.empty()) {
554 AERROR << "Failed to find nearest point: " << point.ShortDebugString();
555 return false;
556 }
557
558 // find closest lane that satisfy vehicle heading
559 int closest_index = -1;
560 double distance = std::numeric_limits<double>::max();
561 double lane_heading = 0.0;
562 double vehicle_heading = state.heading();
563 for (size_t i = 0; i < valid_way_points.size(); i++) {
564 lane_heading = valid_way_points[i].lane->Heading(valid_way_points[i].s);
565 if (std::abs(common::math::AngleDiff(lane_heading, vehicle_heading)) >
566 M_PI_2 * 1.5) {
567 continue;
568 }
569 if (std::fabs(valid_way_points[i].l) < distance) {
570 distance = std::fabs(valid_way_points[i].l);
571 closest_index = i;
572 }
573 }
574 if (closest_index == -1) {
575 AERROR << "Can not find nearest waypoint. vehicle heading:"
576 << vehicle_heading << "lane heading:" << lane_heading;
577 return false;
578 }
579 waypoint->lane = valid_way_points[closest_index].lane;
580 waypoint->s = valid_way_points[closest_index].s;
581 waypoint->l = valid_way_points[closest_index].l;
582 return true;
583}
static PointENU ToPointENU(const double x, const double y, const double z=0)
#define ADEBUG
Definition log.h:41
double AngleDiff(const double from, const double to)
Calculate the difference between angle from and to
Definition math_utils.cc:61
LaneInfoConstPtr lane
Definition path.h:44

◆ GetRouteSegments()

bool apollo::planning::LaneFollowMap::GetRouteSegments ( const common::VehicleState &  vehicle_state,
std::list< apollo::hdmap::RouteSegments > *const  route_segments 
)
overridevirtual

use heuristic forward length and backward length

实现了 apollo::planning::PncMapBase.

◆ UpdatePlanningCommand()

bool apollo::planning::LaneFollowMap::UpdatePlanningCommand ( const planning::PlanningCommand &  command)
overridevirtual

重载 apollo::planning::PncMapBase .

在文件 lane_follow_map.cc 第 232 行定义.

233 {
234 if (!CanProcess(command)) {
235 AERROR << "Command cannot be processed by LaneFollowMap!";
236 return false;
237 }
238 if (!PncMapBase::UpdatePlanningCommand(command)) {
239 return false;
240 }
241 const auto &routing = command.lane_follow_command();
242 range_lane_ids_.clear();
243 route_indices_.clear();
244 all_lane_ids_.clear();
245 for (int road_index = 0; road_index < routing.road_size(); ++road_index) {
246 const auto &road_segment = routing.road(road_index);
247 for (int passage_index = 0; passage_index < road_segment.passage_size();
248 ++passage_index) {
249 const auto &passage = road_segment.passage(passage_index);
250 for (int lane_index = 0; lane_index < passage.segment_size();
251 ++lane_index) {
252 all_lane_ids_.insert(passage.segment(lane_index).id());
253 route_indices_.emplace_back();
254 route_indices_.back().segment =
255 ToLaneSegment(passage.segment(lane_index));
256 if (route_indices_.back().segment.lane == nullptr) {
257 AERROR << "Failed to get lane segment from passage.";
258 return false;
259 }
260 route_indices_.back().index = {road_index, passage_index, lane_index};
261 }
262 }
263 }
264
265 range_start_ = 0;
266 range_end_ = 0;
267 adc_route_index_ = -1;
268 next_routing_waypoint_index_ = 0;
269 UpdateRoutingRange(adc_route_index_);
270
271 routing_waypoint_index_.clear();
272 const auto &request_waypoints = routing.routing_request().waypoint();
273 if (request_waypoints.empty()) {
274 AERROR << "Invalid routing: no request waypoints.";
275 return false;
276 }
277 int i = 0;
278 for (size_t j = 0; j < route_indices_.size(); ++j) {
279 while (i < request_waypoints.size() &&
280 hdmap::RouteSegments::WithinLaneSegment(route_indices_[j].segment,
281 request_waypoints.Get(i))) {
282 routing_waypoint_index_.emplace_back(
283 hdmap::LaneWaypoint(route_indices_[j].segment.lane,
284 request_waypoints.Get(i).s()),
285 j);
286 ++i;
287 }
288 }
289 adc_waypoint_ = hdmap::LaneWaypoint();
290 stop_for_destination_ = false;
291 return true;
292}
static bool WithinLaneSegment(const LaneSegment &lane_segment, const LaneWaypoint &waypoint)
bool CanProcess(const planning::PlanningCommand &command) const override
virtual bool UpdatePlanningCommand(const planning::PlanningCommand &command)

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