Georgia Institute of Technology
School of Aerospace Engineering
Project brief · interactive edition · v8
AE 2220: Dynamics · Project 3

Build Your Own Roadster

Start with a 2D road car. Add wheel forces, a thruster-assisted jump, and a controlled flip; then build a 3D longitudinal roll. For extra credit, try a suction-assisted curved ramp, invent your own Roadster experiment, or do both.

InstructorBolei DengTeam4–5 students
SubmissionPowerPoint slides and a recorded presentation shorter than 10 minutesDatesSee Canvas

v8 · Four required stages · Two bonus options · Visualization-only Python/MATLAB support

Motivation

The demonstration we will try to understand.

On Thursday, October 15, 2026, Tesla demonstrated the next-generation Roadster at the SpaceX test site in McGregor, Texas. The vehicle climbed a curved ramp past vertical, remained attached while inverted, released and recovered before landing. A second sequence used thrust to jump over a row of vehicles while completing a longitudinal roll.

Video A · Curved ramp, inverted attachment, release, and landing
20-second action excerpt: the second climb, release beyond the lip, recovery, landing, and departure.
Video B · Thruster-assisted “kickflip” over the vehicle lineup
20-second action edit: approach, longitudinal roll, and landing, shown from two camera views.
Figure 1 · The two target maneuvers, frame by frame
a. Approach the ramp
b. Climb past vertical
c. Remain attached upside down
d. Release and reorient
e. Settle onto the road
f. Accelerate toward the lineup
g. Initiate the jump
h. Develop roll angle
i. Complete the rotation
j. Arrest motion and land
The project converts these observations into forces, moments, equations of motion, numerical integration, contact, and a defensible control history.

What physical ingredients were shown?

Wheel forces
While the tires remain in contact, the wheels can accelerate or brake the vehicle. In the model this is a tangential contact force, limited by available normal load and friction.
Cold-gas thrusters
Tesla described high-pressure-gas thrusters and separate attitude-control capability. In this project, each nozzle becomes a bounded vector force Fi(t) applied at a fixed point on the body.
Underbody suction
The demonstration used an underbody fan system to create downforce and remain attached as the ramp normal rotated. Tesla representatives described suction approaching 2 g during the event; treat that as reported context, not a required parameter.
Rigid-body motion
Every applied force changes translation; its line of action also changes rotation through MC = ri/C × Fi.
Classroom abstraction. We will not model tanks, compressors, valve dynamics, or detailed fan aerodynamics. The challenge is to choose force vectors and application points, integrate the rigid-body equations, and show that the resulting motion—not a prescribed animation—completes the maneuver.
Project goal

Model the car, then design the motion.

Build and validate your own car simulation: derive the motion from wheel and thruster forces, compute position and orientation, and demonstrate the four required stages. Two optional bonus challenges follow: a suction-assisted ramp and an original Roadster exploration. You may attempt either, both, or neither.

0.00 s
Reference motion and force balance
Force arrows point in the direction of force on the car, not exhaust. The roll and free-flight portions are integrated from Newton–Euler equations. The ramp climb is an ideal-track reference with balanced wheel and suction reactions; teams attempting Bonus Option 1 must implement their own ramp contact.
Visualization-only code support.

Use the supplied Python or MATLAB visualization tools to display trajectories from your own simulation: a 2D viewer for Stages 1–3, a 3D viewer for Stage 4 and optional explorations, and a planar ramp viewer for Bonus Option 1. Choose one language.

We provide: car drawings, animation, pose plots, optional data plots, and export. You write: the dynamics, contact/force models, integration, control inputs, event and collision checks, and performance calculations. Library ODE solvers are permitted. The viewers' built-in example motion is prescribed kinematics, not a dynamics solution.

Individual viewers are also downloadable in their relevant stages. Optional quaternion references appear only in Bonus Option 1.

You choose the geometry.

Choose your car dimensions, center-of-mass (COM) location, supports and thruster positions, then state all assumptions. A suction fan is needed only if you attempt Bonus Option 1.

What I expect you to submit

