Git Product home page Git Product logo

goroslib's Introduction

goroslib

Build Status Go Report Card PkgGoDev

goroslib is a library in pure Go that allows to build clients (nodes) for the Robot Operating System (ROS).

The Robot Operating System (ROS) is a project that provides a protocol specification to make multiple programs communicate with each other over time, exchanging structured data through topics, services and parameters. It was conceived to link sensors, algorithms and actuators in unmanned ground vehicles (UGVs) and robots, but it is not bounded to the robot world and can be used anywhere there's the need of building streams of data (for example in video processing).

The official project provides libraries to write nodes in C++ and Python, but they require the download of over 1GB of data and work only through a cmake-based buildchain, that is computationally intensive and difficult to customize. This library allows to write lightweight nodes that can be built with the standard Go compiler, do not need any runtime library and have a size of some megabytes. Another advantage lies in the possibility of compiling nodes for all the Golang supported operating systems (Linux, Windows, Mac OS X, etc) and architectures.

Features:

  • Subscribe and publish to topics, with TCP or UDP
  • Call and provide services
  • Get and set parameters
  • Get infos about other nodes, topics, services
  • Use namespaces and relative topics
  • IPv6 support (only stateful addresses, since stateless are not supported by the ROS master)
  • Compilation of .msg files is not necessary, message definitions are extracted from code
  • Standard messages are available in folder msgs/
  • Compile or cross-compile ROS nodes for all Golang supported OSs (Linux, Windows, Mac OS X) and architectures
  • Examples provided for every feature, comprehensive test suite, continuous integration

The library provides its features by implementing in pure Go all the ROS protocols (xml-rpc, TCPROS, UDPROS) and APIs (Master API, Parameter Server API, Slave API). Regarding the official client requirements, the situation is shown in the table below.

requirement satisfied
implement the slave side of the master/slave API ✔️
handle node-to-node transport negotiation and connection setup ✔️
handle transport-specific serialization and deserialization of messages ✔️
parse command-line Remapping Arguments
Subscribe to a simulated Clock
publish debugging messages to rosout
depend on the roslang package, which allows rosbuild and other tools to perform appropriate actions, such as msg- and srv-based code generation impossible
object representation of message types ✔️
event loop for connection servicing ✔️
user callback invocation on message receipt ✔️

Installation

  1. Install Go ≥ 1.13.

  2. Create an empty folder, open a terminal in it and initialize the Go modules system:

    go mod init main
    
  3. Download one of the example files and place it in the folder:

  4. Compile and run (a ROS master must be already running in the background)

    go run name-of-the-go-file.go
    

Documentation

https://pkg.go.dev/github.com/aler9/goroslib

FAQs

Where can i find the standard messages?

Standard messages are listed in the documentation.

How can i define a custom message?

To define custom messages, the standard ROS C++/Python libraries require .msg files in this format:

bool field1
int32 field2

This library doesn't require any .msg file, it is enough to write Go structures in this format:

import (
    "github.com/aler9/goroslib/pkg/msgs"
)

type MessageName struct {
    msg.Package `ros:"my_package"`
    Field1 bool
    Field2 int32
}

The type of a field can be one of the following:

  • one of the primitive field types:

    • bool
    • int8
    • uint8
    • int16
    • uint16
    • int32
    • uint32
    • int64
    • uint64
    • float32
    • float64
    • string
    • time.Time
    • time.Duration
  • another standard or custom message

The name of a field must be in CamelCase, and is converted to snake_case when interacting with C++/Python nodes. If this conversion is impossible, the tag rosname can be used to override the field name:

type MessageName struct {
    msg.Package `ros:"my_package"`
    Field bool  `rosname:"FIELD"`
}

A command-line utility is provided to convert existing .msg files into their equivalent Go structures:

go get github.com/aler9/goroslib/cmd/msg-import
msg-import --rospackage=my_package mymessage.msg > mymessage.go

How can i set the namespace?

There's a field Namespace in the Node configuration:

goroslib.NewNode(goroslib.NodeConf{
    Namespace:     "/mynamespace",
    Name:          "goroslib",
    MasterAddress: "127.0.0.1:11311",
})

The default namespace is / (global namespace).

How can i compile a node for another operating system?

To compile a node for another OS, it's enough to follow the standard Golang procedure to cross-compile, that consists in setting the GOOS and GOARCH environment variables according to the target machine. For instance, to build a node for Windows from another OS, run:

GOOS=windows GOARCH=amd64 go build -o node.exe name-of-source-file.go

How can i edit the library?

If you want to hack the library and test the results, unit tests can be launched with:

make test

Links

(v1) ROS Documentation

Other Go libraries

Other non-Go libraries

Conventions

goroslib's People

Contributors

aler9 avatar knuesel avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.