5 #ifndef LODESTAR_QUATERNIONBLOCK_HPP
6 #define LODESTAR_QUATERNIONBLOCK_HPP
8 #include "Lodestar/blocks/Block.hpp"
9 #include "Lodestar/aux/CompileTimeQualifiers.hpp"
10 #include "Eigen/Dense"
15 enum class QuaternionBlockParameter {
20 template<
typename TType,
21 QuaternionBlockParameter TPar = QuaternionBlockParameter::Parametric>
23 static_assert(::std::is_same<TType, TType>::value,
24 "QuaternionBlock not defined for this type.");
27 template<
typename TScalar>
29 Eigen::Matrix<TScalar, 3, 1>,
30 QuaternionBlockParameter::Parametric> :
32 ::std::tuple<Eigen::Matrix<TScalar, 3, 1>>,
33 ::std::tuple<Eigen::Matrix<TScalar, 3, 1>>,
34 ::std::tuple<Eigen::Quaternion<TScalar>>
37 static_assert(::std::is_arithmetic<TScalar>::value,
38 "Scalar must be of arithmetic type.");
46 ::std::tuple<Eigen::Matrix<TScalar, 3, 1>>,
47 ::std::tuple<Eigen::Matrix<TScalar, 3, 1>>,
48 ::std::tuple<Eigen::Quaternion<TScalar>>
51 using Quaternion = Eigen::Quaternion<TScalar>;
55 quaternion(Quaternion::Identity());
65 Quaternion &quaternion()
67 return this->
template p<0>();
70 Quaternion &quaternion(
const Quaternion &quat)
72 this->
template p<0>() = quat;
73 return this->
template p<0>();
76 const Quaternion &quaternion()
const
78 return this->
template p<0>();
84 this->equation = ::std::bind(
85 &type::triggerFunction,
87 ::std::placeholders::_1
91 void triggerFunction(
Base &b)
93 b.template o<0>() = quaternion() * b.template i<0>().object;
97 template<
typename TScalar>
99 Eigen::Matrix<TScalar, 3, 1>,
100 QuaternionBlockParameter::AdditionalInput> :
102 ::std::tuple<Eigen::Matrix<TScalar, 3, 1>, Eigen::Quaternion<TScalar>>,
103 ::std::tuple<Eigen::Matrix<TScalar, 3, 1>>,
107 static_assert(::std::is_arithmetic<TScalar>::value,
108 "Scalar must be of arithmetic type.");
116 ::std::tuple<Eigen::Matrix<TScalar, 3, 1>, Eigen::Quaternion<TScalar>>,
117 ::std::tuple<Eigen::Matrix<TScalar, 3, 1>>,
121 using Quaternion = Eigen::Quaternion<TScalar>;
125 quaternion(Quaternion::Identity());
137 return this->
template i<1>();
142 this->
template i<1>() = quat;
143 return this->
template i<1>();
148 this->
template i<1>() = quat;
149 return this->
template i<1>();
154 return this->
template i<1>();
160 this->equation = ::std::bind(
161 &type::triggerFunction,
163 ::std::placeholders::_1
167 void triggerFunction(
Base &b)
170 quaternion().object * b.template i<0>().object;
174 template<
typename TScalar>
176 Eigen::Matrix<TScalar, 1, 3>,
177 QuaternionBlockParameter::Parametric> :
179 ::std::tuple<Eigen::Matrix<TScalar, 1, 3>>,
180 ::std::tuple<Eigen::Matrix<TScalar, 1, 3>>,
181 ::std::tuple<Eigen::Quaternion<TScalar>>
184 static_assert(::std::is_arithmetic<TScalar>::value,
185 "Scalar must be of arithmetic type.");
193 ::std::tuple<Eigen::Matrix<TScalar, 1, 3>>,
194 ::std::tuple<Eigen::Matrix<TScalar, 1, 3>>,
195 ::std::tuple<Eigen::Quaternion<TScalar>>
198 using Quaternion = Eigen::Quaternion<TScalar>;
202 quaternion(Quaternion::Identity());
212 Quaternion &quaternion()
214 return this->
template p<0>();
217 Quaternion &quaternion(
const Quaternion &quat)
219 this->
template p<0>() = quat;
220 return this->
template p<0>();
223 const Quaternion &quaternion()
const
225 return this->
template p<0>();
231 this->equation = ::std::bind(
232 &type::triggerFunction,
234 ::std::placeholders::_1
238 void triggerFunction(
Base &b)
240 b.template o<0>() = (quaternion() *
241 b.template i<0>().object.transpose()).transpose();
245 template<
typename TScalar>
247 Eigen::Matrix<TScalar, 1, 3>,
248 QuaternionBlockParameter::AdditionalInput> :
250 ::std::tuple<Eigen::Matrix<TScalar, 1, 3>, Eigen::Quaternion<TScalar>>,
251 ::std::tuple<Eigen::Matrix<TScalar, 1, 3>>,
255 static_assert(::std::is_arithmetic<TScalar>::value,
256 "Scalar must be of arithmetic type.");
264 ::std::tuple<Eigen::Matrix<TScalar, 1, 3>, Eigen::Quaternion<TScalar>>,
265 ::std::tuple<Eigen::Matrix<TScalar, 1, 3>>,
269 using Quaternion = Eigen::Quaternion<TScalar>;
273 quaternion(Quaternion::Identity());
285 return this->
template i<1>();
290 this->
template i<1>() = quat;
291 return this->
template i<1>();
296 this->
template i<1>() = quat;
297 return this->
template i<1>();
302 return this->
template i<1>();
308 this->equation = ::std::bind(
309 &type::triggerFunction,
311 ::std::placeholders::_1
315 void triggerFunction(
Base &b)
317 b.template o<0>() = (quaternion().object *
318 b.template i<0>().object.transpose()).transpose();
324 template<
typename TScalar>
327 QuaternionBlockParameter::Parametric> :
329 ::std::tuple<TScalar, TScalar, TScalar>,
330 ::std::tuple<TScalar, TScalar, TScalar>,
331 ::std::tuple<Eigen::Quaternion<TScalar>>
334 static_assert(::std::is_arithmetic<TScalar>::value,
335 "Scalar must be of arithmetic type.");
343 ::std::tuple<TScalar, TScalar, TScalar>,
344 ::std::tuple<TScalar, TScalar, TScalar>,
345 ::std::tuple<Eigen::Quaternion<TScalar>>
348 using Quaternion = Eigen::Quaternion<TScalar>;
352 quaternion(Quaternion::Identity());
362 Quaternion &quaternion()
364 return this->
template p<0>();
367 Quaternion &quaternion(
const Quaternion &quat)
369 this->
template p<0>() = quat;
370 return this->
template p<0>();
373 const Quaternion &quaternion()
const
375 return this->
template p<0>();
379 Eigen::Vector<TScalar, 3> vec_;
383 this->equation = ::std::bind(
384 &type::triggerFunction,
386 ::std::placeholders::_1
390 void triggerFunction(
Base &b)
392 vec_ << b.template i<0>().object,
393 b.template i<1>().object,
394 b.template i<2>().object;
395 vec_ = quaternion() * vec_;
396 b.template o<0>() = vec_.x();
397 b.template o<1>() = vec_.y();
398 b.template o<2>() = vec_.z();
402 template<
typename TScalar>
405 QuaternionBlockParameter::AdditionalInput> :
407 ::std::tuple<TScalar, TScalar, TScalar, Eigen::Quaternion<TScalar>>,
408 ::std::tuple<TScalar, TScalar, TScalar>,
412 static_assert(::std::is_arithmetic<TScalar>::value,
413 "Scalar must be of arithmetic type.");
421 ::std::tuple<TScalar, TScalar, TScalar, Eigen::Quaternion<TScalar>>,
422 ::std::tuple<TScalar, TScalar, TScalar>,
426 using Quaternion = Eigen::Quaternion<TScalar>;
430 quaternion(Quaternion::Identity());
442 return this->
template i<3>();
447 this->
template i<3>() = quat;
448 return this->
template i<3>();
453 this->
template i<3>() = quat;
454 return this->
template i<3>();
459 return this->
template i<3>();
463 Eigen::Vector<TScalar, 3> vec_;
467 this->equation = ::std::bind(
468 &type::triggerFunction,
470 ::std::placeholders::_1
474 void triggerFunction(
Base &b)
476 vec_ << b.template i<0>().object,
477 b.template i<1>().object,
478 b.template i<2>().object;
479 vec_ = quaternion().object * vec_;
480 b.template o<0>() = vec_.x();
481 b.template o<1>() = vec_.y();
482 b.template o<2>() = vec_.z();
490 #endif //LODESTAR_QUATERNIONBLOCK_HPP