TIKI-MINI로 시작하는 ROS2 실무
목차

1. 이론

1.2노드와 ros2 CLI

노드란?

노드(Node)는 ROS2 시스템의 가장 작은 실행 단위입니다. 한 가지 일을 맡은 프로그램이라고 생각하면 됩니다.

  • 보통 노드 하나는 프로세스 하나로 실행됩니다. 터미널 하나에서 ros2 run으로 노드 하나를 띄우는 것이 기본 그림입니다. (한 프로세스에 여러 노드를 넣는 방식도 있지만 지금은 몰라도 됩니다.)
  • 노드마다 이름이 있습니다. 이름은 /turtlesim처럼 슬래시로 시작합니다. 이후 모든 ros2 node 명령은 이 이름으로 노드를 가리킵니다.
  • 노드는 토픽·서비스·액션·파라미터를 통해 다른 노드와 통신합니다. 카메라 노드, 모터 제어 노드, 경로 계획 노드처럼 역할별로 나누어 두면 일부만 교체하거나 재사용하기 쉽습니다.
  • 같은 노드를 여러 개 실행할 수도 있습니다. 단, 이름이 겹치면 혼란스러우므로 실행할 때 이름을 바꿔 줍니다(아래 리매핑 참고).

이 장에서는 노드를 직접 만들지 않고 이미 실행 중인 노드들을 CLI로 들여다보는 법을 익힙니다. 노드를 코드로 작성하는 방법은 다음 장들과 Part 2의 실습에서 다룹니다.

노드 실행하기: ros2 run

노드는 패키지 안에 들어 있는 실행 파일입니다. 아래 형식으로 실행합니다.

ros2 run <패키지> <실행파일>

# 예: turtlesim 패키지의 turtlesim_node 실행 (거북이 창이 열립니다)
ros2 run turtlesim turtlesim_node

노드가 켜진 채로 있어야 하므로 터미널 하나가 노드 하나에 묶입니다. 다른 노드를 더 띄우려면 터미널을 새로 열어서 실행합니다. 예를 들어 키보드로 거북이를 조종하는 노드는 두 번째 터미널에서 이렇게 실행합니다.

ros2 run turtlesim turtle_teleop_key

이렇게 두 노드가 켜져 있으면 이 장의 가상 시스템과 같은 상태가 됩니다. 여기서부터는 "이미 이런 시스템이 돌고 있다"고 가정하고 조사해 봅니다.

가상 시스템 한눈에 보기

실습에 쓸 가상 시스템은 turtlesim 예제입니다. 노드 두 개가 토픽으로 연결되어 있습니다.

/teleop_turtle/turtlesim/turtle1/cmd_vel/turtle1/pose/turtle1/color_sensor

둥근 상자 = 노드 · 사각형 = 토픽 · 화살표 = 데이터 방향

키보드 입력을 받은 /teleop_turtle이 /turtle1/cmd_vel로 속도 명령을 보내고 /turtlesim이 그 명령대로 거북이를 움직이면서 자기 위치(pose)와 바닥 색(color_sensor)을 내보냅니다. (그림에는 모든 노드가 공통으로 쓰는 /parameter_events, /rosout 토픽은 생략했습니다.)

시스템 조사 순서

처음 보는 ROS2 시스템을 만났다고 해 봅시다. 코드를 읽지 않아도 CLI만으로 구조가 드러납니다. 다음 순서를 기억해 두세요.

  1. ros2 node list: 어떤 노드가 떠 있나?
  2. ros2 node info <노드>: 그 노드는 무엇을 발행·구독하나?
  3. ros2 topic list -t: 어떤 토픽이 있고 타입은 무엇인가?
  4. ros2 topic info <토픽>: 발행자와 구독자는 몇 개인가?
  5. ros2 topic echo <토픽>: 실제로 어떤 값이 흐르고 있나?
  6. 필요하면 ros2 interface show <타입>으로 메시지 필드를, ros2 topic hz <토픽>으로 발행 주기를 확인합니다.

이 순서는 "넓게 보고 → 좁혀 가며 → 실제 값을 확인"하는 디버깅 습관입니다. 로봇이 안 움직일 때도 똑같이 합니다. 속도 토픽에 값이 들어오는지(echo), 받는 노드가 있는지(info)를 차례로 확인하면 대부분 원인이 좁혀집니다.

ros2 명령 한눈에 보기

ros2 명령은 ros2 <동사> <하위명령> 형태입니다. 동사가 무엇을 조사할지 정합니다.

