rosbag

package module
v0.0.8 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 22, 2021 License: Apache-2.0 Imports: 15 Imported by: 0

README

go-rosbag

Rosbag parser written in Go. It's designed to be lazy, low memory usage, fast, streamable, and easy-to-use.

Why?

I want to process huge Rosbag data in the backend without bringing ROS ecosystem. So, I think Go is a great language for this. Unfortunately, I couldn't find a good library to fullfil what I need.

These are the libraries that I've found in my search:

Code Coverage

Currently, the unit tests only cover the happy path, and it's not extensive as I want to be. Fuzzing has been added for testing ROS message decoding to cover data corruption. I'm still working on adding coverage during my free time.

Documentation

Overview

rosbag implements Rosbag Format Version 2.0, http://wiki.ros.org/Bags/Format/2.0. Currently, this package only implements the decoder.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Compression

type Compression string
const (
	CompressionNone Compression = "none"
	CompressionBZ2  Compression = "bz2"
	CompressionLZ4  Compression = "lz4"
)

type ConnectionHeader

type ConnectionHeader struct {
	Topic             string
	Type              string
	MD5Sum            string
	MessageDefinition MessageDefinition
}

type Decoder

type Decoder struct {
	// contains filtered or unexported fields
}

func NewDecoder

func NewDecoder(r io.Reader) *Decoder

func (*Decoder) Read added in v0.0.2

func (decoder *Decoder) Read() (Record, error)

Read returns the next record in the rosbag. Next might will return nil record and error at the beginning to mark that the rosbag format version is supported. When, it reaches EOF, Next returns io.EOF error.

type MessageDefinition

type MessageDefinition struct {
	Type   string
	Fields []*MessageFieldDefinition
}

MessageDefinition is defined here, http://wiki.ros.org/msg

type MessageFieldDefinition

type MessageFieldDefinition struct {
	Type    MessageFieldType
	Name    string
	IsArray bool
	// ArraySize is only used when the field is a fixed-size array. If it's a slice, ArraySize is -1
	ArraySize int
	// Value is an optional field. It's only being used for constants
	Value interface{}
	// MsgType is only being used when type is complex. This defines the custom
	// message type.
	MsgType *MessageDefinition
}

type MessageFieldType

type MessageFieldType uint8
const (
	MessageFieldTypeBool MessageFieldType = iota + 1
	MessageFieldTypeInt8
	MessageFieldTypeUint8
	MessageFieldTypeInt16
	MessageFieldTypeUint16
	MessageFieldTypeInt32
	MessageFieldTypeUint32
	MessageFieldTypeInt64
	MessageFieldTypeUint64
	MessageFieldTypeFloat32
	MessageFieldTypeFloat64
	MessageFieldTypeString
	MessageFieldTypeTime
	MessageFieldTypeDuration
	MessageFieldTypeComplex
)

type Op

type Op uint8
const (
	// OpInvalid is an extension from the standard. This Op marks an invalid Op.
	OpInvalid     Op = 0x00
	OpBagHeader   Op = 0x03
	OpChunk       Op = 0x05
	OpConnection  Op = 0x07
	OpMessageData Op = 0x02
	OpIndexData   Op = 0x04
	OpChunkInfo   Op = 0x06
)

type Record

type Record interface {
	// Op parses the header, and lookup for the op field
	Op() (Op, error)
	// Header returns raw header byte slice. It contains metadata for the record
	Header() []byte
	// Data returns raw data byte slice. It contains record specific data
	Data() []byte
	// Close closes the underlying memory allocation for this record so that
	// the allocated memory can be reused
	Close()
}

type RecordBagHeader

type RecordBagHeader struct {
	*RecordBase
}

RecordBagHeader occurs once in the file as the first record.

func (*RecordBagHeader) ChunkCount

func (record *RecordBagHeader) ChunkCount() (uint32, error)

ChunkCount parses Header to get a number of chunk records in the file

func (*RecordBagHeader) ConnCount

func (record *RecordBagHeader) ConnCount() (uint32, error)

ConnCount parses Header to get a number of unique connections in the file

func (*RecordBagHeader) IndexPos

func (record *RecordBagHeader) IndexPos() (uint64, error)

IndexPos parses Header to get an offset of first record after the chunk section

type RecordBase

type RecordBase struct {
	// Raw contains: <header_len><header><data_len><data>
	Raw []byte
	// HeaderLen contains length in bytes of the header
	HeaderLen uint32
	// DataLen contains length in bytes of the data
	DataLen uint32
	// contains filtered or unexported fields
}

