자율주행

7장 Mathworks 자율주행 MATLAB 코딩 (IV)고속도로 차선변경

coding art 2022. 10. 21. 16:21
728x90

참조: Highway Trajectory Planning Using Frenet Reference Path

https://kr.mathworks.com/help/nav/ug/highway-trajectory-planning-using-frenet.html?searchHighlight=Frenet&s_tid=srchtitle_Frenet_1

 

고속도로 주행 시 자율주행 차량의 차선 변경에 대해서 살펴보자. 실제 주행도 어렵지만 몇 가지의 표준적인 주행 환경 시나리오를 설정해 놓은 상태에서 자율주행 차량이 차선 변경을 위한 최적의 조건을 찾아 보도록 한다.

 

시나리오에 따른 차선 환경은 게임 작성 소프트웨어로 잘 알려진 Unity 를 사용하여 구성되며 그중에 ego vehicle(자율주행 차량) 과 주변 차량들이 3개의 차선에 포진된 환경을 연출한 상태에서 차선 변경 연구가 이루어진다.

 

아래 1. 시나리오에서는 1,3 차선의 주행 차량이 위험 차량이며, 차선 변경 없이 크루즈 콘트롤로 앞 차를 따라 가는 것이 최선이다.

아래 2.와 3. 시나리오에서는 전방에 위험 차량들이 주행 중이며 후방에 구행하는 차량은 안전 차량으로 판단한다. 따라서 전방으로 차선 변경이 무난하다.

안전여부를 판단하려면 주변 차량들의 주행 진로 역시 예측되어야 할 것이다.

이 그림에서처럼 모든 도로가 직선적으로 표현된다면 차선 변경을 위한 전략을 세우기가 편리해질 것이다. 하지만 실제 도로는 카티션 직교 좌표계에서 곡선형으로 표현되므로 치량의 주행을 파악하려면 맵 전체 좌표 정보를 사용해서 위치, 주행방향, 속도, 가속도 등을 나타내야 하므로 대단히 불편할 수 있다.

 

따라서 좀 더 효율적인 처리를 위해서 직선형으로 표현되는 Frenet Space 로 변환할 필요가 있다. 즉 다음의 그림에서처럼 곡선으로 표현되는 차선(Longitudinal Axis)을 직선화 변환하고 차선에 수직한 폭(Lateral Axis)도 역시 변환 후 수직이 되도록 한다.

 

차선 변경 문제를 다루기 위해서 Ego 차량 좌표계, 타겟차량 좌표계, 월드 좌표계들이 거론되지만 Frenet 넴ㅊㄷ fh 변환 후 쉽게 문제를 다루어보기로 한다.

 

MathWorks에서 차선 변경을 위한 7개의 제어 블록 다이아그램을 살펴보자. 여기서 블록은 하드웨어가 아니며 소프트웨어작인 클라스 명령이나 함수등을 의미한다.

https://video.search.yahoo.com/search/video?fr=yfp-t&ei=UTF-8&p=self+driving+car+lane+change#id=2&vid=e951c7f1a54a9ea9f2d01ecef9511beb&action=click

① Senario and Environment: 가능한 모든 시나리오를 준비해야 함, 선택

⓶ Planner Configuration Parameters

⓷ Lane Change Planner and Controller: 합쳐서 하나로 볼 수도 있음

④ Vehicle Dynamics ⑤ Metric assesment ⓺ Visualization

 

Lane Change Planner 와 Controller를 합쳐서 아래와 같이 나타낼 수도 있다.

 
 

차선 변경 시뮬레이션 연구를 위해 Senario and Environment를 메뉴로부터 선택할 필요가 있다. 이 블록에서는 차선 변경 작업을 수행할 Ego 차량의 정보를 취한다. 출력은 Ego 차량 기준 좌표계에서 액터와 차선 경계의 가공되지 않은 원본 즉 Ground Truth 데이터가 될 것이다.

위 그림에서 첫 번째 블록을 클릭하면 나타나는 세부 블록을 살펴보자.

 

우측의 Vehicle ToWorld 블록은 타겟 차량의 위치를 월드 좌표로 변환한다. 이 내용들은 일부는 시각적인 효과를 위해서 visualization 목적으로 사용되며 한편으로는 차선 변경 전략 수립을 위해 Frener Space 로 변환되어야 한다.

 

앞 단계에서 데이터들을 입력 받는 Highway Lane Change Planner를 클릭하면 다음과 같은 복잡한 다이아그램이 나타나는데 이해하기가 복잡하므로 보다 간단한 도표를 사용하여 살펴보도록 하자.

 

아래 그림의 간단한 도표 구성을 살펴보자. dynamicCapsuleList는 충돌 체크를 목적으로 한다.

referencePathFreNet 는 자율주행 초기에 입력 단계에서 얻어지는 waypoints 데이터를 사용하여 global에서 Frenet Space 좌표로 변환한다.

waypoints 시작점에 Ego 가 있음을 확인하고 주변 차량 포함 모든 좌표 데이터를 Frenet Space 로 변환하여 차선변경 해석을 준비한다. MIO 는 most important objects 를 뜻한다.

 

아래 그림은 차선변경 모듈과는 다른 모듈인 mission planner에서 작성한 waypoints 데이터이다.

 

 

