본문 바로가기

KAIROS 2기

[카이로스2기] ROS1 기초 : myAGV 자율주행 (SLAM)

이번주 포스팅은 저번 ROS2 기초에 이어 AGV 주행을 위한 ROS1 활용 SLAM 학습에 대한 리뷰를 하고자 한다.
SLAM은 Simultaneous Localization And Mapping 의 약자로, 주변 환경 지도를 작성하고 지도 상의 위치를 추정하기 위해  자율주행 차량에 사용되고 있는 기술이다.🚙
카이로스 2기 교육에서는 해당 SLAM 기술을 활용한 myAGV 차량의 주행을 실습해볼 수 있었다.

1. ROS1 SLAM 환경설정
2. 시뮬레이션
3. 실제 AGV SLAM 주행

 

1. ROS1 SLAM 환경설정

환경설정을 위해서는 우선 라이브러리를 원활하게 사용하기 위해 ROS1 환경을 구축하였다.
이전 ROS2의 22.04 대신 ubuntu 20.04 환경으로 가상환경(VirtualBox)을 구동한다. 
이번에 사용하는 패키지는 'turtlebot3'로, git clone을 통해 쉽게 가져올 수 있다.
ROS2와 ROS1은 기본 구조는 유사하나 명령어 등에서 차이가 있었는데, 대표적으로 가장 많이 쓰는 빌드에서:
- build > colcon이 아니라 catkin_make
- setup > install이 아니라 devel/setup.bash
그리고, ros2 run > rosrun 과 같은 식으로 합쳐진 명령어를 사용하는 점이 그새 조금 헷갈렸다.🤡

 

 

2. 시뮬레이션

SLAM의 시뮬레이션은 위에 기술한 turtlebot3을 활용했는데, 크게 아래의 4가지 터미널을 키고 실습하였다.
해당 과정을 통해 로봇이 어떻게 주변 환경을 인식하고, 지도를 만들어가는지를 쉽게 이해할 수 있었다.😉
1) ROS1 동작을 위해 필수적인 roscore를 제일 먼저 배경에 실행하고,
2) 로봇이 존재하게 될 환경 world를 시뮬레이션 환경에 불러와준다.
3) SLAM launch 파일을 실행하여 SLAM을 작동시킨다.
4) teleop_key launch 파일을 실행하여 시뮬레이션 상의 로봇을 움직이며 지도를 그릴 수 있다.
잘 작동하면 아래 이미지처럼 기본 world 맵에 대한 지도를 차차 그려나가는 것을 볼 수 있다.😮

터미널1)
$ roscore
터미널 2) world 시뮬레이션
$ export TURTLEBOT3_MODEL=burger $ roslaunch turtlebot3_gazebo turtlebot3_world.launch
터미널 3) slam 런치
$ export TURTLEBOT3_MODEL=burger $ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping
터미널 4) teleop : 움직이기
$ export TURTLEBOT3_MODEL=burger $ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

 
그려진 지도는 yaml 파일과 pgm 파일로 저장할 수 있다.
이렇게 저장된 지도 파일을 불러오면, 그 다음 단계인 navigation을 진행할 수 있다.
navigation 환경에서는 2D Nav Goal 기능을 사용해서, 로봇을 자동으로 목적지로 이동시킬 수 있다!
정말 자율주행을 하는 것 같은 모습이 매우 신기했다.😻

 
보다 정확한 매핑과 움직임을 위해서는 map 상에서의 위치와 world 상에서의 위치를 맞춰주는 작업이 필요하다.
이를 위해서는 rviz의 2D Post Estimate 기능을 사용해서 Gazebo World map과 동일하게 이동시켜주면 된다.
또 아래 이미지에서 보이듯이 초록색 noise가 생기는데, 이 부분도 로봇을 많이 움직여주며 제거할 수 있다.👾

 

3. 실제 AGV 실습

이제 학습한 SLAM을 실제 myAGV에 적용하여, 주행을 시키며 지도를 그려볼 시간이다!

드디어 1차 프로젝트부터 통합 프로젝트까지 사용할 우리 조의 AGV를 수령해서, 환경설정을 진행했다.

myAGV는 Elephant 사의 로봇으로, Raspberry Pi가 탑재되어 있어 이를 활용한 개발을 할 수 있었다.😃

 

Raspberry Pi 환경에서의 작업은 처음이라 신기한 부분도 많았다.

직접 AGV에 모니터를 연결해서 작업할 수 있지만, 아무래도 차량이라 주행하는 동안은 원격으로 제어해야 하기 때문에 이를 위한 RealVNC Viewer 사용하였다. (하지만 원격은 참으로 불안정하고 정말 느려서 눈물이 났다..😇)

ssh를 통한 접속, 그리고 파일 전송(scp)등도 배워서 추후 프로젝트하는데도 매우 유용하게 사용했다!

 

환경설정을 마친 AGV로 준비된 강의실 환경에서 실제 지도를 그려서 자율주행을 해보는 시간을 가졌다.

지도를 그리는 동안은 teleop_key를 통해 AGV를 작동시키며 지도를 그리고, 완료된 후에는 목적지를 지정해서 자율주행으로 잘 이동하는지를 보았다. (영상은 학습 중인 모습)

카이로스 2기 종로반 배 자율주행 대회로 시간도 잰 조별 대항전을 진행했는데, 우리 조 두 팀이 좋은 성적을 거두어서 넘 기뻤다!🐣

 

ROS1 SLAM 기초 교육 후기👀

- SLAM이라는 기술에 대해 굉장히 모호한 개념만 가지고 있었는데, 시뮬레이션과 실제 구동을 통해서 훨씬 깊은 이해를 할 수 있었던 시간이었다! 지도를 그린 이후에 목적지를 지정했을때는 어떻게 가도록 알고리즘이 되어있는지에 대해서는 궁금한 부분이다.

- 다만 SLAM이 라이다와 rviz등을 한번에 구동시켜야하는만큼 시스템 부하가 정말 심해서, 잘 활용하기 위해서는 이 부분을 어떻게 극복해야할지 고심이 필요할 것 같았다..

 

🌱 카이로스 2기에서 배운 ROS2가 궁금하다면?

https://bagjo2884.tistory.com/28

 

[카이로스 2기] ROS2 기초 : 시리얼 통신(ESP), URDF

이번에는 저번 포스팅에 이어, ROS를 활용한 시리얼 통신과 소켓 통신으로, ESP32와 ROS 간의 소통에 대한 부분과, 새로 배운 URDF에 대해 다루고자 한다.간단히 순서는 아래와 같다. 🐫1. ESP32 > ROS 간

bagjo2884.tistory.com

 

다음 포스팅은 1차 프로젝트 : myAGV 주행시키기로 만나요!🐤