Motion task

On this page

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)