Autonomous driving Robot Car

나에게 simulation으로만 구현하는 로보틱스 프로젝트로는 뭔가 허전하다. 그래서 이번 프로젝트를 시작했다. 생각보다 많은 사람들이 취미로 자신만의 프로젝트를 하는것으로 보이는 아두이노를 이동한 조그마한 로봇카 프로젝트이다. 먼저 내가 구현한 로봇카는 스마트폰을 이용해 블루투스로 조종이 가능하고 초음파 센서를 통해 스스로 장애물과의 충돌을 피하는 로봇카이다. 이에 관한 자료는 인터넷에 널려 있는데다가 로봇을 제어하기 위한 프로그래밍 언어도 대학때 관심있어 배워둔 C언어와 유사한 스케치라는 언어이다. 결과물은 아래 동영상에. 밧데리 때문에 무게중심이 뒤에 쏠려 가속시 앞 케스터휠이 약간 뜬다^^

학생들 코딩이나 digital making 프로젝트정도의 수준이지만, 센서나 모듈(통합보드 플랫폼이나 제조사마다 HAT, Shield, Breakout등 다양한 이름으로 부르는것 같다)의 기본적 기능을 익히고 로봇카를 코딩하여 테스트 해보기 위해서 먼저 간단한 것을 시도해 보는것이 좋다고 생각한다.

더 나아가 내가 해보고싶은 것은 로봇 플랫폼을 제작하고 인공지능, 로봇제어, ROS등의 기능을 구현해보는 것이었다.  정보를 찾아 보니 내가 하고 싶은 프로젝트와 유사한 프로젝트가 이미 많이 있다. 관심을 끌었던 프로젝트는 2개인데, 하나는 donkeycar project이고 나머지 하나는 MIT자율주행차 강의에 모티브를 받은 duckiecar proejct이다. 두 프로젝트 모두 인공지능을 사용한다는 점과 카메라를 자율주행에 필요한 주요 센서로 이용한다는 점이 흥미롭다. Donkeycar project는 소스가 모두 공개 되어 있으며, RC car를 robot car platform으로 사용하기 때문에 쉽고, Ackerman steering 구조이므로 자동차와 kinematics가 기본적으로 같다. 내가 만든 플랫폼은 이와는 다르지만, 개인적으로 이런 RC car platform을 사용하는 것이 나쁘지 않다고 생각한다. 완성된 robot car가 훨씬 그럴듯해 보인다. 그러나, 이 블로그 글중에 car kinematics에 관한 글에서 differential drive를 소개한 적도 있고 나만의 robot car platform을 만들고자, 소스코드를 differential drive방식으로 변경하였다. Donkeycar 소스는 코딩 체계가 매우 훌륭해서 코드 수정이 쉽다. 코드는 python + open CV + Keras 등을 사용하여 작성된 것이다.

Differential drive로 변경하기 위해서는 steering angle과 속도를 담당하는 throttle 값을 두 바퀴의 모터 회전 속도로 변환해 주는 코드를 작성해주는 것이 코드 변경의 핵심이다. 즉, (steering angle, throttle) 제어 변수를 (left wheel motor rotation speed, right wheel motor rotation speed)로 변환하는 작업이 필요하며, 위 제어 변수의 절대값은 기기마다 다르므로 normalize 과정을 거쳐야 한다(donkeycar의 경우에는 angle과 throttle 모두 -1 ~ +1 범위의 값을 사용한다) 변환에 관한 주요 정보는 car kinematics와 링크된 Youtube 자료를 참조하였는데…별도로 공부하지 않아도 사실 변환 함수의 큰 틀은 아래 식과 같이 직관적으로 알 수 있는 내용이다. 상수(A, B)들은 로봇카의 물리적 특성 (휠간의 거리 및 wheel의 지름)에도 의존하지만 actuator (여기서는 DC모터)의 특성에 의존하므로 로봇의 움직임을 보면서 수정해야 한다.

v_{left} = A \times throttle + B \times Steering Angle

v_{right} = A \times throttle - B \times Steering Angle

Differential drive로 변경된 로봇이 원하는 방식으로 잘 조정이 되는것을 확인하고, 전면 어안렌즈 카메라를 통해 스트리밍된 이미지가 저장되는 테스트를 해보았다. 웹 스트리밍된 카메라 동영상을 보면, 카메라가 로봇카의 높이에서 촬영되므로 조명이나 카메라의 각도등에 영향을 많이 받는다는 것을 확인할 수 있다. 마스킹테이프로 간단한 트랙을 만들고 매뉴얼 운전을 통해 카메라 image, steering angle과 throttle 정보를 가지는 자율주행에 필요한 정보를 저장하고, 저장된 정보를 이용하여 신경망을 학습시켰다. 이런 과정은 앞서 포스팅한 Nvidia에서 발표한 end-to-end 자율주행 프로젝트와 유사한 내용이다. 아래는 이러한 supervised learning통해 학습된 인공지능이 스스로 트랙 주행을 하는 모습을 촬영한 것이다. 문제점이 있는데, 어안렌즈의 가장자리 이미지 왜곡현상과 함께 카메라 이미지에 영향을 미치는 여러 인자에 주행 성능이 영향을 받는 다는 것이다. 예를 들어 조명이나 빛의 반사로 트랙이 희미하게 보이는 구간도 있고, 특히 카메라 각도는 트랙의 두 선을 모두 볼수 있도록 적당히 아래쪽을 향하는 각도여야 한다. 자율 주행 프로젝트를 보면 이미지를 보정하는 작업이 있는데 이런 것들이 이런 변수를 제거하는 방향으로 이미지를 수정하는 작업이다. 이제 시작한 프로젝트라 나중에 여러 기능을 더 추가할 예정이고 주행도 좀더 나아 지는 방향으로 발전시킬 계획이다.

 

 

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중