자율주행

7장 MathWorks 자율주행 MATLAB 코딩 I

coding art 2022. 9. 28. 17:01
728x90

자율주행 차량이 전 세계적으로 많은 시범 운행이 이루어질 정도로 가깝게 우리 주변에서 경험할 수 있을 정도로 발전했으나 아직도 라이더 센서나 레이더 센서나 비젼 시스템 주 어느 것을 선택할 것인가부터 많은 자율주행 연구개발 주체들 간의 쵸준화 내지 통합은 미지수로 남아 있다.

 

이같이 자율주행 차량의 표준 자체가 미정인 상태에서 인터넷 공간상에 많은 종류의 자율주행 차량들이 수집한 Dataset 들이 뿌려져 있는 상태이지만 오픈소스로 이들 데이터세트를 대상으로 자율주행 소프트웨어 체계를 효과적으로 학습하기는 대단히 힘든 상황이다.

 

하지만 Mathworks사가 제공하는 MATLAB 언어를 사용하여 Udacity 와 협력하여 제공하는 자율주행 관련 블로그들은 자율주행을 학습하고 이해함에 효과적으로 도움이 될 것으로 판단된다. 특히 대학에서 MATLAB 라이센스를 많이 보유하고 있으므로 자율주행을 연구함에 대단히 유용할 것이다. 단 MATLAB 언어가 일반 파이선이나 C/C++ 언어처럼 자율주행 차량 소프트웨어 시스템 코드를 작성하기는 거의 불가능하다는 점을 사전에 이해하도록 하자.

 

하지만 이러한 경향은 이미 구글 Waymo 의 경우 자사의 안드로이드 OS를 사용하고 있으며, Teslar 의 경우도 애플사처럼 자체 OS 및 자율주행 소프트웨어 시스템을 준비하고 있다. 유럽의 폭스바겐, 다임러 벤츠도 비슷한 트렌드를 보여 주고 있음에 유의하자.

 

7-1 GNSS에 의한 자율주행 차량 위치 측정 오차 보정

참조: Build a Map from Lidar Data

https://kr.mathworks.com/help/driving/ug/build-a-map-from-lidar-data.html

 

Build a Map from Lidar Data - MATLAB & Simulink - MathWorks 한국

이 예제의 수정된 버전이 있습니다. 사용자가 편집한 내용을 반영하여 이 예제를 여시겠습니까?

kr.mathworks.com

 

IMU(관성 측정 장치) 판독 값의 도움을 받아 점진적으로 지도를 작성할 수 있도록 차량에 장착된 3D 라이더 센서로부터 얻어지는 데이터를 어떻게 처리하는지 살펴보자. 아울러 이렇게 생성된 지도의 성능 평가를 위해서 차량이 주행한 궤적괴 GPS(Global Positioning System) 기록을 비교하는 예를 살펴보기로 하자.

 

센티미터 수준의 정확도로 도로의 정확한 데이터를 제공하는 HD(고화질) 지도는 자율주행 차량의 위치 파악 및 내비게이션과 같은 workflow에 적합할 수 있다. 이러한 고정밀 HD 지도는 정밀한 GPS 및 IMU 센서와 함께 3차원 라이더 스캔에 의해 구축되는 지도로부터 생성되며 수 센티미터 내에서 자율주행 차량의 위치 로컬라이제이션에 사용할 수 있다. 따라서 여기서 다루는 예제는 스마트폰 지도에서 출발지와 도착지를 지정하는 카카오 맵 수준이긴 하지만 HD 시스템 구축에 필요한 부분적인 특징들을 살펴볼 수 있을 것이다.

 

① Udacity Self-Driving Car Data Subset 사이트에서 기록된 주행 데이터를 불러와서 가시화하도록 하자.

https://github.com/mathworks/udacity-self-driving-data-subset/

⓶ 라이다 스캔 결과를 사용하면서 지도를 작성하자.

⓷ IMU 값을 읽어 지도의 정밀도를 개선하자.

 

