Home  >  Article  >  Technology peripherals  >  An in-depth analysis of Apollo’s lane changing strategy and its practical application

An in-depth analysis of Apollo’s lane changing strategy and its practical application

WBOY
WBOYforward
2023-11-07 11:37:05539browse

1. Introduction

1.1. The function of changing lanes

Simply put, the function of changing lanes is to select one of the reference lines from the reference lines to be selected. line, for use by Planning’s subsequent modules.

An in-depth analysis of Apollo’s lane changing strategy and its practical application

#It should be noted that the open source lane changing code provided by Apollo has been greatly deleted, and only a simple frame. Many functions, such as active lane changing, passive lane changing (due to obstacles), relatively complete state machine, lane changing window and Gap selection, etc. are missing. This technical article only shows content on the existing framework. Regarding the content of other lane changing functions, please look forward to the follow-up articles

1.2. Lane changing state machine

Apollo’s current lane changing state machine is as follows:

An in-depth analysis of Apollo’s lane changing strategy and its practical application

There are a few points worth noting about the state machine:

  • The IN_CHANGE_LANE here includes both the lane change execution and lane change preparation stages. Under normal circumstances It should be distinguished. Apollo adopts the method of first switching the reference line and then performing the lane change action, while some friends will adopt the method of first performing the lane change action and then switching the reference line (the advantage is that in the frame when the reference line is switched, the lateral direction of the own car The distance is close to 0).
  • The current code does not reflect when the lane change will fail. There is also reason to believe that it is caused by deleting the relevant code.
  • The complete lane change status should At least include: lane change preparation, lane change execution, lane change maintenance, lane change cancellation, lane change completion and other statuses.

2. Code analysis

2.1. Overall process

The path where the relevant code is located: modules/planning/tasks/deciders/lane_change_decider/http://lane_change_decider.cc

  1. Handle the exception when reference_line_info is empty.
  2. If forced lane change is configured reckless_change_lane is true, then directly Update Reference Line.
  3. Get the lane changing status of the previous frameprev_status. When you first enter the program, there may be no status information in prev_status(!prev_status-> has_status()), at this time it is directly considered that the lane change is completed.
  4. If the number of reference_line_info is 1 (that is, has_change_lane is false ), indicating that the vehicle is in the patrol state. The lane where the vehicle is currently located has a unique lane line and there are no variable lanes around it, so you can directly update the lane change status.
  5. Switch lane change The state machine
  • The previous frame was in the lane change stateChangeLaneStatus::IN_CHANGE_LANE: If the Lane where the car was in the previous frame and the Lane where the car is in this frame If the same, it means that the vehicle is still walking towards the target lane. On the contrary, if the Lane where the vehicle was in the previous frame is different from the Lane where it is in this frame, it means that the vehicle is already in the target lane and the switch has been completed.
  • The previous frame was in the lane changing failed stateChangeLaneStatus::CHANGE_LANE_FAILED: If the lane changing fails, the state will be frozen for a period of time, and then switched to the lane changing state to prepare for the next lane changing.
  • The previous frame was in the lane change completed stateChangeLaneStatus::CHANGE_LANE_FINISHED: After the lane change is successful, it will also freeze for a period of time, and then switch to the lane changing state to prepare for the next lane change. The purpose of freezing the time here is to avoid frequent lane changes.

2.2. Safety check

IsClearToChangeLaneDetermine whether the lane change is safe.

  1. This safety judgment method does not consider virtual obstacles (Virtual Obstacles) and static obstacles (Static Obstacles).
  2. Calculate the projection of dynamic obstacles on the Reference Line. The geometric meaning of the projection As shown below:

An in-depth analysis of Apollo’s lane changing strategy and its practical application

  1. If the vehicle is changing lanesIsChangeLanePath, use the projection relationship calculated above to ignore obstacles outside the lane of the target reference line
  2. . Determine whether the obstacle is traveling in the same direction as the vehiclesame_direction. Calculate the forward direction based on the relationship between the obstacle and the vehicle's traveling direction and speed relationship. Safety distance and backward safety distance
  3. .If the distance between the vehicle and the obstacle is greater than the safety distance calculated above, it is considered that it is safe to change lanes.
  4. HysteresisFilter
is a kind of Open Close logic, the purpose is to increase the stability of the safety judgment result (the judgment result of the previous frame is considered safe, then this frame will be more inclined to give a safe judgment. Vice versa).

2.3. Update Reference Line

The content that needs to be rewritten is: LaneChangeDecider::PrioritizeChangeLane
  1. <span>Input:</span> is_prioritize_change_lane. If is_prioritize_change_lane is true, then find the target reference line to switch to. . On the other hand, if is_prioritize_change_lane is
  2. false
  3. , then find the reference line of the Lane where the current position of the vehicle is located.reference_line_info->splice(reference_line_info-> begin(),*reference_line_info, iter);Put the reference line pointed to by iter found in step 1 at the front of the linked list. Since Planning subsequent modules use reference_line_info( ).front(), so the front of the linked list indicates that the frame is the reference line used.
  4. For detailed instructions on the use of splice
  5. , see C Basics.Output:
  6. ReferenceLineInfo
Linked list.

An in-depth analysis of Apollo’s lane changing strategy and its practical application

##Original link: https://mp.weixin.qq.com /s/IQkBV8iadaU4Qy70F3Xs3Q###

The above is the detailed content of An in-depth analysis of Apollo’s lane changing strategy and its practical application. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:51cto.com. If there is any infringement, please contact admin@php.cn delete