Skip to main content

ROS

ROS utils for use in Transitive robot capabilities. Supports both ROS 1 (using rosnodejs) and ROS 2 (using rclnodejs). The respective classes ROS1 and ROS2 have a unified interface, so that switching between ROS releases is trivial as can be seen in the example below.

Install

npm i @transitive-sdk/utils-ros

Example

This example requires a running roscore for ROS 1.

const { ROSs, getForVersion } = require('@transitive-sdk/utils-ros');

const demo = async (version) => {
const ros = getForVersion(version);
await ros.init();

const topic = '/utils_ros/test1';
const type = version == 1 ? 'std_msgs/String' : 'std_msgs/msg/String';

const interval = setInterval(() => {
ros.publish(topic, type, {data: String(Date.now())});
});

const sub = ros.subscribe(topic, type, (msg) => {
console.log('received', msg.data);
});
};

demo(1); // run demo using ROS1
demo(2); // run demo using ROS2

ROSfs

Extends AbstractROS(EventEmitter)

A class that is interface-compatible with our ROS and ROS2 classes, but uses the filesystem for pub and sub instead. For non-ROS users, low rate. To enable, set global.rosFs to a truthy value in config.json.

Config options:

  • basePath (default: '/tmp/transitive-ros-fs/'): the root of the file-tree where to publish and subscribe to "topics", i.e., files.
  • publishInterval (default 10000, min: 1000): throttle interval (in ms) for publishing.

Example assuming default config:

  • publish('/my/topic', null, {mytime: 1778801349319}) would write the given JSON to /tmp/transitive-ros-fs/my/topic.
  • subscribe('/my/topic', null, console.log) would watch /tmp/transitive-ros-fs/my/topic and, on changes, print the new content to the console (JSON parsed).

publish

Publish the given message (json) on the named "topic", i.e., filepath.

subscribe

subscribe to topic: start watching the respective directory and register event handler

Parameters
  • topic
  • _type
  • onMessage

unsubscribe

Unsubscribe from topic

Parameters
  • topic

refreshFromFile

Refresh and emit the topic value from file; debounced to handle repeat triggers caused by many ways of modifying the file (including echo "test" > file and some editors)

ROS

Extends AbstractROS()

Small convenient singleton class for interfacing with ROS, including some auxiliary functions that come in handy in capabilities. Based on rosnodejs.

callAction

Call an action, i.e., send goal to action server

Parameters
  • actionServer
  • type
  • goal
  • feedbackCallback (optional, default undefined)

callService

Call the given service of the given type with the given body (not required when type is "std_srvs/Empty").

Parameters
  • serviceName
  • type
  • requestBody (optional, default undefined)

createHeader

create a std_msgs/Header for the given frame_id and date

Parameters
  • frame_id (optional, default '')
  • date (optional, default new Date())

getActions

Get available actions

getAvailableTypes

Get all known message and service types, grouped by package.

getParam

Get the value of the given ROS parameter

Parameters
  • param

getServices

Get available services (list of names).

getServiceType

Get type of a given service. Note that in ROS 1 this requires connecting to the service provider directly, and we don't want to poll all of them. So only use this on-demand.

Parameters
  • service

getSubscribedTopics

Get topics that have subscribers

Parameters
  • type (optional, default undefined)

getTopics

Get all topic of a given type or all topics if no type is specified

Parameters
  • type (optional, default undefined)

getTypeTemplate

Given a package, category, and type, e.g., 'std_msgs', 'msg', and 'String', return a plain object representing that type, which can be used as a template for creating messages.

Parameters
  • pkg
  • category
  • type
  • response (optional, default false)

init

Initialize ROS node. This needs to be called first.

Parameters
  • suffix (optional, default '')

publish

Publish the given message (json) on the names topic of type. Will advertise the topic if not yet advertised.

Parameters
  • topic
  • type
  • message
  • latching (optional, default true)

setParam

Set the value of the given ROS parameter

Parameters
  • param
  • value

subscribe

Subscribe to the named topic of the named type. Each time a new message is received the provided callback is called. Here options is an optional object: { "throttleMs": throttle-in-milliseconds }.

