← MuJoCo Sandbox

Engineering journal · September 7, 2026 · MuJoCo 3.12 · MuJoCo Menagerie

A six-legged robot with two arms carries a mug and a block between tables

A 58.8 kg hexapod with two Kinova Gen3 arms and Robotiq 2F-85 grippers walks to a cluttered table, grasps a mug and a block by finger contact, carries both around a barrier and sets them down on a second table. The gait and the grasps are programmed, not learned: every movement comes from bounded joint commands, leg contact and MuJoCo physics.

The complete validated run in six synchronized views at real time (1×): 112.9 simulated seconds, then a four-second hold on the verified final state. Rendered from the recorded physical trajectory; the control is scripted.
112.9 s
simulated time for the complete transfer
6.2 · 16.5 mm
placement error, mug · block (tolerance 60 mm)
0 · 0
MuJoCo warnings · robot penetrations of tables or barrier over 1 mm
58.8 kg
robot mass, carried on five of six feet while walking
35 min 48 s
brief to validated demo, elapsed wall-clock time
Where this stands. One nominal, deterministic run in a known scene, and it passed every check. MuJoCo simulates the floating base, the leg contacts, the arms, the gripper linkages and the free objects. A programmed state machine, analytic leg inverse kinematics and damped arm inverse kinematics turn simulator state and known table coordinates into bounded joint targets; nothing is learned, and the cameras are watched, not used for control. Robustness to moved objects, other friction or masses, and pushes has not been tested. Every number on this page comes from the repository's reports and documentation.

1 · A brief, and a static scene before motion

September 7, 2026 · 20:01–20:20 PDT · nothing moved until the scene was approved

The brief asked for a six-legged, spider-like robot with two independent arms that moves objects between tables: approach a cluttered source table from an offset start, pick up a small mug with one gripper and a block with the other, carry both around a barrier to a second table, then place and release them. The body could be built from primitives; the arms and grippers had to be the Kinova Gen3 and Robotiq 2F-85 models from MuJoCo Menagerie. It asked for documented masses, joint limits and torque limits, head, wrist and third-person cameras, and a preview of the scene before any movement.

So the scene came first. Two tables with 1.30 × 1.40 m tops at 0.84 m stand 3.6 m apart, with a barrier 2.4 m wide and 1.24 m high between them. The robot starts at (−2.15, −1.35) m, offset from the source table. On the source table sit an orange hollow mug, a blue block and four loose clutter blocks, all free bodies. Green squares on the destination mark where the two objects belong; they have no collision.

Five tests guarded the static scene: vendored asset hashes, model structure with two independent grippers, initial contacts on the six feet only, leg clearance over 150 sampled leg configurations, and a five-second physics hold. The checkpoint was ready 12 minutes 55 seconds into the session, with six camera renders inspected and the native macOS viewer tested. The user approved the preview six minutes later, and only then did movement work begin.

Static scene preview: the hexapod beside the source table, the barrier and the destination, with head and wrist camera views
The static design checkpoint the user approved: the whole scene, the robot, and the head and wrist cameras, rendered before any controller existed.
Fix the world while it stands still. Geometry, clearance and cameras are cheap to change before anything moves. The leg clearance sample covers a conservative swing envelope (yaw ±0.25, hip ±0.15, knee ±0.20 rad), not every combination of the full joint limits; that limit is kept on record.

2 · The robot

September 7 · a primitive-shape body, Menagerie arms and grippers, documented limits

The body is boxes, capsules and spheres: a 1.14 × 0.62 × 0.23 m hull, a low belly for stability and a deck for the arms. Each leg has a yaw, a hip and a knee joint: a 0.22 m coxa, a femur and a long tibia ending in a 40 mm rubber foot. The front, middle and rear legs fan out at 45°, 90° and 135° on each side. Standing, the belly clears the floor by 0.61 m and the feet span about 2.10 × 2.36 m.

The two Gen3 arms stand on pedestals 0.47 m apart on the forward deck, above the leg plane. Their files are vendored unchanged from a pinned Menagerie commit with a SHA-256 hash for every file. The scene assembly namespaces each instance, adds travel bounds, damping and armature, and mounts the gripper the way Kinova's Menagerie instructions specify. Each 2F-85 keeps its two four-bar linkages, its tendon split and its three equality constraints, so the fingers move as a real linkage driven by one actuator.

