티스토리 친구하기

본문 바로가기

Robotics/ROS2

ROS2 Node [ROS2 노드]

728x90

ROS2 그래프(Graph)는 로봇 시스템의 구성 요소 간 통신 및 데이터 교환을 관리하는 ROS2의 핵심 개념 중 하나입니다.  ROS2 그래프는 다음과 같은 구성 요소로 이루어져 있습니다.

1. 노드(Node) 

실행 가능한 프로세스(executable process)로, ROS2 그래프 상에서 통신하는 단위입니다. 노드는 토픽(topic), 서비스(service), 액션(action) 등을 이용하여 다른 노드와 데이터를 주고받습니다.

2. 토픽(Topic)

노드 간에 비동기식으로 데이터를 주고받는 메커니즘입니다. 하나의 토픽은 하나 이상의 발행자(publisher)와 하나 이상의 구독자(subscriber)로 구성됩니다.

3. 서비스(Service)

노드 간에 동기식으로 데이터를 주고받는 메커니즘입니다. 하나의 서비스는 요청(request)과 응답(response)으로 구성됩니다.

4. 액션(Action)

서비스와 유사하지만, 더 복잡한 동작을 수행하는 메커니즘입니다. 하나의 액션은 목표(goal), 피드백(feedback), 결과(result)로 구성됩니다.

ROS2 그래프는 중앙 집중식이 아닌 분산형 아키텍처를 기반으로 하고 있어서, 노드와 토픽 등의 구성 요소는 네트워크를 통해 서로 통신하게 됩니다. 이를 통해 로봇 시스템의 구성 요소를 분리하고 독립적으로 개발하고 실행할 수 있습니다.

 

출처: https://docs.ros.org/en/foxy/Tutorials/Beginner-CLI-Tools/Understanding-ROS2-Nodes/Understanding-ROS2-Nodes.html

 

전체 로봇 시스템은 많은 노드가 조화롭게 작동하도록 구성됩니다. ROS 2에서 하나의 실행 파일(single executable: C++ 프로그램, Python 프로그램 등)은 하나 이상의 노드를 포함할 수 있습니다.

즉, 하나의 실행 파일에서 여러 개의 노드를 실행할 수 있으며, 이러한 노드들은 토픽, 서비스, 액션 등을 통해 다른 노드들과 상호작용할 수 있습니다. 이를 통해 전체 로봇 시스템이 하나의 실행 파일로 관리될 수 있으며, 노드 간의 통신 및 데이터 교환도 쉽게 이루어질 수 있습니다.

 

1. ros2 run 

`ros2 run`은 ROS 2에서 노드(Node)를 실행하는 명령어입니다. (ros2 run launches an executable from a package)

`ros2 run` 명령어를 사용하여 특정 패키지의 노드를 실행할 수 있습니다.

 

# 사용법
ros2 run <package_name> <executable_name>

# turtlesim 패키지의 turtlesim 노드 실행
ros2 run turtlesim turtlesim_node

 

패키지 이름은 turtlesim, executable 이름은 turtlesim_node 입니다. 

`executable`과 `node`는 ROS 2 시스템에서 서로 다른 개념입니다. `executable`은 ROS 2에서 노드를 실행할 때 필요한 실행 파일이고, `node`는 ROS 2 시스템에서 실행되는 프로세스입니다. (참조: node와 executable)

우리는 아직 node 이름은 모르지만, ros2 node list 명령어를 통해 node 이름을 알 수 있습니다.

2.  ros2 node list

`ros2 node list` 명령어는 현재 ROS 2 시스템에서 실행 중인 노드의 목록을 출력합니다. 이 명령어는 현재 ROS 2 시스템에서 실행 중인 모든 노드의 이름을 출력하며, 실행 중인 노드가 없는 경우에는 아무것도 출력하지 않습니다.

위에서 실행한 turtlesim이 아직 실행되고 있는 상태에서, 다른 터미널을 열고 아래의 명령어를 입력합니다.

 

# 입력
ros2 node list

# 출력결과
/turtlesim

 

또 다른 터미널에서 teleop node를 실행하고, 다시 ros2 node list 명령어를 입력해봅니다.

 

# 입력 1
ros2 run turtlesim turtle_teleop_key

# 입력 2
ros2 node list

# 출력결과
/turtlesim
/teleop_turtle

 

turtlesim_node, turtle_teleop_key 라는 executable들로 각각 실행시킨 turtlesim, teleop_turtle 노드가 list에 출력되는 것을 확인할 수 있습니다. 

2.1 Remapping

ROS 2에서 `remapping`은 노드 실행 중에 노드 간의 통신에 사용되는 topic, service, parameter 등의 이름을 재정의하는 것입니다. 이를 통해 다른 노드들이 동일한 이름으로 topic, service, parameter를 사용하더라도 해당 노드에서는 다른 이름으로 사용할 수 있습니다.
새로운 터미널에서 아래의 명령어를 입력하면 '/turtlesim' 노트의 이름을 'my_turtle'로 재정의 할 수 있습니다.

 

ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle

 

'ros2 node list' 명령어를 실행시켰던 터미널로 가서, 다시 'ros2 node list'를 실행시키면 3개의 node name을 확인할 수 있습니다.

 

/turtlesim
/teleop_turtle
/my_turtle

 

3. ros2 node info

`ros2 node info` 명령어는 ROS 2 노드에 대한 정보를 출력하는 명령어입니다. 이 명령어를 사용하면 특정 노드에 대한 정보를 확인할 수 있습니다. 
`ros2 node info` 명령어를 실행하기 위해서는 터미널 창을 열고 다음과 같이 입력합니다.

ros2 node info <node_name>

 

'my_turtle' 노드의 정보를 출력하기 위해서 아래의 명령어를 입력합니다.

 

# 입력
ros2 node info /my_turtle

# 출력
/my_turtle
  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
  Services:
    /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
    /my_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters
    /my_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
    /my_turtle/get_parameters: rcl_interfaces/srv/GetParameters
    /my_turtle/list_parameters: rcl_interfaces/srv/ListParameters
    /my_turtle/set_parameters: rcl_interfaces/srv/SetParameters
    /my_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
  Action Servers:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
  Action Clients:

 

 

`ros2 node info` 명령어는 해당 노드와 상호작용하는 ROS 그래프의 연결인 subscriber, publisher, service, action 목록을 출력합니다. 이를 통해 특정 노드에 대한 정보를 쉽게 파악할 수 있습니다.

 

Summary

이 튜토리얼에서는 turtlesim 패키지에서 생성된 노드 turtlesim_node와 turtle_teleop_key를 실행하여 노드를 활용하는 방법을 배웠습니다.

ros2 node list를 사용하여 활성화된 노드 이름을 발견하고, ros2 node info를 사용하여 단일 노드를 내부 검사하는 방법을 배웠습니다. 이러한 도구는 복잡하고 실제 로봇 시스템에서 데이터 흐름을 이해하는 데 필수적입니다.

 

 

 

 

 

반응형