TeamWork in a group of 4–5. Divide responsibility across design/mechanics, theory, coding/simulation, and communication/visualization.
SlidesPrepare a coherent PowerPoint showing the physical model and equations, inputs, validation, trajectories, plots, and readable animations. Explain at least one failed attempt and an improvement.
Recorded presentationRecord a presentation shorter than 10 minutes. Every team member must speak and explain a meaningful part of the work.
ReproducibilitySubmit your simulation code, input parameters or force histories, and files needed to reproduce the plots and animations.
Control strategyThis is not a control course. A clearly explained trial-and-error, piecewise, or intuitive strategy is acceptable; the resulting motion must still follow your equations.
Minimum evidenceState your coordinate frames, inertia, forces/moments and assumptions. Include actual input histories, COM motion, orientation and rates, angular momentum, relevant contact loads and obstacle clearance, a free-drop check, and time-step refinement. Provide additional suction/release evidence only for bonus ramp work.

Four required stages + two optional bonus choices

  1. Flat-road vehicleGravity, unilateral contact, wheel force, braking, and a free-drop benchmark.Mandatory
  2. 2D jumpUse appropriately balanced thrust at two body points to leave the road, clear an obstacle, and land.Mandatory
  3. 2D frontflip or backflipUse differential thrust to create and later remove angular momentum.Mandatory
  4. 3D 360° rollMove normally, launch, roll about the body x-axis, recover, and land.Mandatory
  5. Bonus Option 1 · Suction-assisted rampClimb a finite curved ramp, remain attached, release, reorient, and land.Optional bonus
  6. Bonus Option 2 · Explore whatever you want with the RoadsterInvent a maneuver, optimization, robustness test, or hardware variation and support it with dynamics and quantitative evidence.Optional bonus

Bonus credit. You may attempt Option 1: suction-assisted ramp, Option 2: your own Roadster exploration, or both. All bonus work will be assessed together for one overall extra-credit award, based on its quality, depth, originality, and supporting results. Completing both options does not automatically earn more credit.

0 of 4 required stages · 0 of 2 bonus options marked
Stage 1

First, make a normal car behave normally.

Work in the vertical x–z plane and represent the vehicle by a rigid rectangle. Before adding spectacular thrust, the car must sit on the road, accelerate, brake, and survive a small drop without numerical instability.

(1)

A useful introductory contact model

Use two support points at the front and rear of the rectangle. These are abstract wheel/suspension supports fixed to the body; there is no need to track which part of a rotating tire contacts the ground.

Let zi be the vertical coordinate of support i. The road gap gi is the signed vertical distance from the floor to the support: positive above the floor, zero at the floor, and negative during effective suspension compression. The normal velocity vn,i is positive upward, away from the floor, and negative during approach. For a stationary horizontal floor:

(2)

k models the stiffness of the suspension, and c models its damping. The first maximum keeps the compression δi nonnegative. While compressed, its rate is −vn,i, so compression increases when the normal velocity is negative. The second maximum prevents the support from pulling on the car. A wheel command is simply a requested tangential force; braking is the same force with the opposite sign.

Benchmark before moving on. Release the car from a small height with zero thrust. It should contact the road, dissipate the bounce, and settle near the static compression. Repeat with a smaller time step and verify that penetration, peak normal load, and settling height do not change substantially.
0.00 s
Use the drop test first. Then select “Drive, coast, and brake” to see the wheel force reverse direction while the same contact model supports the car. Horizontal and vertical distances use the same scale. The arrows show applied forces, including gravity, with a common magnitude scale.

Your Stage 1 task

  • Derive the planar translation and rotation equations for your chosen body and support geometry.
  • Implement gravity, two or more unilateral ground contacts, forward wheel force, and braking.
  • Pass the free-drop and static-equilibrium benchmarks; report time-step sensitivity.
  • Show force histories, position/velocity, pitch angle, normal loads, and penetration in the slides.
Visualization only

One 2D viewer for driving, jumping, and flipping

Use the same file for Stages 1, 2, and 3. It draws a rigid car and ground, optionally draws obstacles, and makes pose plots. It does not compute a trajectory or any forces.

Required: t, x, z, theta, N samples each. Time in seconds; COM x,z in meters; continuous nose-up theta in radians. Positive z is upward. Optional obstacle rows: [x_left, width, height], meters.

