RMW (ROS 미들웨어)
DDS
DDS란
- 분산
- 데이터 통신 미들웨어, 운영체제와 사용자 애플리케이션 사이
- 실시간, QoS, 보안, TCP or UDP, 임베디드시스템, 노드 간 동적 검색
메시지 통신
| 토픽 | 서비스 | 액션 |
---|
연속성 | 연속성 | 일회성 | 복합 |
방향성 | 단방향 | 양방향 | 양방향 |
동기성 | 비동기 | 동기 | 동기+비동기 |
다자간 연결 | | 1:1 | 1:1 |
노드 역할 | 퍼블리셔, 서브스크라이버 | 서버, 클라이언트 | 서버, 클라이언트 |
동작트리거 | 퍼블리셔 | 클라이언트 | 클라이언트 |
인터페이스 | msg인터페이스 | srv | action |
CLI 명령어 | ros2 topic, ros2 interface | ros2 service, ros2 interface | ros2 action, ros2 interface |
예 | 센서데이터, 로봇상태, 로봇좌표, 로봇 속도명령 등 | LED제어, 모터토크 on/off, IK\FK계산, 이동경로 계산 등 | 목적지로 이동, 물건파지, 복합태스크 등 |
- 통신 방법에 따라
- 토픽: publisher-subscriber, 비동기 단방향 송수신, 1대다/1대1/다대1, 셀프subscribe, 주기적/항시 통신 시 사용
- 서비스: client-server, 동기식 양방향 송수신, 한 서버에 여러 클라이언트
- 액션: 액션서버들 (1. action client: 액션 goal 지정 2. feedback: 액션 수행 중 중간값 전송 3. result: 최종 결괏값) 간 통신, 비동기식/동기식 양방향 메시지 송수신
- 파라미터: 모든 노드가 가짐, 노드의 파라미터 서버를 통해 외부 파라미터 클라이언트와 통신해 노드 매개변수를 set get
- Integer, Floating point, Boolean, String, 메시지 내 메시지, 배열
명령어
RQt (ROS 종합 GUI툴)
- 화살표: 메시지 방향
- 사각형: 토픽이나 액션
- 원: 노드
- 서비스는 순간적으로 사용되는 형식이라 표시 안 됨
rqt_graph
- 퍼블리시/서브스크라이브 노드가 없으면 토픽이 안 보임
-> Dead sinks, Leaf topics 해제
패키지 리스트
ros2 pkg list
터틀심 패키지 노드 실행
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
노드
: 최소 단위의 실행 가능한 프로세스
- 노드 간 의존성 줄이고 독립성 높여 노드 재사용할 수 있도록 구성
- 실행
- 한 개 노드:
ros2 run 패키지 노드
- 여러 개 노드:
ros2 launch 패키지 노드 노드
- 노드 이름 지정:
ros2 run turtlesim turtlesim_node __node:=new_turtle
- 지정된 명령어:
rqt
, rqt_graph
, rviz2
- 노드 목록:
ros2 node list
- 노드 정보:
ros2 node info /turtlesim
토픽
- 토픽 목록 (데이터형태):
ros2 topic list -t
- 정보 확인:
ros2 topic info /turtle1/cmd_vel
- 토픽 내용 확인:
ros2 topic echo
linear:
x: 1.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
-> linear.x 값이 1.0m/s
- 토픽 대역폭 (토픽 메시지 크기):
ros2 topic bw /turtle1/cmd_vel
- 토픽 주기:
ros2 topic hz /turtle1/cmd_vel
average rate: 33.212
-> 33.2Hz, 0.03초에 한 번 토픽을 퍼블리시
- 토픽 레이턴시:
ros2 topic delay /TOPIC_NAME
- 토픽 퍼블리시:
ros2 topic pub 옵션 토픽이름 메시지형 "메시지 내용"
예: 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}}"
- --once: 단 한 번의 퍼블리시만을 수행
- --rate 1: 지속적인 퍼블리시 (1Hz)
bag: 토픽을 파일 형식으로 저장했다 불러와 동일한 주기로 재생 가능
- bag 기록하기:
ros2 bag record 옵션 토픽이름1 토픽이름2 ...
- 기록 종료 (ctrl+c) 시 rosbag2_날짜-시간 폴더 생성
-o 이름
으로 폴더 이름 설정
- bag 정보:
ros2 bag info 폴더/
- bag 재생:
ros2 bag play 폴더/
서비스
- 서비스 목록:
ros2 service list -t
- 'parameters' 가 붙은 서비스는 파라미터와 관련, 모든 노드가 가짐
- 서비스 형태 확인:
ros2 service type /clear
- 서비스 찾기:
ros2 service find std_srvs/srv/Empty
- 서비스 요청:
ros2 service call 서비스이름 서비스형태 "요청 내용"
- ros2 service call /clear std_srvs/srv/Empty -> 거북이 그림 클리어
- ros2 service call /kill turtlesim/srv/kill "name: 'turtle1'" -> turtle1의 이름을 가진 거북이 삭제
- ros2 service call /reset std_srvs/srv/Empty -> 새 거북이 생성
- ros2 service call /turtle1/set_pen turtlesim/srv/SetPen "{r: 255, g: 255, b: 255, width: 10}"
- ros2 service call /spawn turtlesim/srv/Spawn "{x: 5.5, y: 7, theta: 1.57, name: 'raffaello'}"
- 이름 지정 안 해주면 turtle 뒤 숫자 자동배정
액션
- 액션 목록:
ros2 action list -t
- 액션 결과는 노드 실행 & 뭔가 하면 [INFO]: Rotation goal completed succesfully 처럼 뜸
- 액션 정보:
ros2 action info /turtle1/rotation_absolute
- 액션 goal 전달:
ros2 action send_goal 액션이름 액션형태 "목푯값"
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.5708}"
-> Sending goal: theta: 1.5708, Goal accepted with ID: {ID}, Result: delta: -1.552...
인터페이스
: 토픽, 서비스, 액션 사용할 때 쓰는 데이터 형태
- IDL (Interface Definition Language)
- 토픽: msg
- 서비스: srv
- 액션: action interface
- 단순자료형 기반
메시지 형태를 인터페이스 파일 내 fieldtype fieldname 으로 정의
예: Vector3.msg 내용
float64 x
float64 y
float64 z
- 메시지 인터페이스
ros2 interface show geometry_msgs/msg/Twist
- show: 현재 개발 환경의 모든 msg, srv, action 보여줌
- packages: msg, srv, action 인터페이스 가진 모든 패키지 보여줌
- package: 해당 패키지에 포함된 인터페이스 보여줌
- 서비스 인터페이스
ros2 interface show turtlesim/srv/Spawn.srv
float32 x
float32 y
float32 theta
string name 요청
--- 요청과 응답을 구분
string name 응답
- 액션 인터페이스
ros interface show turtlesim/action/RotateAbsolute.action
float32 theta 목표
---
float32 delta 결과
---
float32 remaining 피드백
| msg 인터페이스 | srv 인터페이스 | action 인터페이스 |
---|
확장자 | msg | srv | action |
데이터 | 토픽 데이터 | 서비스 요청, 응답 | 액션 목표, 결과, 피드백 |
파라미터
- 목록 확인 (노드별 목록):
ros2 param list
- 파라미터 내용 확인:
ros2 param describe 파라미터
- 파라미터 읽기:
ros2 param get 노드이름 파라미터이름
- 파라미터 쓰기:
ros2 param set 노드이름 파라미터이름 값
- 파라미터 저장:
ros2 param dump 노드
-> 현재 경로에 노드 이름.yaml로 저장됨
- 노드 실행 시 파라미터 가져와 쓰기:
ros2 run turtlesim turtlesim_node --ros-args --params-file ./turtlesim.yaml
- 파라미터 삭제:
ros2 param delete 노드이름 파라미터