newhaneul

[ROS2 Humble] ROS2 기본 명령어 본문

1. Programming/ROS

[ROS2 Humble] ROS2 기본 명령어

뉴하늘 2026. 1. 1. 22:19
728x90

본 포스팅은 '민형기 저자의 'ROS2 Humble 혼자 공부하는 로봇SW 직접 만들고 코딩하자'를 읽고 공부한 내용을 정리하기 위한 포스팅입니다.

1. Turtlesim 설치와 실행

sudo apt install ros-humble-turtlesim

 

 

 sudo apt install 명령으로 turtlesim 패키지들을 설치한다. ROS에서는 실행 가능한 최소한의 단위를 노드라고 한다. 그리고 다수의 노드와 여러 설정을 모아 둔 것을 패키지라고 부른다. 

 

 그래서 지금은 turtlesim이라는 패키지의 turtlesim_node라는 노드를 실행하고자 아래의 명령과 같이 입력한다. 이때 아래의 명령을 모두 입력할 필요는 없고 적절한 위치에서 키보드의 <TAB> 키를 누르면 나머지는 자동으로 완성된다.

ros2 run turtlesim turtlesim_node

 

2. ROS Node

 

 노드는 ROS에서 실행 가능한 최소한의 단위이다. 현재 그런 노드가 얼마나 실행되고 있는지 목록을 확인하는 방법은 아래읨 ㅕㅇ령을 사용하면 된다.

ros2 node list

 

ros2 node info /turtlesim

newhaneul@newhaneul-950QDB:~$ ros2 node info /turtlesim
/turtlesim
  Subscribers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /turtle1/cmd_vel: geometry_msgs/msg/Twist
  Publishers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /rosout: rcl_interfaces/msg/Log
    /turtle1/color_sensor: turtlesim/msg/Color
    /turtle1/pose: turtlesim/msg/Pose
  Service Servers:
    /clear: std_srvs/srv/Empty
    /kill: turtlesim/srv/Kill
    /reset: std_srvs/srv/Empty
    /spawn: turtlesim/srv/Spawn
    /turtle1/set_pen: turtlesim/srv/SetPen
    /turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
    /turtle1/teleport_relative: turtlesim/srv/TeleportRelative
    /turtlesim/describe_parameters: rcl_interfaces/srv/DescribeParameters
    /turtlesim/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
    /turtlesim/get_parameters: rcl_interfaces/srv/GetParameters
    /turtlesim/list_parameters: rcl_interfaces/srv/ListParameters
    /turtlesim/set_parameters: rcl_interfaces/srv/SetParameters
    /turtlesim/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
  Service Clients:

  Action Servers:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
  Action Clients:

 

3. ROS Service

 

3.1 Service의 개념

 ROS에서 말하는 service의 개념은 아래 그림과 같다. 

 두 노드가 데이터를 주고받는 방식 중에 클라이언트가 서버에게 요청하면 응답을 받을 수 있는 방식을 ROS에서는 서비스라고 한다. 이때 입력 혹은 출력 데이터는 있을 수도 있고 없을 수도 있다.

 

ros2 service list

 

3.2 ros2 service type

 아래와 같은 명령을 사용하면 해당 서비스가 사용하는 정의를 알 수 있다. 

ros2 service type /turtle1/teleport_absolute

 

 현재 '/turtle1/teleport_absolute 서비스는 'turtlesim/srv/TeleportAbsolute'라고 되어 있다. 먼저 turtlesim이라고 되어있는 부분은 실행한 노드의 이름이자 패키지의 이름이다. 그 안에 srv는 service를 의미하기도 하고, 해당 패키지가 위치하는 폴더에서 srv라는 폴더 이름이다. 그리고 TeleportAbsolute는 서비스의 데이터 정의이다. 

 

https://github.com/ros/ros_tutorials/tree/humble/turtlesim

 

ros_tutorials/turtlesim at humble · ros/ros_tutorials

Code used in tutorials found on ROS wiki. Contribute to ros/ros_tutorials development by creating an account on GitHub.