Python · after your simulation

from roadster_2d import animate2D
out = animate2D(t, x, z, theta)

MATLAB · after your simulation

out = roadster_2d(t, x, z, theta);

Default box: L = 4.5 m, H = 1.2 m. Set dimensions and COM offset to match your model. For a display-only preview, run python roadster_2d.py or roadster_2d with no arguments in MATLAB.

Stage 2

Add two thrust points and make the car hop.

Keep the 2D rigid body. Add one ideal force actuator near the front and one near the rear. The two thrusts need not be equal: choose their ratio so that their moments about the COM balance and the car does not pitch.

You choose the front thruster location Tf and the rear thruster location Tr. The vector rTf/C goes from the center of mass C to the front thruster; rTr/C goes from C to the rear thruster. Express each vector and its force in the same frame.

(3)

The first target is intentionally simple: drive toward an obstacle, turn on appropriately balanced lift at both points, coast, then use a second pulse to reduce the descent speed. The reference simulator uses equal thrust because its mounts are equally spaced about the COM; your chosen geometry may require unequal thrust. It uses smooth pulse edges to avoid an artificial infinite jerk.

0.00 s
The two arrows represent force clusters at two body locations. Change the launch and landing pulses and watch obstacle clearance and touchdown velocity. Horizontal and vertical distances use the same scale. The arrows show applied forces, including gravity, with a common magnitude scale.

Your Stage 2 task

  • Reproduce the sequence: normal driving → lift pulse → airborne coast → descent reduction → landing → continued driving.
  • Define a minimum obstacle clearance and a maximum acceptable touchdown speed.
  • Plot both thrust inputs, COM trajectory, velocity, pitch angle, normal loads, and landing error.
  • Determine the front-to-rear thrust ratio for your chosen locations Tf and Tr, and explain why that ratio balances the pitching moments and keeps the car from pitching.
Use the same 2D Python/MATLAB viewer as Stage 1. Supply your computed t, x, z, theta and optional obstacle drawing. Calculate thrust balance, clearance and touchdown measures in your own code; the viewer only draws and plots them.
Stage 3

Now spend angular momentum: frontflip or backflip.

Use a differential thrust couple to start the rotation, then reverse the couple before touchdown. The important design problem is not merely reaching 360°; it is reaching the desired orientation with a small residual angular velocity.

(4)
0.00 s
In the reference schedule, opposite body-normal forces create a nearly pure moment. Reverse the pair to remove angular velocity. Move either pulse slightly and the landing deteriorates. Horizontal and vertical distances use the same scale. The arrows show applied forces, including gravity, with a common magnitude scale.

Your Stage 3 task

  • Complete one frontflip or backflip in the planar model.
  • Show the angular impulse used to accelerate and decelerate the rotation.
  • Compare at least one failed schedule with the improved schedule.
  • Report orientation error, residual angular velocity, touchdown velocity, peak acceleration, and thrust impulse.
Reuse the 2D viewer. Supply a continuous theta history so a full turn remains visible in the plot. Compute angular velocity, acceleration, momentum and input histories yourself, and pass any of them as optional plot signals.
Stage 4

Expand the same idea to a full 3D rigid body.

Define right-handed body axes a1, a2, a3, with a1 pointing to the front of the car, a2 pointing starboard, and a3 pointing toward the floor of the car, so yaw, pitch, and roll have their usual aerospace navigation meanings. The Roadster-style “kickflip” is modeled as approximately one full roll about the body x-axis while the car translates over the obstacle line.

(5)

Use the Body 3–2–1 Euler-angle relation from class, or another correctly defined orientation representation. A longitudinal roll with pitch near zero does not require a quaternion. The viewer accepts roll/pitch/yaw histories or body-to-world rotation matrices. Throughout this project and the downloadable viewers, R is the body-to-world rotation matrix (direction cosine matrix): vI = R vB. Its transpose RT maps world components to body components: vB = RT vI. Use this convention consistently when assembling forces, moments, and point positions.

riI is the position of point i from the inertial origin; rCI is the COM position from that origin. ri/CB goes from the COM to point i, expressed in body components.

