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.

The function scSim.InitializeSimulation() calls SelfInit() and Reset() for each module. The Update() mehtod is called each task time step when the simulation is executed.

../../_images/qs-bsk-2a.svg

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:

scSim.TotalSim.SingleStepProcesses()

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 Update() call.

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