The hexapod with two white Kinova arms on its deck, next to the source table
Primitive body, Menagerie arms and grippers. MuJoCo computes the primitive links' inertias from their shape and mass; the Menagerie inertias are kept.
ComponentMass (kg)
Chassis hull16
Belly · deck · head4 · 1.2 · 0.38
Each leg (coxa 0.75, femur 1.15, cover 0.12, tibia 0.85, foot 0.15), × 63.02
Each arm pedestal, × 20.45
Each Kinova Gen3 (upstream inertials), × 28.1879
Each Robotiq 2F-85 as attached, × 2≈ 0.9026
Trim strips0.05
Complete robot (MuJoCo compiled)≈ 58.831
Mug · block · each clutter block0.21 · 0.12 · 0.15

Joint travel and torque caps

Joint groupTravel (rad)Torque capKp / Kv
Leg yaw, × 6−0.65 … +0.65±65 N·m400 / 35
Leg hip, × 6−0.75 … +0.70±120 N·m650 / 45
Leg knee, × 6−0.65 … +0.85±100 N·m600 / 40
Gen3 J1–J4, × 2 armsJ1, J3 ±π · J2 ±2.24 · J4 ±2.57±105 N·m2000 / 100
Gen3 J5–J7, × 2 armsJ5, J7 ±π · J6 ±2.09±52 N·m500 / 50
Robotiq actuator, × 2control 0 (open) … 255 (closed)±5 N·m (tendon)upstream
Why five feet stay down. 58.8 kg on six feet is about 96 N per foot, on three feet about 192 N. At roughly 0.6 m of horizontal hip leverage, three-foot support could need about 115 N·m, close to the 120 N·m hip cap. So the gait lifts one foot at a time. Every one of the 34 actuators has a force range as well as a command range, and the simulation stops if any actuator exceeds its cap. These are simulation design limits, not hardware specifications; the Gen3 caps and gains come from the Menagerie model, and the ±π limits on its continuous joints are software bounds against unlimited winding.

3 · Eighteen phases

September 7 · a fixed route and a programmed state machine

The task is a state machine of 18 phases. Timed phases end after a fixed duration; walking phases end when the base is within 15 mm of its waypoint and has almost stopped. The route is fixed for this scene: (−0.95, 0) → (−2.7, 0) → (−2.7, 3.6) → (−0.95, 3.6) m. The robot is never commanded to turn. It keeps facing the tables and walks forward, backward or sideways toward each waypoint, so its long footprint of arms and legs never swings near the fixtures. The footprint, not the chassis centre, sets how far west it must pass: the base needs X ≤ −2.5 m, and the route uses −2.7 m.

#PhaseStarts (s)Ends when
1Approach source0.00at (−0.95, 0)
2Settle at source15.373 s
3Align open grippers18.383 s
4Lower beside objects21.392 s
5Reach around mug and block23.402 s
6Close both grippers25.412 s and both pads touching, on both grippers
7Lift both objects27.423 s
8Tuck arms for carrying30.433 s
9Back away from source33.43at (−2.7, 0)
10Walk around barrier48.22at (−2.7, 3.6)
11Approach destination79.81at (−0.95, 3.6)
12Settle at destination94.843 s
13Extend above placement marks97.853 s
14Lower onto destination100.863 s
15Release both objects103.872 s
16Withdraw open grippers105.882 s
17Raise clear of table107.892 s
18Verify placement109.903 s, then the success check at 112.91 s
Overhead view: the hexapod at its start, the source table, the barrier and the destination table with two green marks
The overhead camera at the start. The robot walks to the source table (bottom right), backs out west (left), walks sideways north past the barrier (yellow) and forward to the destination (top), whose green marks are the targets. Phase start times are from the recorded run.
What counts as success. Each object must end within 60 mm of its mark, upright, nearly still, touching the destination top and touching no gripper. All 18 phases must complete with no MuJoCo warnings and no robot penetration of the tables or barrier beyond 1 mm, checked at every 2 ms physics step. The run aborts if either object's origin drops below 1 m while being carried, or if a walking phase takes longer than 80 s. Reaching the last phase is not enough.

4 · One foot at a time

September 7 · a five-foot ripple gait, anchored to measured touchdowns

