🛰️航天仿真算法库 SpaceAST 0.3.1
载入中...
搜索中...
未找到
AccelerationTransform.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
26
27AST_NAMESPACE_BEGIN
28
29
30#define _AST_DEF_ACCELERATIONTRANSFORM_PROPERTIES\
31 _AST_DEF_KINEMATICTRANSFORM_PROPERTIES\
32 const Vector3d& acceleration() const { return acceleration_; }\
33 Vector3d& acceleration() { return acceleration_; }\
34 const Vector3d& getAcceleration() const { return acceleration_; }\
35 Vector3d& getAcceleration() { return acceleration_; }\
36 void setAcceleration(const Vector3d& acceleration) { acceleration_ = acceleration; }\
37 const KinematicTransform& kinematicTransform() const { return reinterpret_cast<const KinematicTransform&>(velocity_); }\
38 KinematicTransform& kinematicTransform() { return reinterpret_cast<KinematicTransform&>(velocity_); }\
39 const KinematicTransform& getKinematicTransform() const { return kinematicTransform(); }\
40 KinematicTransform& getKinematicTransform() { return kinematicTransform(); }\
41 void setKinematicTransform(const KinematicTransform& transform) { kinematicTransform() = transform; }\
42
55{
56public:
59
65 AccelerationTransform(const Vector3d& translation, const Vector3d& velocity,
66 const Vector3d& acceleration, const AccelerationRotation& rot);
67
72 AccelerationTransform(const KinematicTransform& transform, const Vector3d& acceleration,
73 const Vector3d& angvelDot);
74
77 static AccelerationTransform Identity();
78
79 _AST_DEF_ACCELERATIONTRANSFORM_PROPERTIES
80 _AST_DEF_ACCELERATIONROTATION_PROPERTIES
81
82
87 AccelerationTransform& compose(const AccelerationTransform& next);
88
93 AccelerationTransform composed(const AccelerationTransform& next) const;
94
99 AccelerationTransform operator*(const AccelerationTransform& next) const;
100
105 AccelerationTransform& operator*=(const AccelerationTransform& next);
106
109 void getInverse(AccelerationTransform& inversed) const;
110
113 AccelerationTransform inverse() const;
114
117 {
118 acceleration_ = Vector3d::Zero();
119 velocity_ = Vector3d::Zero();
120 translation_ = Vector3d::Zero();
121 rotation_ = Rotation::Identity();
122 angvel_ = Vector3d::Zero();
123 angvelDot_ = Vector3d::Zero();
124 }
125
138 void transformPosVelAcc(
139 const Vector3d& position,
140 const Vector3d& velocity,
141 const Vector3d& acceleration,
142 Vector3d& positionOut,
143 Vector3d& velocityOut,
144 Vector3d& accelerationOut) const;
145
154 void transformPosVelAccInv(
155 const Vector3d& position,
156 const Vector3d& velocity,
157 const Vector3d& acceleration,
158 Vector3d& positionOut,
159 Vector3d& velocityOut,
160 Vector3d& accelerationOut) const;
161
162protected:
163 Vector3d acceleration_{};
164 Vector3d velocity_{};
165 Vector3d translation_{};
166 Rotation rotation_{};
167 Vector3d angvel_{};
168 Vector3d angvelDot_{};
169};
170
171A_ALWAYS_INLINE AccelerationTransform::AccelerationTransform(const Vector3d &translation, const Vector3d &velocity, const Vector3d &acceleration, const AccelerationRotation &rot)
172 : acceleration_(acceleration)
173 , velocity_(velocity)
174 , translation_(translation)
175 , rotation_(rot.rotation())
176 , angvel_(rot.rotationRate())
177 , angvelDot_(rot.rotationRateDot())
178{
179}
180
181A_ALWAYS_INLINE AccelerationTransform::AccelerationTransform(const KinematicTransform &transform, const Vector3d &acceleration, const Vector3d &angvelDot)
182 : acceleration_(acceleration)
183 , velocity_(transform.velocity())
184 , translation_(transform.translation())
185 , rotation_(transform.rotation())
186 , angvel_(transform.rotationRate())
187 , angvelDot_(angvelDot)
188{
189}
190
192{
193 return AccelerationTransform(Vector3d::Zero(), Vector3d::Zero(), Vector3d::Zero(), AccelerationRotation::Identity());
194}
195
196
197
199{
205 // 先取到局部量,再构造返回值,避免原地赋值
206 Matrix3d mat1 = this->matrix();
207 Vector3d angvel1 = this->rotationRate();
208 Vector3d angvelDot1 = this->rotationRateDot();
209 Vector3d tau = next.translation() * mat1; // 即 M₁ᵀ t₂
210 Vector3d velocity2 = next.velocity() * mat1; // 即 M₁ᵀ V₂
211 Vector3d acceleration2 = next.acceleration() * mat1; // 即 M₁ᵀ A₂
212
213 Vector3d translation = this->translation() + tau;
214 Vector3d velocity = this->velocity() + velocity2 + angvel1.cross(tau);
215 Vector3d acceleration = this->acceleration() + acceleration2
216 + angvel1.cross(velocity2) * 2.0
217 + angvel1.cross(angvel1.cross(tau))
218 + angvelDot1.cross(tau);
219
220 AccelerationRotation rotation = AccelerationRotation(mat1, angvel1, angvelDot1)
221 .composed(next.accelerationRotation());
222
223 return AccelerationTransform(translation, velocity, acceleration, rotation);
224}
225
227{
228 *this = this->composed(next);
229 return *this;
230}
231
233{
234 return composed(next);
235}
236
238{
239 return compose(next);
240}
241
242A_ALWAYS_INLINE void AccelerationTransform::getInverse(AccelerationTransform &inversed) const
243{
248 // 先全部取到局部量,允许 inversed 与 *this 为同一对象
249 AccelerationRotation rotation = this->accelerationRotation();
250 AccelerationRotation inversedRotation;
251 rotation.getInverse(inversedRotation);
252
253 rotation.transformVecVelAcc(
254 -this->translation(),
255 -this->velocity(),
256 -this->acceleration(),
257 inversed.translation(),
258 inversed.velocity(),
259 inversed.acceleration_);
260
261 inversed.setAccelerationRotation(inversedRotation);
262}
263
265{
267 this->getInverse(retval);
268 return retval;
269}
270
272 const Vector3d &position, const Vector3d &velocity, const Vector3d &acceleration,
273 Vector3d &positionOut, Vector3d &velocityOut, Vector3d &accelerationOut) const
274{
278 this->accelerationRotation().transformVecVelAcc(
279 position - this->translation(),
280 velocity - this->velocity(),
281 acceleration - this->acceleration(),
282 positionOut,
283 velocityOut,
284 accelerationOut);
285}
286
288 const Vector3d &position, const Vector3d &velocity, const Vector3d &acceleration,
289 Vector3d &positionOut, Vector3d &velocityOut, Vector3d &accelerationOut) const
290{
294 this->accelerationRotation().transformVecVelAccInv(
295 position,
296 velocity,
297 acceleration,
298 positionOut,
299 velocityOut,
300 accelerationOut);
301
302 positionOut += this->translation();
303 velocityOut += this->velocity();
304 accelerationOut += this->acceleration();
305}
306
307AST_NAMESPACE_END
加速度(二阶运动学)坐标系旋转
定义 AccelerationRotation.hpp:51
void transformVecVelAcc(const Vector3d &position, const Vector3d &velocity, const Vector3d &acceleration, Vector3d &positionOut, Vector3d &velocityOut, Vector3d &accelerationOut) const
变换位置、速度和加速度
定义 AccelerationRotation.hpp:227
void getInverse(AccelerationRotation &inversed) const
获取逆旋转
定义 AccelerationRotation.hpp:209
AccelerationRotation composed(const AccelerationRotation &next) const
组合下一个坐标系旋转
定义 AccelerationRotation.hpp:177
static AccelerationRotation Identity()
获取单位加速度旋转
定义 AccelerationRotation.hpp:151
加速度(二阶运动学)坐标系变换
定义 AccelerationTransform.hpp:55
void transformPosVelAcc(const Vector3d &position, const Vector3d &velocity, const Vector3d &acceleration, Vector3d &positionOut, Vector3d &velocityOut, Vector3d &accelerationOut) const
变换位置、速度和加速度
定义 AccelerationTransform.hpp:271
AccelerationTransform inverse() const
获取逆变换
定义 AccelerationTransform.hpp:264
AccelerationTransform composed(const AccelerationTransform &next) const
组合下一个坐标系变换
定义 AccelerationTransform.hpp:198
void getInverse(AccelerationTransform &inversed) const
获取逆变换
定义 AccelerationTransform.hpp:242
AccelerationTransform operator*(const AccelerationTransform &next) const
组合下一个坐标系变换
定义 AccelerationTransform.hpp:232
Vector3d acceleration_
平移加速度
定义 AccelerationTransform.hpp:163
AccelerationTransform()=default
加速度变换默认构造函数
void transformPosVelAccInv(const Vector3d &position, const Vector3d &velocity, const Vector3d &acceleration, Vector3d &positionOut, Vector3d &velocityOut, Vector3d &accelerationOut) const
变换位置、速度和加速度(逆变换)
定义 AccelerationTransform.hpp:287
static AccelerationTransform Identity()
获取单位加速度变换
定义 AccelerationTransform.hpp:191
AccelerationTransform & operator*=(const AccelerationTransform &next)
组合下一个坐标系变换
定义 AccelerationTransform.hpp:237
void setIdentity()
设置为单位变换
定义 AccelerationTransform.hpp:116
_AST_DEF_ACCELERATIONTRANSFORM_PROPERTIES _AST_DEF_ACCELERATIONROTATION_PROPERTIES AccelerationTransform & compose(const AccelerationTransform &next)
组合下一个坐标系变换
定义 AccelerationTransform.hpp:226
运动学变换
定义 KinematicTransform.hpp:49
坐标系旋转类
定义 Rotation.hpp:55