Effectors

Cartesian methods accept commands for the five chains plus 'Torso'. The position of these control points is shown below. These names can also be used in joint control to refer to the collection of joints in each chain.

// effector names "Head" ( At the neck joint ) "LArm" ( Inside the hand ) "LLeg" ( Below the ankle ) "RLeg" ( Below the ankle ) "RArm" ( Inside the hand ) "Torso" ( A reference point in the torso )

Effectors

Spaces

When creating a command for NAO, much attention needs to be placed on the space used to define the command, as a mistake in space could lead to disastrous results.

  • Torso Space. This is attached to NAO's torso reference, so moves with NAO as he walks and changes orientation as he leans. This space is useful when you have very local tasks, that make sense in the orientation of the torso frame.
  • World Space. This is a fixed origin that is never altered. It is left behind when NAO walks, and will be different in z rotation after NAO has turned. This space is useful for calculations which require an external, absolute frame of reference.
  • NAO Space. This is average of the two feet positions projected around a vertical z axis. This space is useful, because the x axis is always forwards, so provides a natural ego-centric reference.

When executing a task, the space is determined when the task begins, and remains constant throughout the rest of the interpolation. i.e. the interpolation, once defined, will not change as the reference changes due to the legs moving or the torso orientation changing.

Axis Masks

When controlling NAO's arms, he does not have enough degrees of freedom to be able to realize a task that has six constraints.

Using an Axis Mask, you can define which axis you wish to control. The axis mask is passed as a single parameter (an int) which can be calculated using the definitions below:

#define AXIS_MASK_X 1 #define AXIS_MASK_Y 2 #define AXIS_MASK_Z 4 #define AXIS_MASK_WX 8 #define AXIS_MASK_WY 16 #define AXIS_MASK_WZ 32

For instance, if you wish to control just the position, you would do the calculation:

// An Axis Mask for Position only: 7 int axisMask = AXIS_MASK_X + AXIS_MASK_Y + AXIS_MASK_Z;

The axis mask is executed in the same space used to define your task. It has the effect of liberating the constraint on each axis which is not part of the mask. Note carefully that a mask in world space is likely to be very different to one torso space.

Note:

For the Torso, LLeg and RLeg effectors, the axes which are not part of the mask will have a fixed position. i.e. they will not move while performing the task.

For the Head, LArm and RArm effectors, the axes which are not part of the mask are not constrained. i.e. free to move in order to perform the task.





Copyright © 2010 Aldebaran-Robotics - All rights reserved