Execution of Basilisk Modules¶
This guide discusses the main functions that a Basilisk module must perform during setup and when running the simulation. Each Basilisk module has 3 key methods that it must be able to perform:
SelfInit(): With the C-modules this method acts as the constructor that connects the output messages to write to their own payload (i.e. message data). This step is not required with C++ modules.
Reset(): This method should reset the module variables to desired default states. For example, this is where the integral feedback gain might be reset to 0, where module parameters like the spacecraft, reaction wheel or thruster configuration messages are read it, etc. This method typically also does some sanity checks that the module is configured properly, and that required input messages are connected, etc.
Update(): This is the primary module routine that is called every time the simulation advanced one time step. This routine shoudl controll all the functions that this module is to perform.
Reset() for each module. The
Update() mehtod is called each task time step when the simulation is executed.
The sample script below creates a single Basilisk module as illustrated above. The module variable
dummy is set to a non-zero value after the module is created. The
InitializeSimulation() method calls
Reset() which sets this
dummy variable equal to zero.
1 2from Basilisk.utilities import SimulationBaseClass 3from Basilisk.utilities import macros 4from Basilisk.moduleTemplates import cModuleTemplate 5from Basilisk.moduleTemplates import cppModuleTemplate 6from Basilisk.architecture import messaging 7 8def run(): 9 """ 10 Controlling the simulation time 11 """ 12 13 # Create a sim module as an empty container 14 scSim = SimulationBaseClass.SimBaseClass() 15 16 # create the simulation process 17 dynProcess = scSim.CreateNewProcess("dynamicsProcess") 18 19 # create the dynamics task and specify the integration update time 20 dynProcess.addTask(scSim.CreateNewTask("dynamicsTask", macros.sec2nano(1.))) 21 22 # create modules 23 mod1 = cModuleTemplate.cModuleTemplateConfig() 24 mod1Wrap = scSim.setModelDataWrap(mod1) 25 mod1Wrap.ModelTag = "cModule1" 26 scSim.AddModelToTask("dynamicsTask", mod1Wrap, mod1) 27 mod1.dummy = -10 28 print(mod1.dummy) 29 30 # initialize Simulation: 31 scSim.InitializeSimulation() 32 print(mod1.dummy) 33 34 # perform a single Update on all modules 35 scSim.TotalSim.SingleStepProcesses() 36 print(mod1.dummy) 37 38 return 39 40 41if __name__ == "__main__": 42 run()
To execute the code, this script doesn’t run the simulation for a period of time. Rather, the simulation is executed for a single time step. This is convenient in particular when testing the module input-output behavior. The command to execute Basilisk for one time step is:
After the single process step execution the module
dummy variable is printed out again to illustrate that an
Update() call has occured. Looking at the module source code you see that this variable is zero’d on reset and incremented by +1 on each
If you execute this python code you should see the following terminal output:
$ python bsk-2a.py -10.0 BSK_INFORMATION: Variable dummy set to 0.000000 in reset. 0.0 BSK_INFORMATION: C Module ID 1 ran Update at 0.000000s 1.0