github.com

 

 srv  폴더에 들어가서 TeleportAbsolute.srv 파일을 확인해보면 아래와 같다.

  

 방금 관찰한 teleport_absolute라는 서비스는 TeleportAbsolute라고 정의되어 있다. 서비스의 정의는 srv 확장명을 가진 파일에 저장되고 통상 해당 패키지의 srv 폴더에 둔다. srv 파일은 대시(-) 기호를 연달아 세 번 사용하는 구분자를 기준으로 위, 아래로 나눠진다.

 

 이때 대시 세 개 구분자의 윗부분은 서비스를 요청할 때의 데이터를 선언하고, 그 아랫부분은 서비스 서버가 응답할 때의 데이터를 선언해 둔다. 

float32 x
float32 y
float32 theta
---

 

 teleport_absolute 서비스를 요청하고 싶다면 구분자 위에 표시된 대로 x, y, theta라고 이름 붙은 float32형의 데이터 세 개를 주어야 한다. 그리고 응답을 하는 response 영역은 turtlesim을 단지 옮기는 역할을 하는 teleport_absolute 서비스에서는 필요 없다고 느껴서 비어 있는 형태이다. 컴퓨터 언어의 함수로 본다면 return 값이 없는 함수로 생각하면 된다.

 

 아래의 'ros2 interface show' 명령으로 서비스 정의의 이름을 조회하면 그 내용을 알 수 있다

ros2 interface show turtlesim/srv/TeleportAbsolute

 

3.3 서비스를 호출하는 방법 service call

 아래의 명령은 실행한 서비스를 호출하는 명령이다. 

ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 2, y: 2, theta: 1.57}"

 

 만약 다시 처음으로 돌리고 싶다면 reset 서비스를 요청하면 된다. Turtlesim의 reset service는 아무것도 입력할 필요가 없고 아무것도 출력을 내지 않는다. 다만 Empty 데이터 타입에서 {}를 널문자를 주어야 한다.

ros2 service call /reset std_srvs/srv/Empty {}

 

3.4 namespace

 

 

ros2 service list

 

 아래 서비스는 바로 서비스 이름이 있는 경우이고,

/clear
/kill
/reset
/spawn

 

 아래 서비스는 슬래시 뒤에 바로 서비스 이름이 오지 않고 /turtle1이라는 것이 붙어 있다. 이것이 namespace이다.

/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative

 

namespace는 turtle 하나당 각각 적용되어야 하는 서비스의 경우 구분이 되어야 하므로 사용된다. 만약 turtlesim_node를 두 번하면 두 개의 거북이를 만들 수 있는데, 각 거북이의 구분을 위한 것이다. 

 

4. ROS Topic

 

4.1 Topic의 개념

 앞서 서비스는 요청에 대한 응답으로 되어있었다. 토픽은 발행과 구독으로 되어있는 개념이다. 

 

토픽은 서비스와 달리 요청한 것에 대해서만 응답하지 않는다. 발행하기로 결정이 난 메시지는 그저 구독만 하면 된다. 구독해야 할 메시지가 어떤 형태인지는 미리 알아야겠지만, 요청이라는 과정은 없다. 그러므로 토픽은 토픽의 이름과 데이터 (메시지)의 구조를 알고 있다면 누구나 구독할 수 있다. 

4.2 ros2 topic list

 

ros2 topic list

 

 

4.3 ros2 topic type

 

 topic list의 결과를 보면 몇몇 토픽들이 나타나 있는 것을 확인할 수 있다. 서비스와 같이 토픽도 자신이 사용하는 메시지의 타입을 정의하고 있다. 메시지의 타입은 로봇에서 많이 사용하는 다양한 형태를 이미 ROS에서 정의를 잘 해두고 있지만, 다양한 이유로 패키지들이 여러 메시지를 직접 만들어서 사용한다.

 

ros2 topic type /turtle1/pose

 

 /turtle1/pose 토픽의 데이터 타입을 알고 싶다면 topic type 명령어를 사용하면 된다. 만약 일일이 확인하는 것이 귀찮다면 topic list에는 사용할 수 있는 옵션이 있다.

ros2 topic list -t

 