func (*RecordBase) Close added in v0.0.5

func (record *RecordBase) Close()

func (*RecordBase) Data

func (record *RecordBase) Data() []byte

func (*RecordBase) Header

func (record *RecordBase) Header() []byte

func (*RecordBase) Op added in v0.0.4

func (record *RecordBase) Op() (Op, error)

type RecordChunk

type RecordChunk struct {
	*RecordBase
}

RecordChunk is a record that contains one or more RecordConnection and/or RecordMessageData.

func (*RecordChunk) Compression

func (record *RecordChunk) Compression() (Compression, error)

Compression parses Header to get the compression algorithm that's used for the underlying chunk data. The supported compression values are "none", "lz4", and "bz2".

func (*RecordChunk) Size

func (record *RecordChunk) Size() (uint32, error)

Size parses Header to get the size in bytes of the uncompressed chunk

type RecordChunkInfo

type RecordChunkInfo struct {
	*RecordBase
}

RecordChunkInfo contains metadata about Chunks

func (*RecordChunkInfo) ChunkPos

func (record *RecordChunkInfo) ChunkPos() (uint64, error)

ChunkPos parses Header to get the offset of the chunk record

func (*RecordChunkInfo) Count

func (record *RecordChunkInfo) Count() (uint32, error)

Count parses Header to get the number of connections in the chunk

func (*RecordChunkInfo) EndTime

func (record *RecordChunkInfo) EndTime() (time.Time, error)

EndTime parses Header to get the timestamp of latest message in the chunk

func (*RecordChunkInfo) StartTime

func (record *RecordChunkInfo) StartTime() (time.Time, error)

StartTime parses Header to get the timestamp of earliest message in the chunk

func (*RecordChunkInfo) Ver

func (record *RecordChunkInfo) Ver() (uint32, error)

Ver parses Header to get the version of this ChunkInfo record

type RecordConnection

type RecordConnection struct {
	*RecordBase
}

RecordConnection is a record that contains metadata about message data. Some of the metadata are used to encode/decode message data.

func (*RecordConnection) Conn

func (record *RecordConnection) Conn() (uint32, error)

Conn parses Header to get the unique connection ID within a bag

func (*RecordConnection) ConnectionHeader

func (record *RecordConnection) ConnectionHeader() (*ConnectionHeader, error)

ConnectionHeader reads the underlying data and decode it to ConnectionHeader

func (*RecordConnection) Topic

func (record *RecordConnection) Topic() (string, error)

Topic parses Header to get the topic

type RecordIndexData

type RecordIndexData struct {
	*RecordBase
}

func (*RecordIndexData) Conn

func (record *RecordIndexData) Conn() (uint32, error)

Conn parses Header to get the unique connection ID within a bag

func (*RecordIndexData) Count

func (record *RecordIndexData) Count() (uint32, error)

Count parses Header to get the number of messages on conn in the preceding chunk

func (*RecordIndexData) Ver

func (record *RecordIndexData) Ver() (uint32, error)

Ver parses Header to get the version of this Index record

type RecordMessageData

type RecordMessageData struct {
	*RecordBase
	// contains filtered or unexported fields
}

RecordMessageData contains the serialized message data in the ROS serialization format.

func (*RecordMessageData) Conn

func (record *RecordMessageData) Conn() (uint32, error)

Conn parses Header to get the unique connection ID within a bag

func (*RecordMessageData) ConnectionHeader added in v0.0.4

func (record *RecordMessageData) ConnectionHeader() *ConnectionHeader

ConnectionHeader returns the parsed ROS connection header.

func (*RecordMessageData) Time

func (record *RecordMessageData) Time() (time.Time, error)

Time parses Header to get the timestamp when this message was recorded. Note that this timestamp is different from the message header timestamp from ROS. The main difference is that this timestamp is the retrieved time NOT sent time.

func (*RecordMessageData) ViewAs added in v0.0.8

func (record *RecordMessageData) ViewAs(v interface{}) error

ViewAs views the underlying raw data in the given v format. When possible, View will convert raw data without making a copy. With no copy, decoding large arrays become really fast! But, this also means that any data types that are reference based can't be used after this Record is closed.

So, if the data is absolutely needed after reading this record, you MUST NOT CLOSE this record so that the underlying raw data is not overwritten by other records.

type Rosbag

type Rosbag struct {
	Version Version
	Record  []Record
}

type Version

type Version struct {
	Major uint
	Minor uint
}

func (*Version) String

func (version *Version) String() string

Directories

Path Synopsis
examples

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL