Source code for test_formationBarycenter

# 
#  ISC License
# 
#  Copyright (c) 2021, Autonomous Vehicle Systems Lab, University of Colorado Boulder
# 
#  Permission to use, copy, modify, and/or distribute this software for any
#  purpose with or without fee is hereby granted, provided that the above
#  copyright notice and this permission notice appear in all copies.
# 
#  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
#  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
#  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
#  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
#  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
#  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
# 
# 

import copy

import numpy as np
import pytest
from Basilisk.architecture import messaging
from Basilisk.fswAlgorithms import formationBarycenter
from Basilisk.utilities import SimulationBaseClass, unitTestSupport, macros, astroFunctions, orbitalMotion


[docs] @pytest.mark.parametrize("accuracy", [1e-8]) def test_formationBarycenter(show_plots, accuracy): r""" **Validation Test Description** This unit test verifies the formationBarycenter module. It checks the barycenter of three spacecraft using both cartesian coordinates and orbital elements weighted averaging. **Test Parameters** The test parameters used are the following: Args: accuracy (float): absolute accuracy value used in the validation tests **Description of Variables Being Tested** In this file we are checking the values of the variables - ``barycenter`` - ``barycenterVelocity`` - ``barycenterC`` - ``barycenterVelocityC`` which represent the center of mass position and velocity vectors. The variables ending in ``C`` are pulled from the C-wrapped navigation output message, whereas the other two come from the usual C++ message. All these variables are compared to ``trueBarycenter`` and ``trueBarycenterVelocity``, which contain their true values. As stated, both the C and C++ wrapped message outputs are checked. """ [testResults, testMessage] = formationBarycenterTestFunction(show_plots, accuracy) assert testResults < 1, testMessage
[docs] def formationBarycenterTestFunction(show_plots, accuracy): """Test method""" testFailCount = 0 testMessages = [] unitTaskName = "unitTask" unitProcessName = "TestProcess" unitTestSim = SimulationBaseClass.SimBaseClass() testProcessRate = macros.sec2nano(1.) testProc = unitTestSim.CreateNewProcess(unitProcessName) testProc.addTask(unitTestSim.CreateNewTask(unitTaskName, testProcessRate)) # setup module to be tested barycenterModule = formationBarycenter.FormationBarycenter() barycenterModule.ModelTag = "barycenterModuleTag" unitTestSim.AddModelToTask(unitTaskName, barycenterModule) # Configure each spacecraft's position and velocity mu = astroFunctions.mu_E oe1 = orbitalMotion.ClassicElements() oe1.a = 1.1 * astroFunctions.E_radius # meters oe1.e = 0.01 oe1.i = 45.0 * macros.D2R oe1.Omega = 48.2 * macros.D2R oe1.omega = 347.8 * macros.D2R oe1.f = 85.3 * macros.D2R rN1, vN1 = orbitalMotion.elem2rv(mu, oe1) oe2 = copy.deepcopy(oe1) oe2.e = 1.05 * oe1.e oe2.i = 1.05 * oe1.i oe2.f = 1.05 * oe1.f rN2, vN2 = orbitalMotion.elem2rv(mu, oe2) oe3 = copy.deepcopy(oe1) oe3.e = 0.95 * oe1.e oe3.i = 0.90 * oe1.i oe3.f = 1.10 * oe1.f rN3, vN3 = orbitalMotion.elem2rv(mu, oe3) # Configure spacecraft state input messages scNavMsgData1 = messaging.NavTransMsgPayload() scNavMsgData1.r_BN_N = rN1 scNavMsgData1.v_BN_N = vN1 scNavMsg1 = messaging.NavTransMsg().write(scNavMsgData1) scNavMsgData2 = messaging.NavTransMsgPayload() scNavMsgData2.r_BN_N = rN2 scNavMsgData2.v_BN_N = vN2 scNavMsg2 = messaging.NavTransMsg().write(scNavMsgData2) scNavMsgData3 = messaging.NavTransMsgPayload() scNavMsgData3.r_BN_N = rN3 scNavMsgData3.v_BN_N = vN3 scNavMsg3 = messaging.NavTransMsg().write(scNavMsgData3) # Configure spacecraft mass input messages scPayloadMsgData1 = messaging.VehicleConfigMsgPayload() scPayloadMsgData1.massSC = 100 scPayloadMsg1 = messaging.VehicleConfigMsg().write(scPayloadMsgData1) scPayloadMsgData2 = messaging.VehicleConfigMsgPayload() scPayloadMsgData2.massSC = 150 scPayloadMsg2 = messaging.VehicleConfigMsg().write(scPayloadMsgData2) scPayloadMsgData3 = messaging.VehicleConfigMsgPayload() scPayloadMsgData3.massSC = 250 scPayloadMsg3 = messaging.VehicleConfigMsg().write(scPayloadMsgData3) # add spacecraft input messages to module barycenterModule.addSpacecraftToModel(scNavMsg1, scPayloadMsg1) barycenterModule.addSpacecraftToModel(scNavMsg2, scPayloadMsg2) barycenterModule.addSpacecraftToModel(scNavMsg3, scPayloadMsg3) # setup output message recorder objects barycenterOutMsg = barycenterModule.transOutMsg.recorder() barycenterOutMsgC = barycenterModule.transOutMsgC.recorder() unitTestSim.AddModelToTask(unitTaskName, barycenterOutMsg) unitTestSim.AddModelToTask(unitTaskName, barycenterOutMsgC) unitTestSim.InitializeSimulation() unitTestSim.TotalSim.SingleStepProcesses() barycenterModule.useOrbitalElements = True barycenterModule.mu = mu unitTestSim.TotalSim.SingleStepProcesses() # Pull module data barycenter = barycenterOutMsg.r_BN_N barycenterVelocity = barycenterOutMsg.v_BN_N barycenterC = barycenterOutMsgC.r_BN_N barycenterVelocityC = barycenterOutMsgC.v_BN_N elements = orbitalMotion.rv2elem(mu, barycenter[1], barycenterVelocity[1]) elementsArray = [elements.a, elements.e, elements.i, elements.Omega, elements.omega, elements.f] elementsC = orbitalMotion.rv2elem(mu, barycenterC[1], barycenterVelocityC[1]) elementsArrayC = [elementsC.a, elementsC.e, elementsC.i, elementsC.Omega, elementsC.omega, elementsC.f] # Set the true values trueBarycenter = np.array([-2795.61091086, 4349.07305245, 4711.56751498]) trueBarycenterVelocity = np.array([-5.73871824, -4.74464078, 1.07961505]) trueElements = [7015.94993, 0.0099, 0.7579092276785376, 0.8412486994612671, 6.07025513843626, 1.5855546253383273] # Verify the data if not unitTestSupport.isArrayEqual(barycenter[0], trueBarycenter, 3, accuracy) or \ not unitTestSupport.isArrayEqual(barycenterVelocity[0], trueBarycenterVelocity, 3, accuracy): testFailCount += 1 testMessages.append("FAILED: formationBarycenter cartesian unit test.") if not unitTestSupport.isArrayEqual(elementsArray, trueElements, 6, accuracy): testFailCount += 1 testMessages.append("FAILED: formationBarycenter orbital element unit test.") if not unitTestSupport.isArrayEqual(barycenterC[0], trueBarycenter, 3, accuracy) or \ not unitTestSupport.isArrayEqual(barycenterVelocityC[0], trueBarycenterVelocity, 3, accuracy): testFailCount += 1 testMessages.append("FAILED: formationBarycenter C message cartesian unit test.") if not unitTestSupport.isArrayEqual(elementsArrayC, trueElements, 6, accuracy): testFailCount += 1 testMessages.append("FAILED: formationBarycenter C message orbital element unit test.") if testFailCount == 0: print("PASSED: formationBarycenter unit test.") else: print(testMessages) return [testFailCount, "".join(testMessages)]
if __name__ == "__main__": test_formationBarycenter( False, # show_plots 1e-8 # accuracy )