🛰️航天仿真算法库 SpaceAST 0.0.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
33{
34public:
35 KinematicTransform() = default;
36
40 A_ALWAYS_INLINE
41 KinematicTransform(const CartState& translate, const KinematicRotation& rot)
42 : Transform(translate.pos(), rot.getRotation())
43 , angvel_(rot.getRotationRate())
44 , velocity_(translate.vel())
45 {}
46
47 A_ALWAYS_INLINE
48 KinematicTransform(const Vector3d& translation, const Vector3d& velocity, const KinematicRotation& rot)
49 : Transform(translation, rot.getRotation())
50 , angvel_(rot.getRotationRate())
51 , velocity_(velocity)
52 {}
53
56 static KinematicTransform Identity();
57
58 using Transform::getTranslation;
59 using Transform::setTranslation;
60
63 const Transform& getTransform() const { return *this; }
64
67 const Vector3d& getRotationRate() const { return angvel_; }
68 Vector3d& getRotationRate() { return angvel_; }
69
72 void setTransform(const Transform& transform) { (Transform&)*this = transform; }
73
76 const KinematicRotation& getKinematicRotation() const { return kinematicRotation(); }
77 KinematicRotation& getKinematicRotation() { return kinematicRotation(); }
78
81 void setKinematicRotation(const KinematicRotation& rot) { kinematicRotation() = rot; }
82
85 const Vector3d& getVelocity() const { return velocity_; }
86 Vector3d& getVelocity() { return velocity_; }
87
90 void setVelocity(const Vector3d& vel) { velocity_ = vel; }
91
96 KinematicTransform& compose(const KinematicTransform& next);
97
102 KinematicTransform composed(const KinematicTransform& next) const;
103
108 KinematicTransform operator*(const KinematicTransform& next) const;
109
114 KinematicTransform& operator*=(const KinematicTransform& next);
115
116
119 KinematicTransform inverse() const;
120
123 void getInverse(KinematicTransform& inversed) const;
124
126 void setIdentity() { Transform::setIdentity(); angvel_ = Vector3d::Zero(); velocity_ = Vector3d::Zero(); }
127
133 void transformPositionVelocity(const Vector3d& position, const Vector3d& velocity, Vector3d& positionOut, Vector3d& velocityOut);
134
139 CartState transformPositionVelocity(const CartState& state);
140private:
141 KinematicRotation& kinematicRotation() { return reinterpret_cast<KinematicRotation&>(rotation_); }
142 const KinematicRotation& kinematicRotation() const { return reinterpret_cast<const KinematicRotation&>(rotation_); }
143protected:
144 Vector3d angvel_;
145 Vector3d velocity_;
146};
147
148A_ALWAYS_INLINE KinematicTransform KinematicTransform::Identity()
149{
150 return KinematicTransform(CartState::Zero(), KinematicRotation::Identity());
151}
152
153A_ALWAYS_INLINE KinematicTransform &KinematicTransform::compose(const KinematicTransform &next)
154{
155 *this = this->composed(next);
156 return *this;
157}
158
159A_ALWAYS_INLINE KinematicTransform KinematicTransform::composed(const KinematicTransform &next) const
160{
161 KinematicRotation rotation = this->getKinematicRotation().composed(next.getKinematicRotation());
162 /*
163 也可以通过 getRotation().transformVectorVelocityInv() 来实现。
164 */
165 Vector3d vector = next.getTranslation() * this->getMatrix();
166
167 Vector3d translation = this->getTranslation() + vector;
168 Vector3d velocity = this->getVelocity() + next.getVelocity() * this->getMatrix()
169 + this->getRotationRate().cross(vector);
170 return KinematicTransform(translation, velocity, rotation);
171}
172
173A_ALWAYS_INLINE KinematicTransform KinematicTransform::operator*(const KinematicTransform &next) const
174{
175 return composed(next);
176}
177
178A_ALWAYS_INLINE KinematicTransform &KinematicTransform::operator*=(const KinematicTransform &next)
179{
180 return compose(next);
181}
182
183A_ALWAYS_INLINE KinematicTransform KinematicTransform::inverse() const
184{
185 KinematicTransform retval;
186 this->getInverse(retval);
187 return retval;
188}
189
190A_ALWAYS_INLINE void KinematicTransform::getInverse(KinematicTransform &inversed) const
191{
192 this->getKinematicRotation().transformVectorVelocity(-this->getTranslation(), -this->getVelocity(), inversed.getTranslation(), inversed.getVelocity());
193 this->getKinematicRotation().getInverse(inversed.getKinematicRotation());
194}
195
196A_ALWAYS_INLINE void KinematicTransform::transformPositionVelocity(const Vector3d &position, const Vector3d &velocity, Vector3d &positionOut, Vector3d &velocityOut)
197{
198 #if 0
199 // 先计算相对位置向量
200 Vector3d relPos = position - this->getTranslation();
201 // 旋转位置
202 this->getRotation().transformVector(relPos, positionOut);
203 // 计算速度:绝对速度 - 平动速度 - 角速度 × 相对位置向量
204 Vector3d velDiff = velocity - this->getVelocity() - this->getRotationRate().cross(relPos);
205 // 旋转速度
206 this->getRotation().transformVector(velDiff, velocityOut);
207 #else
211 this->getKinematicRotation().transformVectorVelocity(
212 position - this->getTranslation(),
213 velocity - this->getVelocity(),
214 positionOut,
215 velocityOut
216 );
217 #endif
218}
219
220A_ALWAYS_INLINE CartState KinematicTransform::transformPositionVelocity(const CartState &state)
221{
222 CartState stateOut;
223 this->transformPositionVelocity(state.pos(), state.vel(), stateOut.pos(), stateOut.vel());
224 return stateOut;
225}
226
227
228AST_NAMESPACE_END
直角坐标
定义 OrbitElement.hpp:46
const Vector3d & pos() const
获取位置
定义 OrbitElement.hpp:59
const Vector3d & vel() const
获取速度
定义 OrbitElement.hpp:64
运动学坐标系旋转
定义 KinematicRotation.hpp:32
KinematicRotation composed(const KinematicRotation &next) const
组合下一个旋转
定义 KinematicRotation.hpp:151
运动学变换
定义 KinematicTransform.hpp:33
A_ALWAYS_INLINE KinematicTransform(const CartState &translate, const KinematicRotation &rot)
从旋转和平移状态构造变换
定义 KinematicTransform.hpp:41
const Vector3d & getRotationRate() const
获取旋转角速度
定义 KinematicTransform.hpp:67
void setTransform(const Transform &transform)
设置变换
定义 KinematicTransform.hpp:72
void setIdentity()
设置为单位变换
定义 KinematicTransform.hpp:126
void getInverse(KinematicTransform &inversed) const
获取逆变换
定义 KinematicTransform.hpp:190
const Vector3d & getVelocity() const
获取平移速度
定义 KinematicTransform.hpp:85
const Vector3d & getTranslation() const
获取坐标系平移
定义 Transform.hpp:58
void setKinematicRotation(const KinematicRotation &rot)
设置旋转
定义 KinematicTransform.hpp:81
const Transform & getTransform() const
获取变换
定义 KinematicTransform.hpp:63
void setVelocity(const Vector3d &vel)
设置平移速度
定义 KinematicTransform.hpp:90
const KinematicRotation & getKinematicRotation() const
获取旋转
定义 KinematicTransform.hpp:76
坐标系转换类
定义 Transform.hpp:33