사용된 언어는 MATLAB 으로서 자율주행 체계를 학습하는데 큰 도움이 될 수 있으나 실제적인 embedding 시스템에 적용하기는 곤란하다는 점에 유의하자. 자율주행을 위한 시스템 소프트웨어 분야가 최근에 많은 관심을 받고 있긴 하지만 특히 HD 맵 관련해서 산업계의 표준화가 전혀 되어 있지 않은 상황이라 오픈소스 영역에서 체계적인 자료들을 발견하기 어려우며, 비록 실무 수준까지 확장성은 없지만 MATLAB 사이트는 자율주행 소프트웨어에 관한 가장 풍부한 자료를 제공하기 때문에 자율주행의 특성을 학습함에는 큰 도움이 된다고 본다.

 

학습에 사용할 데이터는 Udacity 자율주행 차량 데이터세트의 부분집합 데이터로서 약 100초에 해당하는 라이다, GPS 및 IMU 출력 값이다. 이 데이터들은 MATLAB 포맷인 MAT 확장자를 취하고 있으며, 시각(timetable)별로 기록된 행 데이터를 구성한다.

① lidarPointClouds,mat: 라이다로 스캔된 point cloud

⓶ gpsSequence.mat: 위도(latitude), 경도(longitude), 고도(altitude)

⓷ imuOrientations,mat: 4X1 수치 벡터로 지정된 방향 데이터

 

Udacity 학습데이터는 MATLAB 사이트의 코드를 수정 없이 복사 붙이기 하여 성공적으로 실행시키면 아래의 결과가 출력된다.

 

벨로다인 HDL32E 라이다로부터 저장했던 point cloud 데이터를 불러와서 3차원 pointCloud 객체로 저장하자. 이 객체는 고속 검색이 가능한 K-d tree 구조 형태로 이루어진다. 각각의 라이다 스캔 시점은 timetable의 Time 변수로 기록된다. 몇 개의 데이터를 예로 출력해 보자.

GPS 데이터를 출력해 보자. GPS 데이터가 정밀하다면 소숫점 이하 6자리까지 값을 주어야 하지만, 소수이하 2자리 정도면 10 m 이상 오차를 포함하는 사례이다.

 

IMU 센서는 라이다와 무관하게 자동차에 채택 되어 왔던 센서로서 직선 가속도 및 각속도를 측정하는 6축 과 자기장을 측정하는 3축이 포함된 MEMS 센서이다.

 

참고로 라이다, GPU 및 IMU 의 데이터 센싱 주파수를 결과만 출력해 보자,

 

주행 데이터 가시화

GPS 데이터를 지도에 나타내기 위해서는 지도 제공 업체로부터 API를 받아 위도, 경도 데이터와 확대 줌 값을 사용하여 지도에 나타낼 수 있다. MATLAB 예제에서는 정해잔 지역의 지도를 사용하는 듯하며 데이터를 연결하여 일반 네비게이션에서 처럼 선으로 표현이 가능하다.

 

라이다 데이터를 나타내기 위해 pvplayer 즉 point cloud player 명령을 사용하자. 3차원 공간상에 점 데이터를 표현하기 위해서 x, y, z 구간 범위를 설정하고 좌표축 명칭 및 3차원 그래프의 타이틀을 부여한다.

 

X, Y, Z 라이다 3차원 작도의 중앙 위치에서 360도 회전시켜 보았을 때 아래와 같은 결과를 볼 수 있을 것이다.

 

라이다는 센티미터 급의 정밀한 HD 맵 작성에 사용될 수 있다. 맵 작성을 위한 전형적인 기법은 주행 차량에서 얻어지는 연속적인 라이다 스캔 결과를 배열하여 결합 후 하나의 큰 point cloud 로 만드는 작업이다. 이렇게 작성된 HD 맵은 자율주행 차량에서 로컬라이제이션을 위해 사용될 수 있다.

 

① Align lidar scans: ICP 알고리듬 또는 NDT 알고리듬과 같은 point cloud 등록 기법을 사용하면서 라이다 스캔 결과를 배열한다. NDT 알고리듬은 회전을 수반할 때 정밀한 결과를 보여준다.

⓶ Combine aligned scans: 새로이 point cloud 스캔 결과가 등록되어 첫 번째 point cloud 의 참고 frame 에 맞춰 변환되면, 새 point cloud 는 첫 번째 point cloud 와 머지(merge) 가 된다.

 

