.. Cover Letter

공부#Robotics#자율주행/(ROS2) 기초

(ROS2 기초)4. ROS에서 사용하는 도구

BrainKimDu 2023. 5. 8. 21:05

참고도서 1. ROS 2로 시작하는 로봇 프로그래밍. 표윤석 .  루비페이퍼 . 2021 
참고도서 2. ROS2 혼자공부하는 로봇SW 직접 만들고 코딩하자 . 민형기 .  잇플 . 2022
참고자료 1. PinkWink(민형기)님의 ROS2 강의자료
참고자료 2. ROS2 humble documeation

ROS2를 복습하는 김에 제대로 다시 한 번 정리하고 넘어가고 싶어서 이 시리즈를 작성합니다. 
이 글은 Turtlebot3 패키지를 제대로 이해하고, 다양한 센서를 부착하면서 활용하는 것을 목표로 합니다.
또한 글이 끝날 때 ROS와 관련된 문제를 하나 만들어서 직접 풀어보도록 합니다.

이번 장에서도 코드 레벨에서 확인하는 것이 아니라, ROS2에서 교육용으로 제공하는 패키지인 Turtlesim을 가지고 노는 것을 목표로 합니다. 


ROS2의 도구

ROS에서 함께 사용하면 좋을 프로그램이라고 생각하면 됩니다. 

 

RQt

RQt는 이전 시간에 확인해본적이 있습니다. RQt는 플러그인 형태로 다양한 도구와 인터페이스를 구현할 수 있는 그래픽 사용자 인터페이스 프레임워크입니다. RQt를 통해서 여러가지 토픽을 발행하거나, 데이터가 어떻게 변화하는지 등을 확인할 수 있습니다. 

다음은 Turtlesim을 이용해서 RQt를 확인하는 과정을 살펴봅시다.

다음처럼 실행할 수 있습니다.  만약 노드간의 연결관계를 확인하고 싶다면 다음처럼 실행합니다.

A 터미널
ros2 run turtlesim turtlesim_node
B 터미널
rqt_graph

다음처럼 각 토픽간의 관계를 확인할 수 있습니다. 위에서 보면 체크박스에 체크가 안되어 있는 것을 확인할 수 있는데, check를 하면 보여지는 것을 줄일 수 있습니다.

그래서 정말 간단하게 표현한 모습은 이렇습니다. cmd_vel을 발행하고, turtlesim은 이를 구독하고 있는 형태입니다. 그러면 teleop (Action)을 시작해서 어떻게 변화하는지 확인해봅시다.

os2 run turtlesim turtle_teleop_key

다음처럼 액션 (노드)가 실행되면서 rqt_graph가 다음처럼 변화합니다. 이를 통해서 확인할 수 있는건, 우리가 ROS2를 코드상에서 직접 구현하고 있다고 생각을 해봅시다. 

노드와 노드를 Topic이 되었든, Action이 되었든, Service가 되었든 서로 ROS로 연결을 시켰습니다.  내가 cmd_vel (comend velocity)를 이용해서 움직이라고 명령을 내렸는데, 움직이지 않는 경우가 있을 수 있습니다. 그럴때 위처럼 rqt_graph를 확인해서 노드간 연결이 잘 되었는지 확인할 수 있습니다.

또한 message를 직접 발행할 수 있습니다. 모든 명령어를 종료하고 turtlesim_node와 rqt만 실행해서 토픽을 직접 발행해봅시다.

Plugins -> Topics -> Message Publisher 로 들어갑니다.

 

다음처럼 토픽을 선택하고 +를 눌러서 추가를 합니다. 그리고 다음처럼 값을 수정하고 왼쪽의 체크박스를 체크하면

turtlesim이 cmd_vel topic을 정상적으로 구독하고 움직이기 시작합니다.  다음처럼하면 원을 그리면서 움직입니다.

다음은 Service를 한 번 요청해봅시다.

Plugins -> Servics -> Service Caller

다음음처럼 수정하고 call버튼을 눌러봅시다.

turtlesim화면 왼쪽 밑에 거북이가 나타난 것을 볼 수 있다. 이 친구의 이름은 TurtleKim입니다.

이번에는 파라미터를 변경해보겠습니다.

Plugins -> Configuration -> Dynamic Reconfigure

다음처럼 파라미터를 변경하면 배경색이 바뀌는 것을 확인할 수 있습니다.

추가적으로 토픽 내부의 값들이 어떻게 변화하는지 확인할 수 있습니다.

Plugins -> Visualization -> Plot

Plot의 값을 변경해봅시다. 그러면 보시는 것처럼 파란색 줄이 움직이는 것을 확인할 수 있습니다. (안된다면 다시 껐다가 켜도록 합니다.

 

로그

ROS로 코딩을 할 때 Python유저라면 print("토픽을 받았습니다.) 형태로 작성을 하고나서 코드상에서 토픽을 받았는지 확인해도 됩니다. ROS에서는 이러한 방법보다도, 로그를 남기는 방식을 선호한다고 합니다.

일단 코드상으로 로그를 남기는 것이 아니라, Turtlesim에서 간단하게 로그를 확인하는 방법은 다음과 같습니다.

다음처럼 거북이가 벽을 치게 되면 터미널에는 벽을 쳤다고 표시가 됩니다. 이와 동시에 log를 남기게 됩니다.

plugins ->  Logging -> Console

다음처럼 log를 남긴 것을 확인해볼 수 있습니다. 이에 대한 코드적인 접근은 나중에 다시 한 번 다루도록 하겠습니다.

 

ros2 bag

로봇을 개발하다보면 정확한 상황을 여러번 검증해야하는 경우가 생깁니다. 이 때 사용하는 것을 ros2 bag라고 합니다. 이 부분은 이해를 위한 부분이기 때문에 한 가지 예시를 들고 오도록 하겠습니다.

자율주행 자동차는 ROS 기반으로 만들어진 Autoware라는 프로그램을 사용합니다. 다음은 rosbag를 사용해서 미리 정해진 순서대로 움직이는 과정을 보여주는 모습입니다.

다음의 과정을 진행할 때 사용하는 코드가 다음과 같습니다. 

안돌아갑니다. 터미널에 안쳐도 됩니다.
ros2 bag play ~/autoware_map/sample-rosbag/sample.db3 -r 0.2 -s sqlite3

다음처럼 ros2 bag를 play해라 라는 명령을 내립니다. 그 play할 데이터는 옆에 있는 파일을 의미합니다.

 

 

자 여기까지는 CMD를 통해서 ROS를 다루는 연습을 했습니다. 이 다음부터는 이제 본격적으로 ROS를 코드상으로 접근하도록 하겠습니다.

ROS를 코드 상에서 접근하는 방법은 두 가지 입니다. 첫 번째는 파이썬, 두 번째는 C++ 제 ROS 기초 시리즈는 둘 다 활용하는 방법으로 진행됩니다.