Skip to content

Gallery

A few trajectories generated by scripts under examples/trajgen/python/, to give a feel for what SSQP actually produces before digging into the code that produces it. Every one of these is an offline trajectory-generation solve, not a live simulation: SSQP solves the whole horizon once, and the result is played back.

Solve times

Each solve time and iteration count below is from a single run of the linked script on this machine: an Intel Core i9-14900K (24 cores / 32 threads), 64 GB RAM, Ubuntu 24.04. Both are SSQP's own reported figures, not the script's total wall-clock time, so setup (URDF loading, model construction) isn't included. Each script was run with both of SSQP's per-stage QP backends (see QP Solvers), ADMM and HPIPM, and the faster of the two is shown, labeled accordingly. Treat these as a feel for solve difficulty rather than a rigorous benchmark, for which see Benchmarks.

Go2 Walk

The Go2 quadruped walking 2 meters forward. Produced by go2_gaits.py, which builds its footstep and contact schedule with the GaitManager helper rather than hand-writing per-stage contact logic (compare to Go2 Jump, which schedules contacts directly). GaitManager ships several gait patterns (setWalk, setAmble, setTrot, setPace, setCanter, setGallop, setRotatoryGallop); this script is currently configured for setWalk, but swapping in any of the others produces the same forward motion with a different footfall pattern, worth trying if you want to see how SSQP handles a substantially different contact sequence with no other changes to the problem.

Solve time: 3.3 s (10 iterations, HPIPM)

Formulation: ForwardDynamics

Go2 Frog

The Go2 bounding forward 2 meters with a frog-like, feet-together gait, rather than the alternating-diagonal footfall pattern of a walk or trot. Produced by go2_frog.py, which (unlike go2_gaits.py) schedules every single- and multi-foot contact phase by hand as explicit stage ranges. It's a good example of just how expressive per-stage contact scheduling is: nothing about the constraint API assumes a "gait" in the periodic-footfall sense at all, an arbitrary, asymmetric, non-repeating sequence of which feet touch the ground when is just as representable as a standard one.

Solve time: 4.1 s (19 iterations, HPIPM)

Formulation: ReducedInverseDynamics

Go2 Multi-Jump

The Go2 performing five jumps in place (the same start and end position), also seen on the Home page. Produced by go2_multi_jump.py, which extends the single-jump pattern from Go2 Jump to a predefined sequence of flight windows (JUMP_STEPS), landing on a different combination of feet in each of the four gaps between them (LAND_SEQ: back feet, then right feet, then left feet, then front feet), rather than returning to a full four-foot stance every time.

Solve time: 13.8 s (93 iterations, ADMM)

Formulation: ReducedInverseDynamics

G1 Jump

The Unitree G1 humanoid jumping vertically in place, torso held level and upright throughout. Produced by g1_jump.py, structurally similar to Go2 Jump (a flight window with contacts dropped, symmetric before and after) but on a humanoid: each of G1's feet is modeled as four independent corner contact points rather than a single point contact per foot, as a flat foot actually needs to resist tipping, not just slipping or lifting off, giving the solver 8 simultaneous contact constraints to schedule per stance stage instead of Go2's 4.

Solve time: 8.2 s (13 iterations, HPIPM)

Formulation: ReducedInverseDynamics

G1 Walk

The Unitree G1 humanoid walking 3 meters forward. Produced by g1_walk.py, which, unlike G1 Jump's simultaneous stance on all 8 corner contact points, alternates strictly between single-leg support: one foot swings for a fixed number of stages while the other stays planted, then they switch, with short standing phases (all contacts active) only at the very start and end. Each foot's four corner contacts are also brought on and off gradually rather than all at once, one toe/heel pair engaging a stage before the other, closer to a real heel-to-toe rolling contact than an instantaneous flat-footed stomp. A hand-tuned per-joint regularization weight also damps the hip-yaw joints specifically, keeping the walk heading straight instead of shuffling sideways.

Solve time: 9.2 s (17 iterations, HPIPM)

Formulation: ReducedInverseDynamics

Panda Circle

A Franka Panda end effector tracing a circle in task space via frame-pose tracking costs, constrained (with --constrain, the default) to stay within a square window inscribed in that circle: watch the path flatten against the square's edges near the circle's corners rather than following it exactly, the constraint visibly winning out over the tracking cost there. This is the trajectory produced by panda_circle.py, covered in detail (including the unconstrained comparison) in Panda Circle (Trajectory Generation); the same motion also appears as a live, closed-loop MPC example in Panda Circle (MPC).

Solve time: 0.5 s (6 iterations, HPIPM)

Formulation: InverseDynamics