0.00 s
Target sequence
Drive normally, launch, complete a 360° roll about a1, reverse the roll moment, reduce descent speed, land, and continue driving. The five parked cars use full vehicle-sized geometry. The dashed ΣT arrow is the resultant of the individual thrust forces, not an additional force. Gold arrows are applied thrust; gravity is always vertically downward. All force vectors share one scale.

Lecture language to use

Lecture notes showing Euler dynamic equation and inertia tensor
Euler’s dynamic equation, Newton’s equation, and the inertia tensor about the center of mass.
Lecture notes showing body 3-2-1 Euler angle sequence
Body 3–2–1 roll, pitch, yaw convention and the mapping from Euler-angle rates to body angular velocity.
Lecture notes showing a simulation loop for a 3D rigid body
A classroom simulation loop: evaluate force and moment, solve for acceleration and angular acceleration, update angular velocity and orientation, then update position and velocity.
Simulator convention. The simulators and MATLAB/Python support use the same body axes: a₁ to the front, a₂ starboard, and a₃ toward the floor of the car. Inertial plots keep height positive upward. Body-frame force components follow a₁, a₂, a₃, so negative body Fz provides lift for an upright car.

Your Stage 4 task

  • Build your own 6-DOF solver, including force and moment assembly, inertia, attitude evolution, numerical integration, and Newton–Euler accelerations. Clearly define the center of mass, inertia tensor, body frame, and thruster mount locations. The downloadable viewer displays the trajectory; it does not solve the dynamics.
  • Design a force schedule that completes one longitudinal roll while keeping pitch and yaw controlled.
  • Demonstrate takeoff, rotation, angular-rate arrest, landing, and continued ground motion.
  • Plot roll/pitch/yaw, body angular velocity and acceleration, angular momentum, COM motion, thrust commands, and contact loads.
Visualization only

One 3D viewer for the roll and your own exploration

Supply your computed 3D position and orientation. The file draws the rigid body, body axes, ground and optional obstacles, then plots the histories you supply. It does not solve dynamics and does not require quaternion input.

Required: t (N values), position (N × 3, columns x,y,z in meters), and attitude (N × 3, columns roll,pitch,yaw in radians). Alternative: body-to-world rotation matrices, Python N × 3 × 3 or MATLAB 3 × 3 × N, with matrix mode selected.

Axes and angles: world x initially forward, y left/port, z upward; body axes forward/right/down. Supply Body 3–2–1 roll, pitch, yaw in radians: zero angles are upright; positive roll lowers the right side, positive pitch raises the nose, and positive yaw turns right. Convert your simulation coordinates if necessary.

Python · after your simulation

from roadster_3d import animate3D
out = animate3D(t, position, attitude)

MATLAB · after your simulation

out = roadster_3d(t, position, attitude);

Default box: L = 4.5 m, W = 2.0 m, H = 1.2 m. Set dimensions and COM offset to match your model. Preserve a continuous roll history for full-turn evidence.

Bonus work · Extra credit

Option 1: Suction-assisted curved ramp

Choose either option or both. This ramp and your own Roadster exploration are assessed together under the bonus-credit policy. Neither is an additional required stage.

This extra-credit challenge combines wheel contact, a changing surface normal, suction, thrusters, release from a finite lip, free flight, and landing. Do not constrain the car to the ramp by directly prescribing its position; the attachment must emerge from contact and suction forces.

Optional orientation help. In a general 3D ramp model, Body 3–2–1 Euler-angle rate equations can become singular near vertical pitch; Euler’s rigid-body dynamics remain valid. A planar model can use one continuous pitch angle. If you encounter the 3D coordinate issue, see the optional quaternion support below.

0.00 s
Target sequence
Approach, climb past vertical with a valid sealed surface, reach the finite lip, release, rotate toward an upright attitude, reduce descent speed, and land. The car leaves the lip with its existing velocity, travels away from the ramp, and lands on the departure side. Suction is zero after release. The climb uses an ideal track constraint; free flight and landing use integrated forces and wheel contact.

Before implementing the full ramp, check the local force balance.

Required normal contact N / mg—

Point-COM balance with a schematic car: finite wheelbase and multi-point geometry are not resolved here. Preview extends to 180° for the ceiling check; the suggested mission arc ends at 170°. No normal jet force is included; COM offset h = 0.6 m, Rc = 10 m.

