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이 /turtle1/cmd_vel로 속도 명령을 보내고 /turtlesim이 그 명령대로 거북이를 움직이면서 자기 위치(pose)와 바닥 색(color_sensor)을 내보냅니다. (그림에는 모든 노드가 공통으로 쓰는 /parameter_events, /rosout 토픽은 생략했습니다.)
시스템 조사 순서
처음 보는 ROS2 시스템을 만났다고 해 봅시다. 코드를 읽지 않아도 CLI만으로 구조가 드러납니다. 다음 순서를 기억해 두세요.
ros2 node list: 어떤 노드가 떠 있나?ros2 node info <노드>: 그 노드는 무엇을 발행·구독하나?ros2 topic list -t: 어떤 토픽이 있고 타입은 무엇인가?ros2 topic info <토픽>: 발행자와 구독자는 몇 개인가?ros2 topic echo <토픽>: 실제로 어떤 값이 흐르고 있나?- 필요하면
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를 입력하면 지원하는 명령 목록이 나옵니다.
이 명령을 눌러 실행
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: 다른 시스템 조사하기
이번에는 낯선 시스템입니다. 노드 둘이 있다는 것 외에는 알려 주지 않을 테니, 위의 조사 순서만 사용해서 누가 누구에게 무엇을 보내는지 알아내 보세요. 가이드는 없습니다.
이 명령을 눌러 실행
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로 멈출 때까지 이어집니다.
한눈에 정리
- 노드는 한 가지 일을 하는 실행 단위이며 보통 프로세스 하나에 하나씩
ros2 run으로 실행합니다. - 처음 보는 시스템은
node list → node info → topic list -t → topic info → topic echo순서로 조사합니다. ros2 <동사> <하위명령>에서 동사(node, topic, service, param, interface, pkg)가 조사 대상을 정합니다.--ros-args -r 원래:=새이름으로 코드 수정 없이 노드·토픽 이름을 바꿉니다.- 이 장의 터미널은 시뮬레이션이며 실제 확인은 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로 발행자가 있는지 확인합니다.
다음 장
다음에는 토픽을 직접 발행하고 구독하는 코드를 작성합니다. 내가 만든 노드가 제대로 연결되었는지는 이 장의 조사 명령으로 확인합니다.