Task
In OpenSoT, tasks are utilized to construct a cost function. Considering a specific task, denoted as \(\mathcal{T}_1\), it is defined by its corresponding matrices and vectors:
which defines the scalar cost function:
Note
Most of the time, the \(\mathbf{c}\) term is used to implement the Lasso or an L-1 norm; thus, it is typically not utilized.
A Task object is inherited from the base class OpenSoT::Task
in Task.h, where the method _update(const Vector_type &x)
must be implemented to assign the matrix \(\mathbf{A}\) as Eigen::MatrixXd _A
, along with the vectors \(\mathbf{b}\) as Eigen::VectorXd _b
and \(\mathbf{c}\) as Eigen::VectorXd _c
. This assignment will take place every time the update(const Vector_type &x)
method is invoked.
The Hessian Type
can be set according to the type of Hessian generated by the task as:
Note
The information provided by the Hessian Type
is used only by some back-end solvers, in particular qpOASES
, therefore not mandatory.
If the weight matrix \(\mathbf{W}\) is diagonal, is possible to accelerate the computation of the Hessian, setting the _weight_is_diagonal
flag to true by utilizing the setWeightIsDiagonalFlag(const bool flag)
method.
You can use the applyActiveJointsMask(Matrix_type& A)
function to apply a mask to the \(\mathbf{A}\) matrix of the Task and set the desired columns to \(\mathbf{0}\).
If a reset procedure for a Task is permitted, it must be implemented using the virtual reset()
method.
You can activate or deactivate a Task using the setActive(const bool active_flag)
method.
Note
When a Task is not active, its \(\mathbf{A}\) matrix is set to \(\mathbf{0}\).
Upon invoking the log(XBot::MatLogger2::Ptr logger)
method, the internal matrices _A
and _W
, as well as the vectors _b
and _c
, are stored in the file specified within the log. To record additional data, you must implement the virtual method _log(XBot::MatLogger2::Ptr logger)
.
SubTask
A SubTask comprises a specific number of rows from a Task. The SubTask class facilitates the selection of adjacent and non-adjacent rows from a task by extracting sub-matrices from _A
and _W
, along with a sub-vector from _b
.
Note
SubTasks do not make use of the _c
vector!
A SubTask can be instantiated from a Task using the SubTask(TaskPtr taskPtr, const std::list<unsigned int> rowIndices)
constructor found in SubTask.h.
Note
A SubTask holds a reference to the Task that was used to instantiate it. As a result, any modifications applied to the primary Task are reflected in the SubTask, and vice versa. When the update(const Vector_type &x)
method is invoked on the SubTask, the referenced Task is also updated.
A common application of a SubTask is to focus on a specific portion of a task. For instance, in a Cartesian Task, a SubTask can be employed to isolate the positional component while disregarding the orientation.
GenericTask
A task can be created also from bare Eigen::MatrixXd
and Eigen::VectorXd
using the GenericTask
class in GenericTask.h:
//Creates a task
Eigen::MatrixXd A(2,2); A.Random();
Eigen::VectorXd b(2); b.Random();
auto t1 = std::make_shared<OpenSoT::tasks::GenericTask>("task1", A, b);
Various set methods can be used to update the internal matrices and vectors. A linear task can be created through the GenericLPTask
in GenericLPTask.h.