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
3//
4
5#ifndef __pinocchio_autodiff_casadi_math_quaternion_hpp__
6#define __pinocchio_autodiff_casadi_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<::casadi::Matrix<_Scalar>, false>
20 {
21 typedef ::casadi::Matrix<_Scalar> Scalar;
22 template<typename Matrix3, typename QuaternionDerived>
23 static inline void run(Eigen::QuaternionBase<QuaternionDerived> & q, const Matrix3 & mat)
24 {
25 typedef
26 typename Eigen::internal::traits<QuaternionDerived>::Coefficients QuatCoefficients;
27
28 typedef typename PINOCCHIO_EIGEN_PLAIN_TYPE(QuatCoefficients) QuatCoefficientsPlainType;
29 typedef Eigen::Quaternion<Scalar, QuatCoefficientsPlainType::Options> QuaternionPlain;
30 QuaternionPlain quat_t_positive;
31
32 Scalar t = mat.trace();
33 quaternionbase_assign_impl_if_t_positive::run(t, quat_t_positive, mat);
34
35 QuaternionPlain quat_t_negative_0, quat_t_negative_1, quat_t_negative_2;
36
37 quaternionbase_assign_impl_if_t_negative<0>::run(t, quat_t_negative_0, mat);
38 quaternionbase_assign_impl_if_t_negative<1>::run(t, quat_t_negative_1, mat);
39 quaternionbase_assign_impl_if_t_negative<2>::run(t, quat_t_negative_2, mat);
40
41 // Build the expression graph
42 const Scalar t_greater_than_zero = t > Scalar(0);
43 const Scalar cond1 = mat.coeff(1, 1) > mat.coeff(0, 0);
44 const Scalar cond2 =
45 (cond1 && mat.coeff(2, 2) > mat.coeff(1, 1)) || (mat.coeff(2, 2) > mat.coeff(0, 0));
46
47 for (Eigen::DenseIndex k = 0; k < 4; ++k)
48 {
49 Scalar t_is_negative_cond1 = Scalar::if_else(
50 cond1, quat_t_negative_1.coeffs().coeff(k), quat_t_negative_0.coeffs().coeff(k));
51 Scalar t_is_negative_cond2 =
52 Scalar::if_else(cond2, quat_t_negative_2.coeffs().coeff(k), t_is_negative_cond1);
53
54 q.coeffs().coeffRef(k) = Scalar::if_else(
55 t_greater_than_zero, quat_t_positive.coeffs().coeff(k), t_is_negative_cond2);
56 }
57 }
58 };
59
60 } // namespace internal
61
62 } // namespace quaternion
63
64} // namespace pinocchio
65
66namespace Eigen
67{
68 namespace internal
69 {
70 template<class Scalar, int Options>
71 struct quaternionbase_assign_impl<Eigen::Matrix<::casadi::Matrix<Scalar>, 3, 3, Options>, 3, 3>
72 {
73 template<typename QuaternionDerived>
74 EIGEN_DEVICE_FUNC static inline void run(
75 QuaternionBase<QuaternionDerived> & q,
76 const Eigen::Matrix<::casadi::Matrix<Scalar>, 3, 3, Options> & a_mat)
77 {
78 ::pinocchio::quaternion::internal::quaternionbase_assign_impl<
79 ::casadi::Matrix<Scalar>, false>::run(q, a_mat);
80 }
81 };
82 } // namespace internal
83} // namespace Eigen
84
85#endif // ifndef __pinocchio_autodiff_casadi_math_quaternion_hpp__
Main pinocchio namespace.
Definition treeview.dox:11