🛰️航天仿真算法库 SpaceAST 0.3.1
载入中...
搜索中...
未找到
KinematicTransform.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include "Transform.hpp"
25#include "AstMath/KinematicRotation.hpp"
26#include "AstCore/OrbitElement.hpp"
27
28AST_NAMESPACE_BEGIN
29
30
31#define _AST_DEF_KINEMATICTRANSFORM_PROPERTIES\
32 _AST_DEF_TRANSFORM_PROPERTIES\
33 const Vector3d& velocity() const { return velocity_; }\
34 Vector3d& velocity() { return velocity_; }\
35 const Vector3d& getVelocity() const { return velocity_; }\
36 Vector3d& getVelocity() { return velocity_; }\
37 void setVelocity(const Vector3d& velocity) { velocity_ = velocity; }\
38 const Transform& transform() const { return reinterpret_cast<const Transform&>(translation_); }\
39 Transform& transform() { return reinterpret_cast<Transform&>(translation_); }\
40 const Transform& getTransform() const { return transform(); }\
41 Transform& getTransform() { return transform(); }\
42 void setTransform(const Transform& xform) { transform() = xform; }
43
44
45
49{
50public:
51 KinematicTransform() = default;
52
56 A_ALWAYS_INLINE
57 KinematicTransform(const CartState& translate, const KinematicRotation& rot)
58 : velocity_(translate.vel())
59 , translation_(translate.pos())
60 , rotation_(rot.rotation())
61 , angvel_(rot.rotationRate())
62 {}
63
64 A_ALWAYS_INLINE
65 KinematicTransform(const Vector3d& translation, const Vector3d& velocity, const KinematicRotation& rot)
66 : velocity_(velocity)
67 , translation_(translation)
68 , rotation_(rot.rotation())
69 , angvel_(rot.rotationRate())
70 {}
71
74 static KinematicTransform Identity();
75
76
77public:
78 _AST_DEF_KINEMATICTRANSFORM_PROPERTIES
79 _AST_DEF_KINEMATICROTATION_PROPERTIES
80
85 KinematicTransform& compose(const KinematicTransform& next);
86
91 KinematicTransform composed(const KinematicTransform& next) const;
92
97 KinematicTransform operator*(const KinematicTransform& next) const;
98
103 KinematicTransform& operator*=(const KinematicTransform& next);
104
105
108 KinematicTransform inverse() const;
109
112 void getInverse(KinematicTransform& inversed) const;
113
115 void setIdentity();
116
122 void transformPositionVelocity(const Vector3d& position, const Vector3d& velocity, Vector3d& positionOut, Vector3d& velocityOut);
123
128 CartState transformPositionVelocity(const CartState& state);
129protected:
130 Vector3d velocity_{};
131 Vector3d translation_{};
132 Rotation rotation_{};
133 Vector3d angvel_{};
134};
135
136A_ALWAYS_INLINE KinematicTransform KinematicTransform::Identity()
137{
138 return KinematicTransform(CartState::Zero(), KinematicRotation::Identity());
139}
140
141A_ALWAYS_INLINE void KinematicTransform::setIdentity()
142{
143 velocity_ = Vector3d::Zero();
144 translation_ = Vector3d::Zero();
145 rotation_ = Rotation::Identity();
146 angvel_ = Vector3d::Zero();
147}
148
149A_ALWAYS_INLINE KinematicTransform &KinematicTransform::compose(const KinematicTransform &next)
150{
151 *this = this->composed(next);
152 return *this;
153}
154
155A_ALWAYS_INLINE KinematicTransform KinematicTransform::composed(const KinematicTransform &next) const
156{
157 KinematicRotation rotation = this->kinematicRotation().composed(next.kinematicRotation());
158 /*
159 也可以通过 getRotation().transformVectorVelocityInv() 来实现。
160 */
161 Vector3d vector = next.translation() * this->matrix();
162
163 Vector3d translation = this->translation() + vector;
164 Vector3d velocity = this->velocity() + next.velocity() * this->matrix()
165 + this->rotationRate().cross(vector);
166 return KinematicTransform(translation, velocity, rotation);
167}
168
169A_ALWAYS_INLINE KinematicTransform KinematicTransform::operator*(const KinematicTransform &next) const
170{
171 return composed(next);
172}
173
174A_ALWAYS_INLINE KinematicTransform &KinematicTransform::operator*=(const KinematicTransform &next)
175{
176 return compose(next);
177}
178
179A_ALWAYS_INLINE KinematicTransform KinematicTransform::inverse() const
180{
181 KinematicTransform retval;
182 this->getInverse(retval);
183 return retval;
184}
185
186A_ALWAYS_INLINE void KinematicTransform::getInverse(KinematicTransform &inversed) const
187{
188 this->kinematicRotation().transformVectorVelocity(-this->translation(), -this->velocity(), inversed.translation(), inversed.velocity());
189 this->kinematicRotation().getInverse(inversed.kinematicRotation());
190}
191
192A_ALWAYS_INLINE void KinematicTransform::transformPositionVelocity(const Vector3d &position, const Vector3d &velocity, Vector3d &positionOut, Vector3d &velocityOut)
193{
194 #if 0
195 // 先计算相对位置向量
196 Vector3d relPos = position - this->getTranslation();
197 // 旋转位置
198 this->getRotation().transformVector(relPos, positionOut);
199 // 计算速度:绝对速度 - 平动速度 - 角速度 × 相对位置向量
200 Vector3d velDiff = velocity - this->getVelocity() - this->getRotationRate().cross(relPos);
201 // 旋转速度
202 this->getRotation().transformVector(velDiff, velocityOut);
203 #else
207 this->kinematicRotation().transformVectorVelocity(
208 position - this->translation(),
209 velocity - this->velocity(),
210 positionOut,
211 velocityOut
212 );
213 #endif
214}
215
216A_ALWAYS_INLINE CartState KinematicTransform::transformPositionVelocity(const CartState &state)
217{
218 CartState stateOut;
219 this->transformPositionVelocity(state.pos(), state.vel(), stateOut.pos(), stateOut.vel());
220 return stateOut;
221}
222
223
224AST_NAMESPACE_END
直角坐标
定义 OrbitElement.hpp:53
const Vector3d & pos() const
获取位置
定义 OrbitElement.hpp:66
const Vector3d & vel() const
获取速度
定义 OrbitElement.hpp:73
运动学坐标系旋转
定义 KinematicRotation.hpp:50
KinematicRotation composed(const KinematicRotation &next) const
组合下一个旋转
定义 KinematicRotation.hpp:150
运动学变换
定义 KinematicTransform.hpp:49
A_ALWAYS_INLINE KinematicTransform(const CartState &translate, const KinematicRotation &rot)
从旋转和平移状态构造变换
定义 KinematicTransform.hpp:57
void getInverse(KinematicTransform &inversed) const
获取逆变换
定义 KinematicTransform.hpp:186
坐标系旋转类
定义 Rotation.hpp:55