메시지 전송 절차
오늘은 day1에서 테스트 용도로 사용한 turtlesim 예제의 메시지가 어떤 흐름을 거쳐 전달되는지 알아보도록 하겠습니다.
토픽 메시지 전송
1. 마스터 구동
노드 간 메시지 통신을 하기 위해선 반드시 마스터가 구동되어 있어야 합니다. 마스터는 노드 정보를 관리하며, 각 노드의 요청이 있을 때 노드 정보를 다른 노드에 알립니다. 아래 명령어를 터미널에 입력하면 마스터가 실행됩니다. 마스터는 데이터 전송 프로토콜로 XMLRPC를 사용하며, 서버의 주소는 http://${ROS_MASTER_URI}:11311이 기본으로 적용됩니다.
roscore
2. 퍼블리셔/서브스크라이버 구동
rosrun $PACKAGE_NAME $NODE_NAME
roslaunch $PACKAGE_NAME $LAUNCH_NAME
rosrun 명령어는 노드 하나를 실행할 수 있는 반면, roslaunch는 패키지 내 *.launch 파일에 작성된 여러 개의 노드를 한 번에 실행할 수 있습니다.
3. 퍼블리셔 정보 알림
마스터가 서브스크라이버 노드에 퍼블리셔의 이름, 토픽 이름, 메시지 형태, URI 주소와 포트 등의 정보를 전송합니다.
4. 서브스크라이버 노드의 접속 요청
정보를 전달받은 서브스크라이버 노드는 퍼블리셔 노드에 직접 접속을 요청합니다. 이때 자신의 노드 이름, 토픽 이름, 메시지 방식을 전송하며, 두 노드는 XMLRPC를 이용해 통신합니다.
5. 퍼블리셔 노드의 접속 응답
퍼블리셔 노드는 서브스크라이버 노드의 접속 요청에 응답하여 자신의 URI 주소와 포트를 전송합니다.
6. TCPROS 접속
서브스크라이버는 TCPROS를 이용하여 포블리셔 노드에 대한 클라이언트를 만들고, 퍼블리셔 노드와 직접 연결합니다. TCPROS는 노드 간 통신에 사용되는 TCP/IP 방식의 프로토콜입니다.
7. 메시지 전송
퍼블리셔 노드가 서브스크라이버 노드에 정해진 메시지를 전송합니다. 토픽 메시지 통신은 퍼블리셔나 서브스크라이버가 중지하지 않는 이상, 메시지를 연속적으로 퍼블리시/서브스크라이브 합니다.
서비스 요청 및 응답
서비스 요청 및 응답의 절차는 토픽 메시지와 같으나, 서비스는 1회 접속에 한 해 요청과 응답을 수행한 뒤 서로의 접속을 끊습니다. 서비스를 반복 요청하려면 접속부터 새롭게 진행해야 합니다.
액션 목표, 결과, 피드백
액션은 서비스의 요청과 응답에 중간 결과인 피드백을 추가한 형태이지만, 실제 구동 방식은 토픽과 같습니다. rostopic 명령어를 통해 토픽을 확인하면, 액션은 goal, status, cancel, result, feedback 총 5개의 토픽으로 구성되어 있습니다.
메시지 타입
메시지는 필드타입과 필드네임으로 구성되어 있으며 ROS에서는 uint32
, int64
, string
, time
등의 기본 자료형과 float64 x
, float64 y
, float64 z
세 메시지의 집합인 Vector3
과 같은 헤더 메시지가 사용됩니다.
msg 파일
각각의 데이터 통신 방법과 메시지 파일의 확장자는 구분되어 있습니다. *.msg
파일은 토픽에 사용되는 메시지 파일로, 필드타입과 필드네임만으로 구성되어 있습니다. turtlesim에서 주고 받는 토픽 메시지는 아래와 같은 형태입니다.
Vector3 linear
Vector3 angular
srv 파일
*.srv
파일은 서비스에서 사용되는 메시지로 3개의 하이픈(---)이 서비스 요청, 서비스 응답 메시지를 구분하는 구분자 역할을 합니다. 다음은 sensor_msgs/SetCameraInfo.srv
파일의 예시입니다.
sensor_msgs/CameraInfo camera_info
---
bool success
string status_message
action 파일
액션에 사용되는 메시지 파일로 *.action
이라는 확장자를 이용합니다. 3개의 하이픈이 구분자 역할을 하며, goal, result, feedback 순으로 구분하고 있습니다.
geometry_msgs/PoseStamped start_pose
geometry_msgs/PoseStamped goal_pose
---
geometry_msgs/PoseStamped result_pose
---
float32 percent_complete
'Robotics' 카테고리의 다른 글
5일차 - ros bash, catkin, rosnode 명령어 정리 (0) | 2020.07.05 |
---|---|
4일차 - hello world 패키지 작성하기 (1) | 2020.07.05 |
4일차 - Ubuntu 18.04.2 LTS에 Docker 이용하여 ROS 설치하기 (0) | 2020.07.04 |
2일차 - ROS 용어 정리 (0) | 2020.07.03 |
1일차 - macOS Catalina 10.15.5에 ros2 foxy 설치하기 (2) | 2020.07.01 |