pinocchio  3.7.0
A fast and flexible implementation of Rigid Body Dynamics algorithms and their analytical derivatives
 
Loading...
Searching...
No Matches
quaternion.hpp
1//
2// Copyright (c) 2019-2020 INRIA CNRS
3//
4
5#ifndef __pinocchio_autodiff_cppad_math_quaternion_hpp__
6#define __pinocchio_autodiff_cppad_math_quaternion_hpp__
7
8#include "pinocchio/math/quaternion.hpp"
9
10namespace pinocchio
11{
12 namespace quaternion
13 {
14
15 namespace internal
16 {
17
18 template<typename _Scalar>
19 struct quaternionbase_assign_impl<CppAD::AD<_Scalar>, false>
20 {
21 typedef _Scalar Scalar;
22 typedef CppAD::AD<Scalar> ADScalar;
23 template<typename Matrix3, typename QuaternionDerived>
24 static inline void run(Eigen::QuaternionBase<QuaternionDerived> & q, const Matrix3 & mat)
25 {
26 typedef
27 typename Eigen::internal::traits<QuaternionDerived>::Coefficients QuatCoefficients;
28
29 typedef typename PINOCCHIO_EIGEN_PLAIN_TYPE(QuatCoefficients) QuatCoefficientsPlainType;
30 typedef Eigen::Quaternion<ADScalar, QuatCoefficientsPlainType::Options> QuaternionPlain;
31 QuaternionPlain quat_t_positive;
32
33 ADScalar t = mat.trace();
34 quaternionbase_assign_impl_if_t_positive::run(t, quat_t_positive, mat);
35
36 QuaternionPlain quat_t_negative_0, quat_t_negative_1, quat_t_negative_2;
37
38 quaternionbase_assign_impl_if_t_negative<0>::run(t, quat_t_negative_0, mat);
39 quaternionbase_assign_impl_if_t_negative<1>::run(t, quat_t_negative_1, mat);
40 quaternionbase_assign_impl_if_t_negative<2>::run(t, quat_t_negative_2, mat);
41
42 // Build the expression graph
43 for (Eigen::DenseIndex k = 0; k < 4; ++k)
44 {
45 ADScalar t_is_negative_cond1 = CppAD::CondExpGt<Scalar>(
46 mat.coeff(1, 1), mat.coeff(0, 0), quat_t_negative_1.coeffs().coeff(k),
47 quat_t_negative_0.coeffs().coeff(k));
48
49 ADScalar t_is_negative_cond2 = CppAD::CondExpGt<Scalar>(
50 mat.coeff(2, 2), mat.coeff(0, 0), quat_t_negative_2.coeffs().coeff(k),
51 CppAD::CondExpGt<Scalar>(
52 mat.coeff(1, 1), mat.coeff(0, 0),
53 CppAD::CondExpGt<Scalar>(
54 mat.coeff(2, 2), mat.coeff(1, 1), quat_t_negative_2.coeffs().coeff(k),
55 t_is_negative_cond1),
56 t_is_negative_cond1));
57 q.coeffs().coeffRef(k) = CppAD::CondExpGt<Scalar>(
58 t, ADScalar(0), quat_t_positive.coeffs().coeff(k), t_is_negative_cond2);
59 }
60 }
61 };
62
63 } // namespace internal
64
65 } // namespace quaternion
66
67} // namespace pinocchio
68
69#endif // ifndef __pinocchio_autodiff_casadi_math_quaternion_hpp__
Main pinocchio namespace.
Definition treeview.dox:11