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

# Motion task

NAOqi Motion - Overview | API

## What it does

In ALMotion, every time you call a public method to request a motion, a “motion task” is created to handle the job. At each ALMotion cycle, the task will compute the elementary commands (changes in motor angles and stiffnesses) to perform the motion.

Examples of motion tasks include the walk, the fall manager, the joint-space interpolator.

## How it works

Several motion tasks can coexist. For instance, a task may handle the walk while another controls the arms motion. To prevent several concurrent tasks from sending inconsistent motion commands to the same motors, the tasks are required to declare and book the resources they will control, such as a motor angle or stiffness.

If some resources needed for its execution are unavailable, the task manager will refuse to start a task. It is however possible to free the resources by killing the tasks that are using them.

Note

The resources mentioned here are for ALMotion use only and are different from the ones that are used in Choregraphe and managed by ALResourceManager.

## Use Cases

### Case 1: Resource unavailable: tasks get postponed

In the following example, two motions tasks attempt to control the same joint. As the corresponding resource is owned by the first task, the second one is postponed until the resource is freed.

`almotion_taskManagement1.py`

    #! /usr/bin/env python
    # -*- encoding: UTF-8 -*-

    """Example: Task management - the second motion is postponed"""

    import qi
    import argparse
    import sys
    import math
    import time

    def main(session):
        """
        Task management: the second motion is postponed
        """
        # Get the service ALMotion.

        motion_service = session.service("ALMotion")

        # Wake up robot
        motion_service.wakeUp()

        # go to an init head pose.
        names  = ["HeadYaw", "HeadPitch"]
        angles = [0.0, 0.0]
        times  = [1.0, 1.0]
        isAbsolute = True
        motion_service.angleInterpolation(names, angles, times, isAbsolute)

        # move slowly the head to look in the left direction. The motion will
        # take 4 seconds
        names  = "HeadYaw"
        angles = math.pi/2.0
        times  = 4.0
        isAbsolute = True
        motion_service.angleInterpolation(names, angles, times, isAbsolute, _async=True)

        time.sleep(1.0)

        # one second after having started motion1, check the resources use.
        # As expected the "HeadYaw" resource is busy
        isAvailable = motion_service.areResourcesAvailable([names])
        print("areResourcesAvailable({0}): {1}".format([names], isAvailable))

        time.sleep(1.0)

        # try to look in the right direction. As the "HeadYaw" joint is busy,
        # this motion is postponed until the resource is freed
        angles = -math.pi/2.0
        times  = 2.0
        isAbsolute = True
        motion_service.angleInterpolation(names, angles, times, isAbsolute, _async=True)

        time.sleep(3.0)
        # Go to rest position
        motion_service.rest()

    if __name__ == "__main__":
        parser = argparse.ArgumentParser()
        parser.add_argument("--ip", type=str, default="127.0.0.1",
                            help="Robot IP address. On robot or Local Naoqi: use '127.0.0.1'.")
        parser.add_argument("--port", type=int, default=9559,
                            help="Naoqi port number")

        args = parser.parse_args()
        session = qi.Session()
        try:
            session.connect("tcp://" + args.ip + ":" + str(args.port))
        except RuntimeError:
            print ("Can't connect to Naoqi at ip \"" + args.ip + "\" on port " + str(args.port) +".\n"
                   "Please check your script arguments. Run with -h option for help.")
            sys.exit(1)
        main(session)

### Case 2: Moving a joint without delay

In this example, motions are required using the `setAngles` method, which does not lock the resource. The target can be changed without delay.

`almotion_taskManagement2.py`

    #! /usr/bin/env python
    # -*- encoding: UTF-8 -*-

    """Example: Task management - the second motion is not postponed"""

    import qi
    import argparse
    import sys
    import math
    import time

    def main(session):
        """
        Task management - the second motion is not postponed
        """
        # Get the service ALMotion.

        motion_service = session.service("ALMotion")

        # Wake up robot
        motion_service.wakeUp()

        # go to an init head pose.
        names  = ["HeadYaw", "HeadPitch"]
        angles = [0., 0.]
        times  = [1.0, 1.0]
        isAbsolute = True
        motion_service.angleInterpolation(names, angles, times, isAbsolute)

        # move slowly the head to look in the left direction
        names  = "HeadYaw"
        angles = math.pi/2
        fractionMaxSpeed = .1
        motion_service.setAngles(names, angles, fractionMaxSpeed)

        time.sleep(1.)

        # while the previous motion is still running, update the angle
        angles  = -math.pi/6
        fractionMaxSpeed  = 1.
        motion_service.setAngles(names, angles, fractionMaxSpeed)

        time.sleep(2.0)
        # Go to rest position
        motion_service.rest()

    if __name__ == "__main__":
        parser = argparse.ArgumentParser()
        parser.add_argument("--ip", type=str, default="127.0.0.1",
                            help="Robot IP address. On robot or Local Naoqi: use '127.0.0.1'.")
        parser.add_argument("--port", type=int, default=9559,
                            help="Naoqi port number")

        args = parser.parse_args()
        session = qi.Session()
        try:
            session.connect("tcp://" + args.ip + ":" + str(args.port))
        except RuntimeError:
            print ("Can't connect to Naoqi at ip \"" + args.ip + "\" on port " + str(args.port) +".\n"
                   "Please check your script arguments. Run with -h option for help.")
            sys.exit(1)
        main(session)

Glossary Site map Index Support Contact Legal Notices