4.4 ros2 topic info

 토픽은 주는 쪽 (publish)과 받는 쪽 (subscribe)이 있다. 따라서 그 부분을 구분해서 확인하기 위해 아래의 명령어를 사용한다. topic info 명령을 사용하면 어떤 메시지 타입을 사용하고 구독과 발행하는 노드의 개수를 확인할 수 있다.

ros2 topic info /turtle1/pose

 

 

4.5 토픽을 사용하기 위해 메시지 타입 확인하기

 

 turtle이 발행하는 pose 토픽을 사용하기 위해 turtlesim/msg/Pose가 어떻게 생겼는지 확인해본다. 처음 x, y, theta는 거북이의 위치와 자세를 의미한다. 또한 linear_velocity는 거북이의 직선 방향 속도이다. 또 angular_velocity는 회전 방향의 속도이다.

ros2 interface show turtlesim/msg/Pose

 

4.6 간단하게 터미널에서 토픽 구독해보기

 터미널에서 토픽을 구독할 수 있는 명령을 이용해서 /turtle1/pose 토픽을 구독해보자.

ros2 topic echo /turtle1/pose

 

 위의 그림을 보면 확인했던 메시지의 구조가 그대로 보인다. 위치와 자세 그리고 직선과 회전의 속도 성분이 모두 나타나 있다. 현재 정보를 바탕으로 x, y가 5.54일 때가 화면상 가운데쯤 되는 곳의 좌표임을 알 수 있다. 

 

4.7 주행 명령 토픽 발행해보기

 

 위의 실행 결과를 통해 '/turtle1/cmd_vel' 토픽의 geomtry_msgs_msg_Twist 메시지 타입을 확인할 수 있다. 해당 메시지를 확인하기 위해 아래 명령어를 실행시켜본다.

 

 위의 그림에서 보이는 geometry_msgs/msg/Twist 데이터는 크게 3차원 속도 벡터 두 개로 되어있는데, 공간에서 x, y, z축 방향과 x, y, z축을 중심으로 한 회전 방향의 값이다. 공간상에서 6자유도를 표현할 수 있도록 직선 방향과 그 각 방향을 중심으로 한 회전 성분으로 되어 있다. 

 

 어떤 물체가 공간상에서 직선 방향으로는 x, y, z 방향으로 운동할 수 있고, 또 x축 중심의 회전을 roll, y축 중심의 회전을 pitch, z축 중심의 회전을 yaw라고 한다. 

 

 turtlesim은 평면에 있는 로봇이어서 직선 방향으로는 x축 성분만, 회전 방향으로는 z축 중심의 회전만 의미를 갖는다. 이때 토픽을 발행하고 싶다면

ros2 topic pub --once (or rate <hz>) <topic_name> <msg_type> "<args>"

 

 위와 같이 ros2 topic pub 명령 후에 한 번만 발행 (--once)할 것인지 혹은 일정 주기(Hz)를 갖고 연속적으로 발행할 것인지를 정하고 토픽 이름과 메시지 타입을 나열하고 입력값을 결정하면 된다.

 

 예를 들어 geomerty_msgs/msg/Twist 데이터 타입의 /turtle1/cmd_vel 토픽을 x축 직선 방향으로 2의 속도로 진행하도록 하고 싶다면 아래와 같이 작성하면 된다.

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: 0.0}}"

 

위의 그림에서 보면 cmd_vel 토픽이 발행된 이후 turtle이 x축 방향으로 조금 움직이는 것을 확인할 수 있다. 이때 움직이다 멈추기 때문에 순간적으로 속도 명령이 아니라 위치명령을 준 것으로 오해할 수 있는데, 멈춘 이유는 토픽을 한 번만 발행했기 때문이다.

 

 '--once'라고 되어있는 부분을 '--rate 2' 이라고 변경한다. 의미는 2Hz의 주기로 토픽을 발행하라는 의미이다. Hz는 초당 진동수이다. 그러면 거북이는 계속 원을 그리게 된다.

ros2 topic pub --rate 2 /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}}"

 

4.8 토픽의 흐름을 보여주는 rqt_graph

