control.underactuated

Virtual Model Control of robots with fewer motors than coordinates.

The motors deliver B u, so a wanted torque τ is realized only up to its part E τ, the defect, with E = I − B B⁺ the projector on the null space of Bᵀ. controller builds the naive and the frozen controller, each with an optional passive or tank correction; DirectionalForce tracks a force along a direction with the stiffness the motors can realize.

Functions

controller(compiled[, base, correction, ...])

A controller for an underactuated robot, by flags.

defect(B, J, F[, torque])

The torque defect E (Jᵀ F − τ) of a wrench F at the Jacobian J: what the motors cannot realize of it.

direction_gain(c0, cv, force, K, direction)

The scalar s that makes the realized force c0 + s cv along direction closest to force, with K + s n nᵀ positive definite: s = max(cv (force − c0) / (cv² + reg), floor), the floor being (1 − margin) times the s at which K + s n nᵀ loses it.

feasible(B, J)

The wrenches the motors realize in full at the Jacobian J: the columns of an orthonormal basis of {F : (J E)ᵀ F = 0}, (p, p − rank (J E)).

projector(B)

E = I − B B⁺, the projector on the null space of Bᵀ: the torques no motor can give.

Classes

DirectionalForce(controller, site, param, ...)

Tracks a force along direction at site with one scalar of the stiffness.

Frozen(actuation[, dynamics])

Reads the frozen configuration from the motors, to pass to a StateController.

Passivation(dynamics[, tank, width, ...])

An output stage that keeps the motors from injecting more power than the robot dissipates.