본문 바로가기

FOSCAR-(Autonomous Driving)/ROS 스터디

[2023 ROS 스터디] 이은선 #2주차 - ROS 기초 다지기

반응형

ROS 용어 정리

Node 

최소 단위의 실행 가능한 프로세서를 가리키는 용어로써 하나의 실행 가능한 프로그램으로 생각하면 된다. ROS에서는 최소한의 실행단위로 프로그램을 나누어 작업하게 된다. 각 노드는 메시지 통신으로 데이터를 주고 받는다. Node 별로 프로그램을 짜면 각각의 기능별로 유닛 테스트를 행할 수 있고, 내가 짜고자 하는 로직에 집중할 수 있다는 장점이 있다.

 

Package

하나 이상의 노드, 노드 실행을 위한 정보 등을 묶어 놓은 것. 또한, 패키지의 묶음을 메타 패키지라 하여 따로 분리한다.

 

Message

메시지를 통해 노드 간의 데이터를 주고받게 된다. 메시지는 integer, floating point, boolean와 같은 변수 형태이다. 또한, 메시지 안에 메시지를 품고 있는 간단한 데이터 구조 및 메시지들의 배열과 같은 구조도 사용할 수 있다.

Message 통신 방식

목적에 따라 Topic, Service, Action 등의 통신 방법을 사용하는데, 대부분 ROS에선 90% 이상 Topic의 방식을 많이 사용한다.

 

1) Topic

ROS에서 쓰고 있는 단방향 통신 방법으로 연속성을 가진다. Topic은 센서 데이터 등 일방적으로 데이터를 보내야 하는 상황에 많이 사용한다. 메시지를 보내는 사람을 Publisher, 메시지를 받는 사람을 Subscriber라고 한다.

 

2) Service

양방향 통신 방법으로 일회성의 특징을 띤다.

ex) 로봇에게 x좌표 30도, y좌표 45도로 이동하라고 요청을 보내면, 서비스 서버는 그것에 맞춰 로봇을 동작시키거나 관련된 프로세서를 처리하게 된다. 그 후, 서비스를 처리하고 나선 처리 상태를 클라이언트 딴에 알려주게 된다.

 

 

3) Action

Service와 비슷하나, 중간 단계에서 피드백이 추가됐다는 점에서 차이가 있다. 보통 복잡한 테스크나 중간 단계의 결과값이 필요할 때 사용된다.

 

Message 통신 개념

 

1) 마스터 구동

XMLRPC(XML-Remote Procedure Call) -> XML 기반의 아주 간단한 서버-클라이언트 시스템 

$ roscore

노드 정보들을 관리한다. 실행되는 노드들의 정보들을 관리해서 노드들의 통신을 연결시켜주는 매개체 역할을 한다.

 

2) 서브스크라이버 노드(Node) 구동

$rosrun 패키지이름 노드이름

subscriber node가 실행되자마자 노드 정보(노드 이름, 토픽 이름, 메시지 형태, ip 번호, 포트 번호)를 마스터에게 전달해준다. (마스터가 노드 정보 관리하기 때문)

 

3) 퍼블리셔 노드(Node) 구동

$rosrun 패키지이름 노드이름

publisher node가 실행되자마자 노드 정보(노드 이름, 토픽 이름, 메시지 형태, ip 번호, 포트 번호)를 마스터에게 전달해준다. (마스터가 노드 정보 관리하기 때문)

 

4) 퍼블리셔 정보 알림

마스터는 서브스크라이버 노드에게 새로운 퍼블리셔 정보를 알린다.

 

5) 퍼블리셔 노드에 접속 요청

마스터로부터 받은 퍼브리셔 정보를 이용하여 TCPROS 접속을 요청(이제 마스터는 필요 X) 

 

6) 서브스크라이버 노드에 접속 응답

접속 응답에 해당되는 자신의 TCP URI 주소와 포트번호를 전송

 

7) TCP 접속

TCPROS를 이용하여 퍼블리셔 노드와 직접 연결한다.

 