명령무엇을 조사하나대표 하위 명령
ros2 run패키지의 실행 파일(노드)을 시작(실행 명령)
ros2 node실행 중인 노드list, info
ros2 topic토픽(통로)과 흐르는 메시지list, info, echo, hz, pub
ros2 service요청-응답 서비스list, type, call
ros2 param노드의 설정값(파라미터)list, get, set
ros2 interface메시지·서비스 타입의 정의list, show
ros2 pkg설치된 패키지list, executables

서비스와 파라미터는 뒤의 장에서 자세히 다룹니다. 지금은 이름과 타입을 조회하는 명령이 비슷한 모양으로 갖춰져 있다는 정도만 알아 두세요.

해보기 1: 터미널 둘러보기

아래 터미널에는 위 turtlesim 시스템이 가상으로 돌고 있습니다. 위쪽 버튼을 눌러 명령을 실행하거나, 직접 입력해 보세요. 위/아래 화살표 키로는 이전 명령을 다시 불러오고 help를 입력하면 지원하는 명령 목록이 나옵니다.

turtlesim 시스템이것은 시뮬레이션된 터미널입니다

이 명령을 눌러 실행

# 이것은 시뮬레이션된 터미널입니다. 아래 예시 명령을 눌러 보거나 직접 입력해 보세요. 'help'를 입력하면 지원 명령이 나옵니다.
user@ubuntu:~$

Enter 실행 · 위/아래 화살표 이전 명령 · Ctrl+L 또는 clear 화면 지우기 · help 지원 명령 보기

출력에서는 다음을 확인합니다.

  • ros2 node info /turtlesim의 Subscribers에는 /turtle1/cmd_vel이 있고, Publishers에는 /turtle1/pose가 있습니다. 노드 그림의 화살표와 같은 정보입니다.
  • ros2 topic list -t는 이름 옆 대괄호에 메시지 타입을 보여 줍니다.
  • ros2 topic echo는 메시지를 YAML 형태로 출력하고, 메시지 사이를 ---로 구분합니다.

미션: 직접 찾아보기

터미널에서 아래 미션을 하나씩 풀어 보세요. 막히면 확인 문제의 정답 풀이를 열어 봅니다.

미션 1. 거북이의 움직임을 제어하는 토픽은 무엇이고, 메시지 타입은 무엇인가요?

ros2 topic list -t를 실행하면 /turtle1/cmd_vel [geometry_msgs/msg/Twist]가 보입니다. 이름에 cmd_vel(command velocity)이 들어 있고 Twist는 속도를 표현하는 타입이므로, 이 토픽이 속도 명령용입니다. 확신이 서지 않으면 ros2 node info /turtlesim에서 /turtlesim이 구독(Subscribers)하는 토픽을 보면 됩니다.

미션 2. /turtle1/cmd_vel 토픽에 값을 보내는 노드와 받는 노드는 각각 무엇인가요?

ros2 topic info /turtle1/cmd_vel은 개수(Publisher count, Subscription count)만 알려 줍니다. 이름을 알려면 ros2 node info를 노드마다 실행해서 확인합니다. /teleop_turtle의 Publishers에 /turtle1/cmd_vel이 있으므로 보내는 쪽이고, /turtlesim의 Subscribers에 있으므로 받는 쪽입니다.

미션 3. Twist 메시지에서 거북이가 앞으로 가는 속도와 회전하는 속도는 어느 필드에 담기나요?

ros2 interface show geometry_msgs/msg/Twist로 정의를 보면 linear와 angular가 각각 x, y, z를 가진 Vector3입니다. 평면 위의 거북이는 앞뒤 속도로 linear.x, 회전 속도로 angular.z만 사용합니다. ros2 topic echo /turtle1/cmd_vel에서 값이 실제로 이 두 필드에 들어오는 것도 확인해 보세요.

해보기 2: 다른 시스템 조사하기

이번에는 낯선 시스템입니다. 노드 둘이 있다는 것 외에는 알려 주지 않을 테니, 위의 조사 순서만 사용해서 누가 누구에게 무엇을 보내는지 알아내 보세요. 가이드는 없습니다.

talker / listener 시스템이것은 시뮬레이션된 터미널입니다

이 명령을 눌러 실행

# 이것은 시뮬레이션된 터미널입니다. 아래 예시 명령을 눌러 보거나 직접 입력해 보세요. 'help'를 입력하면 지원 명령이 나옵니다.
user@ubuntu:~$

