본문 바로가기

FOSCAR-(Autonomous Driving)/ROS 스터디

[2023 ROS 스터디] 조영상 #4주차 - SLAM과 내비게이션

반응형

*강의 출처 : 로보티즈(표윤석 님)

스터디 내용 중 혹시 틀리거나 잘못된 부분이 있을 때 정말 가감 없이 지적해 주시면 부족한 제가 성장하는데 큰 도움이 될 것 같습니다. 감사합니다!

 

우선 이번 주제의 뜻을 한번 해석해 보자.

 

 

SLAM : Simultaneous Localization And Mapping : 동시적 위치 추정 및 지도 작성

 

Navigation : 차량 자동 항법 장치

 

위의 어려운 용어를 쉽게 한마디로 설명하면 '길 찾기'이다. [여행의 오랜 동반자 '나침반'과 '지도']

 

출처 : 네이버 국어사전

옛날에는 나침반과 지도를 통해 길을 찾았다. 그렇다면 이 둘이 없다면? --> 길을 잃을 것이다. 

 

옛날에는 해, 달, 별의 위치만으로 나의 위치를 파악했다. 

중국 4대 발명품 중 하나가 나침반이다.(물론 나침반 만으로 진북을 찾을 순 없다. 

 

현제는 나침반이 점점 진화해서 자기 나침반-> 전륜 나침반-> GPS까지 발전했다. 

 

그 외에도 지도를 통해 나의 위치를 파악할 수 있을 것이다. 

 

------------------------

 

어둠 속 길 찾기

 

오늘의 주제에 대한 이해를 돕기 위해 세상이 정말 어두운 상황에서 내 위치를 어떻게 파악할까?(눈을 감고 한번 돌아다녀보자.)

 

눈을 떴을 때 보다 확실히 어려울 것이다. 그런데 뭔가 감으로 내가 어느 정도 갔는지 파악할 수 있다. 

 

왜냐하면 우리는 오랜 세월을 살아가면서 내 보폭은 대략 어떻게 되는지, 회전은 얼마큼 했는지(달팽이관) , 그리고 손으로 주변을 더듬거리면서(로봇으로 치면 거리센서) 대략적으로 나의 위치를 추정할 수 있다. (아무리 깜깜해서 안보이더라도)

 

길 찾기에 필요한 것

 

로봇의 위치 계측/추정하는 기능

 

방법 1. GPS(Global Positioning System) 

 

하지만 오차가 발생하고 날씨의 영향을 많이 받는다. 또한 위성신호를 받아야 하기 때문에 고층빌딩 사이, 또는 실내에서는 신호를 받기 힘들다. 

 

우리가 만들려고 하는 서비스 로봇은 대부분 실내용이기 때문에 다른 방법이 추가적으로 필요할 것이다 

 

방법 2. Indoor Positioning Sensor

 

1) Landmark (Color, IR Camera)

ex) StarGazer를 로봇 위에 장착해서 실내 벽(천장)에 붙어있는 여가지 표식들을 인식하여 본인의 위치를 추청 한다.(외란에 강건한 편이지만, 천장이 어느 정도 낮아야 하고 만약 개인적인 집이라면 마커를 천장에 부착해야 하는데 이러한 이유로 '범용적'으로 이를 적용하고 활용하기가 힘들다. 각 마커의 위치도 정확해야 한다. 즉, 인프라를 구축하기 어려울 수 있다.)

 

ex) 아바타 영화처럼 몸에 센서를 부착하고 그걸 따라서 애니메이션을 그대로 생성하여 모션을 연출할 수 있도록 해주는 것.(이런 식으로 부착하는 마커들은 구슬로 되어있는데 하나의 구슬 안에는 여러 개의 작은 구슬로 이루어져 있다. 이러한 구조는 구슬이 빛을 받았을 때 그 빛을 손실 없이 완전히 그대로 다시 반사해 주도록 한다. 이렇게 반사된 빛을 IR 카메라가 포착하여 해당 마커의 위치를 보다 정확하게 추정한다. ) 정확도가 0.1mm 단위 

그러나 매우 비싸다는 단점이 있다. 

 

2) Indoor GPS

 

실내에 위성의 역할을 해주는 장치를 단다.

 

 3) WiFi SLAM, Beacon

 

Indoor GPS와 유사함, 그러나 신호가 굉장히 어그러져서 쉽지 않은 기술이다. 만약 기술이 완벽하다고 해도 와이파이의 위치를 정확하게 알아야 한다. 

 

방법 3. 추측항법(dead reckoning, 데드레커닝) : 우리가 쓰는 방법

 

로봇이 출발 한 위치로부터의 상대적인 위치를 계산

출처 : 로보티즈 opensource Team
출처 : 로보티즈 opensource Team

2. 센싱 : 벽 물체 등의 장애물의 계측을 하는 기능

 

