ROS(1) : ROS2의 노드, 토픽, 서비스, 액션

장성원·2025년 1월 7일

ROS1/2

목록 보기
1/4
post-thumbnail

ROS2

터미널과 bashrc

shell : PC 실행 이후 커널과 사용자 사이를 연결해주는 프로그램
(커널 : OS의 핵심 요소, HW와 SW 간의 상호 작용 관리 & 조정)

Ubuntu의 기본 shell은 bash shell이다.

‘sudo apt install’로 설치한 패키지들은 /opt/ros/humble 경로에 있는 setup.bash 파일을 읽어오면 되는데, bash 파일은 source 명령어로 읽으면 터미널에 환경이 세팅된다.

-> 따라서 source /opt/ros/humble/setup.bash 라는 명령어를 실행해야 ‘sudo apt install’ 명령어로 실행한 ROS 관련 명령 / 패키지를 실행할 수 있다.

  1. source /opt/ros/humble/setup.bash 명령어를 다 치기에는 피곤해서 humble이라는 이름의 alias로 만들었다.

ROS2 기본 명령 익히기

ROS turtlesim의 실행 -> turtlesim도 하나의 노드이다.
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

Node : ROS에서 실행 가능한 최소 단위의 실행 가능한 프로세스, 즉 하나의 실행 가능한 프로그램

EX) 원본 영상을 출력하는 카메라 드라이버, 원본 영상에 필터링 하는 필터 노드, 필터링 된 영상에서 특징점을 추출하는 노드, 특징점을 이용해 물건을 검출하는 노드

Node 관련 명령어
ros2 node list : 사용 가능한 node의 목록을 보여준다.
ros2 node info /turtlesim : turtlesim이라는 노드의 정보를 알려준다.
rqt_graph : rqt_graph의 실행

메시지 : 노드와 노드 사이에 주고 받는 데이터이며, 주고받는 방식을 메시지 통신이라고 한다. 메시지는 integer, floating point, boolean, string.. 등등과 같은 변수 형태이다.

ROS 통신

  1. ROS Service

  • 클라이언트가 서버에게 요청하면 응답을 받는 방식으로, 동기식 양방향 메시지 송수신 방식이다.

서비스의 요청을 하는 쪽 : service client
서비스의 응답을 하는 쪽 : service server

서비스는 동일 서비스에 대해 복수의 클라이언트를 가질 수 있도록 설계되었다. 단, 서비스 응답은 서비스 요청이 있었던 서비스 클라이언트에 대해서만 응답을 하는 형태로 구성된다.

서비스 관련 명령어

ros2 service list -t : 현재 실행 중인 노드들의 서비스 목록의 확인 가능 (+ -t 옵션을 붙이면 서비스의 타입도 확인 가능)
ros2 service type /turtle1/teleport_absolute : 해당하는 서비스의 타입을 알고 싶을 때 사용한다.

EX) ros2 service type /turtle1/teleport_absolute
-> turtlesim/srv/teleport_absolute

turtlesim : 노드 / 패키지의 이름
srv : service 인터페이스를 사용한다.
teleport_absolute : 서비스의 데이터 정의
ros2 interface show turtlesim/srv/TeleportAbsolute : 해당 서비스의 내용을 알 수 있다.

float32 x
float32 y
float32 theta
string name
---
string name

대시 세 개 구분자의 윗부분은 ‘서비스 요청(Request)’에 해당하고, 아랫 부분은 ‘서비스 응답(Response)’에 해당한다.

ros2 service call <service_name> <service_type> “arguments” : 해당 서비스를 호출한다.

EX) ros2 service call /clear std_srvs/srv/Empty
EX) ros2 service call /kill turtlesim/srv/kill “name : ‘turtle1’”
EX) ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 2, y: 2, theta: 1.57}"

ROS는 각도와 관련된 단위계로 라디안 단위를 사용한다.
rad = degreeπ180
EX) 90° = π/2 = 1.57

namespace
/turtle1... 등등이 namespace 이다. turtle 하나 당 적용되어야 하는 서비스가 구분이 되어야 하기 때문이다.

  1. ROS Topic

  • 단방향 메시지 송수신 방식으로, 메시지를 발행하는 ‘Publisher’과 메시지를 구독하는 ‘Subscriber’간의 통신이다.
  • 1:1, 1:N, N:1, N:N 모두 가능하다. 심지어 자신이 발행한 토픽을 셀프 구독할 수 있도록 구성할 수도 있다.
  • ‘Publisher’ 기능과 ‘Subscriber’ 역할을 동시에 수행할 수도 있다.
    ROS 프로그래밍 시 70% 이상이 토픽으로 사용될 정도로 가장 기본이 되는 통신 방식이다.
    비동기성 + 연속성을 가지며 센서 값 전송 및 항시 정보를 주고 받아야 하는 부분에 사용된다.

[EX]

