24#include <IpIpoptApplication.hpp>
27#include <iCub/utils.h>
69 for (Ipopt::Index i=0; i<(int)
dim; i++)
88 double pitch_cog=
chain(0).getMin()+
offset+delta/2.0;
90 double _tanh=tanh(c*(
q[0]-pitch_cog));
96 dfPitch=0.5*c*(1.0-_tanh*_tanh);
111 size_t n=std::min(
q0.length(),(
size_t)
dim);
112 for (
size_t i=0; i<
n; i++)
133 void set_scaling(
double _obj_scaling,
double _x_scaling,
double _g_scaling)
148 bool get_nlp_info(Ipopt::Index&
n, Ipopt::Index& m, Ipopt::Index& nnz_jac_g,
149 Ipopt::Index& nnz_h_lag, IndexStyleEnum& index_style)
override
155 index_style=TNLP::C_STYLE;
162 Ipopt::Index m, Ipopt::Number* g_l, Ipopt::Number* g_u)
override
164 for (Ipopt::Index i=0; i<
n; i++)
166 x_l[i]=
chain(i).getMin();
167 x_u[i]=
chain(i).getMax();
180 Ipopt::Number* z_L, Ipopt::Number* z_U, Ipopt::Index m,
181 bool init_lambda, Ipopt::Number* lambda)
override
183 for (Ipopt::Index i=0; i<
n; i++)
190 bool eval_f(Ipopt::Index
n,
const Ipopt::Number*
x,
bool new_x,
191 Ipopt::Number& obj_value)
override
195 for (Ipopt::Index i=0; i<
n; i++)
208 Ipopt::Number* grad_f)
override
210 for (Ipopt::Index i=0; i<
n; i++)
217 bool eval_g(Ipopt::Index
n,
const Ipopt::Number*
x,
bool new_x, Ipopt::Index m,
218 Ipopt::Number* g)
override
231 Ipopt::Index m, Ipopt::Index nele_jac, Ipopt::Index* iRow,
232 Ipopt::Index *jCol, Ipopt::Number* values)
override
236 iRow[0]=0; jCol[0]=0;
237 iRow[1]=0; jCol[1]=1;
238 iRow[2]=0; jCol[2]=2;
240 iRow[3]=1; jCol[3]=0;
241 iRow[4]=1; jCol[4]=1;
243 iRow[5]=2; jCol[5]=0;
244 iRow[6]=2; jCol[6]=1;
251 for (Ipopt::Index i=0; i<
n; i++)
272 bool eval_h(Ipopt::Index
n,
const Ipopt::Number *
x,
bool new_x,
273 Ipopt::Number obj_factor, Ipopt::Index m,
const Ipopt::Number *lambda,
274 bool new_lambda, Ipopt::Index nele_hess, Ipopt::Index *iRow,
275 Ipopt::Index *jCol, Ipopt::Number *values)
override
282 Ipopt::Index
n, Ipopt::Number* x_scaling,
283 bool& use_g_scaling, Ipopt::Index m,
284 Ipopt::Number* g_scaling)
override
288 for (Ipopt::Index i=0; i<
n; i++)
291 for (Ipopt::Index j=0; j<m; j++)
294 use_x_scaling=use_g_scaling=
true;
301 const Ipopt::Number*
x,
const Ipopt::Number* z_L,
302 const Ipopt::Number* z_U, Ipopt::Index m,
const Ipopt::Number* g,
303 const Ipopt::Number* lambda, Ipopt::Number obj_value,
304 const Ipopt::IpoptData* ip_data, Ipopt::IpoptCalculatedQuantities* ip_cq)
override
306 for (Ipopt::Index i=0; i<
n; i++)
315 Vector gDir_=SE3inv(
chain.
getH(2,
true)).submatrix(0,2,0,2)*gDir;
334 Ipopt::SmartPtr<HeadCenter_NLP> nlp;
339 nlp->setGravityDirection(gDir);
341 static_cast<Ipopt::IpoptApplication*
>(
App)->OptimizeTNLP(GetRawPtr(nlp));
342 return nlp->get_qd();
Vector solve(const Vector &q0, Vector &xd, const Vector &gDir)
HeadCenter_NLP(iKinChain &c, const Vector &_q0, Vector &_xd)
bool eval_f(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Number &obj_value) override
bool get_bounds_info(Ipopt::Index n, Ipopt::Number *x_l, Ipopt::Number *x_u, Ipopt::Index m, Ipopt::Number *g_l, Ipopt::Number *g_u) override
bool eval_g(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Index m, Ipopt::Number *g) override
bool eval_h(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Number obj_factor, Ipopt::Index m, const Ipopt::Number *lambda, bool new_lambda, Ipopt::Index nele_hess, Ipopt::Index *iRow, Ipopt::Index *jCol, Ipopt::Number *values) override
void computeQuantities(const Ipopt::Number *x)
bool eval_grad_f(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Number *grad_f) override
bool get_nlp_info(Ipopt::Index &n, Ipopt::Index &m, Ipopt::Index &nnz_jac_g, Ipopt::Index &nnz_h_lag, IndexStyleEnum &index_style) override
void finalize_solution(Ipopt::SolverReturn status, Ipopt::Index n, const Ipopt::Number *x, const Ipopt::Number *z_L, const Ipopt::Number *z_U, Ipopt::Index m, const Ipopt::Number *g, const Ipopt::Number *lambda, Ipopt::Number obj_value, const Ipopt::IpoptData *ip_data, Ipopt::IpoptCalculatedQuantities *ip_cq) override
virtual ~HeadCenter_NLP()
void setGravityDirection(const Vector &gDir)
bool eval_jac_g(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Index m, Ipopt::Index nele_jac, Ipopt::Index *iRow, Ipopt::Index *jCol, Ipopt::Number *values) override
void set_bound_inf(double lower, double upper)
void set_scaling(double _obj_scaling, double _x_scaling, double _g_scaling)
bool get_scaling_parameters(Ipopt::Number &obj_scaling, bool &use_x_scaling, Ipopt::Index n, Ipopt::Number *x_scaling, bool &use_g_scaling, Ipopt::Index m, Ipopt::Number *g_scaling) override
bool get_starting_point(Ipopt::Index n, bool init_x, Ipopt::Number *x, bool init_z, Ipopt::Number *z_L, Ipopt::Number *z_U, Ipopt::Index m, bool init_lambda, Ipopt::Number *lambda) override
A Base class for defining a Serial Link Chain.
yarp::sig::Matrix getH(const unsigned int i, const bool allLink=false)
Returns the rigid roto-translation matrix from the root reference frame to the ith frame in Denavit-H...
yarp::sig::Matrix GeoJacobian(const unsigned int i)
Returns the geometric Jacobian of the ith link.
yarp::sig::Matrix AnaJacobian(const unsigned int i, unsigned int col)
Returns the analitical Jacobian of the ith link.
yarp::sig::Vector setAng(const yarp::sig::Vector &q)
Sets the free joint angles to values of q[i].
unsigned int getDOF() const
Returns the current number of Chain's DOF.
double dot(const yarp::sig::Matrix &A, int colA, const yarp::sig::Matrix &B, int colB)
Returns the dot product between two vectors given in the form: matrix(:,col).
double norm(const yarp::sig::Matrix &M, int col)
Returns the norm of the vector given in the form: matrix(:,col).
double sat(const double val, const double min, const double max)
constexpr double CTRL_PI
The PI constant.
constexpr double CTRL_DEG2RAD
PI/180.