11struct RigidTransformationPointActionTpl : C2FunctionTpl<Scalar> {
14 using SE3 = pin::SE3Tpl<Scalar>;
15 using QuatConstMap = Eigen::Map<const typename SE3::Quaternion>;
16 using Base = C2FunctionTpl<Scalar>;
17 using Matrix33s = Eigen::Matrix<Scalar, 3, 3>;
19 SETpl<3, Scalar> space_;
22 RigidTransformationPointActionTpl(
const Eigen::Ref<const Vector3s> &point)
23 : Base(7, 6, 3), space_(), point_(point), skew_point_(pin::skew(point)) {}
25 VectorXs
operator()(
const ConstVectorRef &x)
const override {
26 QuatConstMap q(x.template tail<4>().data());
27 SE3 M(q, x.template head<3>());
29 return M.actOnEigenObject(point_);
33 assert(Jout.rows() == 3 && Jout.cols() == 6);
34 QuatConstMap q(x.template tail<4>().data());
36 Jout.template leftCols<3>() = q.matrix();
37 Jout.template rightCols<3>().noalias() = -q.matrix() * skew_point_;
40 Eigen::Ref<const Matrix33s> skew_point()
const {
return skew_point_; }
43 Matrix33s skew_point_;