Search code examples
drake

Why was I reminded that my plant is not fully actuated?


I'm learning the course Robotic Manipulation,text When I came to text,I want to imitate this document. My model file is SDF type.

'''

......
model_drivers:
    iiwa_left: !IiwaDriver
      hand_model_name: Dexterous_hand_L
    Dexterous_hand_L: !InverseDynamicsDriver {}
    iiwa_right: !IiwaDriver
      hand_model_name: Dexterous_hand_R
    Dexterous_hand_R: !InverseDynamicsDriver {}
'''

And I did weld a dexterous hand to the end of the kuka_iiwa. Then I was reminded that the Dexterous_hand was not fully actuated.It was lack of seven autuators. Why did this happen?

Now I have to use this

'''
......
model_drivers:
    iiwa_left+Dexterous_hand_L:!InverseDynamicsdriver {}
......
'''

I wonder if I can use the former format?


Solution

  • "Inverse dynamics control" maps desired generalized accelerations into torque commands. As it is normally conceived and as it is implemented in Drake's InverseDynamicsControl class requires that the system is fully actuated, so that this mapping exists for all desired accelerations (and is unique).

    The syntax

    model_drivers:
        iiwa_left: !IiwaDriver
          hand_model_name: Dexterous_hand_L
        Dexterous_hand_L: !InverseDynamicsDriver {}
    

    would create two separate inverse dynamics controllers - the first one only controls the iiwa and uses a lumped-inertia approximation of the hand, and the second one only controls the hand. The first one is fine; the second one is the one that (correctly) complains.

    Think of it this way: a controller that only examines the state of the hand cannot solve for desired accelerations of the hand. If the arm was in a position that turns the hand upside down, for instance, then the torques required to cancel gravity will have flipped... but the hand controller wouldn't know it.

    The second syntax which works, and is recommended:

    model_drivers:
        iiwa_left+Dexterous_hand_L:!InverseDynamicsdriver {}
    

    instead creates one inverse dynamics controller which reasons jointly about both the arm and the hand. This makes sense.