3 분 소요

turtlesim package

** turtlesim ** 은 듀토리얼 패키지이다. 이를 이용한 예제를 통해 익히도록 해보자.

turtlesim 패키지에 포함돼있는 노드는 다음과 같이 확인이 가능하다.

$ ros2 pkg executables turtlesim


  • 두 노드 확인

다음의 두 노드를 실행시키면 방향키로 turtlesim_node의 거북이를 움직인다.

$ ros2 run turtlesim turtlesim_node
$ ros2 run turtlesim turtle_teleop_key
  • 실행되고 있는 노드 확인
$ ros2 node list		
  • topic 확인
$ ros2 topic list	
  • servie 확인
$ ros2 service list
  • action 확인
$ ros2 action list
  • rqt_graph로 노드와 메시지를 한눈에 확인
$ rqt_graph

메시지의 종류

종류 동기 방향 사용
Topic 비동기 단방향 연속으로 데이터 송수신
Service 동기 양방향 요청 처리가 순간적(1회성); 현재 상태를 확인하고 응답받는 것이 필요한 경우
Action 비동기 양방향 요청 처리 후 응답까지 오래 걸려서 서비스를 이용하기 어려운 경우, 중간 피드백이 필요한 경우
  • Topic

Screenshot from 2024-01-22 20-43-54

토픽은 실시간으로 전송되는 단방향성 메시지. 퍼블리셔나 서브스크라이버가 중지하지 않는 이상 메시지를 계속 보낸다. 로봇에서는 센서 메시지를 보낼때 토픽을 많이 사용한다.

1:N, N:1, N:N 통신도 가능하며 가장 널리 사용되는 통신 방법이다.

  • Service

Screenshot from 2024-01-22 20-44-36

서비스는 1회성의 메시지이다. 서비스 서버와 서비스 클라이언트 노드간 통신이 이루어진다. 요청과 응답을 수행하면, 서로의 접속을 끊는다. 다시 필요하면 접속부터 처음부터 진행된다.

로봇에 1회성 행동 명령을 내려야 하는 경우 많이 사용된다.

  • Parameter

노드에 Parameter server를 실행시켜 외부의 Parameter client간의 통신으로 파라미트럴 변경한다. 이는 서비스와는 비슷하지만 노드 내 매개변수 또는 글로벌 매개변수를 서비스 메시지 통신 방법을 사용하여 노드 내부 또는 외부에서 SET하거나 GET하는 점에서 목적이 다르다.

  • Action

Screenshot from 2024-01-22 20-44-40

서비스에서 결과값을 보고하는 부분이 추가된 통신이다.

서비스 와는 다르게 클라이언트에서 취소명령을 보내거나, 서버에서 결과값을 보내면 접속이 종료된다.

더 자세히 살펴보면 토픽과 서비스의 혼합이다. 액션 목표 및 액션 결과를 전달하는 방식은 서비스와 같으며 피드백은 토픽과 상태와 같은 메시지 전송 방식을 이용한다.

ROS2에서는 Action Server는 Service Server 3개와 Topic Serve 2개로 구성된다.



토픽

turtlesim node의 발행, 구독하는 메시지를 보여주고 message type까지 나타낸다.

$ ros2 topic list -t

Screenshot from 2024-01-22 21-15-38

  • 토픽 정보 확인
$ ros2 topic info /turtle/cmd_vel

message type과 publisher의 수 subscriber의 수를 보여준다.

  • 토픽 내용 확인
$ ros2 topic echo /turtle1/cmd_vel

teleop_turtle 노드에서 방향키를 누르면 토픽 값을 확인할 수 있다. linear velocity, angular velocity를 x, y, z 각각 나타낸다.

  • 토픽 대역폭 확인
$ ros2 topic bw /turtle1/cmd_vel	

위의 명령어를 이용하면 대역폭과 크기를 확인 할 수 있다.

  • 토픽 주기 확인
$ ros2 topci hz /turtle1/cmd_vel
  • 토픽 지연 시간 확인
$ ros2 topic delay /TOPIC_NAME
  • 토픽 발행
$ ros2 topic pub <topic_name> <msg_type> "<args>"

ex)

topic을 한번 발행

$ ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist 

"{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}" 

주기 1Hz의 topic 발행

$ ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"


서비스

  • 서비스 목록 확인
$ ros2 service list
  • 서비스 형태 확인
$ ros2 service type <특정 service>
$ ros2 service list -t 
  • 서비스 찾기
$ ros2 service find <특정 type의 service>
  • 서비스 요청
$ ros2 service call <service_name> <service_type> "<arguments>"


액션

  • 액션 요청
$ ros2 action send_goal <action_name> <action_type> "<values>"

ros2 bag record

rosbag은 원하는 토픽을 기록하고 재생하는 도구이다.

알고리즘의 입력 값을 고정하고 반복하여 테스트하여 알고리즘의 개선 작업 및 성능 검증 테스트를 할 때 사용한다.


  • /turtle1/cmd_vel의 토픽을 저장하는 예시
$ ros2 bag record /turtle1/cmd_vel
  • ros2 bag info
$ ros2 bag info <생성된 rosbag의 directory>
  • bag 재생
$ ros2 bag play <생성된 rosbag의 directory>/

메시지 인터페이스

$ ros2 interface show geometry_msgs/msg/Twist

geometry_msgs/msg/Twist의 메시지 형태는

Vector3 linear와 Vector3 angular 형태의 2개의 메시지가 있고 이는 각각 float64 자료형으로 3개씩 메시지를 가지므로 총 병진속도 3개, 회전 속도 3개를 합한 6개의 메시지를 가진다.

**서비스 인터페이스 같은 경우에는 .srv파일에 해당한다. — 구분자로 request와 response를 구분한다. **

Action의 인터페이스는 msg 및 srv 인터페이스의 변형이다 .action 파일에 해당한다. 마찬가지로 — 구분자를 사용해 goal, feedback, result를 구분한다.

  • 현재 모든 msg, srv, action을 나타냄
$ ros2 interface list
  • msg, srv, action을 담고 있는 package를 나타냄
$ ros2 interface packages
  • 특정 패키지의 인터페이스를 나타냄
$ ros2 interface package turtlesim
  • 인터페이스의 기본형태를 나타냄
$ ros2 interface proto turtlesim/msg/Pose

댓글남기기