컴퓨터 자원의 종류와 ROS 지원
- ROS 설치 가능
- ARM A-class - Samsung Exynos... / ODROID...
- x86 - Intel Core i-series... / Intel NUC...
- ROS 설치 불가능
- 32-bit MCU - ARM Cortex-M0, ARM Cortex-M7 ...
- 8/16-bit MCU - Atmel AVR, Arduino Leonardo ...
- PC와는 달리 임베디드 시스템에서는 ROS 설치 불가능
- 대신 ROS가 설치 가능한 하드웨어와 USB로 연결이 가능(ROS는 rosserial이라는 패키지를 제공 / PC 등에서 구동)
- 임베디드 시스템은 모터 제어, 센서 조정 값 등을 ROS가 설치된 PC로 전달
rosserial
- PC와 제어기 간의 메시지 통신을 위해 중계자 역할을 수행하는 ROS 패키지
rosserial server
- rosserial_python: python 기반 rosserial server, 제일 많이 사용됨
- rosserial_server: C++ 기반, 일부 기능 제약
- rosserial_java: Java 기반, 안드로이드 SDK와 사용
rosserial client
- rosserial_arduino: Arduino와 Leonardo 지원, OpenCR은 수정하여 사용
- rosserial_embeddedlinux: 임베디드용 리눅스용 라이브러리
- rosserial_windows: 윈도우 운영체제 지원
- rosserial_mbed: ARM의 mbed 지원
- rosserial_tivac: TI사의 Launchpad 지원
rosserial 프로토콜
메시지는 시리얼로 1byte(8bits)씩 전송되고 각각 아래의 순서와 정보로 전달된다.
- 1st Byte - Sync Flag: 패킷의 시작 위치를 알기 위한 헤더
- 2nd Byte - Sync Flag / Protocol version: 프로토콜 버전
- 3rd Byte - Message Length(N) - Low Byte: 메시지의 데이터 길이, Low가 먼저 전송됨
- 4th Byte - Message Length(N) - High Byte: 메시지의 데이터 길이, High가 나중에 전송됨
- 5th Byte - Checksum over message length: 메시지 길이 헤더의 유효성 검증을 위한 체크섬. Checksum = 255 - ((Message Length Low Byte + Message Length High Byte) % 256)
- 6th Byte - Topic ID - Low Byte: 메시지의 형태를 구분하기 위한 ID의 Low Byte
- 7th Byte - Topic ID - High Byte: 메시지의 형태를 구분하기 위한 ID의 High Byte
- N Byte - Serialized Message Data: 송/수신 메시지를 시리얼 형태로 전송하기 위한 데이터. ex) IMU, TF, GPIO 데이터
- Byte N+8 - Checksum over Topic ID and Message Data: Topic ID와 메시지 데이터의 유효성 검증을 위한 체크섬. Checksum = 255 - ((Topic ID Low Byte + Topic ID High Byte + data byte values) % 256)
rosserial 제약사항
- 메모리: 퍼블리셔, 서브스크라이버 개수 및 송신, 수신 버퍼의 크기를 미리 정의해야 함
- Float64: 마이크로컨트롤러는 64비트 실수연산을 지원하지 않아 32비트형으로 변경
- Strings: 문자열 데이터를 String 메시지 안에 저장하지 않고 외부에서 정의한 문자열 데이터의 포인터 값만 메시지에 저장
- Arrays: 메모리 제약사항으로 배열의 크기를 지정해서 사용
- 통신 속도: UART 같은 경우 115200bps와 같은 속도로는 메시지의 개수가 많아지면 응답 및 처리속도가 느려짐
출처
- ROS 강의 Chapter9. 임베디드 시스템: https://www.youtube.com/watch?v=VKNVj9IDMeo&list=PLRG6WP3c31_VIFtFAxSke2NG_DumVZPgw&index=9
- Roswiki: http://wiki.ros.org/rosserial/Overview/Protocol