[ROS 2로 시작하는 로봇 프로그래밍]에 기반한 정리글입니다.
ROS 노드 간에 데이터를 주고받기 위해서 토픽, 서비스, 액션을 사용하고, 이때 사용되는 데이터 형태를 ROS 2 인터페이스
라고 한다. 이들은 각각 msg, srv, action interface를 사용하며, 정수, 부동 소수점, boolean과 같은 단순 자료형과, 데이터 구조와 메시지들이 나열된 배열같은 구조로도 사용이 가능하다.
turtlesim 패키지를 예로, 이 노드의 정보를 확인하면, turtle1/cmd_vel
토픽은 geometry_msgs/msg/Twist
형태임을 알 수 있다.
$ ros2 node info /turtlesim
이 메시지들을 ros2 interface show
명령어로 메시지 형태, 이름을 확인할 수 있다.
$ ros2 interface show geometry_msgs/msg/Twist
$ ros2 interface show geometry_msgs/msg/Vector3
즉, geometry_msgs/msg/Twist
메시지 형태는 float64
자료형의 linear.x
, linear.y
, linear.z
, angular.x
, angular.y
, angular.z
을 가짐을 알 수 있다.
또한 ros2 interface는 show
이외에도 list
, package
, packages
, proto
가 있다.
list
: 현재 개발환경의 모든 msg, srv, action 메시지 출력packages
: msg, srv, action 인터페이스를 담고 있는 패키지 목록 출력package
: 옵션에 패키지명 입력 시 지정한 패키지에 포함된 인터페이스 출력proto
: 특정 인터페이스 형태 입력 시 그 인터페이스의 기본 형태 표시서비스 또한 별도의 인터페이스를 가지고 있는데, 이를 서비스 인터페이스
라고 부르며, .srv
파일을 가르킨다.
ROS 2의 서비스에서 서비스를 요청할 때 필요한 /spawn
서비스를 예로 들어본다.
$ ros2 service list
ros2 interface show
명령어로 .srv
의 인터페이스를 확인할 수 있다.
$ ros2 interface show turtlesim/srv/Spawn.srv
해당 명령어를 호출하면 구분자(---)로 나뉘는 것을 알 수 있는데, 위쪽이 Request
, 아래쪽이 Response
이다. 즉, 서비스 요청은 float64 형태의 x, y, theta, string 형태의 name이고, 응답은 string 형태의 name이 된다.
ros2 interface show
명령어로 action
파일의 인터페이스를 확인할 수 있다.
해당 명령어는 구분자를 통해, Action Goal
, Action Result
, Action Feedback
으로 나누어 출력된다.
즉, goal은 theta, result는 delta, feedback은 remaining이 된다.
ROS 2의 파라미터는 각 노드가 가진 Parameter Server를 통하여 외부의 Parameter Client와 통신하여 파라미터를 변경하는 것이다. ROS 2의 Service와 비슷하지만, 파라미터는 서비스 통신 방법을 사용하여 노드 내부, 외부에서 노드 내 매개변수를 쉽게 지정, 변경, 가져와서 사용할 수 있게 하는 점에서 사용 목적이 다르다.
각 노드는 자기 자신, 다른 노드의 파라미터를 읽고 쓸 수 있으며, 이를 활용하면 능동적으로 변화 가능한 프로세스를 만들 수 있기 때문에 파라미터는 매우 유용하다.
turtlesim 노드와 teleop_turtle 노드로 파라미터를 실습한다.
$ ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
아래의 명령어로 파라미터 목록을 확인할 수 있다.
$ ros2 param list
아래의 명령어로 파라미터 내용을 확인할 수 있다.
$ ros2 param describe /turtlesim background_b
해당 파라미터 이름은 background_b
, 데이터 형태는 integer
, 파라미터의 설명을 확인할 수 있다.
아래의 명령어로 파라미터를 읽을 수 있다. 이것으로 turtlesim 노드의 background 배경의 RGB 값은 (69,86,255) 임을 알 수 있다.
$ ros2 param get <node_name> <parameter_name>
파라미터 쓰기 명령어는 아래와 같이 노드 이름, 파라미터 이름, 변경할 파라미터 값을 지정한다.
$ ros2 param set <node_name> <param_name> <value>
해당 명령어를 수행하면 turtlesim node의 배경색이 바뀜을 확인할 수 있다.
앞에서 파라미터 쓰기를 통하여 파라미터 값을 변경했지만, 노드를 종료한 후 다시 실행하면 모든 파라미터는 초기값으로 설정된다. 이때 파라미터 저장 명령어를 사용하면 변경된 파라미터를 저장할 수 있다.
$ ros2 param dump /turtlesim
노드 실행 시 저장된 파라미터 값을 사용하려면 --ros-args --params-file
옵션과 함께 파라미터가 저장된 yaml 파일의 이름을 입력하면 된다.
$ ros2 run turtlesim turtlesim_node --ros-args --params-file ./turtlesim.yaml
특정 파라미터 삭제는 $ ros2 param delete <node_name> <parameter_name>
로 할 수 있다.
이번 포스팅에서는 ROS 2가 가지는 메시지 통신의 인터페이스의 형태를 확인하였고, 각 노드가 가진 Parameter을 확인하고 쓰기, 저장, 삭제의 기능을 이해하였다.
다음 포스팅에서는 ROS 2를 잘 활용할 수 있는 CLI 및 GUI 개발 도구를 정리한다.
얼굴만큼 실력도 멋지시네요