All projects

ASTRO Lab · Human-in-the-Loop Spacecraft Control

Manual Lunar Lander Control

I built a Python and C++ control system that converts keyboard, joystick, and game-controller inputs into physically representative forces and torques for a simulated lunar lander in Space Teams Pro.

  • Python
  • C++
  • Unreal Engine
  • Space Teams Pro
  • Control Mapping
Human-in-the-loop flight of the lunar lander in Space Teams Pro.
3 Input methods
6-DOF Manual vehicle motion
Python & C++ Software implementation
Real time Command and state updates

Project overview

Enabling Manual Lunar Lander Flight

The completed interface allows an operator to command main-engine thrust, vehicle translation, and attitude using a keyboard, joystick, or game controller. Each input is converted into the forces and torques that the corresponding main engine or RCS thrusters would produce.

The result is a real-time human-in-the-loop system that gives the operator direct control of the simulated vehicle.

My role

Building the Control Interface

I developed the control interfaces that translate user inputs into throttle, force, and torque commands. Python handled input processing and command generation, while C++ applied the resulting forces and torques through Unreal Engine's physics system.

The implementation also included main-engine command logic and a real-time state monitor that gave the operator visibility into vehicle position, velocity, attitude, angular rates, and commanded states.

System architecture

Operator Input to Vehicle Motion

The software architecture separates device input, command generation, force and torque application, and state feedback into modular components.

01

Operator Input

Keyboard, joystick, and game-controller inputs enter through a common input interface.

02

Python Command Mapping

Python converts device inputs into main-engine throttle, translational-force, and attitude-torque commands.

03

Limits and Frame Conversion

Commands are constrained by modeled actuator limits and mapped onto the correct vehicle body axes.

04

C++ and Unreal Physics

C++ applies the commanded forces and torques through Unreal Engine’s physics system, producing real-time vehicle motion based on the lander’s modeled dynamics.

Command mapping

Translation, Attitude, and Main-Engine Control

Each operator command maps to a physically representative action on the simulated vehicle.

Primary propulsion

Main-Engine Thrust

Main-engine inputs command thrust along the lander’s body-Z axis within modeled propulsion limits. The engine remained fixed-axis; vehicle attitude was controlled separately without main-engine gimbaling.

Translation

Body-Force Commands

Translational inputs command forces along the lander’s body-X and body-Y axes, producing motion perpendicular to the main-engine thrust axis.

Attitude control

Body-Torque Commands

Attitude inputs command bounded body torques to rotate the vehicle. Corresponding RCS visual effects identify which modeled thrusters would produce the requested motion.

Integration and result

Real-Time Human-in-the-Loop Flight

The completed system allows an operator to manually control the lander’s full six-degree-of-freedom motion in real time using physically representative forces, torques, and actuator limits.

Simulated lunar lander on the landing pad after a manually piloted flight
A successful landing on the designated pad following a manually piloted flight in Space Teams Pro.

What I learned

Physics, Interfaces, and System Integration

The greatest challenge was integrating input handling, Python command processing, C++ physics, coordinate frames, actuator limits, state tracking, and visual feedback into one responsive system.

The project demonstrated that physically representative forces and torques are only part of a successful manual-control interface. The complete system must also make those dynamics understandable and manageable for the operator.

Return to all projects