Source code for test_ephemDifference

#
#   Unit Test Script
#   Module Name:        ephemDifference
#   Creation Date:      October 16, 2018
#


import inspect
import os
import pytest

filename = inspect.getframeinfo(inspect.currentframe()).filename
path = os.path.dirname(os.path.abspath(filename))

from Basilisk.utilities import SimulationBaseClass, unitTestSupport, macros
from Basilisk.fswAlgorithms import ephemDifference
from Basilisk.utilities import astroFunctions
from Basilisk.architecture import messaging

[docs]@pytest.mark.parametrize("ephBdyCount", [3, 0]) def test_ephemDifference(ephBdyCount): """ Test ephemDifference. """ [testResults, testMessage] = ephemDifferenceTestFunction(ephBdyCount) assert testResults < 1, testMessage
[docs]def ephemDifferenceTestFunction(ephBdyCount): """ Test the ephemDifference module. Setup a simulation, """ testFailCount = 0 # zero unit test result counter testMessages = [] # create empty array to store test log messages unitTaskName = "unitTask" # arbitrary name (don't change) unitProcessName = "TestProcess" # arbitrary name (don't change) # Create a sim module as an empty container unitTestSim = SimulationBaseClass.SimBaseClass() # Create test thread testProcessRate = macros.sec2nano(0.5) # update process rate update time testProc = unitTestSim.CreateNewProcess(unitProcessName) testProc.addTask(unitTestSim.CreateNewTask(unitTaskName, testProcessRate)) # Add a new task to the process ephemDiff = ephemDifference.ephemDifference() # This calls the algContain to setup the selfInit, update, and reset ephemDiff.ModelTag = "ephemDifference" # Add the module to the task unitTestSim.AddModelToTask(unitTaskName, ephemDiff) # Create the input message. inputEphemBase = messaging.EphemerisMsgPayload() # The clock correlation message ? # Get the Earth's position and velocity position, velocity = astroFunctions.Earth_RV(astroFunctions.JulianDate([2018, 10, 16])) inputEphemBase.r_BdyZero_N = position inputEphemBase.v_BdyZero_N = velocity inputEphemBase.timeTag = 1234.0 ephBaseInMsg = messaging.EphemerisMsg().write(inputEphemBase) ephemDiff.ephBaseInMsg.subscribeTo(ephBaseInMsg) functions = [astroFunctions.Mars_RV, astroFunctions.Jupiter_RV, astroFunctions.Saturn_RV] changeBodyList = list() ephInMsgList = list() if ephBdyCount == 3: for i in range(ephBdyCount): # Create the change body message changeBodyMsg = ephemDifference.EphemChangeConfig() changeBodyList.append(changeBodyMsg) # Create the input message to the change body config inputMsg = messaging.EphemerisMsgPayload() position, velocity = functions[i](astroFunctions.JulianDate([2018, 10, 16])) inputMsg.r_BdyZero_N = position inputMsg.v_BdyZero_N = velocity inputMsg.timeTag = 321.0 # Set this message ephInMsgList.append(messaging.EphemerisMsg().write(inputMsg)) changeBodyMsg.ephInMsg.subscribeTo(ephInMsgList[-1]) ephemDiff.changeBodies = changeBodyList # the logging setup must occur on the actual ephemDiff.changeBodies[i].ephOutMsg as we are providing # pointers to the message payload. Logging changeBodyList.ephOutMsg won't work as this message has a # different location. dataLogList = list() for i in range(ephBdyCount): dataLogList.append(ephemDiff.changeBodies[i].ephOutMsg.recorder()) unitTestSim.AddModelToTask(unitTaskName, dataLogList[i]) # Initialize the simulation unitTestSim.InitializeSimulation() # The result isn't going to change with more time. The module will continue to produce the same result unitTestSim.ConfigureStopTime(0) # seconds to stop simulation unitTestSim.ExecuteSimulation() if ephBdyCount == 3: trueRVector = [[69313607.6209608, -75620898.04028425, -5443274.17030424], [-5.33462105e+08, -7.56888610e+08, 1.17556184e+07], [9.94135029e+07, -1.54721593e+09, 1.65081472e+07]] trueVVector = [[15.04232523, -1.13359121, 0.47668898], [23.2531093, -33.17628299, -0.22550391], [21.02793499, -25.86425597, -0.38273815]] posAcc = 1e1 velAcc = 1e-4 unitTestSupport.writeTeXSnippet("toleranceValuePos", str(posAcc), path) unitTestSupport.writeTeXSnippet("toleranceValueVel", str(velAcc), path) for i in range(ephBdyCount): outputData_R = dataLogList[i].r_BdyZero_N outputData_V = dataLogList[i].v_BdyZero_N timeTag = dataLogList[i].timeTag # print(timeTag) # print(outputData_R) # At each timestep, make sure the vehicleConfig values haven't changed from the initial values testFailCount, testMessages = unitTestSupport.compareArrayND([trueRVector[i]], outputData_R, posAcc, "ephemDifference position output body " + str(i), 2, testFailCount, testMessages) testFailCount, testMessages = unitTestSupport.compareArrayND([trueVVector[i]], outputData_V, velAcc, "ephemDifference velocity output body " + str(i), 2, testFailCount, testMessages) if timeTag[0] != 321.0: testFailCount += 1 testMessages.append("ephemDifference timeTag output body " + str(i)) if ephemDiff.ephBdyCount is not ephBdyCount: testFailCount += 1 testMessages.append("input/output message count is wrong.") snippentName = "passFail" + str(ephBdyCount) if testFailCount == 0: colorText = 'ForestGreen' print("PASSED: " + ephemDiff.ModelTag) passedText = r'\textcolor{' + colorText + '}{' + "PASSED" + '}' else: colorText = 'Red' print("Failed: " + ephemDiff.ModelTag) passedText = r'\textcolor{' + colorText + '}{' + "Failed" + '}' unitTestSupport.writeTeXSnippet(snippentName, passedText, path) return [testFailCount, ''.join(testMessages)]
if __name__ == '__main__': test_ephemDifference(3)