Skip to main content
The thermal modules simulate the temperature evolution of spacecraft components under power dissipation and radiative exchange. Both modules integrate the thermal energy balance using simple Euler integration and output a TemperatureMsgPayload message.

Motor thermal

Computes the temperature of a reaction wheel motor accounting for mechanical power inefficiencies, friction heat generation, and radiative dissipation to the environment.Heat generation modelMechanical power from the motor:
P_mec = Ω × u_s
Power lost as heat (given mechanical efficiency η):
P_loss = P_mec × (1 − η) / η
Friction dissipation:
P_f = Ω × τ_f
Thermal dissipation to environment:
P_dissipation = (T_k − T_ambient) / R_ambient
Temperature update (Euler):
T_{k+1} = T_k + Δt × (|P_loss| + |P_f| − P_dissipation) / C_motor
Messages
MessageTypeDirectionDescription
rwStateInMsgRWConfigLogMsgPayloadInputRW mechanical torque, friction torque, and wheel speed
temperatureOutMsgTemperatureMsgPayloadOutputMotor temperature
Key parameters
ParameterDescription
currentTemperatureInitial motor temperature [°C]
ambientTemperatureAmbient temperature [°C]
efficiencyMechanical efficiency η (0–1)
ambientThermalResistanceThermal resistance to environment [°C/W]
motorHeatCapacityMotor heat capacity C_motor [J/°C]
from Basilisk.simulation import motorThermal

thermalModel = motorThermal.MotorThermal()
thermalModel.ModelTag = 'rwThermals'

thermalModel.currentTemperature = 40.0  # [Celsius] initial temperature
thermalModel.ambientTemperature = 20.0  # [Celsius]
thermalModel.efficiency = 0.7           # mechanical efficiency
thermalModel.ambientThermalResistance = 5.0  # [Celsius/W]
thermalModel.motorHeatCapacity = 50.0   # [J/Celsius]

thermalModel.rwStateInMsg.subscribeTo(rwStateEffector.rwOutMsgs[0])
sim.AddModelToTask(taskName, thermalModel)
Estimating parametersMotor heat capacity from mass and specific heat:
C_motor = m_motor × c_motor
Steel has a specific heat of approximately 466 J·kg⁻¹·°C⁻¹.Ambient thermal resistance from convection:
R_ambient = 1 / (h × A)
For free convection in air, h ≈ 100 W·m⁻²·°C⁻¹.Assumptions
  • Ambient temperature is constant
  • Ambient thermal resistance does not vary with temperature or pressure
  • Motor heat capacity is constant

Sensor thermal

Models the temperature of a flat-plate sensor accounting for radiative emission, solar absorption, and electrical power dissipation. The sensor is assumed to have an insulated backing (no conduction to the spacecraft).Energy balanceRadiative emission (Stefan–Boltzmann law):
Q_emit = ε × σ × A × T⁴
Solar absorption:
Q_absorb = illuminationFactor × α × S × A_proj
Temperature update (Euler):
T_i = T_{i-1} + (Q_absorb + Q_in − Q_emit) / (ρ × Vol × c_p) × dt
Messages
MessageTypeDirectionDescription
sunInMsgSpicePlanetStateMsgPayloadInputSun state
stateInMsgSCStatesMsgPayloadInputSpacecraft state
sunEclipseInMsgEclipseMsgPayloadInput (optional)Eclipse illumination factor
sensorStatusInMsgDeviceStatusMsgPayloadInput (optional)Sensor power on/off
temperatureOutMsgTemperatureMsgPayloadOutputSensor temperature
Key parameters
ParameterDefaultDescription
nHat_B[0,0,0]Required. Normal vector of sensor face in body frame
sensorArea−1Required. Sensor area [m²]
sensorAbsorptivity−1Required. Solar absorptivity α
sensorEmissivity−1Required. Thermal emissivity ε
sensorMass1.0 kgRequired. Sensor mass [kg]
sensorSpecificHeat890 J/kg/KSpecific heat (aluminum default)
T_00.0 °CInitial temperature [°C]
sensorPowerDraw0.0 WElectrical power dissipated as heat [W]
from Basilisk.simulation import sensorThermal

sensorThermalModel = sensorThermal.SensorThermal()
sensorThermalModel.ModelTag = 'sensorThermal'

sensorThermalModel.nHat_B = [0, 0, 1]       # face normal in body frame
sensorThermalModel.sensorArea = 1.0          # [m^2]
sensorThermalModel.sensorAbsorptivity = 0.25 # [-]
sensorThermalModel.sensorEmissivity = 0.34   # [-]
sensorThermalModel.sensorMass = 2.0          # [kg]
sensorThermalModel.sensorSpecificHeat = 890  # [J/kg/K]
sensorThermalModel.sensorPowerDraw = 30.0    # [W]
sensorThermalModel.T_0 = 0.0                 # [Celsius]

sensorThermalModel.sunInMsg.subscribeTo(sunMsg)
sensorThermalModel.stateInMsg.subscribeTo(scObject.scStateOutMsg)
sensorThermalModel.sunEclipseInMsg.subscribeTo(eclipseObject.eclipseOutMsgs[0])

sim.AddModelToTask(taskName, sensorThermalModel)
shadowFactor is deprecated. Use illuminationFactor in all new code. Support for shadowFactor ends December 31, 2026.
Assumptions
  • Flat plate with insulated backing (no conduction to spacecraft)
  • Earth albedo not included
  • All electrical power converts to heat instantly

Build docs developers (and LLMs) love