ROSSerial Message Format

In RIC we only use the basic formatting of the ROSSerial protocol and not the publish/subscribe mechanism of ROS. In ROSSerial message formats are predefined and must be understood by both both RIC and the interface software.

A rosserial packet looks like this:

  1st Byte - Sync Flag (Value: 0xff)
  2nd Byte - Sync Flag / Protocol version
  3rd Byte - Message Length (N) - Low Byte
  4th Byte - Message Length (N) - High Byte
  5th Byte - Checksum over message length
  6th Byte - Topic ID - Low Byte
  7th Byte - Topic ID - High Byte
  x Bytes  - Serialized Message Data
  Byte x+1 - Checksum over Topic ID and Message Data

The ROSSerial format is described in more detail on the ROS wiki

Marty v2 ROSSerial interface

Marty 2 ROSSerial messages are different from Marty 1 and Marty 1 messages are not supported by Marty 2.

Publishers from Marty

Topic Name

Msg Type



Code: 120

SmartServo []


uint8 IDNo

int16 position

int16 motorCurrent

byte status

An array of smart servo info each 6 bytes long

IDNo is the index of the motor in the order described elsewhere with Left Hip == 0

position is an int16, same format as commanded positions, -32768 indicates an unknown value

motorCurrent in milliamps, -32768 indicates an unknown value

status byte is as reported by the servo


Code 121


(float32 x, float32 y, float32 z)

The x,y,z of the built in accelerometer


Code 122

uint8 remCapPC

uint8 tempDegC

uint16 remCapMAH

uint16 fullCapMAH

int16 currentMA

uint16 powerOnTimeSecs

uint16 powerFlags

Power status information

Remaining capacity percentage (0..100)

Battery temperature degC

Remaining capacity mAh

Battery fully charged mAh

Current in mA, +ve means charging

Time 5V has been on for in seconds

Power Flags:

bit 0 == on USB power

bit 1 == 5V is turned on

bit 2 == battery info is NOT valid

bit 3 == USB power info is NOT valid


AddOnInfo []


uint8 IDNo

uint8 StatusFlags

uint8 [10] RecentData

An array of add-on info each 12 bytes long

IDNo is the IDNo of the add-on see hwstatus information for ordering but note this is dynamically allocated

Status Flags:

bit 7 (mask 0x80) indicates data is fresh (0 indicates stale)

RecentData is the 10 bytes most recently read from the add-on during polling


(orginal 2 byte message)

New 24 byte message: added to RIC Firmware in 2021

NOTE: martypy and other interfaces need to be able to cope with both message lengths

uint8 MotionFlags

uint8 queueLen

uint32 heapFree

uint32 heapMin

uint32 pix0_RGBT

uint32 pix1_RGBT

uint32 pix2_RGBT

uint8 sysManLoopMsAvg

uint8 sysManLoopMsMax





number of queued work items (255 indicates >=255)

heap free space in bytes

heap minimum (lower watermark) bytes

RGBT means RGB (big endian) value in 1st 3 bytes and pixel state in last byte where 0 == off, 1 == on, 2 == breath, 3 == override

average and max ms for SysManager loop (main service loop). 255 indicates >= 255