Hardware reference

Dexterous Hands — Unitree Dex3-1 and BrainCo Revo 2

Degrees of freedom, tactile sensing, DDS control topics, teleoperation and LeRobot support for the two tactile hands available on the G1.

FACTS VERIFIED 16 JUL 2026 · 10 MIN READ

Reference, not instruction. Confidence tags mark how each claim was established: VerifiedReportedInferredNot established. Firmware and SDKs move: re-verify anything you are about to act on against the code you have. These are heavy machines, see the Product Safety Notice.

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_ on rt/dex3/{left,right}/{cmd,state},

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 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.2rt/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)

  • g1_with_brainco_hand; unitree_sim_isaaclab has Dex3 grasp tasks (no Brainco).
  • 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.

    • 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.

    Buying or specifying

    We import, commission and support these robots.

    Official distributor for South Africa. Talk to the people who wrote this page.

    View the fleet Talk to us →