Home

Awesome

AffAction

Affordances and actions for robot behavior generation.

Concepts

Conceptually, this project connects a semantic text-level action language with the low-level motor control of a robot (or its simulation).

We represent a scene as a composition of several objects, each of them comprising several affordances. For instance, a table can have the "Supportable" affordance to indicate that something can be put on its support surface. Similarly, objects can have the Affodance to be "Graspable", where this can be detailed down to "Powergraspable" for cylindrical objects etc. Affordance come typically with a coordinate frame that describes the geometry of its interaction. For instance, the "Powergraspable" affordance is described by a frame that has the z-axis pointing into the invariant rotation direction.

The scene also contains a set of Manipulators that are composed of several "Capabilities". A "Capability" can for instance be a "Powergrasp", a "Palmgrasp", a "FingerpushCapability" and more. At runtime, an action is checking all possible combinations of Capabilities and Affordances, and computes the feasible pairs.

Here is an example: The action "get apple" leads to:

Actions

The "get" action

get(<object-to-pick-up> <which-hand (optional)> <"from" parent-object (optional>)

Grasps an object and lifts it a little bit up. If no manipulator (which-hand) is given, the action will determine the best possible manipulator. Internally, the action matches the manipulator's capabilities with the object's affordances. These combinations are supprted:

AffordanceCapability
PowerGraspablePowergraspCapability
PincerGraspablePincergraspCapability
BallGraspablePincergraspCapability
PalmGraspablePalmgraspCapability

The set of matches is evaluated, and the best feasible one is determned. If the "from" attribute is used, the object-to-pick-up is determined as being a child of the object-to-pick-up. This allows to give a spatial constraint in case there are several objects with the same name. For instance:

get lemon from cutboard   // Gets a lemon that is a child of the cutboard. The hand is auto-selected.
get apple_1 hand_right    // Gets the apple_1 with the right hand.

The "put" action

put(<object to put down>, <location-hint (optional)> <which-hand (optional)>)

The "double_get" action

double_get (<object1, object2>)

The "double_put" action

double_put(<object1>, <object2>, (target1), (target2))

The "poke" action

poke(<switch-object>)

The "gaze" action

gaze(<object to look at>)

The "open_door" action

open_door(<door-object>)

The "close_door" action

close_door (<door-object>)

The "pour" action

pour(<object to pour from>,<object to pour into>)

The "pose" action

pose(<name-of-a-model-state-pose>)

This action loads the passed model state from the graph's configuration file and moves all joints into this pose. If a join is not part of the model state, it will not be moved.

The "push" action (Not yet working)

push(<object to push>)

The "screw" action (Not yet working)

screw(<object to screw top off>)

Feedback messages

Syntax of Error messages:

ERROR: cannot  REASON: because  SUGGESTION:  DEVELOPER:

or

FATAL_ERROR for non-recoverable errors (e.g. Emergency Stop ...)

Unrecoverable Errors that Need a Replan:

Semantic Errors:

Logical Errors:

Physical Errors:

Software design

The project is composed of three parts:

How to build

  git clone https://github.com/HRI-EU/affaction.git
  cd affaction
  mkdir build
  cd build
  cmake ..
  make 

How to start the websocket action server

Python websocket client