Skip to content

Commit c59b078

Browse files
committed
[edit] constraint effector branching patch
1 parent c324eb5 commit c59b078

File tree

5 files changed

+238
-56
lines changed

5 files changed

+238
-56
lines changed

examples/scenarioConstrainedDynamics.py

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
# Basilisk imports
6969
from Basilisk.architecture import messaging
7070
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)
7272
import matplotlib.pyplot as plt
7373

7474
# Utility imports
@@ -120,6 +120,9 @@ def run(show_plots, env):
120120
scObject2.hub.r_BcB_B = [[0.0], [0.0], [1.0]]
121121
scObject2.hub.IHubPntBc_B = [[600.0, 0.0, 0.0], [0.0, 600.0, 0.0], [0.0, 0.0, 600.0]]
122122

123+
# Define the spacecraft's properties
124+
scGeometry = geometryClass()
125+
123126
# Add Earth gravity to the simulation if requested
124127
if env == 'Gravity':
125128
earthGravBody = gravityEffector.GravBodyData()
@@ -174,6 +177,58 @@ def run(show_plots, env):
174177
scObject2.hub.v_CN_NInit = rDot_B2N_N_0
175178
scObject2.hub.omega_BN_BInit = omega_B2N_B2_0
176179

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+
177232
# Create the constraint effector module
178233
constraintEffector = constraintDynamicEffector.ConstraintDynamicEffector()
179234
# Set up the constraint effector physical parameters
@@ -185,7 +240,7 @@ def run(show_plots, env):
185240
constraintEffector.ModelTag = "constraintEffector"
186241

187242
# Add the constraint to both spacecraft
188-
scObject1.addDynamicEffector(constraintEffector)
243+
translatingBody2.addDynamicEffector(constraintEffector)
189244
scObject2.addDynamicEffector(constraintEffector)
190245

191246
# Add the modules to runtime call list
@@ -265,6 +320,15 @@ def run(show_plots, env):
265320

266321
return figureList
267322

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+
268332
if __name__ == "__main__":
269333
run(
270334
True, # show_plots: True or False

examples/scenarioExtendingBoom.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ def run(show_plots):
260260
["arm3", translatingBodyEffector.translatingBodyConfigLogOutMsgs[2]],
261261
["arm4", translatingBodyEffector.translatingBodyConfigLogOutMsgs[3]]]
262262
viz = vizSupport.enableUnityVisualization(scSim, dynTaskName, scBodyList
263-
# , saveFile=fileName
263+
, saveFile=fileName
264264
)
265265
vizSupport.createCustomModel(viz
266266
, simBodiesToModify=[scObject.ModelTag]

src/simulation/dynamics/_GeneralModuleFiles/dynamicEffector.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,19 @@ class DynamicEffector {
4141
Eigen::Vector3d torqueExternalPntB_B = Eigen::Vector3d::Zero(); //!< [Nm] External torque applied by this effector
4242

4343
/** setter for `stateNameOfPosition` property */
44-
void setStateNameOfPosition(std::string value);
44+
virtual void setStateNameOfPosition(std::string value);
4545
/** getter for `stateNameOfPosition` property */
4646
const std::string getStateNameOfPosition() const {return this->stateNameOfPosition; }
4747
/** setter for `stateNameOfVelocity` property */
48-
void setStateNameOfVelocity(std::string value);
48+
virtual void setStateNameOfVelocity(std::string value);
4949
/** getter for `stateNameOfVelocity` property */
5050
const std::string getStateNameOfVelocity() const { return this->stateNameOfVelocity; }
5151
/** setter for `stateNameOfSigma` property */
52-
void setStateNameOfSigma(std::string value);
52+
virtual void setStateNameOfSigma(std::string value);
5353
/** getter for `stateNameOfSigma` property */
5454
const std::string getStateNameOfSigma() const { return this->stateNameOfSigma; }
5555
/** setter for `stateNameOfOmega` property */
56-
void setStateNameOfOmega(std::string value);
56+
virtual void setStateNameOfOmega(std::string value);
5757
/** getter for `stateNameOfOmega` property */
5858
const std::string getStateNameOfOmega() const { return this->stateNameOfOmega; }
5959
/** setter for `propName_m_SC` property */
@@ -85,19 +85,19 @@ class DynamicEffector {
8585
/** getter for `propName_centerOfMassDotSC` property */
8686
const std::string getPropName_centerOfMassDotSC() const { return this->propName_centerOfMassDotSC; }
8787
/** setter for `propName_inertialPosition` property */
88-
void setPropName_inertialPosition(std::string value);
88+
virtual void setPropName_inertialPosition(std::string value);
8989
/** getter for `propName_inertialPosition` property */
9090
const std::string getPropName_inertialPosition() const { return this->propName_inertialPosition; }
9191
/** setter for `propName_inertialVelocity` property */
92-
void setPropName_inertialVelocity(std::string value);
92+
virtual void setPropName_inertialVelocity(std::string value);
9393
/** getter for `propName_inertialVelocity` property */
9494
const std::string getPropName_inertialVelocity() const { return this->propName_inertialVelocity; }
9595
/** setter for `propName_inertialAttitude` property */
96-
void setPropName_inertialAttitude(std::string value);
96+
virtual void setPropName_inertialAttitude(std::string value);
9797
/** getter for `propName_inertialAttitude` property */
9898
const std::string getPropName_inertialAttitude() const { return this->propName_inertialAttitude; }
9999
/** setter for `propName_inertialAngVelocity` property */
100-
void setPropName_inertialAngVelocity(std::string value);
100+
virtual void setPropName_inertialAngVelocity(std::string value);
101101
/** getter for `propName_inertialAngVelocity` property */
102102
const std::string getPropName_inertialAngVelocity() const { return this->propName_inertialAngVelocity; }
103103
/** setter for `propName_vehicleGravity` property */

0 commit comments

Comments
 (0)