Enter 실행 · 위/아래 화살표 이전 명령 · Ctrl+L 또는 clear 화면 지우기 · help 지원 명령 보기

정답 확인: 이 시스템의 구조는?

ros2 node list로 /talker와 /listener를 확인하고 ros2 node info로 보면 /talker가 /chatter를 발행하고 /listener가 구독합니다. 타입은 std_msgs/msg/String이며 ros2 topic echo /chatter에서 data 필드에 문자열이 들어 있습니다. 다음 1.3장에서 직접 만들어 볼 구조와 같습니다.

이름 바꾸기: 리매핑 기초

같은 노드를 두 번 실행하거나, 노드가 쓰는 토픽 이름을 다른 시스템에 맞추고 싶을 때가 있습니다. 리매핑(remapping)은 코드를 수정하지 않고 실행할 때 이름을 바꾸는 기능입니다. --ros-args 뒤에 -r 원래이름:=새이름을 붙입니다.

# 노드 이름 바꾸기: /turtlesim 대신 /my_turtle 로 실행
ros2 run turtlesim turtlesim_node --ros-args -r __node:=my_turtle

# 토픽 이름 바꾸기: 속도 명령을 /turtle1/cmd_vel 대신 /turtle2/cmd_vel 로 구독/발행
ros2 run turtlesim turtle_teleop_key --ros-args -r turtle1/cmd_vel:=turtle2/cmd_vel

노드 이름을 바꾼 뒤에는 ros2 node list에 /my_turtle이 나타나고, 이후 조사도 이 이름으로 합니다. 토픽 이름을 서로 맞추는 방식은 같은 노드를 다른 로봇에 연결할 때 자주 쓰입니다. 예를 들어 우리 로봇(TIKI-MINI)의 속도 토픽 이름이 노드가 기대하는 이름과 다르면 코드를 고치는 대신 리매핑으로 맞춥니다. 실제로 어떤 토픽 이름을 쓰는지는 로봇 장에서 ros2 topic list로 확인합니다.

실제 환경에서는

Part 2에서 VM에 ROS2 Humble을 설치하면 이 장의 명령을 진짜 turtlesim에서 그대로 실행합니다. 터미널 두 개를 열고 각각 turtlesim_node와 turtle_teleop_key를 실행한 뒤, 세 번째 터미널에서 이 장의 조사 명령을 입력합니다.

ros2 node list
ros2 node info /turtlesim
ros2 topic list -t
ros2 topic echo /turtle1/pose

실제 출력은 여기서 본 것과 형태는 같지만 숫자가 계속 바뀌고 echo는 Ctrl+C로 멈출 때까지 이어집니다.

한눈에 정리

  1. 노드는 한 가지 일을 하는 실행 단위이며 보통 프로세스 하나에 하나씩 ros2 run으로 실행합니다.
  2. 처음 보는 시스템은 node list → node info → topic list -t → topic info → topic echo 순서로 조사합니다.
  3. ros2 <동사> <하위명령>에서 동사(node, topic, service, param, interface, pkg)가 조사 대상을 정합니다.
  4. --ros-args -r 원래:=새이름으로 코드 수정 없이 노드·토픽 이름을 바꿉니다.
  5. 이 장의 터미널은 시뮬레이션이며 실제 확인은 Part 2의 VM과 이후 시뮬레이션·실기기에서 합니다.

확인 문제

Q1. 실행 중인 노드가 무엇을 구독하고 발행하는지 한 번에 보려면 어떤 명령을 쓰나요?

ros2 node info <노드 이름>입니다. Subscribers, Publishers, Service Servers 등이 섹션별로 출력됩니다.

Q2. 토픽의 메시지 타입을 알고 싶을 때 쓸 수 있는 명령 두 가지는?

ros2 topic list -t(모든 토픽을 타입과 함께 표시)와 ros2 topic info <토픽>(그 토픽의 Type과 발행자·구독자 수 표시)입니다.

Q3. /turtle1/cmd_vel 토픽으로 데이터가 오는지 보려면 먼저 무엇을 실행하나요?

ros2 topic echo /turtle1/cmd_vel입니다. 아무것도 출력되지 않으면 발행하는 노드가 없거나 값을 보내지 않는 것이므로, ros2 topic info와 ros2 node info로 발행자가 있는지 확인합니다.

다음 장

다음에는 토픽을 직접 발행하고 구독하는 코드를 작성합니다. 내가 만든 노드가 제대로 연결되었는지는 이 장의 조사 명령으로 확인합니다.