I have been trying to get a linearized version of a MultiBodyPlant without gravity to experiment with LQR for systems without gravity. However, the linearization leads to some interesting phenomena. A simplified example can be found in this google colab notebook.
When I linearize and check the rank of the controllability matrix for a single free-floating rigid body, I get a rank of 6. This is expected as I use the get_applied_generalized_force_input_port()
as the input port, hence making sure that all possible forces can be applied to the system. The system of a single rigid body has 6 degrees of freedom (DoF) and the rank of the controllability matrix is 6, hence it is controllable.
However, when I use Drake's in-built function IsControllable()
to check the controllability, it results False
meaning that it thinks the system is not controllable. In the source of the IsControllable()
function, the rank of the matrix is checked against the number of rows in the A
matrix. I think that this might be causing an issue as the linearization involves the use of quaternions during the AutoDiff (thus adding one more row to the A
matrix due to 4 numbers being used for quaternions to represent the state). The linearization process does not know about the unit-quaternion constraint, and hence the A
matrix for a system using quaternions will have 1 more row than the DoF of the system.
I wonder if this is the correct intuition for the controllability mismatch?
And could this cause issues as other functions within Drake that maybe use the IsControllable()
function for verifying controllability?