Ego Vehicle 주행 궤적 결정을 위해 주변 교통환경 조건 및 맵 정보를 제공하면 가능한 후보 주행 궤적을 얻어내기 위해 비용함수를 사용하여 최적화 후 checkCollision 에 입력한다. 아울러 주변 차량들에 대해서도 주행 모션을 예측하여 checkCollision 에 입력한다. 충돌 체크 후 최적화 궤적을 결정한다.

 

위 오른쪽 그림에 의하면 dynamicsCapsuleList 에 여러 종류의 차선 변경 후보 궤적들이 제시되었다.

① 지나친 차량 회전이 요구되면 이는 타당성 없는(infeasible) 궤적으로서 지나치게 편운동(yawing)이 일어나는 경우이다. ⓶ 비용함수가 큰 경우도 제외한다.

⓷ 충돌 가능성이 있는 궤적도 제외한다. ④ 최적 궤도가 결정된다.

한편 주변 차량 들이 사라지게 되면 다시 차선 변경을 위한 비용함수가 최소화되는 사례가 아래 그림 오른쪽에서처럼 발생함을 알 수 있다.

motion planner에서의 2개의 출력들이 아래 그림에서처럼 다음 단계로 넘겨진다.

① 첫 번째 출력은 RefPointOnPath에 입력된다.

⓶ 두 번째 출력 VisualizationInfo 는 최종단의 VizualizationInfo 로 넘겨진다.

이때 Vehicle Dynamics 모듈로부터 주행방향 속도(Longitudinal Velocity) 가 입력됨에 유의하자. Vehicle Dynamics 모듈은 디지털 Odometry 로부터의 주행속도 데이터를 확보하여 넘겨주게 된다. 차선변경 제어 모듈에서 사용하는 차선 자체는 HD 맵정보로부터 가져 온 지속적으로 업데이트 되는 일종의 가상차선이다.

 

차선변경 제어 모듈에서 RefPointOnPath 입력 데이터의 구성 내용을 살펴보자.

① RefVelocity: 경험적인 속도정보 ⓶ RefCurvature: HD 맵자료

⓷ RefYawDiff: 경험적인 yawing 데이터 ④ LatOffset: 측면오프셋

4개의 데이터는 Path Following Controller 가 MPC 제어를 하기 위해서 알아야 할 기본 정보이다. 아울러 MPC가 제대로 제어하도록 하기 위해서는 horizon(steps) 즉 시간구간의 스텝 수를 잘 조절해야 한다.

 

자율주행 차량이 위치한 곳에서 곡률, 곡률의 미분계수, 헤딩각, 측면 오프셋 값 정보 중에서 곡률과 곡률미분계수에 주행방향 속도를 종합하여 Previewed Curvature를 산출한다.

 

Previewed Curvature 산출 과정에서 고려 중인 자율주행 차량의 상태를 차선 크기에 비해서 좀 작게 과장해서 그린 차선 구조이다. 주행속도는 디지털 오도메트리에서 받아 오는 데이터이며 차선 변경 시 제어 대상 물리량이다.

Lane Keeping Assist 는 중심차선에서 벗어난 거리를 줄일 수 있도록 조향각을 제어해야 한다.

Adaptive Cruise Control 에서는 사용자가 설정하는 속도와 앞차와의 공간 측면에서 각각 안전거리 확보 조간하에 상대거리를 유지해야 한다.

 

PID 제어 대비 MPC 제어의 이점은 많은 수의 입력과 출력에 여러개의 제어 변수를 다룰 수 있으며 아울러 코너라든지 멈춤 표지판이 사전에 탐지되면 감속해야 하는 제약조건(constraints)들을 편리하게 다룰 수 있는 Preview 가능성이다. MPC는 Lane Keeping Assist 문제를 다루기에 편리하다.

 

참조: Vehicle Path Travking Using Model Predictive Control(MPC)

https://kr.mathworks.com/matlabcentral/fileexchange/84320-vehicle-path-tracking-using-model-predictive-control-mpc

 

참조의 MPC 예제 문제를 시작하기 위해서 Path Following Control System 블록의 controller를 아래와 같이 초기화하여 시뮬레이션 해보자.

 

조향각 범위는 0.26 radian 각도로 환산하면 14.9 도 이다.

주행방향(Longitudinal) 가속도가 3 m/s^2 수준이라면 1초에 3 m/s 수준의 주행 속도 변동이 가능하며 시속기준으로는 근사적으로 11 km/h 정도의 속도변동이다.

Sample time 이 0.1초인데 지나치게 크면 급격한 회전이 필요한 곳에서 제대로 회전을

할 수가 없을 것이다. 참조의 MPC 예제 문제에 의하면 턴을 해야 하는 곳에서 충분한 horizon(steps) 이 충분치 않으면 아래 그래프에서처럼 예측되는 속도 분포의 편차가 지나치게 커지게 된다.

 

따라서 아래 왼쪽 그래프에서처럼 궤적 예측에 큰 오차가 발생함을 알 수 있다. 이런 문제를 피하려면 Velocity Distribution Lookup Table 블록에 이어지는 OP 앰프에서 Gain 값을 3배로 키워 VelRef 에 입력하도록 한다. 증가된 Gain 조건에서 아래 오른쪽에서처럼 정상적인 주행궤도를 얻어 볼 수 있다.

 

Vehicle Dynamics 모듈에서 자율주행 차량의 구체적 모델인 Bicycle 모델을 살펴보자. 전방주행속도 ,측면 운동 및 yawing 운동 모델링이 가능하다.