The floating base has no motor. It moves only because the feet push on the floor, so walking is entirely leg control. Each foot swings for 0.36 s while the other five carry the robot, in the order left front, right rear, left middle, right front, left rear, right middle; a full cycle takes 2.16 s. A swing lifts the foot 85 mm on a smooth arc and aims it ahead of its neutral spot in the direction of travel. Commanded speed is capped at 0.12 m/s and acceleration at 0.25 m/s². Closed-form inverse kinematics turns each foot target into yaw, hip and knee angles; a test checks it against MuJoCo's own forward kinematics to 10−7 rad on 60 random leg poses.

The controller runs at 100 Hz against 500 Hz physics, and its only output is joint targets. The transfer test enforces that: it checks that a controller update never changes the robot's position or the objects', and that no external forces are applied at any step.

The first gait walked off its map. The initial version moved the feet on an open-loop schedule and never checked where each foot had actually landed. Body-position error accumulated to about half a metre.
Anchor the gait to what the feet actually did. When a foot lands, its target is replaced by its measured position, and stance feet hold those measured spots. The body reference, where the controller wants the base to be, advances at the commanded speed but is never allowed more than 35 mm from the measured base. With that feedback the robot reaches every waypoint. Before manipulation, a stop finishes one more six-step cycle to recentre the feet.
Backing away from the source, then turning the route's corner into the sideways walk around the barrier, at real time (1×), simulated seconds 44 to 60. In the following-detail panel (top centre) the legs step one at a time. Scripted gait, recorded physical run.

Walking took 76.8 of the 112.9 simulated seconds. The longest stretch, 3.6 m sideways past the barrier, took 31.6 s, an average of 0.11 m/s against the 0.12 m/s cap.

5 · Holding by finger contact only

September 7 · no welds, no pose writes; both pads must touch before lifting

Each arm solves damped Jacobian inverse kinematics on a scratch copy of the simulation state, 15 iterations per controller update, starting from its previous answer. Only the resulting joint targets reach the simulated arm. Gravity compensation is added to those targets, and the original torque caps still apply.

Both grippers approach horizontally. They align beside the objects with open fingers, lower to pinch height, slide 16 cm forward around the mug and the block, and close. The right gripper takes the mug, a hollow cup of 64 mm diameter built from a floor, 20 wall segments and 12 handle segments, all of which collide; the left takes the 50 mm block. Both fit the gripper's 85 mm opening.

The lift has to be earned. After closing, the state machine counts the object's contacts with each gripper's two pads, and unless both pads touch on both grippers the run stops with an error. In the recorded run both grasps were confirmed at 27.42 s. The model has no mocap bodies and no weld constraints; its only six equality constraints are the grippers' own linkages. The mug and the block stay free bodies, held by friction at the pads, and while carried they stayed above 1.10 m, well clear of the 1 m abort line.

The wrist camera went through the table. The first horizontal grasp orientation put the Gen3's wrist vision housing through the table edge. The housing's collision geometry was kept; instead the tool frame was rolled so the housing rides above the table, and both grasps then worked.
Align, lower, reach, close, confirm, lift and tuck, at real time (1×), simulated seconds 18 to 32. The bottom centre and right panels are the two wrist cameras, each looking along its own fingers. Scripted control, recorded physical run.

6 · What broke, and the clock

September 7 · four problems, each fixed at its cause

Four things went wrong while the demo was built. Each was fixed where it arose: no collision geometry was removed and no object was attached to a hand.

ProblemWhat happenedFix
macOS viewer launchRunning mjpython through uv could not find libpython3.12.dylib The launcher passes the interpreter's library directory to the official macOS trampoline in a subprocess environment; no system libraries or shell settings changed
Open-loop foot scheduleAbout 0.5 m of accumulated body-position error Measured touchdowns and a body reference held within 35 mm of the measured base (chapter 4)
First horizontal graspThe Gen3 wrist vision housing went through the table edge Roll the tool frame; collision geometry unchanged (chapter 5)
Gripper mountingA redundant Robotiq coupling was stacked on the Kinova wrist interface Follow the Kinova-specific Menagerie instructions: drop the base mount and attach the gripper directly

The clock

MilestoneLocal time (PDT)Note
Session start (approximate)20:01:31Workspace creation time
Static scene checkpoint20:14:26Five tests pass, six renders inspected
Scene approved, movement work begins20:20:32Review pause of about 6 min 6 s
First complete transferby 20:29:04Next recorded clock reading, an upper bound
Tests and recording inspected20:36:09Seven tests pass
Demo implemented and validated20:37:1935 min 48 s after the session start
Six-view film verified20:46:29A 4 min 40 s follow-up
Wall time is not compute time. The 35 minutes 48 seconds are elapsed development time, including the user's review pause, tests, rendering and communication. The finished task itself runs headless in 23.5 s of wall time for 112.9 simulated seconds.

