실외 배달 로봇 - 2024년
2023년도에 실외 배달 로봇을 만들었지만 자율주행이 아닌 수동 제어 였고, 외관의 모습 등등 미흡한 모습이 많아 많이 아쉬움이 많았다. 그래서 2024년에도 이어서 더 다듬어서 완벽한 실외 배달로봇을 만들고 싶다는 욕심이 생겨서 전의 실외 배달로봇을 발전 시키기 위해 기간을 1년으로 잡은 프로젝트를 다시 진행하게 되었다.
필자는 자율주행을 제대로 할 수있는 방법이 없을까 검색을 해가며 자료를 찾다가 ROS2라는 플랫폼에 대해서 접하게 되었고, 이것을 우리 로봇에 적용하면 한층더 발전된 산업용 로봇으로 거듭날 수 있지 않을까?라는 기대감을 품고 ROS2라는 것에 무작정 부딯치며 도전하게 되었다.
1년 중 상반기에는 ROS2에 대한 강의를 들으며 작년에 앱인벤터로 만들었던 앱을 진짜 제대로된 앱으로 다시 만들고 싶어서 2023년도 겨울방학에 java를 모든 팀원들에게 스터디를 하면서 강의 자료를 만들어 알려주고 나서 팀원들과 앱 UI를 같이 그림판을 통해서 만들어보고 각각의 UI에서 해야할 기능들에 대해서 토의를 해나간 결과
매장/ 고객/ 관리자로 나누어서 앱을 분리해서 만들었다. 우선 매장은 주문이 들어왔을때 처리할 수 있도록 하였고, 고객은 교내에 있는 커피숍에 있는 상품들을 장바구니에 담아서 처리 할 수 있도록 하였고, 관리자는 로봇 수동 제어 및 로봇의 실시간 위치를 알려주고, 로봇을 각각의 주문에 배치할 수 있도록 아래 그림과 문서처럼 설계를 하였고,
그 다음에는 중간 정리도 하면서 한이음 공모전에 제출할 서류들을 만들어가면서 더욱 구체화해가며, 이렇게 설계한 내용들을 바탕으로 Android Studio를 이용해서 UI와 기능들을 틈틈히 구현하였다.
그리고 앱들 간의 통신은 구글 클라우드인 FireBase를 연동해서 앱을 만들었다.
그렇게 해서 만들게 된 최종 앱 영상이다.
이제 어느덧 프로젝트 상반기가 되었다. 실외 로봇을 제대로 만들려다보니 라이다도 실외에서 사용할 수 있는 라이다로 바꿔야 했고, 그 외에도 외관 비용 등으로 들어가는 비용이 많이 필요해서 프로젝트를 진행하는데 돈을 지원해주는 공모전들을 지원하다가 한이음이라는 공모전에 서류가 통과를 해서 로봇을 만드는데 필요한 돈을 끌어올 수 있었다.
실제로 로봇을 만들기 전에 알고리즘 테스트 및 여러 오픈소스로 제공하는 것들을 직접 시뮬레이션을 통해 사용해보면서 알고리즘 공부와 우리 배달로봇에 알맞는 것을 찾아내는 작업을 했다.
이제 대면으로 러닝스푼즈에서 현업에서 일하고 계시는 강사님께 ROS2에 대해 배워가며, 수업이 끝날때마다 수업 내용에 대한 질문과 지금 진행하고 있는 실외 배달로봇에 대해서 센서들에 대해 추천을 받는 등 많은 조언을 들어가며 실외 배달 로봇 전체 시스템 틀을 어느 정도 잡아갈 수 있게 되었다.
(참고로, 필자는 실외/ 실내 로봇 프로젝트를 둘다 진행했는데 그 프로젝트에서 전체적인 시스템 설계와 SLAM을 이용한 지도 생성, Nav2의 역할을 맡았다.)
이렇게 틀을 짜가는 과정에서 실외의 경우 지면이 평평하지 않고, 오르막길, 내리막길이 있기 때문에 3D Lidar를 사용해서 Mapping을 해야했지만 공모전을 통해서 자금을 지원받더라도 실외에서 쓸 수 있는 파장이 905nm 이상의 3D Lidar를 사기에는 너무 비싸서 940nm의 2D Lidar를 구매해서 사용하게 되어서 일단은 Cartographer를 사용해서 mapping을 했지만 아래의 사진과 같이 Loop Closure가 안되서 같은 자리로 돌아와도 센서 값들이 틀어지게 되고 mapping한 지도가 이상하게 되었다.
그래서 팀원들과 토의 끝에 주행할 구역을 정하고 그 구간별로 조금씩 나눠서 Cartographer를 사용해 Mapping하고 해당 png파일들을 이어붙여서 gimp라는 리눅스 기반 사진 편집 툴을 사용해서 픽셀 단위로 하나하나 mapping한 지도의 png 파일을 팀원이 수정하게 되었다.
그리고 UTM 좌표계를 적용해서 GPS 좌표의 범위를 교내로 범위를 설정하고,
하나하나 GPS 값을 받아가며 로봇의 위치가 실제로 이 지도상에서 갈 수있는 구역인 흰 부분에 TF가 위치하는지 확인했다.
그 과정 후에는 Nav2의 global/local costmap과 사용할 장애물 회피 알고리즘 등의 파라미터 값들을 정했다.
그리고 실내 프로젝트를 진행하면서 실외 프로젝트를 진행하였기 때문에 전체적인 시스템 구조의 상당 부분을 유사하게 설계하였다. 그 이유는 팀원들 또한 ROS2를 처음 접해보기 때문에 같이 프로젝트를 진행하면서 서로서로 상당부분 정보를 공유해가면 두 프로젝트의 진행하는데 있어서 시간이 많이 줄어들 것이라 생각했기 때문이다.
그리고 실외에서 장애물 인식하는 데 있어서 2D Lidar와 카메라를 센서 퓨전해서 카메라를 통해서 학습시킨 물체가 객체 인식이 되고, 그 객체 인식 박스에 들어온 2D Lidar 포인트 값들만 뽑아서 어디에 장애물이 있다고 알려줄 수 있도록 설계하였었는데 그것을 함께 진행했던 팀원이 구현을 하였다.
팀원 중 한명이 3D 프린터를 이용해서 외관 설계한 영상이다.
그와 더불어 작년에 사용했던 센서들과 추가된 부품들을 바탕으로 실외 외관과 로봇 구동 기반 또한 갖춰지게 되었다.
이제 이렇게 만들어 진 것들을 통합하는 과정이 남았다.
이 프로젝트를 진행하면서 많은 어려움들이 있었다.
- 모터가 가격적인 문제 때문에 킥보드용으로 산거라 ESC도 달리지 않고, 토크 또한 거의 없어서 모터가 내리막길에서 출력을 어느정도 넣지 않으면 뒤로 밀리는 문제
-> 팀원 중 한명이 BLDC 인휠 모터로부터 U, V, W 값을 얻어와서 속도 값에 맞는 U의 개수가 카운팅이 안되면 속도를 더 주는 식으로해서 보완했다. - 모터가 갑자기 역기전류가 흘러서 갑자기 최대 속도로 급발진하고, 그로인해 3D 프린터로 뽑았던 바퀴 커버가 계속 깨져서 계속해서 프린팅 해주는 문제
-> 여분으로 바퀴 커버를 구비해 놨었다. 그리고 전원선을 길게 빼서 갑자기 급발진하는 경우 대처할 수 있도록 했다. - ST보드에 연결된 센서가 많아서 초음파 센서에 전류양이 조금이라도 모자르게 된다면 바로 초음파 센서가 작동이 멈추게 되는 문제
-> 전원 공급을 따로 분리해주는 등 여러가지 방법을 시도해 봤지만 아직까지도 의문이다. - 4륜 구동 로봇인데 조향축이 없이 Differiential robot이라 실내에서는 제자리 회전이 가능하지만 실외에서는 제자리 회전 조차 불가능한 문제
-> 이 문제는 하드웨어 구조를 다시 짜야하는데 그렇게 할 경우 지금까지의 설계나 필라멘트의 양이 한정되어 있어서 보류했다. - TMAP에서 제공하는 API를 사용하려했지만 이또한 보행자 경로라 로봇이 갈 수 없는 길을 안내하는 경우가 다수 발생
-> 직접 GPS의 위도 경도 좌표를 직접 알아내서 그 좌표들을 경로로 한번에 뿌려주는 방식으로 변경했다.