Aldebaran documentation What's new in NAOqi 2.4.3?

Creating a custom main

Sometimes you may want to change the main.cpp of your module.

A typicall case may be to change the option parsing, or not use the big black box which is ALTools::mainFunction


#include <iostream>

#include <boost/shared_ptr.hpp>
#include <alerror/alerror.h>
#include <alcommon/albroker.h>
#include <alcommon/albrokermanager.h>

int main(int argc, char* argv[])

  if(argc < 2)
    std::cerr << "Usage: custommain NAO_IP" << std::endl;
    return 2;

  // We will try to connect our broker to an running NAOqi:
  const std::string parentBrokerIP = std::string(argv[1]);
  int parentBrokerPort = 9559;

  // Need this to for SOAP serialization of floats to work
  setlocale(LC_NUMERIC, "C");

  // A broker needs a name, an IP and a port:
  const std::string brokerName = "mybroker";
  // FIXME: would be a good idea to look for a free port first
  int brokerPort = 54000;
  const std::string brokerIp   = "";  // listen to anything

  boost::shared_ptr<AL::ALBroker> broker;
    broker = AL::ALBroker::createBroker(
        0    // you can pass various options for the broker creation,
             // but default is fine
  catch(const AL::ALError& /* e */)
    std::cerr << "Faild to connect broker to: "
              << parentBrokerIP
              << ":"
              << parentBrokerPort
              << std::endl;
    return 1;

  // Deal with ALBrokerManager singleton:

  // Now it's time to load your module with
  // AL::ALModule::createModule<YourModule>(broker, "YourModule");

  return 0;

Some few remarks:

  • The call to setlocale is very important. Due to SOAP issues, you must make sure your client and your server are using the same LC_NUMERIC settings.
  • In the example there is no parsing of options, so you must add the code to handle --pip and --pport yourself. Using boost::program_options, this looks like:
#include <boost/program_options.hpp>
#include <qi/application.hpp>
namespace po = boost::program_options;
po::options_description desc("Allowed options");

int main(int argc, char* argv[])

  std::string parentBrokerIP;
  int parentBrokerPort;

  qi::Application app(argc, argv);
  po::options_description desc("Allowed options");

    ("pip", po::value<std::string>(&parentBrokerIP)->default_value(""), "IP of the parent broker. Default:")
    ("pport", po::value<int>(&parentBrokerPort)->default_value(9559), "Port of the parent broker. Default: 9559")

  // Map containing all the options with their values
  po::variables_map vm;

  // program option library throws all kind of errors, we just catch them
  // all, print usage and exit
    po::store(po::parse_command_line(argc, argv, desc), vm);
  catch(po::error &e)
    std::cerr << e.what() << std::endl;
    std::cout << desc << std::endl;

  // Now use parentBrokerIP, parentBrokerPort when creating ALBroker