rqt_graph

 동그라미는 node를 의미하고 사각형은 topic을 의미한다. '/_ros2cli_12938'은 토픽을 발행하고 있는 터미널에서 실행된 노드이다. 터미널에서 cmd_vel 토픽을 발행했고, 그것을 구독하는 노드가 turtlesim이라는 것을 알 수 있다.

 

 

5. ROS Action

 

ROS에서는 토픽과 서비스와는 또 다른 기능으로 액션이 있다. 액션을 제공하는 액션 서버를 구현하는 노드에 클라이언트 노드에서 먼저 서비스로 목표를 요청한다. 그러면 응답을 서버가 한다. 여기까지는 서비스와 같지만, 액션이 다른 것은 목표를 달성할 때까지 그 중간을 토픽으로 피드백을 해 준다는 것이다. 그래서 목표에 도달할 때까지 그 중간을 확인할 수 있다. 그리고 끝나면 결과 서비스를 사용하게 된다.

 

5.1 노드 turtle_teleop_key 실행

 한 터미널에서 아래 명령어를 실행하고,

ros2 run turtlesim turtlesim_node

 

 또 다른 터미널에서 아래 명령어를 실행한다.

ros2 run turtlesim turtle_teleop_key

 

화살표 키로 turtle을 움직일 수 있다. 

 위의 그림에서 보면 /turtle1/cmd_vel이라는 토픽이 /telop_turtle 노드에서 /turtlesim 노드로 들어가는 것을 확인할 수 있다. 이 토픽은 앞서 다루었던 토픽으로 이번에는 실행한 telop_turtle 노드가 발행하고 있는 것이다. 

 

 나머지 토픽은 액션 때문에 발생한 것이다. 그리고 표시된 feedback과 status 토픽이 액션서버 (/turtlesim)에서 클라이언트 (/telop_turtle)로 전달되는 것을 확인할 수 있다.

 

5.2 ros2 action list

 이제 또 다른 터미널에서 아래 명령을 수행하면 '/turtle1/rotate_absolute' 결과를 얻을 수 있다. 

ros2 action list

 

 이 상태에서 '/turtle1/rotate_absolute'의 데이터 타입을 알려면 info 옵션을 사용하면 되지만 한 번에 처리하는 명령어를 사용하면 아래와 같다.

ros2 action list -t

  실행 결과를 보면 '/turtle1/rotate_absolute' 액션을 사용하기 위해서는 'turtlesim/action/RotateAbsolute' 데이터 타입을 알아야 한다.

 

 따라서 아래 명령어를 통해 데이터 타입의 정의를 확인해본다.

ros2 interface show turtlesim/action/RotateAbsolute

 실행 결과를 보면 대시 기호 세 개로 된 구분자가 두 번 나와서 총 세 개의 데이터가 보인다. 셋 다 float32 데이터로 각각 theta, delta, remaining이다.

 

 #으로 된 주석을 해석해보면 theta가 최종 묙표이고 delta는 첫 출발 위치에서의 각도 차이를 보여준다. 아마도 액션에서 이야기한 결과 (result)이다. 그리고 remaining은 남은 각도를 보여주므로 feedback에 해당된다.

 

5.3 ros2 action send_goal

 액션은 목표를 지정하는 방법인 send_goal을 지정하면 된다. 그 방법은 액션의 이름, 액션에서 사용하는 데이터 타입, 그리고 설정값을 아래와 같이 지정하면 된다.

ros2 action send_goal <action_name> <action_type> <values>

 

 이렇게 지정하면 된다. 현재 상황에서는 아래처럼 입력가능하다.

 

ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 3.14}"

 

 이 명령은 'turtlesim/action/RotateAbsolute'라는 데이터 타입을 가진 '/turtle1/rotate_absolute'라는 액션에 theta를 3.14를 인가한 것으로 turtle이 처음 오른쪽을 보고 있다가 반 바퀴를 돌아서 왼쪽으로 보고 있게 된다.

 여기서 터미널 결과를 주목해보면, send_goal로 지정한 theta 값인 3.14를 Sending goal이라는 항목에서 확인할 수 있다. 그리고 Result 항목에서 -3.13을 확인할 수 있다. 그리고 최종 상태 status가 SUCCEEDED라는 것도 확인할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90