각 센서들의 사진, 모델정보들은 강의자료에 나옴.

 

거리센서

 

비전센서(두 개의 카메라를 이용해서 Depth정보를 계산할 수도 있다., 또한 모노 카메라를 사용하는 대신 움직이는 로봇이 위치에 따라 여러 사진을 찍으면 이 또한 Depth 정보를 계산할 수 있다.)

 

Depth camera

 

위이 센서들이 예전에는 굉장히 비쌌지만 요즘에는 가격이 저렴해짐.

 

3. 지도 : 길과 장애물 정보가 담긴 지도

 

요즘에는 건물 안에서의 지도도 만들어지는 중이다. 

 

그러나 가정집의 지도는 없을 것이고, 탐사해야 하고나 붕괴된 곳은 미리 지도를 만들 수 없을 수 있다. (데이터베이스가 ㅇ벗을 수 있다.)

 

우리가 이러한 단점을 보완하기 위해 하는 것이 바로 SLAM이다. 

 

4. 경로 : 목적지까지 최적 경로를 계산하고 주행하는 기능

 

경로라는 개념은 내비게이션, 위치추정, 경로 탐색 및 계획이라는 개념을 포함한다. 

 

이를 위해 여러 가지 알고리즘이 사용된다. 

 

  • Dynamic Window Approach (DWA)
  • A* 알고리즘 (A star) 아주 고전적 방법 : 목표 위치까지의 경유 포인트들 중에서 가장 점수가 높은 포인트로 이동해 가는 것(주로 게임게발에서 많이 쓰임 하지만 지금 쓰진 않음 워낙 고전이라서)
  • 포텐셜 장(Potential Field) : 마치 철가루 위에 자석을 올려놓으면 자기장이 가시적으로 여러 줄 표시되는 것을 확인할 수 있는데 이러한 경로들 중 최적의 경로를 선택하는 방법(Goal지점은 빨아들이는 방향(로봇과 인력), 장애물은 척력의 방향으로 자기장이 그려진다. 
  • 파티클 필터 (Particle Filter) : 원리 :파티클 필터의 동작원리는 매우 간단하다. 시스템에 적절하게 제안된 확률분포로 임의로 생성된 입력을 여럿 가하여보고 그것들을 종합하여 시스템의 정보를 추측하는 것이다.(출처: 위키피디아)
  • 그래프 (Graph)

중간 정리

 

SLAM

위치 + 센싱 --> 지도 

 

Navigation

위치 + 센싱 + 지도 --> 경로

 

위에서 언급한 각각의 요소 (위치, 센싱, 지도, 경로)는 각각 메시지로 전송될 수 있다. 

 

SLAM을 위해 ROS에서 주어진 패키지 

위의 강의 자료에서 강조된 것처럼 우리가 ROS를 처음 배울 때 사용했던 turtlesim 패키지에서 병진속도, 회전속도 메시지를 보내줬던 경험이 있었는데 Gmapping에도 해당 메시지를 활용할 수 있다.

 

Gmapping을 사용하는 로봇은 주행기록계가 있어야 한다.(얼마나 주행했는지)

 

계측 센서는 2차원 정보만 받아들일 수 있는데 만약 3차원 데이터가 들어온다고 해도 2차원 정보를 제외한 나머지 정보는 잘려서 들어오게 된다. 

 

로봇은 한쪽 방향으로 너무 긴 로봇은 사용하기 어렵다. 

 

TurtleBot3에 Gmapping을 사용하여 SLAM을 해볼 것인데 필요한 소프트웨어와 TurtleBot3 패키지가 있다.(강의자료에 있음)

 

로봇을 이용하여 처음에 지도를 작성할 때에는 로봇을 수동으로 조작하여(키보드, 조이스틱) 지도를 그린다. (터틀봇에서는 이렇게 됨.) 그냥 풀어놓으면 부딪히고 고장 날 우려가 있음. 

지도 작성 Tip : 느리게 이동시킨다.

 

ROS구동 순서(자세한 명령어는 강의 자료에 나와있음)

 

1. 마스터 실행

$ roscore

 

2. 터틀봇 및 센서 구동 (SBC)

 

터틀봇의 제어기(MCU)인 OpenCR을 구동시키게 되고 모터의 엔코더 값을 받아서 오도메트리를 준비한다. 이러한 정보들을 싱글보드 컴퓨터로 전달한다. 싱글보드 컴퓨터에는 usb로 2차원 라이다가 연결되어 있다. 라이다로부터 2차원 정보값을 받는다. 실질적으로 지도를 작성하는 부분은 컴퓨터에서 메시지를 받아서 작성하게 된다. 

 

지도(2차원 점유 격자 지도)가 완성되면

 

흰색 부분은 로봇이 이동 가능한 자유영역이고

 

흑색 부분은 로봇이 이동 불가능한 점유영역(벽이라고 생각하면 됨 혹은 장애물)

 

회색 부분은 확인되지 않은 미지 영역이다. 

 

강의 자료에 사진에 따라 자유영역과 미지영역이 각각 회색, 더 진한 회색으로 표현되기도 함. 알고리즘에 따라 더 세분화시키기도 함.

 

 

Gmapping 말고도 Google Cartographer가 있는데 성능은 크게 차이가 안 나지만 둘은 비교해 보면 다음과 같다.

 

Gmapping 

 

  • 상업용으로 쓰기 어려운 라이선스
  • 개발이 거의 멈춘 상태
  • 2차원 지도만 지원한다. 

Google cartographer

 

  • 아파치 라이선스 2.0(ApacheLicense)을 사용하고 있어서 상업용으로 사용하기에 좀 더 유리하다. 
  • 오픈소스로써 현재도 개발이 계속 진행되고 있다.
  • 2차원뿐만 아니라 3차원 지도를 지원한다.

 

SLAM과 Navigation을 공부하기에 앞서서 이를 공부하는 목적에 따라 연구 방향성을 잡는 것도 중요하다. 

 

만약 SLAM과 Navigation을 기본 기능으로 갖는 서비스 로봇을 만들고 싶다면 내가 집중하고 있는 서비스 개발에 좀 더 포커스를 맞추고 SLAM과 Navigation는 엄청 깊게 파고들어 시간배분을 하지 않는 것이 좋다. 

 

만약 SLAM과 Navigation을 좀 더 공부하고 싶다면 이들이 오픈소스인 점을 이용하여 마음껏 보고 변형시키고 기능을 추가해 가면서 공부하는 것이 좋다. (옛날에는 수많은 논문들을 읽고 코드를 짜보고 하는 내공이 필요했지만 요즘에는 오픈소스로 된 패키지들이 있기 때문에 그 장벽을 넘어오기 쉽다.)

 

 

위의 순서도에서 보이는 처리과정에서

 

sensor값을 우선 Gmapping에게 보내고

 

키보드나 다른 조작을 통해 병진/회전 속도와 관련된 메시지를 로봇(turtlebot3)에게 보내게 된다. 

 

로봇은 오도메트리를 계산하게 되는데 처음으로 계산되는 오도메트리는 로봇 자체의 오도메트리이고 우리가 최종적으로 알아내어야 하는 상대 위치(오도메트리)는 로봇에 부착된 센서에 대한 오도메트리이다. 

 

로봇의 부위 별로의 상대 좌표를 알고 있기 때문에 tf를 통해 최종적인 센서의 오도메트리를 계산할 수 있다.

 

결국 Gmapping엣 필요한 것은 두 가지인데 

 

1. 센서의 오도메트리 정보

2. 센서 값

 

이다. 이를 통해 map을 생성하고 서버에 map.pgm & map.yaml을 만들어낸다. 

 

. pgm은 그리드 지도정보를 담고 있고,. yaml은 지도의 크기등의 정보를 갖고 있다. 

 

 

try and error 방식이다.

particle filter를 좀 더 전문적으로 공부하고 싶다면 다음의 책을 참고하는 것이 좋다.

 

Probabilistic Robotics
디터 폭스, 볼푸램 부르가르드 와 세바스찬 스런의 책
 
파란색 책이라고함.
 
 
네비게이션 구동 명령 순서(SLAM이랑 유사함)
 
1. 마스터 실행
2. 터틀봇 및 센서 구동
3. RViz, 터틀봇 원격 조종, 내비게이션

위의 사진에서 로봇에 모인 초록색 점들이 particle이라고 생각하면 된다. 즉, 로봇이 있는 위치를 점들의 모임으로 추정한 것이고 빨간색 화살표가 최종 목적지를 의미한다.  로봇과 화살표를 이어주는 선이 경로를 의미한다.
 

푸리에 변환과 같은 느낌의 발견을 가져다준다. 

 

굉장히 신기하고 재밌는 발상이 나오게 되는데 

 

우리는 일반적으로 로봇의 위치를 이동시키기 위해서 현재 위치에서 다음 위치의 좌표를 생각하게 된다. 그러나 위 그림에서 설명하는 DWA방식은 위치기반 영역이 아닌 속도 탐색 영역으로 바꾸게 된다. 다음 위치 좌표를 생각하는 것이 아니라 가장 빠르게 도달할 수 있는 속도를 선택하는 방식이다. 

 

 

 

DWA에서 주어지는 식을 좀 더 살펴보면 알파, 베타, 감마와 같은 일종의 Gain을 조정할 수 있도록 해준다. 이것은 로봇의 목적에 따라 개발자가 지정해 주는 것이다.

 

만약 내가 개발하고자 하는 로봇이 목적지까지 다른 것 은 상관없이 무조건 빠르게만 도착하면 되는 경우가 있을 것이고 방향이나 거리가 더 중요한 목적이 되는 로봇이 있을 것인데 이들을 고려하여 목적함수 G가 최대가  되는 속도 v, w를 구하게 된다.  이와 관련된 서적도 위에서 언급한 세바스찬이 저자인 책이다. 

 

 

실습 시작

 

Turtlebot3 위키 참고 : https://emanual.robotis.com/docs/en/platform/turtlebot3/overview/ 

 

melodic 버전 명령어 참고(KAsimov Wiki) : https://kasimov.korea.ac.kr/dokuwiki/doku.php/activity/public/2020/ros/210127 

 

하지만 처음 Gezebo 실행부터 오류를 만났다. lauch파일을 실행시켰을 때 오류가 발생해서 혹시 Gezobo에 오류가 있을까 싶어서 Gazebo만 따로 실행시켜 봤는데 가상 머신의 메모리 관련 오류 메시지가 뜨면서 실행되지 않았다. 

 

오류메시지는 다음과 같았다.

 

vmw_ioctl_command error Cannot allocate memory.

 

이에 대한 해결 방법을 찾기 위해 구글링해 본 결과 가상 머신설정에서 3D가속 설정을 해제하면 된다는 해결책을 찾게 되었다. 

 

https://answers.gazebosim.org//question/13214/virtual-machine-not-launching-gazebo/ 

 

Virtual Machine not launching Gazebo - Gazebo: Q&A Forum

Virtual Machine not launching Gazebo edit I am using the beta version of ROS as well as Ubuntu 16.04. When attempting to launch gazebo I get the following error: mroscoe@ubuntu:~$ gazebo VMware: vmw_ioctl_command error Invalid argument. I have checked onli

answers.gazebosim.org

 

가상 머신을 설치할 때 참고했던 유튜브를 언급했던 내 개인 블로그 글에서 미리 수정해 놔야겠다는 생각을 하게 됐다.

 

실행 완료 

RViz실행

$ roslaunch turtlebot3_gazebo turtlebot3_gazebo_rviz.launch 

RViz상에서 노이즈까지 반영돼서 보이는 것을 확인할 수 있다.

 

로봇 구동 w키가 앞으로 이동(병진속도 제공)

 

카메라 기능 체크

SLAM 실습

 

모든 구간 탐색 완료

 

map 서버에 정보 저장

내비게이션 실습

 

처음에는 녹색의 particle들(로봇의 위치를 추정해 주는 점들)이 이곳저곳에 흩어져 있다는 것을 확인할 수 있다.

 

2D estimate 기능을 활용하여 실제 로봇이 가제보상에 어디에 위치하는지 지정해 준다. 

 

Teleop를 사용하여 로봇을 원격 조종 해주면 particle들이 조금 더 수렴하는 모습을 확인할 수 있다.

 

이제는 Teleop를 꺼줘야 한다. 왜냐하면 내비게이션에서 목적지에 도달하기 위해 전송되는 메시지(병진, 회전속도)가 있을 것이고 Teleop에서도 역시 키보드의 입력에 따라 병진속도, 회전속도에 대한 메시지가 전송될 것이다. 이들이 중첩되어 혼선을 가져올 수 있기 때문에 Teleop_key를 꺼줘야 한다.

 

그 후 2D Nav Goal을 클릭하여 목표지점까지 DWA방식을 활용하여 내비게이션 되도록 한다. 

목표지점 도착
체크

위 사진에서 초록색 부분이 레이저 센서값을 나타내고

중간에 핑크색이 장애물(아얘 갈 수 없는 부분)

그리고 파란색 테두리 겉 주변의 빨간색 부분은 그 부분에 로봇이 도달하면 충돌 가능성이 높다라는 것을 의미한다.

이러한 옵션들을 너무 세세하게 작성해 놓으면 로봇이 조금이라도 좁은 구간은 지나가지 않으려고 하고 돌아서 가려고 할 수도 있다. 여러 개의 로봇을 하나의 맵에 가져다 놓을 수도 있다. 

 

이러한 옵션들은 try and error를 반복하면서 수정해 나갈 수 있다. 

 

 

ROS에 대한 기본적인 학습을 마치게 되었는데 이번 SLAM & Navigation에서는 각각의 실행 파일들을 자세히 들여다본 것이 아니고 큰 틀에서 SLAM과 Navigation이 어떤 순서로 동작하게 되는지 직접 실습해 보는 시간을 많이 가지게 되었다. 

 

조만간 연구하게 될 자율주행 차량을 직접 튜닝하기 위해서는 위의 과정들을 좀 더 자세히 들여다볼 필요가 있을 것 같다. 

 

반응형