Portfolio

Starfish Space Internship

GNC Engineer

Non-Disclosure Agreement: only non-proprietary aspects of my work at Starfish Space are discussed here.

I spent my 2026 summer as a GNC intern at Starfish Space working on rendezvous and proximity operations for Otter, a servicing vehicle that uses relative navigation to autonomously dock with client spacecraft. My work covered three projects, each integrated into Starfish's Basilisk simulation and CI pipeline: a modular attitude control framework, a solar array shadowing model for power-aware proximity operations, and a SIL C++ thermal controller exercised across nominal and tumbling rendezvous 6-DOF simulations.

Generic Satellite Attitude Control

I designed a generic attitude controller class and a composable PID controller in Python and C++ for Basilisk. The wrapper handles what every control law shares - attitude error, reference rates in the body frame, torque saturation - and the flight software selects its law by name from config. The composable PID assembles that law at construction from lookup tables. Most importantly, the framework I developed supports entirely custom, Lyapunov, and other PID formulations without rebuilding the code, and each variant carries its own unit test. A simple version of the work is included in the demo below.

Create a Control Law

attitude propagation, 120s sim, unmodeled disturbance torque
Settle (<0.5°)
RMS Error
Peak torque
Control effort
Attitude tracking error [deg, log] selected baseline PD
Commanded body torque, max [N·m, log]
Gain Updates [K / K₀] Kp Kd

Supporting Power-aware Trajectory Design

Otter docks with clients significantly larger than itself, so both the client and Otter's own structure throw a moving shadow across the solar arrays. Client geometry is unique to every mission and the docked stack's dynamics change constantly, so a shadowing model that was accurate, cheap, and valid for all orientations was needed to assist with power-aware RPOD.

I built a ray tracing pipeline that resolves self and client shadowing directly from spacecraft geometry, including solar panel rotation. I reduced the dimensionality of the problem by collapsing the three-dimensional Sun vector to two angles and removing the dependence on Sun distance, reducing the problem to a 2-D look-up table of array visibility fraction that the BSK simulation interpolates in microseconds.

Ray tracing schematic: sunlight cast past the client onto Otter's arrays, with the resulting per-panel visibility fraction

Otter Client shadowing results for different orientations.

Solar array visibility look-up table over azimuth and elevation, before and after parallelization

The same azimuth × elevation visibility table before and after parallelization.

I integrated the model into Basilisk end to end: a custom pyModel that maps Otter's orientation onto the table's two angles and interpolates it, an interface layer wiring config, Python, and the C++ solar panel model together through the messaging system, and plotting support that resolves the resulting shadow factor across anything from a single orbit to a full year.

SIL Thermal Controller

Validating a thermal controller left two options: a mock controller, cheap and broad but blind to what the real firmware actually does, and TVAC, perfectly faithful but real-time and unable to sweep every orbit, attitude, and fault case.

I closed this gap by building a SIL framework connecting Otter's real temperature control firmware to Basilisk's 6-DOF Monte Carlo state propagation. The firmware communicates with the simulation over a lockstep socket interface, and the sim blocks on the client everystep, reproducing the flight-like single-step delay between reading a temperature and heater response.

Python server and C++ firmware client exchanging temperatures and heater states, and the resulting component temperature sawtooth against setpoint buffers

Socket interface and example temperature response profile.

Block diagram: one thermal plant feeding either the Python mock controller or the C++ firmware controller, selected by a YAML switch

One plant, two controllers - a simple config switch.

The simulation scales to n components. Also, the mock and firmware controllers hang off the same plant behind a config switch so that they compare on identical dynamics. I validated thermal control capability across nominal and tumbling rendezvous scenarios and added the checks to the CI unit test pipeline.

TOP SKILLS & TOOLS UTILIZED
GNC Flight Software
C++ Basilisk Simulation
Attitude Control Law Design
SIL Testing
6-DOF Monte Carlo Analysis
CI Unit Test Development