Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions docs/source/Support/bskReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,12 @@ Version |release|
The new option is useful when the user wants to ensure that the simulation runs for at least the specified time,
instead of at most the specified time.
- Fixed documentation quote typos that caused documentation build errors with doxygen version 1.15 and newer.
- Configured the :ref:`prescribedMotionStateEffector` module for attachment of other state effectors to it
rather than the spacecraft hub.
- Configured the :ref:`spinningBodyOneDOFStateEffector`, :ref:`spinningBodyTwoDOFStateEffector`, and
:ref:`linearTranslationOneDOFStateEffector` modules for optional attachment to the prescribed motion state effector.
- Added two example branching scenarios to illustrate the prescribed motion branching capability. See
:ref:`scenarioPrescribedMotionWithTranslationBranching` and :ref:`scenarioPrescribedMotionWithRotationBranching`.


Version 2.8.0 (August 30, 2025)
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 9 additions & 0 deletions examples/_default.rst
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,15 @@ Complex Spacecraft Dynamics Simulations
Robotic Arm Effector with Profiler <scenarioRoboticArm>
Spacecraft with an multi-link extending component <scenarioExtendingBoom>

Multi-Body Dynamics Simulations with Prescribed Motion Branching
----------------------------------------------------------------

.. toctree::
:maxdepth: 1

Prescribed Motion with Translating Effector Branching <scenarioPrescribedMotionWithTranslationBranching>
Prescribed Motion with Rotating Effector Branching <scenarioPrescribedMotionWithRotationBranching>

Mission Simulations
---------------------------------------

Expand Down
64 changes: 30 additions & 34 deletions examples/scenarioDeployingSolarArrays.py
Original file line number Diff line number Diff line change
Expand Up @@ -252,36 +252,32 @@ def run(show_plots):
array2ElementList.append(prescribedMotionStateEffector.PrescribedMotionStateEffector())
array1ElementList[i].ModelTag = "array1Element" + str(i + 1)
array2ElementList[i].ModelTag = "array2Element" + str(i + 1)
array1ElementList[i].mass = mass_element # [kg]
array2ElementList[i].mass = mass_element # [kg]
array1ElementList[i].IPntPc_P = IElement_PntPc_P # [kg m^2]
array2ElementList[i].IPntPc_P = IElement_PntPc_P # [kg m^2]
array1ElementList[i].r_MB_B = r_M1B_B # [m]
array2ElementList[i].r_MB_B = r_M2B_B # [m]
array1ElementList[i].r_PcP_P = [- radius_array * np.cos(72 * macros.D2R),
array1ElementList[i].setMass(mass_element) # [kg]
array2ElementList[i].setMass(mass_element) # [kg]
array1ElementList[i].setIPntPc_P(IElement_PntPc_P) # [kg m^2]
array2ElementList[i].setIPntPc_P(IElement_PntPc_P) # [kg m^2]
array1ElementList[i].setR_MB_B(r_M1B_B) # [m]
array2ElementList[i].setR_MB_B(r_M2B_B) # [m]
array1ElementList[i].setR_PcP_P([- radius_array * np.cos(72 * macros.D2R),
0.0,
(1/3) * radius_array * np.sin(72 * macros.D2R)] # [m] For triangular wedge
array2ElementList[i].r_PcP_P = [radius_array * np.cos(72 * macros.D2R),
(1/3) * radius_array * np.sin(72 * macros.D2R)]) # [m] For triangular wedge
array2ElementList[i].setR_PcP_P([radius_array * np.cos(72 * macros.D2R),
0.0,
(1/3) * radius_array * np.sin(72 * macros.D2R)] # [m] For triangular wedge
array1ElementList[i].r_PM_M = r_PM1_M1Init1 # [m]
array2ElementList[i].r_PM_M = r_PM2_M2Init1 # [m]
array1ElementList[i].rPrime_PM_M = np.array([0.0, 0.0, 0.0]) # [m/s]
array2ElementList[i].rPrime_PM_M = np.array([0.0, 0.0, 0.0]) # [m/s]
array1ElementList[i].rPrimePrime_PM_M = np.array([0.0, 0.0, 0.0]) # [m/s^2]
array2ElementList[i].rPrimePrime_PM_M = np.array([0.0, 0.0, 0.0]) # [m/s^2]
array1ElementList[i].omega_PM_P = np.array([0.0, 0.0, 0.0]) # [rad/s]
array2ElementList[i].omega_PM_P = np.array([0.0, 0.0, 0.0]) # [rad/s]
array1ElementList[i].omegaPrime_PM_P = np.array([0.0, 0.0, 0.0]) # [rad/s^2]
array2ElementList[i].omegaPrime_PM_P = np.array([0.0, 0.0, 0.0]) # [rad/s^2]
array1ElementList[i].sigma_PM = sigma_PM1Init1
array2ElementList[i].sigma_PM = sigma_PM2Init1
array1ElementList[i].omega_MB_B = [0.0, 0.0, 0.0] # [rad/s]
array2ElementList[i].omega_MB_B = [0.0, 0.0, 0.0] # [rad/s]
array1ElementList[i].omegaPrime_MB_B = [0.0, 0.0, 0.0] # [rad/s^2]
array2ElementList[i].omegaPrime_MB_B = [0.0, 0.0, 0.0] # [rad/s^2]
array1ElementList[i].sigma_MB = [0.0, 0.0, 0.0]
array2ElementList[i].sigma_MB = [0.0, 0.0, 0.0]
(1/3) * radius_array * np.sin(72 * macros.D2R)]) # [m] For triangular wedge
array1ElementList[i].setR_PM_M(r_PM1_M1Init1) # [m]
array2ElementList[i].setR_PM_M(r_PM2_M2Init1) # [m]
array1ElementList[i].setRPrime_PM_M(np.array([0.0, 0.0, 0.0])) # [m/s]
array2ElementList[i].setRPrime_PM_M(np.array([0.0, 0.0, 0.0])) # [m/s]
array1ElementList[i].setRPrimePrime_PM_M(np.array([0.0, 0.0, 0.0])) # [m/s^2]
array2ElementList[i].setRPrimePrime_PM_M(np.array([0.0, 0.0, 0.0])) # [m/s^2]
array1ElementList[i].setOmega_PM_P(np.array([0.0, 0.0, 0.0])) # [rad/s]
array2ElementList[i].setOmega_PM_P(np.array([0.0, 0.0, 0.0])) # [rad/s]
array1ElementList[i].setOmegaPrime_PM_P(np.array([0.0, 0.0, 0.0])) # [rad/s^2]
array2ElementList[i].setOmegaPrime_PM_P(np.array([0.0, 0.0, 0.0])) # [rad/s^2]
array1ElementList[i].setSigma_PM(sigma_PM1Init1)
array2ElementList[i].setSigma_PM(sigma_PM2Init1)
array1ElementList[i].setSigma_MB([0.0, 0.0, 0.0])
array2ElementList[i].setSigma_MB([0.0, 0.0, 0.0])

