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