배경#
자율주행의 상용화를 위해서는 값비싼 workstation이 아닌 컴퓨팅 성능은 떨어지지만 값싼 임베디드 보드에서의
자율주행 로직 수행이 필요하다. 교수님은 이 점을 강조해서 여러 과제를 따오곤 했다. 따라서 당시 오픈소스 자율주행 SW로 알려진 Autoware를 임베디드 보드에서 실행하는 것을 목표로 했다. 또, 컴퓨팅 성능으로 인해 자율주행이 실패하거나 성능이 열화되는 경우, real time constraint를 만족할 수 있도록 로직을 추가하는 것이 목표였다.
결과적으로 SVL 시뮬레이터와 실차, 그리고 미니카와 연동해서 자율주행 로직 동작에 성공했다.
임베디드 보드 포팅#
당시 연구실에서 사용하던 임베디드 보드는 Nvidia TX2였다.
이후에 사용하는 Xavier나 회사에서 본 Orin 보드에 비해 하우징이 상당히 안되어있던 기억이 난다.
그래서인지 모르겠지만 미니카에서 실험할 때에는 자주 꺼져서 불안했었다.
Nvidia board를 위한 CUDA, OpenCV가 설치된 OS를 설치해주는 SDK manager가 존재했는데
Autoware가 Ubuntu 18.04에서 동작하는 ROS melodic 버전을 사용했기 때문에 Ubuntu 18.04에 맞는 Jetpack을 사용했다.
TX2는 신기하게 heterogeneous CPU core를 가지고 있었는데 총 6개의 core 중 4개는 ARM A57 core, 2개는 Denver로 종류가 달랐다.
특정 Jetpack 버전부터는 Denver core를 키지 못하게 해놓은 문제가 있었다.
원래 nvpmodel에서 모드를 바꿔서 모든 코어를 활성화할 수 있어야했는데 이게 불가능해서, 플래시할 때 isolcpus 을 지우고 플래시해야 했던 이슈도 있었다.
Xavier 보드의 경우 모든 코어의 종류가 같기도 하고 별 이슈 없이 포팅했었다.
LiDAR 인터페이싱#
지금은 망한 회사인 Velodyne VLP-16 라이다를 사용했다.
ROS에서 velodyne 패키지를 제공하기도 해서 설치하고 네트워크 설정만 해주니 연결되었다.
Autoware 로직 수정#
GNSS 기반 LiDAR Point mapping 모듈 구현#
당시 mapping과 localization을 위해 Autoware의 NDT matching을 사용했는데, map 기반의 localization이다보니 map을 잘 만드는 것이 중요했다. 다만 map도 scan - scan matching으로 만들어지는데 주변 지형지물이 적절하지 않으면 map에 왜곡이 생기는 문제가 있었다.
따라서 ground truth라고 할 수 있는 GNSS를 이용해서 GNSS 위치로 lidar point를 이동해서 point를 쌓고 이후에 downsampling해서 최종적으로 point map을 만드는 모듈을 구현했다.
GNSS 정보를 믿을 수 있는 시뮬레이터와 실차에서 유용하게 썼다.
Multi LiDAR fusion#
미니카에는 라이다를 하나만 달았었는데, 실차에서는 전방 측면에 라이다를 각각 하나씩 달아서 두개를 사용했다.
이유는 자율주행 차량이지만 못생기지 않아야 상용화할 수 있다는 교수님의 철학을 과제에서도 많이 얘기했기 때문이다.
결과적으로는 천장에 라이다를 달지 못해서 두개를 달았음에도 성능이 썩 좋지는 않았다.
또 두 개의 라이다에서 온 데이터를 합쳐서 하나의 라이다에서 들어온 것처럼 하는 로직이 필요하여
라이다의 time sync를 맞춰서 두 라이다 데이터를 합치는 모듈을 구현했다.
GNSS 이용 localization redundancy 추가#
NDT matching은 수렴할 때까지 반복하는 알고리즘이라 반복 횟수와 성능이 어느 정도 비례한다.
다만 여느 수렴 알고리즘이 그렇듯 수렴하지 못하는 경우도 있다.
하지만 자율주행이라는 것은 차량이 특정 시간 이내에 올바르게 planning하고 control까지 해야한다는 deadline이 있는 real time constraint를 가진다.
따라서 특정 시간 동안 NDT matching을 시도해보고 안될것 같으면 GNSS로 localization을 수행하는 redundancy를 추가했다.
그럼 항상 GNSS로 하면 되는 것 아닌가 싶을수도 있는데, 당시 실차로 실험한 시흥캠퍼스 트랙에서 GNSS도 오차가 생기는 경우가 꽤나 있었어서 map matching도 필요하긴 했다.
둘 다 안 되는 경우도 있었는데 그럴때는 lane keeping이라도 하자라고 결론을 내렸었다.
그 외 parameter tuning#
미니카, 실차, 시뮬레이터에 맞게 localization parameter를 튜닝하거나,
제어 알고리즘인 pure pursuit의 parameter를 튜닝하는 작업도 했다.
실차 테스트#

실차 테스트는 테스트베드인 시흥캠퍼스까지 이동해서 해야됐기 때문에 가서 로직이 잘 안돌면 허탈한 경우가 많았다.
control parameter 튜닝은 가서도 할 수 있었지만 localization이 문제면 맵을 다시 만들어야하는 경우가 많았다.
미니카 인터페이싱#

Autoware 로직은 그대로이고 미니카의 brushless motor와 통신해서 ROS topic으로 제어할 수 있어야 했다.
FoxBox ESC를 사용해서 통신에 성공했다.
대용량 보조배터리가 필요해서 미니카에 마운트되면서 용량이 적절한 배터리를 찾던 기억도 난다.
라이다가 없는 미니카들은 카메라로 lane keeping만 수행하는 미니카들이다.

처음에는 방 하나만 사용했었는데 이후에 데모용으로 다른 방까지 사용한다고 해서 이동하면서 확인하기 위해 미니 모니터랑 블루투스를 연결해서 사용했었다.
V2X (CITS) 모듈 구현#
사진을 보면 신호등처럼 생긴 것이 있는데, 각각에 라즈베리파이를 연결해서 시간마다 신호가 켜지도록 하고 원격으로 CITS 신호를 보내도록 했다.
시뮬레이터#

당시 LG에서 만든 SVL 시뮬레이터로도 로직을 확인했다.
라이다 등 센서 모사도 잘 되어있고 가벼워서 잘 사용했던 기억이 난다.
지금은 지원을 종료해서 페이지조차 없지만 당시에 작성했던 글을 남긴다.
지금은 esmini나 carla를 사용할 수 있을 것 같다.
이후에 2021 현대 자율주행 챌린지 예선을 위해 CarMaker와도 연동에 성공했었는데, 이건 회사에 입사해서도 잠시 사용했었다.