[Dashing][CLI Tools] 3. Understanding ROS 2 nodes
이 글은 아래의 자료를 참고로 만들어졌습니다.
docs.ros.org/en/dashing/Tutorials/Understanding-ROS2-Nodes.html
Understanding ROS 2 nodes
Goal: Learn about the function of nodes in ROS 2, and the tools to interact with them.
Tutorial level: Beginner
Background
1 The ROS 2 graph
이후의 몇 개의 튜토리얼들을 통해서,
“ROS 2 graph”를 구성하는 ROS 2의 핵심적인 개념들에 대해 배울 것입니다.
ROS graph는 ROS 2 요소들의 네트워크입니다.
ROS graph는 실행가능한 프로세스들(nodes)과 그것들의 통신방법(topics, services, actions, parameters)를 포함합니다.
2 Nodes in ROS 2
ROS에서 각각의 node는 하나의 용도를 가진 모듈이어야합니다.
(즉, 하나의 노드가 바퀴의 모터를 제어하고, 또 다른 하나의 노드가 레이저 거리 측정기를 제어해야합니다.)
각 노드는 topics, services, actions 또는, parameters을 통하여 데이터를 다른 노드에 보내거나 받을 수 있습니다.
로봇 전체의 시스템은 수 많은 노드이 함께 작동하도록 구성됩니다.
ROS 2에서는 단일 실행 파일(C++, Pyhton 등)은 하나 또는 그 이상의 노드들을 포함할 수 있습니다.
Prerequisites
이전 튜토리얼의 turtlesim package가 설치되어 있어야합니다.
그리고 매 새로운 terminal마다 설정 파일을 소싱하는 것을 잊지마세요.
Tasks
1 ros2 run
ros2 run 명령은 package에서 실행 파일을 시작합니다.
$ ros2 run <package_name> <executable_name>
turtlesim을 실행하기 위해서, 새로운 터미널을 열고 아래의 명령어를 입력합니다.
$ ros2 run turtlesim turtlesim_node
이전 튜토리얼에서 봤듯이, turtlsim 새로운 창이 열릴 것입니다.
여기서, turtlesim은 package 이름이며,
turtlesim_node는 실행파일입니다.
만약, node의 이름을 모르겠다면, ros2 node list 명령으로 node의 이름을 찾을 수 있습니다.
2 ros2 node list
ros2 node list 은 현재 실행 중인 노드들의 이름을 알려줍니다.
이 명령은 특히 노드와 상호작용하거나, 시스템에 많은 노드들이 있어 그것들을 추적할 때 유용합니다.
새로운 터미널을 열고, 다른 터미널에서 turtlesim이 실행 중일 때,
아래의 명령어를 입력하면 다음 결과를 반환합니다.
$ ros2 node list
/turtlesim
다른 새로운 터미널을 열고,
teleop node를 실행합니다.
$ ros2 run turtlesim turtle_teleop_key
그리고 다시 ros2 node list 명령어를 입력하면,
2개의 노드가 실행되었음을 확인할 수 있습니다.
$ ros2 node list
/turtlesim
/teleop_turtle
2.1 Remapping
Remapping은 노드 이름, 토픽 이름, 서비스 이름 등, default node의 속성을 custome value로 재할당합니다.
지난 튜토리얼에서는 turtle_teleop_key를 remapping하여
default turtle을 조종하는 것을 바꾸어 새로운 turtle을 조종하도록 하였습니다.
새로운 터미널에서 /trutlesim node의 이름을 재할당하는 명령은 아래와 같습니다.
$ ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
turtlesim의 ros2 run 명령을 다시 실행하였기 때문에, 또 다른 turtlesim 화면이 열릴 것입니다.
하지만, ros2 node list를 다시 실행하여 보면, 3개의 노드가 실행 중임을 알 수 있습니다.
$ ros2 node list
/turtlesim
/my_turtle
/teleop_turtle
3 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 명령은 해당 node와 상호작용하는 subscribers, publishers, services, and actions (the ROS graph connections)의 리스트를 보여줍니다.
그리고 /teleop_turtle node에 대해서는 아래와 같습니다.
$ ros2 node info /teleop_turtle
/teleop_turtle
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/turtle1/rotate_absolute/_action/feedback: turtlesim/action/RotateAbsolute_FeedbackMessage
/turtle1/rotate_absolute/_action/status: action_msgs/msg/GoalStatusArray
Publishers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
/turtle1/cmd_vel: geometry_msgs/msg/Twist
Services:
/teleop_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters
/teleop_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/teleop_turtle/get_parameters: rcl_interfaces/srv/GetParameters
/teleop_turtle/list_parameters: rcl_interfaces/srv/ListParameters
/teleop_turtle/set_parameters: rcl_interfaces/srv/SetParameters
/teleop_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
/turtle1/rotate_absolute/_action/cancel_goal: action_msgs/srv/CancelGoal
/turtle1/rotate_absolute/_action/get_result: turtlesim/action/RotateAbsolute_GetResult
/turtle1/rotate_absolute/_action/send_goal: turtlesim/action/RotateAbsolute_SendGoal