Joint Coupling and Underactuated Hands

In the chapters so far we have used the terms “joint” and “DOF” as if they were the same thing, and one DOF always correspond to one and only one joint. This is not always true in real hand models, and it is not always true in GraspIt! either. GraspIt! allows you to connect multiple joints to a single DOF (joint coupling) and allows support for multiple coupling methods.

The best way to think of a DOF in GraspIt! is as a motor. It is responsible for moving the joints of a robot, and it is the only external interface to the robot available for doing that. In the GraspIt! GUI, joint draggers are not actually “joint” draggers but rather “DOF” dragger: only one dragger is presented to the user for each DOF. In the case of the Barrett hand for example, you will notice that there is only one dragger per finger, even though each finger has two joints. Moving the one dragger however affects both joints, as they are coupled to the same DOF.

In a fully actuated robot, there is one motor for each joint. In many cases however, we have joint coupling, that is multiple joints connected to a single DOF. The key aspect here is how exactly this coupling is implemented from a hardware standpoint, and whether we can replicate that in software.

A GraspIt! DOF is responsible for telling us how all of the joints that are attached to it respond to changes in the DOF. This intelligence is built into the DOF class and its implementations. Depending on how the joint coupling is achieved, DOF behave differently, which is why there are multiple implementations. The most important question is: when one of the joints of a DOF can not move (presumably due to some contact on its links), what happens to the other joints connected to the same DOF?

In dynamics mode, a DOF is also responsible for enforcing the same mode of operation. This is done via “DOF constraints” which must be built into the LCP solved by the dynamics engine. For instance, a rigidly coupled DOF must ensure that all of its joints always move at the same rate. Finally, the DOF is also responsible for applying forces to its joints (which then pass them on to the links) in dynamics mode. This is the only way of moving a Robot in dynamics. Force generation capabilities also depend on the implementation of the DOF, see the classes described below for details.

Rigid coupling

The simplest type of coupling is rigid, implemented in practice through gear transmission of steel cables. This means that whenever one joint from a DOF stops moving, all the other joints from the same DOF stop as well. In code, this is implemented in the RigidDOF class. Most hands in GraspIt! use this kind of underactuation (Robonaut, DLR, the 16 DOF version of the HumanHand). See the RigidDOF class for details.

Breakaway transmission

This kind of coupling allows a distal joint to “break away” and continue to close if a proximal link has been stopped. The break away point is marked, and the proximal joint is only re-engaged if the DOF goes back to the break away point. This is the type of transmission built into the Barrett hand. In code, this is the BreakAwayDOF, see this class for details.

Under development: compliant joints

This is the transmission achieved in practice through tendon networks and compliant (spring-like) joints. It is more difficult to simulate that the BreakawayDOF, as stopped joints are always connected to the DOF. In the code, this is the CompliantDOF. However, this is still an active area of research for us, and this kind of DOF has proven difficult to simulate in static mode.

For the compliant DOF we have also built a mechanism for hand quasistatic analysis. This mechanism exists for any kind of DOF, but is only relevant for the compliant one: due to its nature, the Compliant DOF will apply some unbalanced forces through existing contacts during the hand closing process. The Compliant DOF is thus responsible for computing these forces, which are then passed on to the quasi-static computation. This computation is then performed by the Grasp class; also see the chapter for details. A complete description of this engine and its applications can be found in the chapter.