개발 배경
4학년 졸업작품으로 공부하던 ROS2라는 로봇 프로그램을 이용하여 실제로 로봇을 만드는 것이 어떠냐는 학과 교수님의 말에 친구들과 둘이서 자율주행 왜건을 만들어 보기로 하였습니다. 왜건으로 선택한 이유로는 모모로봇 회사에서 출시되고 있는 왜건을 보고 같이 공부할 친구들과 왜건을 만들어 보면 어떨까 하는 논의에서 왜건을 만들어 보기로 했습니다.

omorobotr1mini
처음에는 위 사진의 omorobotr1mini라는 제품을 사용해서 처음으로 ROS2라는 프로그래밍을 공부했습니다. 하지만 처음 공부해보니 정말 제공하는 코드를 해석하는 데도 무척 고생했어요. 라이다 센서는 어떻게 작동하고 모터 드라이브 등 동작이 어떻게 일어나는지 전혀 몰랐습니다. 이걸 navigation이라는 동작까지 수행하는데 정말 한 달 정도가 소모됐다. 하아하…

친구들과 만든 자율주행 왜건
사진이 잘 안 나왔어. 기본적인 왜건 사진은 위 사진의 모습입니다.
개발 이유 왜건의 필요성으로는 물건을 옮길 때 navigation이라는 동작 방법을 이용하여 더 편리하게 물건을 원하는 위치까지 가져올 수 있어 편하기 때문에 개발하였습니다.
navigation이란? navigation이라고 하는 것은 Ridar 센서와 imu라고 하는 자세 센서를 이용하여 로봇 경로를 정한 후 지정한 위치로 이동할 수 있도록 하는 동작 방법입니다.
== 만들면서 정말 처음에 뭐부터 해야 할지 전혀 몰랐어요. 부품은 어떤 걸로 해야 하는지 틀은 뭘로 해야 하는지, 그리고 개발 언어도 C언어가 아닌 C+를 이용해서 개발하는 것에 충격을 받았습니다. 동작하는 언어에서는 C+를 이용하여 실행 속도를 빠르게 하고 실행 파일은 Python을 이용하여 구동시키기 때문에 정말 굉장히 어려웠습니다.정말 자율주행 개발자가 대단한 것 같아요.
부품 제원과 정보
부품을 하나하나 기능을 다 설명하다 보면 너무 길어져서 부품 이름만 씁니다.
모터 드라이브(MW-MDC24D20D-v2) 2. 모터(소형 유성 DC 엔코더 모터 12V 1:51500PPR) 3. 구동휠 지능형 자동차 구동 타이어(높이100mm,내경8mm4.X4 거리측정 LIDARSensor(12cm~10M) 5.MPU92506.JET SONNO7.wifi 동글
제작 과정에서 부품을 결합하는데도 추가로 케이블선을 추가시키거나 조금씩 변형하면서 조립을 하는데 이게 생각보다 복잡했어요. 처음 해보는 만큼 난이도가 꽤 있었어요. 그래도 친구들과 함께 하드웨어 조립을 해보니 외형은 완성시켰습니다. 그런데 문제가 정말 코드를 짠 적이 없었는데 하나하나 짜야 하니까 정말 막막했어요. 그래도 인터넷으로 검색해서 이것저것 정말 셀 수 없이 많은 코드를 번갈아 작동시켰습니다.
할 일이 너무 많았어요. 리눅스도 처음이라 너무 어려웠어요. SD카드에 우분투 20.04를 삽입해서 실행시키는데 정말 아무것도 손을 댈 수 없을 정도였어요. 그래도 교수님이 많이 도와주시고 ROS2 강의에 대한 동영상을 알려주셔서 영상을 보면서 공부를 시작했습니다. 그래도 직접 코드를 짜는 건 힘들었어요.일단 처음부터 하나하나 짜기는 힘들어서 인터넷으로 검색해서 코드를 최대한 해석하고 수정하고 반복했어요.

홈 화면
위의 파일은 ROS2 기본 폴더를 생성한 것입니다. ROS2는 폴더명을 무조건 ws로 생성해야 합니다. ws는 workspace의 약자로 패키지로 관리합니다. 또한 워크스페이스 폴더 내에 src라고 하는 소스 저장 파일을 작성합니다.폴더 생성 명령은 ‘mkdir 파일명’입니다.

기본 코드 파일 내부
기본적으로 ROS2는 오픈 소스에서 파일을 GitHub에서 가져옵니다. 위 사진은 패키지를 작성하면 기본적으로 CMakeLists.txt 파일과 package.xml 파일이 생성됩니다. 이 txt와 xml 코드는 빌드 설정 파일, 패키지 설정 파일입니다. 코드는 모두 비슷합니다. Git 허브로 패키지를 가져올 때는 “gitcloneGit 허브 주소” 명령을 사용합니다.

왜건 코드 파일
위 사진은 로봇에 들어가는 코드입니다. 이들 코드의 종류로는 imu 위치 센서, 모터 드라이버, ydlidar 센서로 구성되어 있으며 블링업 파일에는 로봇의 원격 접속으로 로봇과 연결시키기 위한 코드입니다.

조종에 사용되는 코드
위 사진은 원격 PC에 들어가는 파일입니다. SLAM과 NAVIGATION, 키보드 조작 등의 기능을 할 수 있도록 구성된 코드입니다.
아래부터는 로봇에 들어있는 코드입니다.

ydlidar_client.cpp
ydlidar_node.cpp
ydlidar_node.cpp
ydlidar_node.cpp
ydlidar_node.cpp
ydlidar_node.cpp
ydlidar_param
여기까지가 ydlidarx4, 즉 라이더 센서 노드와 실행 파일입니다. 너무 길어요 저도 잘 이해가 안가요. param 파일은 기본 ydlidar 옵션을 설정한 파일입니다.
지금부터는 모터 드라이버 코드 파일입니다.
md_main.cpp
md_main.cpp
md_main.cpp
여기까지가 모터 드라이버 코드 파일입니다.
cartographer.launch.py
cartographer.launch.py 여기까지 Cartographer 코드입니다.
지금부터는 키보드 조작 코드 파일입니다.
teleop_keyboard
teleop_keyboard
teleop_keyboard
teleop_keyboard
teleop_keyboard
여기까지 왜건을 구동하기 위한 키보드 조작 코드입니다.
여기부터는 bringup 코드로 원격 접속하여 구동을 시작하는 패키지입니다. 로봇의 실행 파일을 실행하는 것입니다.
robot.launch.py
robot.launch.py 여기까지 로봇이 들어있는 코드를 launch 파일에 하나로 묶어 로봇을 구동합니다.
SLAM 공정
위 사진은 ROS2에서 노드를 실행시켰을 때의 모습을 간단하게 캡처한 것입니다. 저게 슬램이라고 로봇이 주변을 탐색해서 로봇의 현재 위치와 지도를 추정할 수 있는 기술입니다. 완벽한 자율주행을 위한 코스라고 생각하세요.
NAVIGATION 과정 위의 사진이 NAVIGATION이라고 하는 ROS 동작 방법 중 하나인데 매핑(Mapping)한 경로를 실행하는 것을 NAVIGATION이라고 합니다. 바로 완벽한 자율주행을 의미하는 거죠. 정말 힘들어서 죽는 줄 알았어요. 몇 달 동안 왜건에 소비했습니다. 정말 맨살에 헤딩해서 하면 뭐든 괜찮겠지 하는 마음으로 계속했습니다. ROS2에 대한 정보도 드물어서 찾기도 힘들었어요.
특별한 일은 아니지만 간단하게 찍었어요.
이상 공부한 ROS2 프로그래밍이었습니다. 감사합니다。