Parameterize the track instead of using z = h(x)

For the inside surface of a circular ramp with a horizontal entry:

(6)

The normal points toward the circle center: upward at the bottom, horizontally at 90°, and downward at the ceiling. For a contact candidate, locate the nearest valid surface point, use its normal, and evaluate the signed gap and normal approach speed. Respect the arc’s endpoints and finite width; do not use an infinite circular wall.

The downloadable ramp viewer draws the arc but supplies no surface-selection or contact algorithm. In your simulation, combine the valid floor/ramp candidates, avoid double-counting a junction contact, and detect the transition off the lip. A prescribed ramp path may test the display, but cannot serve as the final dynamics simulation.

Suction attracts toward the nearby surface; normal contact repels from it
(7)

Choose and report a seal-gap cutoff hmax and a facing criterion. For example, require the body-down direction R(0,0,1)T to be within 30° of −n, toward the surface. The suggested 30° is only an example criterion; you may choose and justify another value. The seal/facing gate must be implemented in your own simulation. The example hmax = 0.10 m is a classroom leakage model. Evaluate the gap at a modeled skirt/seal location, not automatically at the COM.

Once the seal is lost or no nearby finite surface exists, this suction-to-surface model gives S = 0. Any free-air fan thrust would be a separate modeled aerodynamic force; do not retain an unexplained attraction to a distant ramp.

At steady speed v on a COM path of radius Rc − h, with no normal jet component,

(8)

Ceiling check: at β = 180° and v = 0, N = S − mg. A sealed fan must provide at least mg just to sustain this assumed stationary attachment. If the required N is negative, ordinary contact cannot supply it; the prescribed attached state is infeasible. The car must detach or its other forces/trajectory must change.

Remember the fan’s application point and moment. Adding suction to the friction bound without also including it in the force and moment balances is not sufficient.

Option 1 · What to implement

  • Parameterize a finite ramp surface and compute its tangent, normal, closest valid point, and lip.
  • Apply suction only while a modeled skirt is close enough and correctly aligned with the surface.
  • Use contact to repel, suction to attract, and friction to support tangential motion; include every force’s moment about the COM.
  • Detect release rather than forcing it. Then integrate free flight and design the attitude-recovery and landing pulses.
  • Show seal gap, suction command, normal load, ramp position, release event, orientation, angular rate, and touchdown metrics.
Visualization only

Option 1 · Ramp visualization

A planar viewer with a finite curved-ramp background. You provide the car motion and compute contact, suction, release and landing. Optional quaternion mathematics in this file is a fallback for a general-3D bonus attempt, not a dynamics solver.

Required: t, x, z, theta, as in the 2D viewer. Drawing parameter: ramp = [entry_x, entry_z, radius, end_angle]; default [0,0,10,170°], but pass the angle in radians. The viewer never attaches the car to the track.

Python · after your simulation

from roadster_ramp import animateRamp
out = animateRamp(t, x, z, theta)

MATLAB · after your simulation

out = roadster_ramp(t, x, z, theta);

A planar ramp can be simulated with one continuous pitch angle through vertical and inversion. For a genuinely 3D ramp trajectory, the 3D viewer also accepts a supplied ramp polyline as scene geometry; use matrix mode to avoid Euler-angle extraction.

Optional help for Option 1: orientation near vertical pitch

This is optional help within the extra-credit ramp, not a separate required task and not automatic bonus credit merely for choosing quaternions. A planar theta model is valid through vertical. For a general 3D model, it is the inverse 3–2–1 Euler-angle rate relation that becomes singular at pitch ±90°, not Euler’s torque balance.

The ramp files include normalization, Hamilton multiplication, initial-angle conversion, quaternion-to-matrix conversion, and the kinematic derivative qdot = 0.5 q ⊗ [0, omega_body]. You still compute angular velocity from your own dynamics and integrate your own state. There is no quaternion time integrator, torque model, or completed ramp simulation.

