0. THE ONE PARAGRAPH
Dex3-1 = Unitree's G1-native 3-finger hand (7 DoF, unitree_hg HandCmd_/HandState_,
topics rt/dex3/{left,right}/{cmd,state}, resident RS485→DDS service on the robot,
tactile in PressSensorState_). Revo 2 = BrainCo's 5-finger hand (6 active DoF, bridged
by brainco_hand_service to rt/brainco/{left,right}/{cmd,state}, but **NO tactile over
DDS — touch needs the BrainCo serial SDK). Both** supported in xr_teleoperate
(--ee dex3 / --ee brainco) and unitree_lerobot (Unitree_G1_Dex3=28-motor,
Unitree_G1_Brainco=26). Show hand = Revo 2 (6 built-in gestures + 24 custom slots;
Dex3 ships zero presets). **under a GEAR/SONIC whole-body-control stack the new rt/hand_sdk ai_sport-blend
path is DEAD** — drive hands raw via the rt/dex3 / brainco services.
1. UNITREE DEX3-1 (the tactile 3-finger hand)
- Mechanics: 7 DoF (thumb ×3, index ×2, middle ×2), 710 g, payload 500 g, fingertip
±2 mm. Motors F-1515-108/-214, torque 0.49-3.1 N·m (model + direction dependent),
12-58 V, 1000 Hz. Joint ranges: thumb −60~60°/−35~60°/0~100°; index/middle 0~90° & 0~100°.
- Tactile (Advanced/Ultimate config): 33 sensors/hand — 2×2 palm ×3, 2×2 finger-pad
×3, 3×1 fingertip ×3 (dev doc: 3×4 arrays at 6 locations); range 10 g-2500 g, 20 kg max
undamaged.
- DDS control (unitree_hg):
HandCmd_/HandState_onrt/dex3/{left,right}/{cmd,state},
7× MotorCmd_ (q/dq/tau/kp/kd); the mode byte packs id[4]|status[3]|timeout[1] — bit-7
1 s timeout is the ONLY built-in guard. Tactile = PressSensorState_ { u16 data[12]; u8 id;
u8 temp; u16 reserve[2] } per location; **valid ≥ 100000, invalid = 30000, scale
100000→10.0**. HandState reports power_v/power_a/system_v/device_v.
- Wire: internal RS485 @24 V → resident onboard bridge service → rt/dex3. C++ ONLY —
example/g1/dex3/g1_dex3_example.cpp (rotateMotors/gripHand/stopMotors/printState); **no
Python example, no gesture presets, no torque/position/thermal guard** (a related reference pattern —
the integrator must clamp and monitor these via power_v/power_a).
- Doc: G1_developer space, path
dexterous_hand, CDN 11/251 (no standalone Dex3 space).
2. BRAINCO REVO 2 (the tactile 5-finger show hand)
- Mechanics: 11 DoF / 6 active actuators (thumb 2 active + 1 passive; 4 fingers 1
active + 1 passive each), 383 g, grip ≥50 N, pinch ≥15 N, payload ≥20 kg, full flex
≤0.65 s, −10~40 °C, 4.6 A max. Launched 2025-09-16. Variants Basic/Pro/Touch.
- Touch tactile: capacitive multimodal fingertip on ALL 5 fingers — normal force,
tangential force + direction, self-proximity (SDK fields normal_force1/tangential_force1/
tangential_direction1/self_proximity1; raw channels 4-9 per finger). 0.1 N resolution
Reported. Interfaces: Revo2 = RS485 + CAN + CANFD + EtherCAT, 12-64 V.
- DDS control (Unitree side):
brainco_hand_service(official serial→DDS bridge, needs
unitree_sdk2, tested Jetson Orin NX) → rt/brainco/{left,right}/{cmd,state}, unitree_go
MotorCmds_, 6 DoF ordered [Thumb, Thumb_aux, Index, Middle, Ring, Pinky], normalized
[0,1] (0=open, 1=closed). left=126/right=127. This service exposes NO tactile.
- BrainCo SDK (tactile side): github.com/BrainCoTech/brainco-hand-sdk (MIT, Python
3.8-3.12 + C++ + ROS2; stark-serialport-example archived → migrated here). Tactile via
async client.get_touch_sensor_status() / get_touch_sensor_raw_data() (~200 Hz);
revo2_tactile_grasp demo = stiffness classification + current-based adaptive grasp
(2/3/5-finger modes). 6 on-device gesture built-ins (Open, Fist, PinchTwo/Three/Side,
Point) + 24 custom flash slots (run/save/clear) — author show gestures here.
- G1 mounting: BrainCoTech/unitree-g1-brainco-hand (official, G1-23 & 29-DoF, dual
RS485-over-USB /dev/ttyUSB*, brainco_ws dual-arm IK + ros2_stark_ws, hand-eye calib GUI).
- Doc: G1_developer path
brainco_hand, CDN 11/815 (updated 2026-03-25). BrainCo docs:
brainco-hz.com/docs/revolimb-hand.
2a. ⚠ THE TACTILE-vs-TELEOP SERIAL CONFLICT (plan around this)
Unitree's DDS bridge and BrainCo's tactile SDK both own the **same /dev/ttyUSB* Modbus-RTU
port — two masters on one RS485 bus collide. So teleop (rt/brainco) and tactile reading
cannot run simultaneously** without custom glue. Fix = extend brainco_hand_service to also
publish touch, OR use the BrainCo SDK for both cmd+touch. Inferrednot documented — verify
3. TELEOP + LeROBOT (both hands, a related reference extends)
§3 refreshed 2026-07-30 — 9-agent sweep + 3 adversarial lenses, verified against a fresh clone at HEAD 64ed45b (2026-07-30). Answers "is a data glove required?" → NO.
3a. ⛔ NO GLOVE — not required, not supported, nothing to buy Verified
Zero glove support exists anywhere in Unitree's teleop stack. Proven four ways:
(1) case-insensitive grep of the whole tree at HEAD for `glove|exoskel|manus|senseglove|cyberglove|
rokoko|stretchsense|haptx|手套` → 0 matches (only binary-STL false positives);
(2) **git log --all -S<term> pickaxe over the ENTIRE history incl. the avp_teleoperate era →
0 commits** — no driver was ever added and removed; (3) all three submodules (televuer — where a
glove driver would have to live — teleimager, dex-retargeting), working tree AND history → 0;
(4) no glove among unitreerobotics' repos (every hand repo is robot-side: dex1_1_service,
brainco_hand_service, linker_hand_service, dfx_inspire_service) and none in shop.unitree.com's
24-SKU catalogue. Only glove issue ever filed = #252 (SenseGlove Nova 2, opened 2026-02-09,
closed 2026-02-11), maintainer silencht: "Hello, Note: not used the SenseGlove Nova 2 device so far."
⚠ A third-party blog (roboticscenter.ai) claims Unitree hands work with "select third-party gloves" —
no primary source. Do not buy against it. Not established
And a glove could not replace the headset anyway: televuer supplies TWO things — the (4,4) SE(3)
wrist pose that drives arm IK, and the (25,3) hand array. A glove replaces only the second.
MANUS's own page confirms gloves need third-party trackers (Xsens/OptiTrack/Vive) for wrist pose.
Gloves DO beat optical (BiDex arXiv 2411.13677: Manus 95%/6.5 s vs AVP 60%/21.6 s) **but that used a
16-DoF 4-finger LEAP hand — the Dex3-1 is 7-DoF/3-finger consuming 4 landmarks**, so a 25-DoF
glove's fidelity is discarded before it reaches DDS. Manus Quantum was $6,500 and is EOL; Pro is
quote-only (a circulating $12,138 figure is unsubstantiated). Homunculus is NOT Unitree's
(nepyope/hmc_exo, no license) and does not touch the hands — LeRobot's G1 teleoperator action
space is arm joints + remote only, no finger term.
3b. The actual Dex3 chain, end to end Verified, source-read at HEAD
headset cameras → Vuer/WebXR HAND_MOVE (25 joints × 16 floats SE(3)) → televuer keeps
translations → left_hand_pos_array = Array('d', 75, lock=True) shared memory → **only 4 of 25
landmarks used**: 0=wrist, 4=thumb-tip, 9=index-tip, 14=middle-tip (ring/pinky discarded —
Dex3-1 has neither) → DexPilot retarget, assets/unitree_hand/unitree_dex3.yml
(target_link_human_indices_dexpilot: [[9,14,14,0,0,0],[4,4,9,4,9,14]], scaling_factor: 1.0,
low_pass_alpha: 0.2) → 7 joints/hand, kp=1.5 kd=0.2 → rt/dex3/{left,right}/cmd @ 100 Hz
(unitree_hg HandCmd_); state on rt/dex3/{left,right}/state.
Nothing to install robot-side — README documents host services for Inspire (§3.2), BrainCo (§3.3)
and Dex1_1 (§3.4) but there is NO Dex3 service section; stock EDU firmware serves those topics.
Launch: python teleop_hand_and_arm.py --input-mode=hand --arm=G1_29 --ee=dex3.
3c. ⚠️⚠️ THE LEFT-HAND MIS-WIRE — recharacterise anything measured pre-fix Verified
teleop/teleop_hand_and_arm.py:176 still gates dex3/inspire out of controller mode:
if args.ee in ("dex3","inspire_ftp","inspire_dfx") and args.input_mode == "controller":
raise ValueError(f"{args.ee} does not support controller input mode.")
**[supersedes: the §3 note "G1_DEX3_CONFIG right-hand index/middle order contradicts the official IDL
order — re-verify", valid until 2026-07-30] — RESOLVED, and it was a REAL BUG.** Dex3's left and
right API joint orders genuinely differ: **left = thumb×3, MIDDLE×2, INDEX×2; right = thumb×3,
INDEX×2, MIDDLE×2. Commit ad0e21c (2026-05-27) fixed the left** hand being reordered with the
RIGHT hand's index map. → Anyone on v1.5 or earlier had left-hand index and middle SWAPPED.
Shipped as v1.6 (2026.7.29) "Fixed the Dex3 retargeting bug."
Also: arm_reference_mode="head_yaw" is now default AND hard-coded (line 139), not a CLI flag —
teleop feels different from pre-2026-07-16 behaviour.
Flag name correction: the flag is --input-mode (hand/controller, default hand) —
[supersedes: --xr-mode, which survives only in an old __main__ block and pre-2026 issues].
CHANGELOG tension DISSOLVED: v0.5 was "Only supported hand tracking mode"; v1.0 ADDED
controllers — "Devices tested include: ... PICO 4 Ultra Enterprise (with controllers)" describes the
newly added path, and never meant PICO is controller-only.
Pin the clone: v1.6 is in the CHANGELOG but NEVER TAGGED, and the repo publishes zero
GitHub Releases → "latest" is a moving HEAD. Pin 64ed45b.
3d. ⚠️ PICO 4 Ultra CONSUMER + dex3 hand mode = NOT PROVEN Verified
Issue #305 is exactly this config and is STILL OPEN (2026-05-21, --ee=dex3 --input-mode hand,
"Xr device: PICO4 ultra (Not Enterprise version)"): *"The arms just fell off on the desk, I cannot
control them neither with controllers nor front cameras in PICO."* Maintainer's only reply
2026-07-24 ("Have you turned on PICO's hand tracking?"); reporter never answered; closed_at: None.
Same reporter 4 days later: *"the issue only exists on PICO, I changed to Meta Quest, the issue does
not appear."* Independently echoed in #290. Earlier, #63: browser works on consumer PICO but the same
user then reported hand tracking dead — a working browser is NOT verified hand tracking.
Maintainer guidance (#273, 2026-03-23): *"If you want high-degree-of-freedom dexterous hand retargeting
input data, the AVP should be your first choice"; "The Pico 4 Ultra has relatively weak WebXR
compatibility"; "avp >> quest3 ≈ quest3s ≈ pico4u ≈ pico4ue."* **And the ValueError leaves no
controller fallback — that guard was added 2026-05-28 (7dc9aa1)**, absent at v1.5, so it removed
the very workaround PICO users were running.
The likely fix is FREE and documented ONLY in the issue tracker (#290), not in README/Device.md/wiki:
PICO Settings → Interaction → hands-only (仅手势), endorsed by silencht. Browser ≥ 4.0.34.
3e. Quality ceiling — what optical hand-tracking can and cannot do Verified
CAN: real dataset collection. Closest published match to a G1 test rig — Humanoid Everyday
(arXiv 2510.08807): "the 29-DoF G1 with 7-DoF three-fingered dexterous hands (Dex3-1)", operator in
an AVP, dex-retargeting, no glove. Unitree's own G1_Dex3_* HF datasets are headset-optical too.
CANNOT: occluded bimanual work — TeleOpBench (arXiv 2505.12748) Task 7: VR 0% vs exoskeleton
80% vs Xsens+Manus 100%, "hand-over-hand occlusion breaks pose estimation" — and that VR baseline was
an AVP, the best optical case. Pinch is marginal: DexPilot project_dist=0.03 / escape_dist=0.05
= a 20 mm hysteresis band against ~11 mm fingertip error, 9.6° joint error and 45 ms delay
(PMC10830632), at scaling_factor: 1.0. No per-user calibration exists (grep calibrat = one hit,
about the Dex1 gripper rail) — the only levers are project_dist/escape_dist/scaling_factor.
🛑 BOOTH-SAFETY: on tracking loss the Dex3 controller **holds the last computed target and keeps
publishing it at 100 Hz** — no ramp, no freeze-to-measured-state, no timeout-to-safe-pose. Dex3 gets
neither the WeightedMovingFilter nor the per-step delta clipping that Dex1 has.
Treat a tracking dropout as a hazard, not a glitch. No published latency/accuracy numbers exist for
this pipeline anywhere — measure on your own rig.
3f. If a data glove were required Verified
Clean seam, but the work is ours: write a driver filling the **75-double shared-memory array
(25 joints × xyz) per hand** into left_hand_pos_array/right_hand_pos_array; everything downstream
(DexPilot → 7 joints → rt/dex3/*/cmd) is reusable unchanged. Branch dex-retargeting from
silencht's fork, not Yuzhe Qin's upstream. No glove→Dex3 integration exists publicly anywhere —
every community Dex3 rig found uses a headset (one exception used a full Noitom inertial suit).
This is a research project, not a purchase.
3g. LeRobot + datasets
- unitree_lerobot:
Unitree_G1_Dex3= 28 motors (14 arm + 7+7),Unitree_G1_Brainco=
26 (14 arm incl. 4 phantom wrist slots + 6+6). **Rubber-hands custom robot_type (a related reference §0)
is now UNNECESSARY** — these configs work as-is.
- HF datasets: 13 Dex3 + 8 Brainco + 4 WBT_Brainco sets exist — **NONE contain tactile
fields** (schemas inspected). Tactile-in-the-loop data must be collected by the integrator.
- Sim: menagerie g1_with_hands.xml = Dex3 (7 joints/hand); unitree_ros
g1_29dof_with_hand_rev_1_0.urdf + dexterous_hand_description (dex1_1/dex2_5/dex3_1/dex5_1)
Community: kael53/unitree_g1_dex3_stack (tactile-feedback grasp + OMPL/FCL planning).
4. GRASPING / MANIPULATION MODELS
- GR00T N1.7 REAL_G1 pretrain uses relative wrist-EEF + absolute 7-dim-per-hand hand
actions — dims match Dex3-1 exactly (NVIDIA never names the hand — strong inference).
UNITREE_G1_SONIC posttrain = SONIC motion_token + explicit L/R hand joint actions (hands
OUTSIDE the latent — matches this architecture).
- Humanoid-GPT (a related reference §2) ships a BrainCo dexterous-hand tracking variant → directly
relevant to Revo 2.
- No pretrained DexGraspNet-class checkpoint exists for either hand (DexGraspVLA's open
ckpt is a PsiBot hand). Tactile-RL for Revo 2 = research-only, we'd build it.
5. SAFETY / OPS (a related reference §3 + a related reference apply)
- Official warnings: add shoulder outward offset to avoid hand-body collision; **no
running/balance-tests with hands fitted**; don't pinch the wrist cable; avoid squat/lying
with hands on. (Tension with high-energy performance motion.)
- No thermal/torque guards in either SDK — monitor Dex3 HandState power_v/power_a;
Revo2 has stall detection + 4.6 A cap. Hand joints likely the fragile glass — build the
hands glass table on arrival (confirm Dex3 0.49-3.1 N·m per joint direction).
- RE-QA REQUIRED: every rubber-hand-authored SONIC gesture clip needs full sim re-QA
with real hand geometry (collision) before live runs — the "no finger gesture" law
(g1 no hands gesture rules) flips to conditional, but hand-body collision is new risk.
- rt/hand_sdk (new doc 11/1349, 2026-07-09): ai_sport-blended (Motor_real =
weight·Hand_SDK + (1−weight)·G1_Cmd, weight=cmds[0].mode/100), Dex2-5/Dex1-1 only, positive
tau=close, disabled in damping. DEAD under GEAR-SONIC (SONIC releases ai_sport) — not
the recommended path; drive rt/dex3 / rt/brainco directly.
6. ON-ARRIVAL CHECKLIST
Confirm exact SKUs (Dex3 tactile config letter; Revo2 Touch) + firmware · run
brainco_hand_service + dex3 bridge, verify rt/dex3 + rt/brainco topics · read one tactile
frame each (PressSensorState scale; BrainCo get_touch_sensor_status) · resolve the Revo2
serial tactile-vs-teleop conflict (§2a) · build hands glass table · re-QA all SONIC clips
for hand-body collision · author show gestures as Revo2 custom-slot sequences (wave/count/
thumbs-up) · re-verify G1_DEX3_CONFIG finger order before dataset replay.
7. FULL DEX LINEUP (context — Dex1-1/Dex5-1/Dex2-5)
Dex1-1 = 1-motor parallel gripper (M4010, 90 mm, 5-120 N, dex1_1_service → rt/dex1/*,
~$380). Dex5-1 = 20-DoF 5-finger (94 tactile on -1P, USB2.0, H1/H2-marketed, **no public
DDS SDK**, G1 fitment unconfirmed, ~$25k/hand). Dex2-5 = 5-finger 2-DoF (4-motor) in the new
rt/hand_sdk path. Dex3-1 tactile ~$6.5-8.2k/hand.
Maintained by MCM Robotics, the official Unitree Robotics distributor for South Africa. This is our own engineering documentation: it is not Unitree's official documentation and is not endorsed by Unitree. Trademarks belong to their respective owners. Provided as-is, without warranty. Found an error? Tell us and we will correct it.