scObject.addStateEffector(array1ElementList[i])
scObject.addStateEffector(array2ElementList[i])
Expand Down Expand Up @@ -463,9 +459,9 @@ def run(show_plots):
array1ElementRefMsgList2 = list()
for i in range(num_elements):
array1ElementList[i].prescribedTranslationInMsg.subscribeTo(array1ElementTranslationMessage)
array1ElementList[i].r_PcP_P = [0.0, 0.0, - (2/3) * radius_array * np.sin(72 * macros.D2R)]
array1ElementList[i].r_PM_M = r_PM1_M1Init2 # [m]
array1ElementList[i].sigma_PM = sigma_PM1Init2
array1ElementList[i].setR_PcP_P([0.0, 0.0, - (2/3) * radius_array * np.sin(72 * macros.D2R)])
array1ElementList[i].setR_PM_M(r_PM1_M1Init2) # [m]
array1ElementList[i].setSigma_PM(sigma_PM1Init2)

array1RotProfilerList[i].setThetaInit(array1ThetaInit2) # [rad]
array1RotProfilerList[i].setThetaDDotMax(array1MaxRotAccelList2[i]) # [rad/s^2]
Expand Down Expand Up @@ -527,9 +523,9 @@ def run(show_plots):
array2ElementRefMsgList3 = list()
for i in range(num_elements):
array2ElementList[i].prescribedTranslationInMsg.subscribeTo(array2ElementTranslationMessage)
array2ElementList[i].r_PcP_P = [0.0, 0.0, - (2/3) * radius_array * np.sin(72 * macros.D2R)]
array2ElementList[i].r_PM_M = r_PM2_M2Init2 # [m]
array2ElementList[i].sigma_PM = sigma_PM2Init2
array2ElementList[i].setR_PcP_P([0.0, 0.0, - (2/3) * radius_array * np.sin(72 * macros.D2R)])
array2ElementList[i].setR_PM_M(r_PM2_M2Init2) # [m]
array2ElementList[i].setSigma_PM(sigma_PM2Init2)

array2RotProfilerList[i].setThetaInit(array2ThetaInit2) # [rad]
array2RotProfilerList[i].setThetaDDotMax(array2MaxRotAccelList3[i]) # [rad/s^2]
Expand Down
Loading
Loading