Use the stated convention. Scalar-first q = (w,x,y,z), Hamilton product, body-to-world rotation; omega is in body coordinates, rad/s. With body forward/starboard/down and world forward/port/up, the upright initial quaternion is [0,1,0,0] (or its negative), not the identity quaternion. The initialization helper includes this fixed axis conversion. Normalize q after accepted integration steps; do not normalize qdot.

Python · optional math

from roadster_ramp import quat_from_euler, quat_rate, quat_to_matrix
q0 = quat_from_euler(0, 0, 0)
qdot = quat_rate(q, omega_body)  # inside YOUR derivative function
R = quat_to_matrix(q_history)  # after YOUR integration

MATLAB · optional math

Q = roadster_ramp('quaternion');
q0 = Q.from_euler(0, 0, 0);
qdot = Q.rate(q, omega_body);  % inside YOUR derivative function
R = Q.to_matrix(q_history);   % after YOUR integration

For general 3D playback, pass R to the 3D viewer in matrix mode and supply your ramp polyline as track. Do not convert back to Euler angles at the singular orientation just to satisfy the viewer. A quaternion/rotation matrix does not by itself record how many full turns were made; keep any required continuous rotation measure separately.

Optional reading: UC Berkeley: Euler-angle parameterization; UC Berkeley: quaternion representation; MathWorks: rotations and quaternions; Wikipedia background. References use varying active/passive conventions; this project’s explicit body-to-world contract takes precedence. The supplied helpers use ordinary arrays and do not require a quaternion toolbox.

Bonus work · Extra credit

Option 2: Explore whatever you want with the Roadster

Choose your own Roadster question or challenge: a new maneuver, an optimization, a disturbance-recovery test, a hardware variation, or another dynamics investigation. Extend your own simulation, compare meaningful cases, and explain what you learned. Use the 2D viewer or 3D viewer as appropriate. You may do this option alone or with the ramp; all bonus work contributes to the same overall extra-credit assessment.

The sandbox below is an optional flat-road 6-DOF teaching demonstration. It accepts timed forces at four mounts and displays the resulting motion. Use it to explore ideas; your submitted results and conclusions must come from your own simulation.

Force → motion lab

FLAT ROAD · 6 DOF · CLASSROOM MODEL
Drag to orbit · Scroll to zoom · Arrows show force ON the car
0.000 s
Click the plot to scrub · Playback samples 50 Hz; peaks checked at integration steps
Ready.

Experiment settings

Use the existing 2D or 3D viewer for your own simulated trajectories. Show a baseline and a modified design or input, and support your conclusions with quantitative results. This interactive lab is for exploration; it is not a substitute for your submitted solver.

Your thrust history

Times in seconds. Fx, Fy, Fz in kN below; exported CSV uses N. Rows sum per nozzle before the 15 kN vector-magnitude limit is applied. Body inputs use a₁/a₂/a₃; world inputs use the inertial x/y/z axes (initial forward/port/up).

Start [s]End [s]MountFrameFx [kN]Fy [kN]Fz [kN]

Changes to forces or initial conditions take effect after “Simulate my inputs.” The constant wheel request acts throughout the run, subject to contact and friction. For timed wheel commands in your submitted work, implement your own wheel-force function in your simulation.

Run peak COM specific force—
Run maximum penetration—
Thrust impulse ∫Σ|T|dt—
Integrated physics steps—

These are diagnostics, not an automatic project grade. Independent wheel contacts produce pitch, roll, and rebound; simulation continues after touchdown and through chassis bump-stop contact. A roof or obstacle impact disables the controls and marks an illustrative totaled-car state while rigid-body contact continues. The damage cue is not a deformation or occupant-safety model. Collision sampling remains discrete: refine the time step and add your own event and clearance checks.

Freestyle uses your existing viewer, not another code package. Reuse the 3D viewer (or the 2D viewer for a justified planar investigation), supply each simulation’s histories, and explain your baseline-versus-variant comparison. Experiment design, simulation and comparison metrics remain your work.
Optional sandbox utilities and checks

STL import changes only the display mesh. Contact points, inertia, and collision geometry remain those of the classroom model.

Visualization source

This is the exact source downloaded by the selected button. Viewers display supplied histories; they do not solve vehicle dynamics. Only the bonus-ramp files include optional quaternion mathematics.