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.
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.moduleTemplates import cModuleTemplate
3from Basilisk.utilities import SimulationBaseClass
4from Basilisk.utilities import macros
5
6
7def run():
8 """
9 Controlling the simulation time
10 """
11
12 # Create a sim module as an empty container
13 scSim = SimulationBaseClass.SimBaseClass()
14
15 # create the simulation process
16 dynProcess = scSim.CreateNewProcess("dynamicsProcess")
17
18 # create the dynamics task and specify the integration update time
19 dynProcess.addTask(scSim.CreateNewTask("dynamicsTask", macros.sec2nano(1.)))
20
21 # create modules
22 mod1 = cModuleTemplate.cModuleTemplate()
23 mod1.ModelTag = "cModule1"
24 scSim.AddModelToTask("dynamicsTask", mod1)
25 mod1.dummy = -10
26 print(mod1.dummy)
27
28 # initialize Simulation:
29 scSim.InitializeSimulation()
30 print(mod1.dummy)
31
32 # perform a single Update on all modules
33 scSim.TotalSim.SingleStepProcesses()
34 print(mod1.dummy)
35
36 return
37
38
39if __name__ == "__main__":
40 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