8) 메시지 전송

발행자 노드느 서브스크라이버 노드에게 메시지를 전송(토픽)

 

9) 서비스 요청 및 응답

1회에 한해 접속, 서비스 요청 및 서비스 응답이 수행되고 서로간의 접속을 끊는다.

 

Message 통신 예제

←→↑↓의 키보드 입력이 메시지 형태로 전달되어 해당 방향으로 거북이를 움직이는 예제

roscore
rosrun turtlesim turtlesim_node // turtlesim이란 패키지 안에 turtlesim_node라는 노드 하나를 실행시켜라.
rusrun turtlesim turtle_teleop_key
rosrun rqt_graph rqt_graph

 

추가 용어 정리

Name

노드, 메시지(토픽, 서비스, 액션, 파라미터) 가지는 고유의 식별자로, ROS는 그래프라는 추상 데이터 형태를 지원

▪︎ 글로벌(global) : 문자 없이 네임을 바로 쓰거나 네임 앞에 슬래쉬(/)를 붙임.

▪︎ 프리베이트(private): 네임 앞에 틸트(~)를 붙임.

 

좌표변환(TF, transform)

각 조인트(joint)들의 상대 좌표 변환.

트리 형태로 조인트들간의 관계도를 표시함

 

RViz

▪︎ ROS의 3D 시각화툴

로서 센서 데이터, 레이저 거리 센서(LDS) 센서의 거리 떼이터, RealSense, Kinect, Xtion 등의 Depth Camera의 포인트 클라우드 데이터, 카메라의 영상 데이터, IMU 센서의 관성 데이터 등의 시각화를 가능하게 함.

▪︎ 로봇 외형의 표시와 계획된 동작을 표현

URDF -> 드론, 휴머노이드 로봇이든 URDF 형태로만 기술해놓으면 RViz에서 시각화 가능

▪︎ navigation

▪︎ manipulation

▪︎ 원격 제어

 

RViz 설치

sudo apt-get install ros-kinetic-rviz

 

RViz 실행

rosrun rviz rviz
rviz

 

RQT

▪︎ 플러그인 방식의 ROS의 종합 GUI 툴

▪︎  ROS Fuerte 버전부터는 rqt라는 이름으로 기존의 rxbag, rxplot, rxgraph 등이 통폐합되어 rqt_bag, rqt_plot, rqt_graph 등을 프러그인으로 하는 ROS의 종합 GUI 툴로써 사용 가능해졌다.

▪︎  rqt는 Qt로 개발되어 있기 때문에 유저들이 자유롭게 플러그인을 개발하여 추가할 수도 있다. 

 

RQT 설치

sudo apt-get install ros-kinetic-rqt ros-kinetic-rqt-common-plugins

 

RQT 실행

rqt

 

RQT 실습  #1 : rqt_image_view

rqt_image_view

rostopic list

다음 명령어를 치면, 현재 전송되거나 등록된 토픽을 확인할 수 있다.

 

RQT 실습  #2 : rqt_graph

rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
rosrun uvc_camera uvc_camera_node
rosrun image_view image_view image:=image_raw
rqt_graph

현재 노드 네트워크 상에 구동하고 있는 노드 및 노드와 노드 사이에 주고받는 메시지를 확인할 수 있다.

 

RQT 실습  #3 : rqt_plot

rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
rqt_plot /turtle1/pose/

 

RQT 실습  #4: rqt_bag

rosrun uvc_camera uvc_camera_node
rosbag record /image_raw
rqt_bag

 

Gazebo

▪︎  Gazebo는 로봇 개발에 필요한 3차원 시뮬레이션을 위한 로봇, 센서, 환경 모델 등을 지원하고 물리 엔진을 탑재하여 실제와 근사한 결과를 얻을 수 있는 3차원 시뮬레이터

▪︎ 미국 DARPA Robotics Challenge의 공식 시뮬레이터

▪︎  ROS와의 호환성이 매우 좋다.

반응형