🛰️航天仿真算法库 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 using Transform::transformPosition;
61 using Transform::getRotation;
62
65 const Transform& getTransform() const { return *this; }
66
69 const Vector3d& getRotationRate() const { return angvel_; }
70 Vector3d& getRotationRate() { return angvel_; }
71
74 void setTransform(const Transform& transform) { (Transform&)*this = transform; }
75
78 const KinematicRotation& getKinematicRotation() const { return kinematicRotation(); }
79 KinematicRotation& getKinematicRotation() { return kinematicRotation(); }
80
83 void setKinematicRotation(const KinematicRotation& rot) { kinematicRotation() = rot; }
84
87 const Vector3d& getVelocity() const { return velocity_; }
88 Vector3d& getVelocity() { return velocity_; }
89
92 void setVelocity(const Vector3d& vel) { velocity_ = vel; }
93
98 KinematicTransform& compose(const KinematicTransform& next);
99
104 KinematicTransform composed(const KinematicTransform& next) const;
105
110 KinematicTransform operator*(const KinematicTransform& next) const;
111
116 KinematicTransform& operator*=(const KinematicTransform& next);
117
118
121 KinematicTransform inverse() const;
122
125 void getInverse(KinematicTransform& inversed) const;
126
128 void setIdentity() { Transform::setIdentity(); angvel_ = Vector3d::Zero(); velocity_ = Vector3d::Zero(); }
129
135 void transformPositionVelocity(const Vector3d& position, const Vector3d& velocity, Vector3d& positionOut, Vector3d& velocityOut);
136
141 CartState transformPositionVelocity(const CartState& state);
142private:
143 KinematicRotation& kinematicRotation() { return reinterpret_cast<KinematicRotation&>(rotation_); }
144 const KinematicRotation& kinematicRotation() const { return reinterpret_cast<const KinematicRotation&>(rotation_); }
145protected:
146 Vector3d angvel_;
147 Vector3d velocity_;
148};
149
150A_ALWAYS_INLINE KinematicTransform KinematicTransform::Identity()
151{
152 return KinematicTransform(CartState::Zero(), KinematicRotation::Identity());
153}
154
155A_ALWAYS_INLINE KinematicTransform &KinematicTransform::compose(const KinematicTransform &next)
156{
157 *this = this->composed(next);
158 return *this;
159}
160
161A_ALWAYS_INLINE KinematicTransform KinematicTransform::composed(const KinematicTransform &next) const
162{
163 KinematicRotation rotation = this->getKinematicRotation().composed(next.getKinematicRotation());
164 /*
165 也可以通过 getRotation().transformVectorVelocityInv() 来实现。
166 */
167 Vector3d vector = next.getTranslation() * this->getMatrix();
168
169 Vector3d translation = this->getTranslation() + vector;
170 Vector3d velocity = this->getVelocity() + next.getVelocity() * this->getMatrix()
171 + this->getRotationRate().cross(vector);
172 return KinematicTransform(translation, velocity, rotation);
173}
174
175A_ALWAYS_INLINE KinematicTransform KinematicTransform::operator*(const KinematicTransform &next) const
176{
177 return composed(next);
178}
179
180A_ALWAYS_INLINE KinematicTransform &KinematicTransform::operator*=(const KinematicTransform &next)
181{
182 return compose(next);
183}
184
185A_ALWAYS_INLINE KinematicTransform KinematicTransform::inverse() const
186{
187 KinematicTransform retval;
188 this->getInverse(retval);
189 return retval;
190}
191
192A_ALWAYS_INLINE void KinematicTransform::getInverse(KinematicTransform &inversed) const
193{
194 this->getKinematicRotation().transformVectorVelocity(-this->getTranslation(), -this->getVelocity(), inversed.getTranslation(), inversed.getVelocity());
195 this->getKinematicRotation().getInverse(inversed.getKinematicRotation());
196}
197
198A_ALWAYS_INLINE void KinematicTransform::transformPositionVelocity(const Vector3d &position, const Vector3d &velocity, Vector3d &positionOut, Vector3d &velocityOut)
199{
200 #if 0
201 // 先计算相对位置向量
202 Vector3d relPos = position - this->getTranslation();
203 // 旋转位置
204 this->getRotation().transformVector(relPos, positionOut);
205 // 计算速度:绝对速度 - 平动速度 - 角速度 × 相对位置向量
206 Vector3d velDiff = velocity - this->getVelocity() - this->getRotationRate().cross(relPos);
207 // 旋转速度
208 this->getRotation().transformVector(velDiff, velocityOut);
209 #else
213 this->getKinematicRotation().transformVectorVelocity(
214 position - this->getTranslation(),
215 velocity - this->getVelocity(),
216 positionOut,
217 velocityOut
218 );
219 #endif
220}
221
222A_ALWAYS_INLINE CartState KinematicTransform::transformPositionVelocity(const CartState &state)
223{
224 CartState stateOut;
225 this->transformPositionVelocity(state.pos(), state.vel(), stateOut.pos(), stateOut.vel());
226 return stateOut;
227}
228
229
230AST_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:152
运动学变换
定义 KinematicTransform.hpp:33
A_ALWAYS_INLINE KinematicTransform(const CartState &translate, const KinematicRotation &rot)
从旋转和平移状态构造变换
定义 KinematicTransform.hpp:41
const Vector3d & getRotationRate() const
获取旋转角速度
定义 KinematicTransform.hpp:69
void setTransform(const Transform &transform)
设置变换
定义 KinematicTransform.hpp:74
void setIdentity()
设置为单位变换
定义 KinematicTransform.hpp:128
void getInverse(KinematicTransform &inversed) const
获取逆变换
定义 KinematicTransform.hpp:192
const Vector3d & getVelocity() const
获取平移速度
定义 KinematicTransform.hpp:87
const Vector3d & getTranslation() const
获取坐标系平移
定义 Transform.hpp:58
void setKinematicRotation(const KinematicRotation &rot)
设置旋转
定义 KinematicTransform.hpp:83
const Transform & getTransform() const
获取变换
定义 KinematicTransform.hpp:65
void setVelocity(const Vector3d &vel)
设置平移速度
定义 KinematicTransform.hpp:92
const KinematicRotation & getKinematicRotation() const
获取旋转
定义 KinematicTransform.hpp:78
坐标系转换类
定义 Transform.hpp:33