7 · Results

The nominal run: one deterministic transfer, checked at every 2 ms physics step

2/ 2
objects placed, released, upright and resting on the destination
transfer complete at 112.91 simulated s
6.2mm
mug placement error, right gripper
tolerance 60 mm
16.5mm
block placement error, left gripper
tolerance 60 mm
0· 0
MuJoCo warnings · robot penetrations of tables or barrier over 1 mm
checked at every physics step
ResultMug, rightBlock, left
Final position (m)(0.124, 3.369, 0.840)(0.141, 3.808, 0.870)
Placement error6.2 mm16.5 mm
Resting on the destinationyesyes
Released by the gripperyesyes
Uprightyesyes
Lowest object-origin height while carried1.107 m1.138 m
Whole runMeasured
Simulated time112.912 s
Headless wall time23.5 s
Largest arm IK position residual16.9 mm
Peak actuator torque / cap1.0
Robot penetration of tables or barrier over 1 mmnone
Robot self-penetration over 1 mm (20 Hz trajectory)none
Tests7 passed

A peak torque fraction of 1.0 means at least one actuator reached its cap during the run; no cap was ever exceeded. The seven tests cover the vendored asset hashes, the model structure, the initial contacts, sampled leg clearance, a stationary physics hold, the leg inverse kinematics against MuJoCo, and the complete transfer.

Lower, release, withdraw, raise and verify, at real time (1×), simulated seconds 100 to 112.9, then the four-second hold on the verified final state. Recorded physical run.
Four frames: both objects lifted, carrying around the barrier, release at the destination, objects upright and released
Checkpoints rendered from the run: both objects lifted, carried around the barrier, released, and resting upright on their marks.
What this does and does not show. It is one deterministic run with fixed task coordinates and simulator-state feedback, in the scene it was designed for. Robustness to moved objects, other friction or masses, external pushes and new routes is not claimed. The frictions, gains and limits pass this task; they have not been swept.

8 · Cameras, the film, and next steps

Six synchronized views rendered from the recorded run; the cameras are observer output

Scene cameras

  • third_person: the source, the barrier and the destination
  • Following detail: a tracking view that follows the chassis in the film (robot_detail is its fixed counterpart)
  • overhead: layout and route clearance

Robot cameras

  • head: on the head, panned 0.4 rad toward the source, 75° vertical field of view
  • left_wrist, right_wrist: the Menagerie Gen3 bracelet cameras, 41.84°, showing their own fingers and the objects

What they are for

  • Watching and recording; the controller never reads a pixel
  • It uses simulator state and known table coordinates
  • No object detection or visual localization is implemented

The headless run saves the positions of every body and the joint commands at 20 Hz. The film is rendered from that recording: for each frame the saved state is restored, MuJoCo recomputes the geometry, and all six panels are drawn from the same simulated instant. Nothing in the film is animated separately from the physics. The six-view film is 1920 × 1080 at 20 frames per second, 2,338 frames and 116.9 s long, at real time, with the phase and the simulated clock on screen. The shorter overview below is the same run at twice real time.

The whole transfer in 56 s at 2× playback: third-person view above, head and both wrist cameras below. Rendered from the same recorded physical run.

Next steps

  1. Many runs, not oneMove the objects, change friction and masses, and push the robot, over predetermined seeds, and report the success rate across all attempts alongside this single nominal run.
  2. Check what carries the weightRecord which robot surfaces touch the floor at every physics step. The run checked body height and penetration of the tables and barrier, and the start pose rests on the six feet, but floor contact by leg links during walking was not logged.
  3. Clearance over the whole envelopeExtend the 150-configuration leg clearance sample beyond the conservative swing envelope to the full joint limits, and add self-collision planning for the arms.
  4. Let the cameras seeLocate the mug and the block from the head and wrist images instead of known coordinates, so the scene no longer has to be the one the route was designed for.
  5. Plan the routeReplace the four fixed waypoints with a planner that accounts for the 2.10 × 2.36 m footprint and the carried objects, for arbitrary fixtures.
  6. Learn a piece, keep the yardstickReplace the scripted gait or grasp with a learned controller and compare it with this one under the same success checks.