68
68
# Basilisk imports
69
69
from Basilisk .architecture import messaging
70
70
from Basilisk .utilities import (SimulationBaseClass , orbitalMotion , macros , RigidBodyKinematics )
71
- from Basilisk .simulation import (spacecraft , constraintDynamicEffector , gravityEffector , svIntegrators )
71
+ from Basilisk .simulation import (spacecraft , constraintDynamicEffector , gravityEffector , svIntegrators , linearTranslationNDOFStateEffector , prescribedLinearTranslation )
72
72
import matplotlib .pyplot as plt
73
73
74
74
# Utility imports
@@ -120,6 +120,9 @@ def run(show_plots, env):
120
120
scObject2 .hub .r_BcB_B = [[0.0 ], [0.0 ], [1.0 ]]
121
121
scObject2 .hub .IHubPntBc_B = [[600.0 , 0.0 , 0.0 ], [0.0 , 600.0 , 0.0 ], [0.0 , 0.0 , 600.0 ]]
122
122
123
+ # Define the spacecraft's properties
124
+ scGeometry = geometryClass ()
125
+
123
126
# Add Earth gravity to the simulation if requested
124
127
if env == 'Gravity' :
125
128
earthGravBody = gravityEffector .GravBodyData ()
@@ -174,6 +177,58 @@ def run(show_plots, env):
174
177
scObject2 .hub .v_CN_NInit = rDot_B2N_N_0
175
178
scObject2 .hub .omega_BN_BInit = omega_B2N_B2_0
176
179
180
+ # Set up translating body
181
+ translatingBodyEffector = linearTranslationNDOFStateEffector .linearTranslationNDOFStateEffector ()
182
+ translatingBodyEffector .ModelTag = "translatingBodyEffector"
183
+ scObject1 .addStateEffector (translatingBodyEffector )
184
+ scSim .AddModelToTask (simTaskName , translatingBodyEffector )
185
+
186
+ translatingBody1 = linearTranslationNDOFStateEffector .translatingBody ()
187
+ translatingBody1 .setMass (100 )
188
+ translatingBody1 .setIPntFc_F ([[translatingBody1 .getMass () / 12 * (3 * (scGeometry .diameterArm / 2 ) ** 2 + scGeometry .heightArm ** 2 ), 0.0 , 0.0 ],
189
+ [0.0 , translatingBody1 .getMass () / 12 * (scGeometry .diameterArm / 2 ) ** 2 , 0.0 ],
190
+ [0.0 , 0.0 , translatingBody1 .getMass () / 12 * (3 * (scGeometry .diameterArm / 2 ) ** 2 + scGeometry .heightArm ** 2 )]])
191
+ translatingBody1 .setDCM_FP ([[1.0 , 0.0 , 0.0 ], [0.0 , 1.0 , 0.0 ], [0.0 , 0.0 , 1.0 ]])
192
+ translatingBody1 .setR_FcF_F ([[0.0 ], [scGeometry .heightArm / 2 ], [0.0 ]])
193
+ translatingBody1 .setR_F0P_P ([[0 ], [scGeometry .lengthHub / 2 ], [0 ]])
194
+ translatingBody1 .setFHat_P ([[0 ], [1 ], [0 ]])
195
+ translatingBody1 .setRhoInit (0.0 )
196
+ translatingBody1 .setRhoDotInit (0.0 )
197
+ translatingBody1 .setC (400.0 )
198
+ translatingBody1 .setK (100.0 )
199
+ translatingBodyEffector .addTranslatingBody (translatingBody1 )
200
+
201
+ translatingBody2 = linearTranslationNDOFStateEffector .translatingBody ()
202
+ translatingBody2 .setMass (100 )
203
+ translatingBody2 .setIPntFc_F ([[translatingBody2 .getMass () / 12 * (3 * (scGeometry .diameterArm / 2 ) ** 2 + scGeometry .heightArm ** 2 ), 0.0 , 0.0 ],
204
+ [0.0 , translatingBody2 .getMass () / 12 * (scGeometry .diameterArm / 2 ) ** 2 , 0.0 ],
205
+ [0.0 , 0.0 , translatingBody2 .getMass () / 12 * (
206
+ 3 * (scGeometry .diameterArm / 2 ) ** 2 + scGeometry .heightArm ** 2 )]])
207
+ translatingBody2 .setDCM_FP ([[1.0 , 0.0 , 0.0 ], [0.0 , 1.0 , 0.0 ], [0.0 , 0.0 , 1.0 ]])
208
+ translatingBody2 .setR_FcF_F ([[0.0 ], [scGeometry .heightArm / 2 ], [0.0 ]])
209
+ translatingBody2 .setR_F0P_P ([[0 ], [0 ], [0 ]])
210
+ translatingBody2 .setFHat_P ([[0 ], [1 ], [0 ]])
211
+ translatingBody2 .setRhoInit (0.0 )
212
+ translatingBody2 .setRhoDotInit (0.0 )
213
+ translatingBody2 .setC (400.0 )
214
+ translatingBody2 .setK (100.0 )
215
+ translatingBodyEffector .addTranslatingBody (translatingBody2 )
216
+
217
+ profiler2 = prescribedLinearTranslation .PrescribedLinearTranslation ()
218
+ profiler2 .ModelTag = "profiler"
219
+ profiler2 .setTransAccelMax (0.0005 )
220
+ profiler2 .setTransPosInit (translatingBody2 .getRhoInit ())
221
+ profiler2 .setSmoothingDuration (10 )
222
+ scSim .AddModelToTask (simTaskName , profiler2 )
223
+ translatingBodyEffector .translatingBodyRefInMsgs [1 ].subscribeTo (profiler2 .linearTranslationRigidBodyOutMsg )
224
+
225
+ translatingRigidBodyMsgData = messaging .LinearTranslationRigidBodyMsgPayload ()
226
+ translatingRigidBodyMsgData .rho = scGeometry .heightArm # [m]
227
+ translatingRigidBodyMsgData .rhoDot = 0 # [m/s]
228
+ translatingRigidBodyMsg2 = messaging .LinearTranslationRigidBodyMsg ().write (translatingRigidBodyMsgData )
229
+ translatingRigidBodyMsg2 .this .disown ()
230
+ profiler2 .linearTranslationRigidBodyInMsg .subscribeTo (translatingRigidBodyMsg2 )
231
+
177
232
# Create the constraint effector module
178
233
constraintEffector = constraintDynamicEffector .ConstraintDynamicEffector ()
179
234
# Set up the constraint effector physical parameters
@@ -185,7 +240,7 @@ def run(show_plots, env):
185
240
constraintEffector .ModelTag = "constraintEffector"
186
241
187
242
# Add the constraint to both spacecraft
188
- scObject1 .addDynamicEffector (constraintEffector )
243
+ translatingBody2 .addDynamicEffector (constraintEffector )
189
244
scObject2 .addDynamicEffector (constraintEffector )
190
245
191
246
# Add the modules to runtime call list
@@ -265,6 +320,15 @@ def run(show_plots, env):
265
320
266
321
return figureList
267
322
323
+ class geometryClass :
324
+ massHub = 400
325
+ lengthHub = 3
326
+ widthHub = 3
327
+ heightHub = 6
328
+ massArm = 50
329
+ heightArm = 3
330
+ diameterArm = 0.6
331
+
268
332
if __name__ == "__main__" :
269
333
run (
270
334
True , # show_plots: True or False
0 commit comments