The Optimization Problem
Returning to our generic representation of a whole-body controller presented in Overview,
(1)
we make some important assumptions about the structure of the problem. Firstly, we make the assumtion that our control problem is continous and has size = , i.e.
. Next we impose that
be quadratic in
, leaving us with an unconstrained Quadratic Program, or QP:
(2)
In (2), the first line is the classical formulation of a QP:
the optimization vector
the hessian matrix (
)
the gradient vector (
)
the linear matrix of the affine function (
)
the origin vector (
)
The last line of (2), , is the least-squares formulation.
We will continue using the least squares version, which admits an analytical minimum-norm solution,
, in the unconstrained case.
(3)
where is the Moore-Penrose pseudoinverse of the
matrix. This solution will be found assuming the rank of the linear system is consistent.
Adding an affine equality constraint produces a constrained least squares problem,
(4)
which can be solved analytically, assuming a solution exists, using the Karush Kuhn Tucker (KKT) equations,
(5)
where is the solution to the dual problem and contains the Lagrange multipliers.
Adding an affine inequality constraint to the problem produces the following QP,
(6)
Equation (6) can no longer be solved analytically and one must use numerical methods such as interior point, or active set methods.
Note
For more details on convex optimization, check out Boyd and Vandenberghe’s book: http://web.stanford.edu/~boyd/cvxbook/
Resolution of (6) with a numerical solver, such as qpOASES
, will provide a globally optimal solution for provided that the constraint equations are consistent, i.e. the set of possible solutions is not empty.
Objective Function Implementation
Within ORCA the QP objective function is formulated as a weighted Euclidean norm of an affine function,
(7)
In (7), is the weight of the euclidean norm (
) and must be a positive symmetric definite matrix.
In ORCA, is actually composed of two components, the norm weighting
and the selection matrix,
,
(8)
is a matrix with either 1’s or 0’s on the diagonal which allows us to ignore all or parts of the affine function we are computing. Concretely this means we can ignore components of the task error. More information on tasks is provided in the Control Objectives (Tasks) section.
For example…
For a Cartesian position task, setting the low 3 entries on the diagonal of to 0 allows us to ignore orientation errors.
For practicality’s sake we set from a vector with the function
setSelectionVector(const Eigen::VectorXd& s)
, which creates a diagonal matrix from s
.
Given from (8), the hessian and gradient are calculated as,
Note
is dropped from the objective function because it does not change the optimal solution of the QP.
In the code, these calculations can be found in WeightedEuclidianNormFunction
:
void WeightedEuclidianNormFunction::QuadraticCost::computeHessian(const Eigen::VectorXd& SelectionVector
, const Eigen::MatrixXd& Weight
, const Eigen::MatrixXd& A)
{
Hessian_.noalias() = SelectionVector.asDiagonal() * Weight * A.transpose() * A ;
}
void WeightedEuclidianNormFunction::QuadraticCost::computeGradient(const Eigen::VectorXd& SelectionVector
, const Eigen::MatrixXd& Weight
, const Eigen::MatrixXd& A
, const Eigen::VectorXd& b)
{
Gradient_.noalias() = 2.0 * SelectionVector.asDiagonal() * Weight * A.transpose() * b ;
}
Constraint Implementation
Constraints are written as double bounded linear functions,
the constraint matrix (
)
and
the lower and upper bounds of
(
)
Thus to convert our standard affine constraint forms we have the following relationships:
ORCA QP
In ORCA the full QP is expressed as,
Note
For convenience an explicit constraint on the optimization variable is included in the problem because it is so common. This constraint is identical to the second line:
when
is the identity matrix.
In the next sections we show how to formulate the different task and constraint types one might need to control a robot. In section Multi-Objective Optimization, we show how to combine multiple objective functions (tasks) in one controller allowing us to exploit the redundancy of the system.
Note
Multiple constraints can be combined through vertical concatenation of their matrices and vectors. I.e.