2
3
4
5
6
7
8
9
10
11
12
13
14
15
17
18
19
20
21
22
23
25#ifndef FRAME_UTILS_HPP
26#define FRAME_UTILS_HPP
28#include "core/macros.h"
29#include "core/clockwerkerrors.h"
30#include "core/CartesianVector.hpp"
31#include "six_dof_dynamics/Frame.hpp"
40 int getFrameRelativeDCM(
Frame<T> &f1,
Frame<T> &f2,
DCM<T> &dcm_f1_f2) {
43 if(f1.getFrameRootPointer() != f2.getFrameRootPointer()) {
48 DCM<T> dcm_f1_root, dcm_f2_root, dcm_root_f2;
49 f1.rootRelDCM(dcm_f1_root);
50 f2.rootRelDCM(dcm_f2_root);
51 dcm_f2_root.inverse(dcm_root_f2);
52 multiply(dcm_f1_root, dcm_root_f2, dcm_f1_f2);
68 if(f1.getFrameRootPointer() != f2.getFrameRootPointer()) {
77 getFrameRelativeDCM(f2, f1, dcm_f2_f1);
80 multiply(dcm_f2_f1, vec__f1, vec__f2);
97 if(f1.getFrameRootPointer() != f2.getFrameRootPointer()) {
102 CartesianVector<T, 3> pos_tmp = f1.rootRelPosition() + f1.rootRelDCM().inverse()*vec_f1__f1;
105 vec_f2__f2 = f2.rootRelDCM()*(pos_tmp - f2.rootRelPosition());
118 template <
typename T>
123 if(f1.getFrameRootPointer() != f2.getFrameRootPointer()) {
129 DCM<T> dcm_root_f1 = f1.rootRelDCM().inverse();
130 CartesianVector<T, 3> vel_tmp = f1.rootRelVelocity() + dcm_root_f1*vel_f1__f1;
131 vel_tmp = vel_tmp + dcm_root_f1*cross(f1.rootRelAngularVelocity(), pos_f1__f1);
135 framePositionTransform(pos_f1__f1, f1, f2, pos_f2__f2);
138 DCM<T> dcm_root_f2 = f2.rootRelDCM().inverse();
139 vel_tmp = vel_tmp - dcm_root_f2*cross(f2.rootRelAngularVelocity(), pos_f2__f2);
140 vel_tmp = vel_tmp - f2.rootRelVelocity();
141 vel_f2__f2 = f2.rootRelDCM()*vel_tmp;
Standard vector class derived from Matrix.
Definition CartesianVector.hpp:39
Class defining a direction cosine matrix inherited from Matrix.
Definition DCM.hpp:71
Frame class definition.
Definition Frame.hpp:92
#define NO_ERROR
Definition clockwerkerrors.h:31
#define ERROR_DIFFERENT_TREE
Definition clockwerkerrors.h:123