18 #ifndef __se3_lie_group_operation_base_hxx__ 19 #define __se3_lie_group_operation_base_hxx__ 21 #include "pinocchio/macros.hpp" 27 template <
class Derived>
28 template <
class ConfigIn_t,
class Tangent_t,
class ConfigOut_t>
30 const Eigen::MatrixBase<ConfigIn_t> & q,
31 const Eigen::MatrixBase<Tangent_t> & v,
32 const Eigen::MatrixBase<ConfigOut_t>& qout)
const 34 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigIn_t , ConfigVector_t);
35 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Tangent_t , TangentVector_t);
36 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigOut_t, ConfigVector_t);
37 derived().integrate_impl(q, v, qout);
40 template <
class Derived>
41 template <
class Config_t,
class Tangent_t,
class JacobianOut_t>
43 const Eigen::MatrixBase<Config_t > & q,
44 const Eigen::MatrixBase<Tangent_t> & v,
45 const Eigen::MatrixBase<JacobianOut_t>& J)
const 47 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Config_t , ConfigVector_t);
48 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Tangent_t , TangentVector_t);
49 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(JacobianOut_t, JacobianMatrix_t);
50 derived().dIntegrate_dq_impl(q, v, J);
53 template <
class Derived>
54 template <
class Config_t,
class Tangent_t,
class JacobianOut_t>
56 const Eigen::MatrixBase<Config_t > & q,
57 const Eigen::MatrixBase<Tangent_t> & v,
58 const Eigen::MatrixBase<JacobianOut_t>& J)
const 60 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Config_t , ConfigVector_t);
61 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Tangent_t , TangentVector_t);
62 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(JacobianOut_t, JacobianMatrix_t);
63 derived().dIntegrate_dv_impl(q, v, J);
75 template <
class Derived>
76 template <
class ConfigL_t,
class ConfigR_t,
class ConfigOut_t>
78 const Eigen::MatrixBase<ConfigL_t> & q0,
79 const Eigen::MatrixBase<ConfigR_t> & q1,
81 const Eigen::MatrixBase<ConfigOut_t>& qout)
const 83 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigL_t , ConfigVector_t);
84 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigR_t , ConfigVector_t);
85 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigOut_t, ConfigVector_t);
86 Derived().interpolate_impl(q0, q1, u, qout);
89 template <
class Derived>
90 template <
class Config_t>
92 (
const Eigen::MatrixBase<Config_t>& qout)
const 94 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Config_t, ConfigVector_t);
95 return derived().normalize_impl (qout);
106 template <
class Derived>
107 template <
class Config_t>
109 (
const Eigen::MatrixBase<Config_t>& qout)
const 111 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Config_t, ConfigVector_t);
112 return derived().random_impl (qout);
115 template <
class Derived>
116 template <
class ConfigL_t,
class ConfigR_t,
class ConfigOut_t>
118 const Eigen::MatrixBase<ConfigL_t> & lower_pos_limit,
119 const Eigen::MatrixBase<ConfigR_t> & upper_pos_limit,
120 const Eigen::MatrixBase<ConfigOut_t> & qout)
const 122 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigL_t , ConfigVector_t);
123 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigR_t , ConfigVector_t);
124 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigOut_t, ConfigVector_t);
125 derived ().randomConfiguration_impl(lower_pos_limit, upper_pos_limit, qout);
128 template <
class Derived>
129 template <
class ConfigL_t,
class ConfigR_t,
class Tangent_t>
131 const Eigen::MatrixBase<ConfigL_t> & q0,
132 const Eigen::MatrixBase<ConfigR_t> & q1,
133 const Eigen::MatrixBase<Tangent_t>& d)
const 135 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigL_t, ConfigVector_t);
136 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigR_t, ConfigVector_t);
137 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Tangent_t, TangentVector_t);
138 derived().difference_impl(q0, q1, d);
141 template <
class Derived>
142 template <
class ConfigL_t,
class ConfigR_t,
class JacobianLOut_t,
class JacobianROut_t>
144 const Eigen::MatrixBase<ConfigL_t> & q0,
145 const Eigen::MatrixBase<ConfigR_t> & q1,
146 const Eigen::MatrixBase<JacobianLOut_t>& J0,
147 const Eigen::MatrixBase<JacobianROut_t>& J1)
const 149 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigL_t, ConfigVector_t);
150 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigR_t, ConfigVector_t);
151 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(JacobianLOut_t, JacobianMatrix_t);
152 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(JacobianROut_t, JacobianMatrix_t);
153 derived().Jdifference_impl (q0, q1, J0, J1);
156 template <
class Derived>
157 template <
class ConfigL_t,
class ConfigR_t>
158 typename LieGroupBase<Derived>::Scalar
160 const Eigen::MatrixBase<ConfigL_t> & q0,
161 const Eigen::MatrixBase<ConfigR_t> & q1)
const 163 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigL_t, ConfigVector_t);
164 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigR_t, ConfigVector_t);
165 return derived().squaredDistance_impl(q0, q1);
168 template <
class Derived>
169 template <
class ConfigL_t,
class ConfigR_t>
170 typename LieGroupBase<Derived>::Scalar
172 const Eigen::MatrixBase<ConfigL_t> & q0,
173 const Eigen::MatrixBase<ConfigR_t> & q1)
const 178 template <
class Derived>
179 template <
class ConfigL_t,
class ConfigR_t>
181 const Eigen::MatrixBase<ConfigL_t> & q0,
182 const Eigen::MatrixBase<ConfigR_t> & q1,
183 const Scalar & prec)
const 185 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigL_t, ConfigVector_t);
186 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigR_t, ConfigVector_t);
187 return derived().isSameConfiguration_impl(q0, q1, prec);
193 template <
class Derived>
194 template <
class Config_t,
class Tangent_t>
195 typename LieGroupBase<Derived>::ConfigVector_t
197 const Eigen::MatrixBase<Tangent_t> & v)
const 204 template <
class Derived>
205 template <
class ConfigL_t,
class ConfigR_t>
207 const Eigen::MatrixBase<ConfigL_t> & q0,
208 const Eigen::MatrixBase<ConfigR_t> & q1,
209 const Scalar& u)
const 216 template <
class Derived>
217 typename LieGroupBase<Derived>::ConfigVector_t
225 template <
class Derived>
226 template <
class ConfigL_t,
class ConfigR_t>
227 typename LieGroupBase<Derived>::ConfigVector_t
229 (
const Eigen::MatrixBase<ConfigL_t> & lower_pos_limit,
230 const Eigen::MatrixBase<ConfigR_t> & upper_pos_limit)
const 237 template <
class Derived>
238 template <
class ConfigL_t,
class ConfigR_t>
240 const Eigen::MatrixBase<ConfigL_t> & q0,
241 const Eigen::MatrixBase<ConfigR_t> & q1)
const 243 TangentVector_t diff;
249 template <
class Derived>
250 template <
class ConfigL_t,
class ConfigR_t,
class ConfigOut_t>
252 const Eigen::MatrixBase<ConfigL_t> & q0,
253 const Eigen::MatrixBase<ConfigR_t> & q1,
255 const Eigen::MatrixBase<ConfigOut_t>& qout)
const 257 if (u == 0)
const_cast<Eigen::MatrixBase<ConfigOut_t>&
>(qout) = q0;
258 else if(u == 1)
const_cast<Eigen::MatrixBase<ConfigOut_t>&
>(qout) = q1;
261 TangentVector_t vdiff(u *
difference(q0, q1));
266 template <
class Derived>
267 template <
class ConfigL_t,
class ConfigR_t>
268 typename LieGroupBase<Derived>::Scalar
270 const Eigen::MatrixBase<ConfigL_t> & q0,
271 const Eigen::MatrixBase<ConfigR_t> & q1)
const 275 return t.squaredNorm();
278 template <
class Derived>
279 template <
class ConfigL_t,
class ConfigR_t>
281 const Eigen::MatrixBase<ConfigL_t> & q0,
282 const Eigen::MatrixBase<ConfigR_t> & q1,
283 const Scalar & prec)
const 285 return q0.isApprox(q1, prec);
288 template <
class Derived>
289 typename LieGroupBase <Derived>::Index
292 return derived().
nq();
295 template <
class Derived>
296 typename LieGroupBase <Derived>::Index
299 return derived().
nv();
302 template <
class Derived>
303 typename LieGroupBase <Derived>::ConfigVector_t
309 template <
class Derived>
312 return derived().
name();
317 #endif // __se3_lie_group_operation_base_hxx__
Eigen::VectorXd squaredDistance(const Model &model, const Eigen::VectorXd &q0, const Eigen::VectorXd &q1)
Squared distance between two configuration vectors.
Scalar distance(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1) const
Distance between two configurations of the joint.
void normalize(const Eigen::MatrixBase< Config_t > &qout) const
Normalize the joint configuration given as input. For instance, the quaternion must be unitary...
void integrate(const Eigen::MatrixBase< ConfigIn_t > &q, const Eigen::MatrixBase< Tangent_t > &v, const Eigen::MatrixBase< ConfigOut_t > &qout) const
Integrate a joint's configuration with a tangent vector during one unit time duration.
Eigen::VectorXd difference(const Model &model, const Eigen::VectorXd &q0, const Eigen::VectorXd &q1)
Compute the tangent vector that must be integrated during one unit time to go from q0 to q1...
std::string name() const
Get name of instance.
void interpolate(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1, const Scalar &u, const Eigen::MatrixBase< ConfigOut_t > &qout) const
Interpolation between two joint's configurations.
void dIntegrate_dq(const Eigen::MatrixBase< Config_t > &q, const Eigen::MatrixBase< Tangent_t > &v, const Eigen::MatrixBase< JacobianOut_t > &J) const
Computes the Jacobian of the Integrate operation.
Eigen::VectorXd interpolate(const Model &model, const Eigen::VectorXd &q0, const Eigen::VectorXd &q1, const double u)
Interpolate the model between two configurations.
Scalar squaredDistance(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1) const
Squared distance between two joint configurations.
bool isSameConfiguration(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1, const Scalar &prec=Eigen::NumTraits< Scalar >::dummy_precision()) const
Check if two configurations are equivalent within the given precision.
Eigen::VectorXd integrate(const Model &model, const Eigen::VectorXd &q, const Eigen::VectorXd &v)
Integrate a configuration for the specified model for a tangent vector during one unit time...
void randomConfiguration(const Eigen::MatrixBase< ConfigL_t > &lower_pos_limit, const Eigen::MatrixBase< ConfigR_t > &upper_pos_limit, const Eigen::MatrixBase< ConfigOut_t > &qout) const
Generate a configuration vector uniformly sampled among provided limits.
Eigen::VectorXd randomConfiguration(const Model &model, const Eigen::VectorXd &lowerLimits, const Eigen::VectorXd &upperLimits)
Generate a configuration vector uniformly sampled among provided limits.
Index nv() const
Get dimension of Lie Group tangent space.
ConfigVector_t neutral() const
Get neutral element as a vector.
void dIntegrate_dv(const Eigen::MatrixBase< Config_t > &q, const Eigen::MatrixBase< Tangent_t > &v, const Eigen::MatrixBase< JacobianOut_t > &J) const
Computes the Jacobian of the Integrate operation.
void Jdifference(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1, const Eigen::MatrixBase< JacobianLOut_t > &J0, const Eigen::MatrixBase< JacobianROut_t > &J1) const
Computes the Jacobian of the difference operation.
void difference(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1, const Eigen::MatrixBase< Tangent_t > &v) const
Computes the tangent vector that must be integrated during one unit time to go from q0 to q1...