Most locomotion policies output joint position targets and learn gaits from scratch, shaped by reward terms. APT-RL moves the prior into the action space instead. First, a trajectory optimiser generates a large set of physically consistent gait cycles. It uses a single-rigid-body model (SRBD): the robot is treated as one rigid body pushed by ground forces, in the sagittal plane only. The paper's set is 180,000 trajectories, 90,000 trot and 90,000 bound, from −2 to 7 m/s. That's about 15.5 hours of motion, generated in 8 minutes.
A transformer VAE is trained on that set. Its encoder maps a short window of robot state to a 16-dimensional latent. Separate decoders, one per gait, map the latent back to joint torques. After training, the encoder is thrown away and the decoders are frozen. The RL policy then outputs three things. A gait bit, chosen at 2 Hz (trot below 0.5, bound above). A 16-dim latent and 12 auxiliary joint offsets, both at 100 Hz. What reaches the motors is the decoder's torque plus a PD term around the default pose, shifted by the auxiliary action:
τ = Dec_gait(z) + kp·(q_default − q + a_scale·a_aux) − kd·q̇
The prior shapes which motions are cheap, not which are allowed; whatever the 2D library can't express, like hip abduction or a jump, comes from the auxiliary channel. The paper's key check zeroes the decoder torque in a trained policy: success drops from 94.6% to 2.9%. I call that the ff=0 test and ran it on every policy.
SRBD trajectory optimisationPeriodic trot and bound cycles, sagittal plane, offline
→
Motion libraryState windows and torques per trajectory, filtered to the A1's limits
→
Transformer VAEEncoder to a 16-dim latent; one torque decoder per gait, then frozen
→
PolicyGait bit at 2 Hz; latent + 12 joint corrections at 100 Hz
→
Joint torqueDecoder torque + PD around default pose + correction