by RethinkRobotics-opensource

RethinkRobotics-opensource / rosnodejs

Client library for writing ROS nodes in JavaScript with nodejs

136 Stars 60 Forks Last release: 9 months ago (3.0.2) Apache License 2.0 135 Commits 8 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

rosnodejs Build Status


npm install rosnodejs

Start a node

const rosnodejs = require('rosnodejs');
.then(() => {
  // do stuff


const nh = rosnodejs.nh;
const sub = nh.subscribe('/chatter', 'std_msgs/String', (msg) => {
  console.log('Got msg on chatter: %j', msg);

const pub = nh.advertise('/chatter', 'std_msgs/String'); pub.publish({ data: "hi" });

Udp transport (Experimental)

const nh = rosnodejs.nh;
const sub = nh.subscribe('/chatter', 'std_msgs/String', (msg) => {
  console.log('Got msg on chatter: %j', msg);
}, {
  transports: ["TCPROS", "UDPROS"],  // specify transports, default ["TCPROS"]
  dgramSize: 1500   // optional: datagram packet size, default: 1500 bytes

const pub = nh.advertise('/chatter', 'std_msgs/String'); pub.publish({ data: "hi" });


const service = nh.advertiseService('/add_two_ints', 'beginner_tutorials/AddTwoInts', (req, resp) => {
  res.sum = req.a + req.b;
  return true;

const client = nh.serviceClient('/add_two_ints', 'beginner_tutorials/AddTwoInts');{a: 1, b: 2});


nh.setParam('val', 2);
.then((val) => {
  // do stuff

Generating Messages

Messages can be generated in a number of ways depending on the versions of ROS and Node.js you're using. - catkin - works in ROS Kinetic and later for Node.js v6+.

$ catkin_make
$ catkin build
- One-time "build" call available through
for versions of ROS before Kinetic and Node.js v6+. Should be called separately and in advance of processes attempting to use messages.
const rosnodejs = require('rosnodejs');
- On the fly - all versions of ROS and Node.js 4.5+. When generating on the fly, messages can not be required until the node has initialized.
const rosnodejs = require('rosnodejs');
rosnodejs.initNode('my_node', { onTheFly: true }).then(() => {
  const stdMsgs = rosnodejs.require('std_msgs');

| |Pre-Kinetic|Kinetic & Later| |:---:|:---:|:---:| |Node.js >= v6|

, on the fly|catkin,
, on the fly| |Node.js < v6|on the fly|on the fly|

Using Messages

const sensorMsgs = rosnodejs.require('sensor_msgs');

const image = new sensorMsgs.msg.Image(); const temperature = new sensorMsgs.msg.Temperature({ temperature: 32 });

const SetCameraInfo = sensorMsgs.srv.SetCameraInfo; const setRequest = new SetCameraInfo.Request();

// messages can be used when advertising/subscribing const nh = rosnodejs.nh; const StringMsg = rosnodejs.require('std_msgs').msg.String; const sub = nh.subscribe('/chatter', StringMsg, (msg) => { ... }); const pub = nh.advertise('/chatter', StringMsg);

const AddTwoInts = rosnodejs.require('beginner_tutorials').srv.AddTwoInts; const service = nh.advertiseService('/add_two_ints', AddTwoInts, (req, resp) => { ... }); const client = nh.serviceClient('/add_two_ints', AddTwoInts);

Actions (Experimental)

const nh = rosnodejs.nh;
const as = new rosnodejs.ActionServer({
  type: 'turtle_actionlib/Shape',
  actionServer: '/turtle_shape'

as.on('goal', function (goal) { goal.setAccepted(); });


const ac = new rosnodejs.ActionClient({ nh, type: 'turtle_actionlib/Shape', actionServer:'/turtle_shape' });

ac.sendGoal({edges: 3, radius: 1});

Run the turtlesim example


rosrun turtlesim turtlesim_node
rosrun turtle_actionlib shape_server

Then run

node src/examples/turtle.js

or, if you are running an older version of node:

npm run compile
node dist/examples/turtle.js



for a more catkin-inspired take on using


Inspired By

was inspired by other work that you can learn more about here - roscpp & rospy - Robots as web services - ROSBridge - roslibjs

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.