Parameters
  • topic
  • type
  • onMessage
  • options (optional, default {})

unsubscribe

Unsubscribe from topic

Parameters
  • topic

ROS0

Extends AbstractROS(EventEmitter)

A class that is interface-compatible with our ROS and ROS2 classes, but connects to ZeroMQ addresses for pub and sub instead. For non-ROS users. To enable, set global.rosFs to a truthy value in config.json. Config options:

  • address (default 'ipc:///tmp/transitive-zmq.sock'): the zeroMQ address to connect Publisher (+.pub suffix) and connect Subscriber (+.sub suffix) to.

init

Open two UNIX domain sockets: one for pushing and one for pulling

Parameters
  • config

processQueue

(Re-)start queue processing if not already running

publish

Publish the given message (json) on the names topic of type. Will advertise the topic if not yet advertised.

Parameters
  • topic
  • _type
  • message
  • latching (optional, default true)

subscribe

Subscribe to the named topic of the named type. Each time a new message is received the provided callback is called.

Parameters
  • topic
  • _type
  • onMessage

unsubscribe

Unsubscribe from topic

Parameters
  • topic

watchForMessages

Start watching for messages; Do not await this!

ROS2

Extends AbstractROS()

Small convenient singleton class for interfacing with ROS2, including some auxiliary functions that come in handy in capabilities. Based on rclnodejs.

callAction

Call an action, i.e., send goal to action server

Parameters
  • action
  • type
  • goal
  • feedbackCallback (optional, default undefined)

callService

Call the given service of the given type with the given body (not required when type is "std_srvs/srv/Empty").

Parameters
  • serviceName
  • type
  • request (optional, default undefined)

createHeader

create a std_msgs/Header for the given frame_id and date

Parameters
  • frame_id (optional, default '')
  • date (optional, default new Date())

getActions

Get available actions

getAvailableTypes

Get all known message, service, and action types, grouped by package.

getParam

Get the named parameter. If node is not given, then from our own params. Example: await getParam('background_b', '/turtlesim')

Parameters
  • param
  • node (optional, default undefined)

getServices

Get list of available services (list of names).

getServiceType

Get type of a given service.

Parameters
  • service

getSubscribedTopics

Get topics that have subscribers

Parameters
  • type (optional, default undefined)

getTopics

Get all topic of a given type or all topics if no type is specified

Parameters
  • type (optional, default undefined)

getTypeTemplate

Given a package, category, and type, e.g., 'std_msgs', 'msg', and 'String', return a plain object representing that type, which can be used as a template for creating messages.

Parameters
  • pkg
  • category
  • type
  • response (optional, default false)

init

Initialize ROS node. This needs to be called first.

Parameters
  • suffix (optional, default '')

publish

Publish the given message (json) on the names topic of type. Will advertise the topic if not yet advertised.

Parameters
  • topic
  • type
  • message
  • latching (optional, default false)

setParam

Set parameter param to value, auto-detecting the type of value. If the node argument is not given, it's applied to the current node params. Example: await setParam('background_b', 188, '/turtlesim')

Parameters
  • param
  • value
  • node (optional, default undefined)

subscribe

Subscribe to the named topic of the named type. Each time a new message is received the provided callback is called. For available options see https://robotwebtools.github.io/rclnodejs/docs/0.22.3/Node.html#createSubscription. The default options.qos.reliability is best-effort. The options object can contain: "throttleMs": throttle (in milliseconds).

Parameters
  • topic
  • type
  • onMessage
  • options (optional, default {})

unsubscribe

Unsubscribe from topic

Parameters
  • topic

AbstractROS

An abstract base class for all our ROS and pseudeo-ROS implementations.

Parameters

  • BaseClass (optional, default Object)

getForVersion

Get the correct instance for the given ROS version (1 or 2).

Parameters

  • version

getROS2GoalStatus

Look up ROS2 goal status for given ROS1 goal handle

Parameters

  • goalHandle

mapRos1GoalStatusToRos2

mapping from ROS1 goal statuses to ROS2