This guide will teach you how to write a qimessaging client in C++, to interact with the various services offered by the robot.
First you need to write the function that does the work you want.
You can use the qi::Session::service method to get access to a service (local
or remote).  This method will return a qi::AnyObject. In this example, the
danceManager object works as any other qi::AnyObject, please refer to its
documentation for more details.
#include <qi/session.hpp>
void dance(qi::SessionPtr session)
{
  qi::AnyObject danceManager = session->service("DanceManager");
  danceManager.call<void>("dance");
  // this function blocks here, it should return a future
  // we keep the function like this for the sake of the simplicity of this example
}
Then you must register your function in the module. If you don’t want to use modules, you can skip directly to the Manual way section.
void registerDance(qi::ModuleBuilder* mb)
{
  mb->advertiseMethod("dance", &dance);
}
QI_REGISTER_MODULE("dancemodule", ®isterDance);
Finally, create your module through CMake.
cmake_minimum_required(VERSION 2.8)
project(dancedancerotation)
find_package(qibuild)
find_package(qimodule)
qi_create_module(dancemodule
  SRC
    src/dance.cpp
  DEPENDS
    QI
)
Warning
The name you give to QI_REGISTER_MODULE in the C++ file must be the same
as the one you give to qi_create_module in the CMake file.
qilaunch can be used to call a function in a module. So, with the module you just created, qilaunch can take care of all the boiler plate of parsing arguments, connecting a session, forwarding logs, etc, and just run that function.
To run your function, just do:
qilaunch -n dancedanceman --function dancemodule.dance
If you don’t want to use qilaunch, you can write your own main function.
The first step to interact with qi services is to connect a
qi::Session to the Service Directory
of the robot. The Service Directory address is represented by a standard URL.
One simple way to achieve this is to use the helper class ApplicationSession, which will fetch the URL from the command line (using the –qi-url option), or use a default value of localhost.
Finally, you call qi::Session::asyncCallModule to call the function and give
the session as the first parameter automatically.
#include <qi/applicationsession.hpp>
int main(int argc, char** argv)
{
  qi::ApplicationSession app(argc, argv);
  app.startSession(); // connect the session
  qi::SessionPtr session = app.session();
  qi::Future<void> future = session->asyncCallModule("dancedance.dance");
  future.value(); // wait for the end
  return 0;
}
If you don’t want to use module, you can of course call your function directly. The code is very similar to the semi-automated way.
#include <qi/applicationsession.hpp>
#include "dance.hpp"
int main(int argc, char** argv)
{
  qi::ApplicationSession app(argc, argv);
  app.startSession(); // connect the session
  qi::SessionPtr session = app.session();
  dance(session);
  return 0;
}