1. 액션(Action)
액션(action)은 토픽과 서비스가 혼합된 형태의 통신 방식 입니다. 서비스와 유사하지만 서비스는 동기적으로 통신하는 반면 액션은 비동기적으로 통신합니다.
요청을 하는 노드를 액션 클라이언트(action client), 응답을 하는 노드를 액션 서버(action server)라고 합니다.
액션 클라이언트는 목표(goal)를 서비스를 통해 설정합니다. 액션 서버는 결과(result)가 있을때까지 피드백(feedback)을 토픽을 통해 발행(publish) 합니다.
출처: https://docs.ros.org/en/foxy/Tutorials/Understanding-ROS2-Actions.html
액션은 토픽의 비동기 통신과 서비스의 동기통신이 혼합되어 있으므로 액션을 원활히 수행하기 위해 따로 상태 머신(state machine)을 운용합니다. 출처: http://design.ros2.org/articles/actions.html
클라이언트로 부터 목표 서비스 요청을 받으면 상태머신을 통해 액션 목표의 상태에 이르기까지 토픽을 통해 피드백을 보냅니다.
액션도 turtlesim 패키지를 통해 알아보도록 하겠습니다.
2개의 터미널에 각각 turtlesim_node 노드와 turtle_teleop_key 노드를 실행합니다.
$ ros2 run turtlesim turtlesim_node |
$ ros2 run turtlesim turtle_teleop_key |
다음 명령어를 통해 액션 리스트를 확인합시다.
-t 옵션을 넣어서 타입도 같이 확인해봅시다.
액션의 정보를 확인해봅시다.
$ ros2 action info [액션 이름] |
/turtle1/rotate_absolute 액션에는 /teleop_turtle 노드가 액션 클라이언트로, /turtlesim 노드가 액션 서버로 연결되어 있는 것을 확인할 수 있습니다.
액션 인터페이스의 확장자는 .action 입니다. action 인터페이스의 구조를 알아봅시다.
$ ros2 interface show [메시지 타입].action |
액션 인터페이스는 서비스 인터페이스처럼 --- 으로 구분되는데 각각 액션 목표(goal), 액션 결과(result), 액션 피드백(feedback)의 정보를 담고 있습니다.
이제 액션 목표설정을 해봅시다. 다음 명령어를 입력합니다.
$ ros2 action send_goal [액션 이름] [메시지 타입] "인수" |
피드백을 받으려면 옵션으로 --feedback을 넣어주면 됩니다.
$ ros2 action send_goal /turtle1/rotate_absolute turtlesim/RotateAbolute "{theta: 3.14}" --feedback |
액션을 수행중에 Ctrl + C를 눌러 액션 수행을 중단하면 취소(cancel) 서비스를 요청하면서 액션이 종료됩니다.
2. 파라미터(Parameter)
파라미터(parameter)는 서비스와 비슷하지만 RPC를 목적으로 하는 서비스와 달리 파라미터는 노드의 매개변수 설정을 목적으로 합니다. ROS에서 노드는 기본적으로 파라미터 서버를 포함하고 있습니다.
turtlesim 패키지를 통해 파라미터를 확인해보겠습니다.
turtlesim_node 노드와 turtle_teleop_key 노드를 각각 터미널에서 실행합니다.
$ ros2 run turtlesim turtlesim_node |
$ ros2 run turtlesim turtle_teleop_key |
다른 터미널을 열고 다음 명령어를 통해 파라미터를 확인합시다.
다음 명령어를 통해 파라미터의 세부정보를 확인해봅시다.
$ ros2 param describe [노드 이름] [파라미터 이름] |
background_b 파라미터는 integer 타입이고 배경색상의 Blue 채널을 나타낸다는 것을 알 수 있습니다.
이제 다음 명령어를 통해 파라미터를 읽어보겠습니다.
$ ros2 param get [노드 이름] [파라미터 이름] |
이를 통해 turtlesim_node 노드의 배경색이 rgb(69, 86, 255)라는 것을 알 수 있습니다. 이 색상의 rgb는 69, 86, 255 입니다.
파라미터를 변경하려면 다음 명령어를 입력합니다.
$ ros2 param set [노드 이름] [파라미터 이름] [값] |
rgb 값을 0,0,0으로 설정하면 다음과 같이 배경색이 검은색으로 변합니다.
파라미터 값은 노드를 다시 실행시킬때 초기화됩니다. 파라미터 값을 저장하려면 다음 명령어를 입력합니다.
$ ros2 param dump [노드 이름] |
다음 명령어를 실행한 경로에 노드이름으로 yaml 파일이 생성됩니다.
$ ros2 param dump /turtlesim |
노드 실행시 저장된 파라미터를 사용하려면 다음 명령어를 입력하세요.
$ ros2 run [패키지 이름] [노드 이름] --ros-args --params-file [파라미터 파일 경로] |
$ ros2 run turtlesim turtlesim_node --ros-args --params-file ./turtlesim.yaml |
|