Client library for writing ROS nodes in JavaScript with nodejs
npm install rosnodejs
const rosnodejs = require('rosnodejs'); rosnodejs.initNode('/my_node') .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" });
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, res) => { res.sum = req.a + req.b; return true; });const client = nh.serviceClient('/add_two_ints', 'beginner_tutorials/AddTwoInts'); client.call({a: 1, b: 2});
nh.setParam('val', 2); nh.getParam('val') .then((val) => { // do stuff });
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 OR $ catkin build-
loadAllPackages()- One-time "build" call available through
rosnodejsfor 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'); rosnodejs.loadAllPackages();- 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|
loadAllPackages(), on the fly|catkin,
loadAllPackages(), on the fly| |Node.js < v6|on the fly|on the fly|
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, res) => { ... }); const client = nh.serviceClient('/add_two_ints', AddTwoInts);
const nh = rosnodejs.nh; const as = new rosnodejs.ActionServer({ nh, type: 'turtle_actionlib/Shape', actionServer: '/turtle_shape' });as.on('goal', function (goal) { goal.setAccepted(); });
as.start();
const ac = new rosnodejs.ActionClient({ nh, type: 'turtle_actionlib/Shape', actionServer:'/turtle_shape' });
ac.sendGoal({edges: 3, radius: 1});
Start:
roscore 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
rosnodejs_examplesfor a more catkin-inspired take on using
rosnodejs.
rosnodejswas inspired by other work that you can learn more about here - roscpp & rospy - Robots as web services - ROSBridge - roslibjs