생각

NVIDIA End-to-End Model in RC Car

딸기소 2021. 2. 22. 16:46

제가 처음 개별 연구를 시작할 때 잡은 목표는 국민대 자율주행 경진대회에 참여할 수 있게끔 RC Car를 조작해보는 것이었습니다. 하지만, 그 트랙 환경을 똑같게 구현하는 게 쉽지 않고, 또 너무 기간이 길어질 것 같았습니다. 그러던 와중에, 사수 형이 End to End model을 적용해보는 게 어떻겠냐고 제안해 주셔서 방향을 살짝 수정해 RC CarEnd to End model을 적용해보는 프로젝트를 진행하게 되었습니다.

 

Nvidia End-to-End Model은 input으로 사진만 받고 output으로는 휠의 각도를 출력하는 간단한 형식으로 이루어져 있습니다. 여기에 대해서는 다음 Nvidia 측의 블로그 포스트에 자세히 나와 있으며, “End-to-End Deep Learning for Self-Driving Cars.” 논문은 여기서 찾아볼 수 있습니다. “End to End Learning for Self-Driving Cars

 

논문과 관련된 이론적인 부분들을 학습하고 난 뒤, RC Car에 실제 적용을 하기 위해 ROS (Robot Operating System)을 공부했습니다. 그 후, RC car와 제 노트북을 vscode remote ssh를 이용해 원격으로 연결하여 움직임을 자유자재로 할 수 있게끔 세팅을 완료했습니다. RC Car Configuration은 다음과 같습니다.

 

RC Car Configuration

 

Training Data Collection

 

모델에 넣을 데이터를 수집하는 과정입니다. 컨트롤러를 이용해 연구실에 있는 트랙을 주행하면서 Rosbag을 사용해 Compressed Image, car1/rc_cmd/steer 토픽을 Subscribe 했습니다. 그 후, Rosbag 메시지를 cv2 이미지로 변환해 저장하고 그에 해당하는 Steering angle를 찾아 csv 파일에 기록했습니다. 대략 40,000장 정도의 사진을 수집했습니다.

 

Rosbag으로 저장한 주행 데이터

Data Preprocessing

 

수집한 데이터들을 모델에 넣기 전에 전처리를 해주었습니다. Steer angle의 경우, 그 값이 1100~1900 사이에 있어 0 근처의 값들로 바꾸어주었고, 사진의 경우는 주행에 필요 없는 상단부를 제거하였고, 픽셀 값들을 표준화시켜주었습니다.

 

y축의 0부터 200 사이를 잘라주었습니다.

 

Model Training

 

Google Colab을 통해 학습을 진행했습니다. 모델 구조는 논문에서 제시한 구조와 거의 유사합니다.

 

Nvidia End-to-End Model

Model Training Performance

 

 

Model Deployment

 

모델이 잘 동작하는 지 확인을 위해 샘플 이미지를 넣어 각도를 출력하는 스크립트로 테스트를 했습니다. 

제 로컬 노트북 환경에서는 잘 작동하였지만 Jetson Xavier 보드에서는 계속 에러가 났는데, 이런 임베디드 보드들을 위한 Tensorflow가 따로 있다는 것을 보고 공식 홈페이지에서 다운을 받는 방법으로 해결했습니다.

 

Tensorflow 모델이 정상적으로 작동하는 것을 확인한 후, Node를 만들어 RC car의 카메라로부터 Compressed image를 subscribe 하고 throttle과 steer를 publish 하는 코드를 작성했습니다.

 

Performance

 

모델을 테스트 해보았는데, RC car의 움직임이 지나치게 왼쪽으로 편향됨을 발견했습니다. 그래서 주행 후 몇 초 뒤 벽에 부딪히는 참사가 일어났습니다...

 

 

주행 데이터를 수집할 때 트랙을 반시계 방향으로만 돌아서 생긴 문제인 것 같아 이미 있는 사진을 뒤집고, 그에 따른 Steer도 바꿔주는 Data Augmentation이 필요할 것 같습니다.

 

또 제가 생각하기에 제대로 성능이 나오지 않는 하나의 가능성은 연구실 트랙에 Lane과 같은 주행에 직접적으로 도움이 되는 지표가 없기 때문입니다. 좀 더 좋은 성능을 위해서는 눈에 띄는 테이프를 붙이거나 길을 표시해서 주행 데이터를 수집해야 할 것 같습니다.

 

www.youtube.com/watch?v=ei192P9nK_M

Lane을 잘 따라가는 RC Car

 

 

전체 자료 및 자세한 코드는 제 깃헙에서 찾아보실 수 있습니다.

github.com/scottsuk0306/rcCarEndtoEnd

 

scottsuk0306/rcCarEndtoEnd

End to End self-learning rc-car. Contribute to scottsuk0306/rcCarEndtoEnd development by creating an account on GitHub.

github.com