Parallelogram gripper
Looped linkages
One slider opens and closes two parallelogram fingers whose jaws stay vertical.
steel preset (the default), recordedon an NVIDIA RTX PRO 6000 Blackwell.Run it
cd examples# the default preset (steel), then the othersuv run shelf play loop_parallel_gripper# change solver settings liveuv run shelf tune loop_parallel_gripperSource: examples/shelf/05_looped_linkages/loop_parallel_gripper/ · ported from common/loop_mechanisms.py, mechanism gripper
Presets
| Preset | Solver | Status | Checked |
|---|---|---|---|
steeldefault | steel | works | 2026-11-10, newton f6fc82a8b, NVIDIA RTX PRO 6000 Blackwell Server Edition |
Solvers with no row are untested on this example. The full settings are inpresets.toml.
Code
# SPDX-FileCopyrightText: Copyright (c) 2026 Skild AI and the Steel contributors# SPDX-License-Identifier: Apache-2.0
############################################################################ Example Parallelogram gripper## One prismatic actuator pulls two rods that swing the upper bars of two parallelogram fingers, so the# jaws translate symmetrically and stay vertical. Four planar loops (revolute closures); 1 DOF.## The mechanism comes from common/loop_mechanisms.py and runs through common/loop_linkage.py. check compares# the tracked bodies with reference.json, an exact-constraint reference integration.## Command: python -m shelf run loop_parallel_gripper############################################################################
from typing import ClassVar
import newton.examples
from common.loop_linkage import LoopLinkageExample
class Example(LoopLinkageExample): file = __file__ mechanism = "gripper" period = 2.0 # [s] the trajectory repeats with this period once its one-second ramp is over camera: ClassVar = {"eye": (-0.152, -0.416, 0.578), "target": (0.0, 0.0, 0.5)}
if __name__ == "__main__": parser = Example.create_parser() viewer, args = newton.examples.init(parser) newton.examples.run(Example(viewer, args), args)example = "loop_parallel_gripper"source = "common/loop_mechanisms.py, mechanism gripper"default = "steel"
[check]# Arguments `python -m shelf check` passes in test mode: a 4 s run, the frames in reference.json.args = ["--num-frames", "200"]
[gallery]short = "One slider opens and closes two parallelogram fingers whose jaws stay vertical."title = "Parallelogram gripper"frame = 75
[xpbd]status = "untested"
[vbd]status = "untested"
[mujoco]status = "untested"
[featherstone]status = "untested"
[semi_implicit]status = "untested"
[feather_pgs]status = "untested"
[steel]status = "works"# loop-closing joints need the "immediate" response (this Newton's Steel enforces BALL and REVOLUTE closures only there).# 2 substeps x 48 iterations: the fastest setting (RTX PRO 6000 sweep, 2026-11-07, mean 1.13 ms per frame) within# 0.5 mm of the exact reference on both jaws (0.33 mm) and a 0.25 mm loop gap (0.14 mm). Four revolute loops in a# chain through the slider converge slowly: 2 x 32 leaves the jaws 0.78 mm off, 4 x 16 0.65 mm. Tuned with solve_mode# "split", which newton f6fc82a8b removed (it runs "serial"); re-checked there at 1.12 ms.sim = { fps = 50, substeps = 2 }solver = { solve_mode = "serial", iterations = 48, articulated_contact_response = "immediate" }checked = "2026-11-10, newton f6fc82a8b, NVIDIA RTX PRO 6000 Blackwell Server Edition"
[kamino]status = "untested"
[implicit_mpm]status = "untested"
[style3d]status = "untested"Steel docs and tutorials are licensed under Apache-2.0. Third-party notices. "Skild", "Skild AI" and the Skild logo are trademarks of Skild AI and are not licensed under Apache-2.0.