ROS2 Tutorial (Basic)
  • 교육 안내
  • ROS2 개요
  • ROS2 환경 구성
  • turtlesim, ROS2 rqt
  • 노드(Node) 이해하기
  • 토픽(Topic) 이해하기
  • 서비스(Service) 이해하기
  • 파라메터(Parameter) 이해하기
  • 액션(Action) 이해하기
  • rqt_console 을 이용해 로그 보기
  • 노드 실행하기(launch)
  • 데이터 기록 및 재생
  • ROS2 프로그래밍 시작
  • 작업공간 만들기
  • 패키지 만들기
  • 간단한 게시자와 구독자 노드 만들기
  • 간단한 서비스 및 클라이언트 작성
  • 사용자 정의 msg 및 srv 파일 생성
  • 사용자 정의 인터페이스 구현
  • 파라메터 사용하기
  • 문제 식별에 ros2doctor 사용하기
Powered by GitBook
On this page
  • 개요
  • 실습
  • 1. 설정
  • 2. Action 사용
  • 3. ros2 node info
  • 4. ros2 action list
  • 5. ros2 action info
  • 6. ros2 interface show
  • 7. ros2 action send_goal

Was this helpful?

Export as PDF

액션(Action) 이해하기

저작권: 쿼드(QUAD) 드론연구소 https://smartstore.naver.com/maponarooo

Previous파라메터(Parameter) 이해하기Nextrqt_console 을 이용해 로그 보기

Last updated 1 year ago

Was this helpful?

개요

액션은 ROS2의 통신 유형 중 하나이며 장기 실행 작업을 위한 것입니다. 목표, 피드백 및 결과의 세 부분으로 구성됩니다.

Action은 주제와 Service를 기반으로 합니다. 작업이 선점 가능하다는 점을 제외하면 해당 기능은 서비스와 유사합니다(실행 중에 취소할 수 있음). 또한 단일 응답을 반환하는 서비스와 달리 꾸준한 피드백을 제공합니다.

작업은 게시자-구독자 모델과 유사한 클라이언트-서버 모델을 사용합니다(토픽에서 설명됨). "액션 클라이언트" 노드는 목표를 확인하고 피드백 스트림과 결과를 반환하는 "액션 서버" 노드로 목표를 보냅니다.

실습

1. 설정

/turtlesim하고 /teleop_turtle두 개의 turtlesim 노드를 시작 합니다.

ros2 run turtlesim turtlesim_node

다른 터미널을 열고 다음을 실행합니다.

ros2 run turtlesim turtle_teleop_key

2. Action 사용

노드를 시작하면 /teleop_turtle터미널에 다음 메시지가 표시됩니다.

Use arrow keys to move the turtle.
Use G|B|V|C|D|E|R|T keys to rotate to absolute orientations. 'F' to cancel a rotation.

작업에 해당하는 두 번째 줄에 초점을 맞추겠습니다.

문자 키는 키보드의 키 G|B|V|C|D|E|R|T주위에 "상자"를 형성합니다. 각 키의 위치는 Turtlesim의 해당 방향에 해당합니다. 예를 들어 E 키는거북이의 방향을 왼쪽 위 모서리로 회전시킵니다.

/turtlesim노드가 실행 중인 터미널에 주의하십시오 . 이 키 중 하나를 누를 때마다 /turtlesim노드의 일부인 작업 서버에 목표를 보냅니다. 목표는 특정 방향을 향하도록 거북이를 회전시키는 것입니다. 거북이가 회전을 완료하면 목표 결과를 전달하는 메시지가 표시됩니다.

[INFO] [turtlesim]: Rotation goal completed successfully

키 F는 실행 중간에 목표를 취소하여 선점 가능한 작업 기능을 보여줍니다.

C키를 누른 다음 거북이가 회전을 완료하기 전에 F키를 누르십시오. 노드가 실행 중인 터미널에 /turtlesim다음 메시지가 표시됩니다.

[INFO] [turtlesim]: Rotation goal canceled

클라이언트 측(텔레옵의 입력)이 목표를 중지할 수 있을 뿐만 아니라 서버 측(노드 /turtlesim)도 중지할 수 있습니다. 서버측에서 목표 처리를 중지하기로 선택하면 목표를 "중단"했다고 합니다.

D키를 누른 다음 첫 번째 회전이 완료되기 전에 G키를 누르십시오 . 노드가 실행 중인 터미널에 /turtlesim다음 메시지가 표시됩니다.

[WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal

3. ros2 node info

이 경우 /turtlesim노드가 제공하는 작업 목록을 보려면 새 터미널을 열고 다음 명령을 실행합니다.

ros2 node info /turtlesim

그러면 구독자, 게시자, 서비스, 액션 서버 및 액션 클라이언트 목록이 반환됩니다.

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

RotateAbsolute 액션이 /Turlesim 노드에 있음을 알 수 있습니다. turtlesim/action/RotateAbsolute

/teleop_turtle 노드를 살펴 봅니다.

ros2 node info /teleop_turtle

다음을 반환합니다.

/teleop_turtle
  Subscribers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
  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
  Action Servers:

  Action Clients:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute

액션 클라이언트에 RostateAbsolute 액션이 나타난 것을 확인할 수 있습니다.

4. ros2 action list

ROS 그래프에서 모든 액션을 식별하려면 다음 명령을 실행합니다.

ros2 action list

다음을 반환합니다.

/turtle1/rotate_absolute

이것은 현재 ROS 그래프의 유일한 액션입니다. 앞에서 본 것처럼 거북이의 회전을 제어합니다. 또한 명령 을 사용하여 이 작업에 대해 하나의 작업 클라이언트와 하나의 작업 서버가 있음을 이미 알고 있습니다 .

4.1 ros2 action list -t

작업에는 토픽 및 서비스와 유사한 유형이 있습니다. /turtle1/rotate_absolute의 유형을 찾으려면 다음 명령을 실행하십시오.

ros2 action list -t

다음을 반환합니다.

/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]

각 액션 이름의 오른쪽에 있는 괄호 안에는 turtlesim/action/RotateAbsolute작업 유형이 있습니다 . 명령줄이나 코드에서 작업을 실행하려는 경우에 필요합니다.

5. ros2 action info

다음 명령을 사용하여 액션을 추가로 검사할 수 있습니다 .

ros2 action info /turtle1/rotate_absolute

다음을 반환합니다.

Action: /turtle1/rotate_absolute
Action clients: 1
    /teleop_turtle
Action servers: 1
    /turtlesim

이것은 이전에 각 노드에서 "ros2 node info/teleop_turtle/turtlesim/turtle1/rotate_absolute"실행하면서 배운 내용을 알려줍니다 . 노드에는 액션 클라이언트가 있고 액션에 대한 작업 서버가 있습니다.

6. ros2 interface show

액션 목표를 직접 전송하거나 실행하기 전에 필요한 또 하나의 정보는 액션 유형의 구조입니다.

ros2 action list -t명령을 실행할 때 /turtle1/rotate_absolute유형을 식별했음을 기억하십시오 . 터미널에 작업 유형과 함께 다음 명령을 입력합니다.

ros2 interface show turtlesim/action/RotateAbsolute

다음을 반환합니다.

# The desired heading in radians
float32 theta
---
# The angular displacement in radians to the starting position
float32 delta
---
# The remaining rotation in radians
float32 remaining

첫 번째 ---위의 이 메시지 섹션은 목표 요청의 구조(데이터 유형 및 이름)입니다. 다음 섹션은 결과의 구조입니다. 마지막 섹션은 피드백의 구조입니다.

7. ros2 action send_goal

이제 다음 구문을 사용하여 명령줄에서 작업 목표를 전송해 보겠습니다.

ros2 action send_goal <action_name> <action_type> <values>

<values>는YAML 형식이어야 합니다.

Turtlesim 창을 주시하고 터미널에 다음 명령을 입력하십시오.

ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"

거북이가 회전하는 것과 동시에터미널에 다음 메시지가 표시되어야 합니다.

Waiting for an action server to become available...
Sending goal:
   theta: 1.57

Goal accepted with ID: f8db8f44410849eaa93d3feb747dd444

Result:
  delta: -1.568000316619873

Goal finished with status: SUCCEEDED

모든 목표에는 반환 메시지에 표시되는 고유 ID가 있습니다. 시작 위치로의 변위인 이름이 있는 필드인 delta결과도 볼 수 있습니다 .

이 목표에 대한 피드백을 보려면 실행한 마지막 명령에 --feedback 추가하십시오. 먼저 theta의 값을 변경했는지 확인하십시오 . 이전 명령을 실행한 후 거북이는 이미 라디안 방향에 있으므로 새로운 theta 값인 -1.57 을 전달하지 않으면 움직이지 않습니다.

ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.57}" --feedback

터미널에서 다음 메시지를 반환합니다.

Sending goal:
   theta: -1.57

Goal accepted with ID: e6092c831f994afda92f0086f220da27

Feedback:
  remaining: -3.1268222332000732

Feedback:
  remaining: -3.1108222007751465

…

Result:
  delta: 3.1200008392333984

Goal finished with status: SUCCEEDED

목표가 완료될 때까지 피드백(나머지 라디안)을 계속 받게 됩니다.