$ ros2 node info /turtlesim
/turtlesim
Subscribers:
/turtle1/cmd_vel: geometry_msgs/msg/Twist
(생략)
Publishers:
/turtle1/color_sensor: turtlesim/msg/Color
/turtle1/pose: turtlesim/msg/Pose
(생략)
Services:
/clear: std_srvs/srv/Empty
/kill: turtlesim/srv/Kill
(생략)

  • turtlesim 노드는 geometry_msgs/msg/Twist 형태의 메시지인 cmd_vel을 구독하고 있다.
  • turtlesim/msg/Color 형태의 메시지인 /turtle1/color_sensor과 turtlesim/msg/Pose 형태의 메시지인 /turtle1/pose 메시지를 발행하고 있다.

  • /teleop_turtle 노드에서 발행하는 /turtle1/cmd_vel 메시지를 /turtlesim 노드가 구독하고 있다.

토픽 관련 명령어

ros2 topic list –t : 사용 가능한 토픽의 종류를 보여준다. (-t 옵션을 붙이면 토픽의 타입도 확인 가능)
ros2 topic type : 해당하는 토픽의 타입을 알 수 있다.
ros2 topic info /turtle1/pose : /turtle1/pose라는 메시지를 사용하고 구독과 발행하는 노드의 개수를 확인할 수 있다.
ros2 interface show turtlesim/msg/Pose : 해당 토픽의 내용을 알 수 있다.
ros2 topic pub --once <topic_name> <msg_type> “args” : 해당하는 토픽을 한 번만 발행 (혹은 일정 주기를 가지고 연속적으로 발행) 할지를 정하고 발행한다;

EX) ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}“

: 해당 토픽을 한 번만 발행한다.

EX) ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

: 1Hz의 주기로 해당 토픽을 발행한다

ROS 인터페이스

  • ROS의 노드 간에 데이터를 주고 받는 통신 방식인 토픽, 서비스, 액션에서 사용되는 데이터의 구조와 형식을 정의한 것이다. 토픽, 서비스, 액션은 각각 msg, srv, action interface를 사용하며, 정수, 부동 소수점, 불리언과 같은 단순 자료형을 기본으로 한다.
  • 즉, 토픽/서비스/액션은 데이터를 주고받는 채널이고, 메세지 타입은 그 채널을 통해 주고받는 데이터의 형식이다.

메시지 인터페이스(message interface, msg)

[EX]
ros2 topic type /turtle1/cmd_vel -> geometry_msgs/msgs/Twist의 형태인데, 이는 geometry_msgs 패키지의 msgs 분류의 Twist 데이터 형태를 의미한다.

Twist 데이터 형태는 Vector3 linear, Vector3 angular 이라고 되어 있는데, 이는 메시지 안에 메시지를 품고 있는 것을 의미한다. Vector3 형태에 linear 이라는 이름의 메시지와 Vector3 형태에 angular 이라는 이름의 메시지, 즉 2개의 메시지가 있다는 것이며 Vector3는 다시 float64 형태에 x, y, z 값이 존재한다.

$ ros2 interface show geometry_msgs/msg/Twist
Vector3 linear
Vector3 angular

$ ros2 interface show geometry_msgs/msg/Vector3
float64 x
float64 y
float64 z

3. ROS Action

  • 클라이언트 노드에서 먼저 서버 노드로 목표를 요청하면, 서버 노드가 응답을 한다. 이때 목표를 달성할 때 까지 그 중간을 토픽으로 피드백 해준다.
  • 비동기식 + 동기식 양방향 메시지 송수신 방식이다.

참고 : 동기식 통신 & 비동기식 통신
동기식 통신 : Request를 보내면 그 자리에서 바로 Response를 받는 통신
비동기식 통신 : Request를 보내더라도 언제 받아도 상관이 없는 통신

- ROS1 에서 액션은 목표, 피드백, 결과 값을 토픽으로만 주고 받는 반면, ROS2에서는 토픽과 서비스 방식을 혼합하여 사용한다.
ROS2에서는 목표 전달, 목표 취소, 결과 받기라는 동기식 서비스를 사용한다.

액션 관련 명령어

ros2 action list –t : 사용 가능한 액션의 종류를 보여준다. (-t 옵션을 붙이면 액션의 타입도 확인 가능)
ros2 interface show turtlesim/action/RotateAbsolute : 해당 액션의 내용을 알 수 있다.
ros2 action send_goal <action_name> <action_type> ”values“ : 해당 액션의 목표를 전달한다.
[EX] ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.5708}“

ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.5708}" --feedback
: --feedback 옵션을 붙이면 피드백을 계속 표시해준다.


참고 서적 : ROS2 혼자 공부하는 로봇 SW

참고 자료 : 오로카 https://cafe.naver.com/openrt?iframe_url=/MyCafeIntro.nhn%3Fclubid=25572101

profile
Automated Vehicle & AGV / AMR (Robotics)에 관심을 두고 공부하는 학생입니다.

0개의 댓글