# SoftBank Robotics documentation What's new in NAOqi 2.8?

# Python - How to write a qimessaging client

## Introduction

This guide will teach you how to write a qimessaging client in Python, to interact with the various services offered by the robot.

### Prerequisites

- An installed python NAOqi SDK for your operating system.

### Creating an application

The first step to interact with qimessaging services is to create an Application, it will handle the connection to the robot.

    import qi

    app = qi.Application()
    app.start()
    session = app.session

### Calling a method on a service

Let us make the robot speak by using the say method of the ALTextToSpeech service.

    tts = session.service("ALTextToSpeech")
    tts.say("Hello Word")

### Starting your application

You can then run your application. It will connect to localhost by default, but you can override that.

    python MyApp.py --qi-url tcp://nao.local:9559

For more information on the arguments your application can take, see: qi application arguments.

### Making asynchronous calls using qi::async

Most of the API are designed to block until the operation started by the call completes. For example with this code inside our main:

    tts = session.service("ALTextToSpeech")
    motion = session.service("ALMotion")
    tts.say("This is a very very very very long sentence.")
    motion.moveTo(1, 0, 0); // go forward one meter

The robot will only start moving when he finishes speaking.

To perform both actions simultaneously, the API provides a special `_async` argument that performs a call in an asynchronous manner, and notifies you when the call finishes using a qi.Future:

    tts = session.service("ALTextToSpeech")
    motion = session.service("ALMotion")
    sayOp = tts.say("This is a very very very very long sentence.", _async=True)
    moveOp = motion.moveTo(1, 0, 0, _async=True)
    # Wait for both operations to terminate.
    sayOp.wait()
    moveOp.wait()

Look at the `qi.Future` for more complete documentation, but here is what you most definitely need to know:

- If the method throws an exception, it is stored in the `qi.Future`, and can be accessed using `qi.Future.error()`.
- Use `qi.Future.wait()` to wait for the future to complete. It can accept a timeout duration as argument, and will return the state of the future.
- Use `qi.Future.value()` and `qi.Future.error()` to get the stored value or error.
- You can register a callback to be notified when the future finishes with `qi.Future.add_callback()`.

Glossary Site map Index Support Contact Legal Notices