SoftBank Robotics documentation What's new in NAOqi 2.8?

JavaScript SDK

Documentation for QiMessaging JavaScript 1.0 is also available.

Introduction

The LibQi JavaScript SDK provides bindings to use LibQi services in JavaScript.

This library can be used to build HTML5 applications for your robot.

What is new

Here is a list of major changes since QiMessaging JavaScript 1.0:

  • LibQi now uses Promise/A+;
  • QiSession creation has been simplified;
  • LibQi properties can now be used in JavaScript;
  • QiSession.socket() has been removed so as to ease backward compatibility maintenance;
  • Binary buffers are now serialized as Arrays of unsigned bytes instead of base 64 strings.

You may want to take a look at How to migrate from version 1.0 to 2.

Including the library

qi.js

The client page requires the inclusion of LibQi which is hosted on the robot.

<script src="/libs/qi/2/qi.js"></script>

Promise/A+

The library makes use of native ECMAScript 6 Promise/A+, which are now widely available.

If you are currently developing for an older browser, you can use a polyfill such as:

<script src="https://www.promisejs.org/polyfills/promise-6.0.0.min.js"></script>

Creating a QiSession

Initialization

The bindings provide only one class: QiSession. This object connects to the robot and gets proxies to services.

QiSession() can take three arguments:

  • a callback which will be fired upon connection;
  • a callback which will be fired upon disconnection;
  • an optional host name or address which defaults to window.location.host.
QiSession(function (session) {
  console.log("connected!");
  // you can now use your QiSession
}, function () {
  console.log("disconnected");
});

Please note the QiSession object will actually be given to the first callback. You can then call service().

service()

You can call this function to get a JavaScript proxy to any service, also known as modules. Services are JavaScript bound objects providing corresponding NAOqi APIs through Calls, Signals and Properties.

QiService() takes a string corresponding to the service name, and returns a Promise which, upon fulfilled request, fires a callback with the proxy object.

QiSession.connect(function (session) {
  session.service("ALTextToSpeech").then(function (tts) {
    // tts is a proxy to the ALTextToSpeech service
  }, function (error) {
    console.log("An error occurred:", error);
  });
}, ...);

Using services

Calls

Service calls are only JavaScript function calls returning Promises. They are entirely asynchronous and take two callbacks, called respectively in case of success or failure.

tts.getLanguage().then(function (lang) {
  console.log("I speak " + lang);
}, function (error) {
  console.log("An error occurred: " + error);
});

Signals

Signals are JavaScript objects inside a service, that provide two methods, connect() and disconnect(), respectively to subscribe and unsubscribe. The first one will return an id that must be used by the second one for unregistration.

The example below connects to a signal, and once fired, disconnects.

var signalLink;
var serviceDirectory;

function onServiceAdded(serviceId, serviceName)
{
  console.log("New service", serviceId, serviceName);
  serviceDirectory.serviceAdded.disconnect(signalLink);
}

session.service("ServiceDirectory").then(function (sd) {
  serviceDirectory = sd;
  serviceDirectory.serviceAdded.connect(onServiceAdded).then(function (link) {
    signalLink = link;
  }, function (error) {
    console.log("An error occurred: " + error);
  });
);

Compatibility between Signals and ALMemory

ALMemory events cannot be directly used as LibQi signals. An extra step is needed, where ALMemory events are converted to signals using ALMemory::subscriber().

session.service("ALMemory").then(function (ALMemory) {
  ALMemory.subscriber("FrontTactilTouched").then(function (subscriber) {
    // subscriber.signal is a signal associated to "FrontTactilTouched"
    subscriber.signal.connect(function (state) {
      console.log(state == 1 ? "You just touched my head!" : "Bye bye!");
    });
  });
});

Properties

Qi properties behave like Signals, but provide two other methods: setValue() and value().

session.service("myservice").then(function (service) {
  service.prop.connect(function (value) {
    console.log("Value changed to", value);
    service.prop.value().then(function (v) {
      console.log("Current value is", v);
    });
  }).then(function (link) {
    service.prop.setValue(42); // will trigger callback
  });
});