Xycar의 라이다(Lidar), 초음파(Ultrasonic), 카메라(Camera) 센서를 사용해 라바콘 장애물이 있는 미로를 탈출하는 것을 목표로 한다.
C++ / ROS / OpenCV / Control method (PID, Stenley etc) / Filtering (Moving avereage, Low pass Filter etc)
객체지향 프로그래밍 구조 설계
CMake를 이용한 프로젝트 빌드
Git을 이용한 프로젝트 코드 관리
ROS를 이용한 로봇 시스템 구축(Node간 통신)
2D Lidar활용 장애물 인식 및 회피
규칙기반 알고리즘(Rule-based Algorithm)설계 및 구현
SLAM 활용
경로 탐색 알고리즘(A*, DFS 등) 활용
초기 목표
: 지난 프로젝트에서의 아쉬움을 만회하고자 "제어"기법을 사용하는 것을 목표로 삼고 싶었다.
slam을 이용해 desired path정보를 취득한 뒤 stanley method를 사용해 차량을 제어하는 것을 초기 목표로 삼았다.
(hector_slam package / move_base package / stanley method)
하지만, 결국...
2D-Lidar를 활용하여 hector_slam으로 map data를 얻어내는 것 까진 성공했다.
move_base로 desired path를 계획하는 것에서 실패했다.
실패한 이유는 능력 부족인 것 같다. 패키지가 제공되어 필요한 데이터만 구축하면 되는 상황임에도 불구하고 그 환경을 설계하는것이 어려웠다.
시간적 여유가 없어 픅로젝트 완료 3일 전, 규칙기반의 알고리즘을 설계하고 구현하는 것을 새로운 목표로 잡고 프로젝트를 진행했다.
최종 진행
4명이 팀원이 2명씩 짝지어 두가지 알고리즘을 구현했다. (장애물 회피 / 주차 알고리즘)
나는 장애물 회피 알고리즘을 구현했다.
두 가지 의견이 있었다.
나: 장애물 위치 기반 steering angle 계산
다른 팀원: DFS(depth first search) 방식의 경로생성 알고리즘
planning 공부를 위해서 팀원의 아이디어를 활용해 보고 싶었지만, 시간적 여유가 없었기 때문에 최종적으로 구현 시간 대비 성능이 나쁘지 않을 것으로 예상되는 내 알고리즘을 채택했다.
차체 내부에 장애물이 있을 것이라고 판단되는 상황에서 steering anlge을 계산하는 수식을 아래와 같이 유도했다.
: 가장 가까운 장애물과의 거리(d), 그 장애물의 위치정보(theta)는 2D_Lidar의 토픽 /scan으로 부터 받아올 수 있다.
차체의 제원 w를 알 수 있고, 안전거리 l_sf를 임의로 설정하면 적절한 steering angle을 계산할 수 있다.
"장애물 회피 알고리즘"은 정상적으로 작동했고, 결과적으로 미로 내에서 장애물 충돌은 한번도 일어나지 않았다.
차체 유턴 및 선회 시 여유로운 회전 공간을 위해 장애물 감지 시 스티어링이 반대인 상태에서 한번 후진하는 알고리즘을 추가했다.
초음파 센서로 직진 가능 여부의 기준을 부여해 주고 싶었지만, /ultra topic 발행이 안되는 문제로 인해 초음파 센서를 활용하지 못했다.
"주차 알고리즘"을 적용시키지 못해 프로젝트 미션을 완벽히 수행하지 못했다.
: 두 가지 모두 실패했다.
yolo 패키지 사용을 위한 환경 구축에 실패했다.
OpenCV는 공부해서 적용할 시간이 부족해 시도하지 않았다.
결론
: 장애물회피는 단순한 규칙기반 알고리즘으로 구현했지만, 주행 정지 조건인 주차 기준을 적용시키지 못해 프로젝트를 성공적으로 마무리 짓지 못했다.
매우 아쉽다.
초기에 자율주행 경로계획을 통한 control 계획을 거창하게 세웠으나, planning을 학습하지 않은 상태에서 단기간의 프로젝트에 기술을 적용시키는데 한계가 있었다.
Simulation을 통한 planning 학습을 먼저 진행한 후 해당 프로젝트를 진행했다면, 더 만족스러운 결과를 얻을 수 있지 않았을까 하는 아쉬움이 있다.
장애물 회피를 위한 단순 규칙기반 알고리즘 설계 경험은 이전에 해본적 있는 경험이었기 때문에, 새로운 지식이나 기술을 습득했다고 느껴지지 않았다.
이번 프로젝트에서도 여전히 제일 중요하다고 생각했던 "제어"를 경험하지 못했다고 느껴졌다.
최종적으로 해당 프로젝트를 통해 ROS 상에서 시스템 구현을 위한 통신 및 빌드 환경을 더 깊이있게 공부하는데 그쳤다고 생각한다.
안녕하세요, 포스팅 잘 읽었습니다.
혹시 조향각 계산 공식 출처를 알 수 있을까요?