examples/mujoco_xr: pick the gripper ghost with --robot - #929
Open
jiwenc-nv wants to merge 1 commit into
Open
Conversation
Contributor
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
jiwenc-nv
force-pushed
the
jiwenc-nv/rebot-mujoco
branch
from
August 8, 2026 05:00
3cb001f to
2f68b26
Compare
Adds the reBot DevArm gripper beside the SO-101 leader gripper, selected with
`--robot={so101,rebot}`. Everything that differs -- scene, meshes, mocap bodies,
how each moving part is driven, where it sits on the hand -- moves into
robots.py, so app.py keeps only the machinery and a moving part is a hinge or a
slide.
The two ghosts are not the same kind of thing, and the placement follows. The
SO-101 leader is the device the fist is closed around, so its posture is measured
on a headset. The reBot leader is a back-driven arm on a table, so what the
controller commands is the follower's parallel jaw -- nobody holds it, and its
placement is the OpenXR grip frame's own definition with the fist on the drive
motor. A test may pin that, and does.
Meshes are fetched from Seeed's own reBotArm_control_py at a pinned commit,
checksum-verified, and the jaw frames and travel are read out of the URDF beside
them rather than tuned. Upstream disagrees with itself on the travel --
joint_left says 0.05 and joint_right 0.0715 for one rack -- and the cnc7 rail
plate breaks the tie at 0.05, a 100 mm opening. That repository declares MIT in
its README and ships no LICENSE file, so the README is fetched in its place.
Neither ghost has been through a headset since this landed, and the reBot one
never has.
Signed-off-by: Jiwen Cai <jiwenc@nvidia.com>
jiwenc-nv
force-pushed
the
jiwenc-nv/rebot-mujoco
branch
from
August 8, 2026 05:10
2f68b26 to
f74ca37
Compare
9 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Stacked on #900 — review that first; the base here is
jiwenc/mujoco-xr-scene, and #928 is a sibling on the same base (it changes_update_ghost's signature, so one of the two will need a trivial merge).Adds the reBot DevArm gripper beside the SO-101 leader gripper, selected with
--robot={so101,rebot}. Everything that differs between them — scene, meshes, mocap bodies, how each moving part is driven, where it sits on the hand — moves into a newrobots.py, soapp.pykeeps only the machinery and a moving part is a hinge or a slide. Those two cases are the whole of_update_ghost.The two ghosts are not the same kind of thing, and the placement follows. The SO-101 leader is the device the fist is closed around, so its posture stays a headset measurement with no test pinning it. The reBot leader is a back-driven arm on a table, so what the controller commands is the follower's parallel jaw — nobody holds it, there is nothing to tune, and its placement is the OpenXR grip frame's own definition (ghost
+x→ grip−Z, the pen-tip axis; ghost±y→ grip±X, so the jaws open the way the index finger squeezes) with the fist on the drive motor. A test may pin that, and does. This is the call most worth challenging.Two things came out of the geometry rather than a preference. Upstream disagrees with itself on the jaw travel —
joint_leftsays0.05andjoint_right0.0715for one rack-driven pair — and thecnc7rail plate breaks the tie: at 0.05 the carriage's outer edge stops 3.4 mm inside the plate's end, at 0.0715 it hangs 18.1 mm past it. And the jaw origins are written as quaternions rather than copied fromrpy, because URDFrpyis fixed-axisRz·Ry·Rxwhile MuJoCoeuler=is intrinsicRx·Ry·Rz, and these have two non-zero angles. Both are checked against the fetched URDF.Licence wrinkle worth a decision. Meshes come from Seeed's own
reBotArm_control_pyat a pinned, checksummed commit — the only source with both the gripper geometry and the URDF the tests read. That repository declares MIT in itsREADME.mdand ships noLICENSEfile, so the fetch script pulls the README in its place. The hardware itself isSeeed-Projects/reBot-DevArm, CERN-OHL-W-2.0. Say the word if you would rather it came from somewhere else — it is one pinned line in a 70-line script.Type of change
Testing
Ubuntu 22.04 / aarch64 (Tegra). Full
cmake --preset py3.12 -DBUILD_VIZ=ONbuild green;ctest -L mujoco_xrgreen — 4 files, 57 tests, all executed rather than skipped. The generic ghost assertions are parametrized over both robots; the reBot ones cover the URDF-derived jaw frames, the travel, the closing sweep and the placement convention.uv pip install ./examples/mujoco_xrwas checked to carry both asset directories and the extension into the wheel.The rail-plate assertion was checked to actually discriminate: it reads −3.39 mm at 0.05 and +18.11 mm at 0.0715, and fails at the latter.
isaiahbjork/rebot-teleop's independent MJCF of the same arm agrees with the derived jaw frames; nothing here depends on it.Not verified, and not verifiable without hardware: everything a headset touches, unchanged from #900 — plus the reBot ghost has never been seen through one. Its placement is derived rather than measured, so what is untested is whether a 190 mm gripper reaching 250 mm out of the fist is usable, not whether it is where the convention says.
Checklist
SKIP=check-copyright-year pre-commit run --all-filesgit commit -s) per the DCO