[ROS2] 메시지 통신

­윤다빈·2022년 8월 17일
0

[Devlog] - ROS

목록 보기
5/9

토픽 (Topic)

: 비동기식 단방향 메시지 송수신 방식
msg 인터페이스 형태의 메시지를 퍼블리시하는 Publisher와 메시지를 서브스크라이브하는 Subscriber 간의 통신
1:1 통신이 기본 // 1:N, N:1, N:N 통신도 가능
ROS 메시지 통신에서 가장 많이 사용됨
노드 하나가 하나 이상의 토픽을 퍼블리시할 뿐만 아니라, Publisher 기능과 동시에 토픽을 서브크라이브할 수도 있음

토픽 정보 확인

$ ros2 node info [노드명]

서비스, 액션, 파라미터 등의 메시지 정보를 확인할 수 있음
지정한 노드만의 정보를 확인할 수 있음
패키지/노드를 실행해야(run) 해당 토픽 정보들을 확인할 수 있음

토픽 목록 확인

$ ros2 topic list -t

현재 개발환경에서 동작 중인 모든 노드들의 토픽 정보를 볼 수 있음
-t 옵션: 각 메시지의 형태(Type) 함께 표시

토픽 내용 확인

$ ros2 topic echo [토픽명]

토픽 퍼블리시

$ ros2 topic pub [토픽 이름] [토픽 메시지 타입] "[메시지 내용]"

ex.
$ ros2 topic pub --once /turtle/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}}"

--once 옵션: 단 한번의 퍼블리시만을 수행
--rate 1 옵션: 주기 1Hz의 지속적인 퍼블리시 생성

rosbag을 사용하여 원하는 토픽을 기록하고 재생하도록 => 일정한 데이터를 갖고 테스트할 수 있음


서비스 (Service)

: 동기식 양방향 메시지 송수신 방식
서비스 요청(Request)을 하는 Service Client와 요청받은 서비스를 수행한 후 서비스 응답(Response)하는 Service Server 같의 통신

서비스 목록 확인

$ ros2 service list

패키지 노트 실행해야 서비스 목록 나옴

서비스 찾기

$ ros2 service find [서비스 형태]

=> 해당 형태의 서비스를 사용하는 서비스명 확인 가능

서비스 요청

$ ros2 service call [서비스이름] [서비스타입] "[서비스내용]"

액션 (Action)

: 비동기, 동기식 양방향 메시지 송수신 방식
액션 목표(Goal)를 지정하는 Action Client와 액션 목표를 받아 특정 태스크를 수행하면서 중간 결과값을 전송하는 액션 피드백(Feedback), 그리고 최종 결과값을 담은 액션 결과(Result)를 전송하는 Action Server 간의 통신

액션 목표 전달

$ ros2 action send_goal [액션이름] [액션타입] "[목표값]"

인터페이스

: ROS 노드 간에 데이터를 주고받기 위해서는 토픽, 서비스, 액션을 사용
이때 사용되는 데이터 형태를 ROS 2 인터페이스라고 함
=> IDL (Interface Definition Language)과 msg, src, action이 있음

메시지 형태 및 이름 확인

$ ros2 interface show [토픽형태]

=> 해당 토픽 형태가 가지는 자료형, 데이터 형태를 반환

ros2 interface packages

$ ros2 interface packages

=> msg, srv, action 인터페이스를 담고 있는 패키지의 목록을 보여줌


파라미터

: 각 노드가 가진 Parameter server를 통해 외부의 Parameter client와 통신하여 파라미터를 변경하는 것 (서비스와 유사함)
cf) 파라미터는 노드 내부 또는 외부에서 노드 내 매개변수를 쉽게 지정(Set)하거나 변경할 수 있고, 쉽게 가져(Get)와서 사용할 수 있게한다
=> 각 노드의 다양한 매개변수를 글로벌 매개변수처럼 사용할 수 있게 됨

RCL(ROS Client Libraries)의 기본 기능으로 모든 노드가 자신만의 Parameter server를 가지고 있음

파라미터 내용 확인

파라미터가 어떤 형태, 목적, 데이터 형태, 최소, 최대값을 가지는지 알아볼 수 있음

$ ros2 param describe [노드이름] [파라미터이름]

파라미터 읽기

$ ros2 param get [노드이름] [파라미터이름]

파라미터 쓰기

$ ros2 param set [노드이름] [파라미터이름] [변경할파라미터값]
-> 파라미터를 변경할 수 있지만 노드 종료 후 다시 실행하면 다시 초기값으로 설정됨

=> set으로 파라미터 변경 후,  
$ ros2 param dump [노드이름]

-> 현재 경로에 해당 노드 이름으로 설정 파일이 yaml 형태로 저장됨

-> 이후 노드 재실행 시 해당 파라미터 값을 초깃값으로 사용하려면,
$ ros2 run [패키지이름] [노드이름] --ros-args --params-file [yaml파일]
profile
Web-Front / SW-AI 개발자

0개의 댓글