스텝별로 코드 구성을 살펴보자.

서로 인접한 두 라이다 스캔 결과로 작업을 해보자. 처리를 신속하게 하면서 스캔 작업간의 충분한 움직임이 축적될 수 있도록 매 10회차 스캔 결과를 사용하자. 1회차 스캔이 0.1c초 걸리므로 10회차면 1초 간격으로 스캔 데이터를 사용하는 셈이다.

등록 전에 point cloud 구조가 서로 구별이 될 수 있도록 다음과 같이 처리한다

① 바닥면(fixed)을 탐지하여 제거한다.

⓶ 자율주행 차량 자체 (ego-vehicle: moving)를 탐지하여 제거한다.

 

지표면과 자율주행 차량을 표현하는 붉은색(Magenta) 점들을 제거 처리하여 상면도로 처리 결과를 디스플레이 하자.

 

point cloud 들을 전처리 후 NDT 알고리듬을 사용하여 등록하자. 등록 전후 이미지를 비교해 보자. 뭔가 많이 제거된 느낌이 들 것이다.

 

point cloud 들이 등록 된 후 근접하게 alignment 가 잘 이루어져도 완전한 것은 아니며 다시 한번 point cloud 들을 누적해서 머지(merge) 작업이 이루어져야 한다. 자율주행 차량의 이동 속도 정보를 오도메터로부터 얻을 수 있으면 timetable 로부터 얻을 수 있는 시간 간격 정보를 사용하여 적절한 mergeGridStep 값을 설정할 수 있을 것이다.

 

이같이 자율주행 차량이 주행하여 얻어 낸 point cloud 들만을 등록하여 작성한 맵은 국소적으로 일관성이 있을 수 있지만 전체적으로 보면 정밀한 기준으로부터 심각할 정도로 표류하고 있을 수 있을 것이다.

 

따라서 GPS 값 입력을 ground truth 궤적으로 삼아 작성된 맵의 품질을 가시적으로 평가해 보자. (※ GPS 데이터는 근본적으로 반경 5 m 수준의 오차를 포함하고 있지만 여기서는 비교적 정확한 데이터로 가정하기로 한다.)

 

GPS 값(위도, 경도, 고도)을 읽어서 첫번째 point cloud 의 원점 기준에 맞춰 변환하도록 한다.

① latlon2local 함수를 사용하여 GPS 좌표를 국지 East-North-UP 국지 카티션 좌표로 변환하자. 궤적 출발에서의 GPS 위치를 국지 좌표계 (x, y, z)에서의 원점으로 잡는다.

⓶ 국지 좌표계가 첫 번째 라이다 센서 좌표계와 일치가 되도록 회전시킨다. (※ 라이더 센서와 GPS 의 마운팅이 정확히 일치하는지는 알 수 없으며, 단지 평가로 갈음하기로 한다.)

작도 결과를 보면 Ground Truth 로 삼은 GPS 데이터는 첫 번째 ㅎ좌회전 이후 Estimated Trajectory 에 비해 상당히 표류(drift)하게 되는데, 그 3가지 이유들은 다음과 같디. ① 스캔 노이즈, ⓶ 강력한 특징을 가진 객체의 부재, ⓷ 회전 시 부정확한 초기 변환이 원인이다.

 

GPS 데이터의 교정은 IMU 값을 읽어 아래 그림에서처럼 상당량 보정이 가능하지만 역시 시간 간격이 커지게 되면 표류 오차가 역시 증가하게 된다.

 

자율주행 차량에서 이와 같은 근본적인 문제가 오랜 동안 기술의 진보에도 불구하고 해결되지 못하고 있다는 점을 지적해 두며, 이러한 기술과 무관하게 Teslar 나 MobileEyeQ 의 경우에서처럼 비젼 기술만 채용하여도 어느 정도 자율주행이 가능하다는 점에 유의하자.

 

하지만 라이다 센서의 정밀성을 감안할 때 아직도 자율주행 차 산업계에서 치열한 연구개발과 양산에 따른 저가형 라이다 개발이 이루어지고 있으므로 향후에 자율주행 차량 기술 진보에 중요한 역할이 기대된다.