Skip to Content
LessonsDay 10 — Upper-body manipulation

Day 10 — Upper-body / manipulation on shared balance ceilings

Upper-body manipulation stack: EstimatorState and ManipulationCommand into EE soft tasks under foot ContactState friction/unilateral and torque_scale, then JointCommand

Day 09 made disturbance rejection a decision layer on the same stack: capture-point / CoM escape, recover-in-place vs emergency step, abort / soften when power or contact confidence collapses. Day 08 owned gait modes and swing as soft tasks. Day 07 owned the feasible program. Day 06 owned the estimate. Day 05 owned sag honesty.

Today owns reach and grasp as soft tasks on those same ceilings: end-effector and hand references under measured foot contact_set, Day 07 friction / unilaterality, and torque_scale — without inventing a second “arm plant” that steals support wrench or finishes a mid-reach teleop into brownout.

Manipulation is a task layer, not a second plant

A reach is not a new dynamics model for the arms. It is a set of soft EE / grasp tasks competing for residual authority inside the same QP that already balances on feet. The arms do not get a parallel torque bus, a private FOC path, or permission to ignore foot cones because a grasp heuristic “really wants it.”

LayerOwnsMust not own
IntentReach / grasp / hold / abort; EE and hand refs in named framesFriction cones / BMS ceilings / FOC
Task layerSoft ee_refs / hand_refs + posture bias into WbcTaskSetHard support constraints on feet
Support honestyTag hands FREE vs SUPPORT; never free a loaded sole for a prettier EEA parallel “arm balance” plant
HonestyMid-reach stale / POWER_GATED / low torque_scale → abort/softenHeroic completion into brownout

Core thesis: manipulation consumes EstimatorState + Day 07 friction / unilaterality + torque_scale. It publishes soft EE / grasp tasks (and optional hand-contact tags) into the existing WBC face. It does not replace QP constraints, FOC, or the BMS derate path — and it must not steal wrench the feet still need.

Ownership rule: one writer for manipulation intent (ManipulationCommand / EE fields on WbcTaskSet) and one writer for measured support (contact_set on feet — and later hands). When they disagree mid-reach, measured contact wins for constraints; the manipulation layer aborts, softens, or re-plans — it does not yank a still-loaded sole or lean the CoM into air because an EE heuristic said so.

How today fits the Days 05–09 stack

DayWhat you already frozeWhat Day 10 reuses
05torque_scale, POWER_GATED, sag honestySame ceilings bind arm and leg joints every tick
06EstimatorState, age / stale, contact modesEE tasks consume the same estimate; no perfect-state arm cheat bus
07Tasks vs hard friction / unilateralityEE / grasp stay soft; feet stay hard
08Measured contact_set owns swing vs supportSame rule: intended EE never owns foot constraints
09Mid-event abort / softenMid-reach abort on stale / gated / low scale

Do not bolt a Cartesian arm controller that writes JointCommand beside the QP. That is a second plant with nicer branding — and it will fight support wrench the first time the pack sags or a foot slips.

Soft EE / grasp under hard foot support

Reach and grasp authority lives in task weights, not in dropping cones:

PieceRole
ee_refs[]Soft Cartesian / SE(3) tasks; miss → residual, not NaN
hand_refs[]Soft grasp / finger / wrench bias when the hand is FREE
CoM / posture biasSoft; dump excess into torso / free arms only within limits
Support feetHard friction + Fz≥0F_z \ge 0; tagged from measured contact_set
Ceilingstorque_scale / iq_ceiling still bind every joint every tick

Hard vs soft: support constraints on feet stay hard. Manipulation authority lives in EE / hand task weights and priority order. If the QP goes infeasible, the honest answer is soften / abort / shorten the reach — not silently dropping friction so the hand can “make it.”

Hand FREE vs hand-as-support honesty

Until Day 11, treat hands as FREE end-effectors unless measured contact honestly says otherwise.

Hand tagMeaningAllowed today
FREENo trusted hand load in contact_setSoft EE / grasp tasks only
CLAIMED_SUPPORT (teleop / planner wish)Intent wants the hand to take weightDo not enable hand friction cones yet — keep soft; log the claim
MEASURED_SUPPORTHand appears in measured contact_set with healthy confidenceDay 11 loco-manipulation — same ceilings, new contact set

Do not let a grasp net or teleop stick “borrow” foot wrench by raising arm tasks until cones break. If the planner wants hand-as-support, that is a contact-mode change, not a bigger EE weight. Claiming support without measured contact is how you tip while looking busy.

Mid-reach abort / soften honesty

Manipulation is where teams love to disable safety “just until the grasp closes.” Do not.

Signal mid-reachRequired behavior
INPUT_STALE / confidence cliffSoften or freeze EE tasks; hold safest DS posture available
POWER_GATED / falling torque_scaleAbort or soften grasp close; raise margins; never finish a heavy lift into brownout
Foot contact_set disagrees with intended DS/SSHold EE soft; do not free a loaded sole for reach clearance
QP infeasible under conesDrop EE / grasp weights / abort — do not drop unilaterality
Hand contact flicker while FREEKeep soft; do not flip to SUPPORT on noise

Abort and soften are success paths when the world lied or the pack sagged. A robot that always finishes the planned grasp into a collapsing bus is ignoring Day 05 with a prettier end-effector demo.

Shared API: manipulation face on the same stack

Keep Day 02 / 04 wire honesty. Cyclic commands still carry BusHeader. Extend Day 07’s WbcTaskSet rather than inventing a parallel “arm bus”:

BusHeader: node_id, seq t_sample, clock_domain, age_budget_ms faults # Upstream (read-only here) EstimatorState, ContactState, PowerState ⊇ BusHeader # Thin manipulation face (host / mid-rate) ManipulationCommand ⊇ BusHeader: intent # IDLE | REACH | GRASP | HOLD | ABORT ee_refs[] # frame, pose/twist targets, weight hints — document units hand_refs[] # grasp aperture / finger bias / optional wrench bias hand_role[] # FREE | CLAIM_SUPPORT — measured contact still owns truth priority_hint[] # soft ordering vs CoM / posture; ceilings may still force soften relax_on_fault # stale / POWER_GATED / low torque_scale → abort/soften # Extended Day 07 task face WbcTaskSet ⊇ BusHeader: mode # STANCE_DS | STANCE_SS | SWING | IMPACT | RECOVER_IP | MANIP | ... com_ref / capture_ref? foot_refs[] # each tagged support | swing | settling ee_refs[] # soft end-effector tasks (Day 10) hand_refs[] # soft grasp / hand tasks (Day 10) posture_bias? priority_order[] # EE may rise during REACH/GRASP — never above hard constraints relax_on_fault # Downstream muscle (Day 02) — ceilings still reflect torque_scale JointCommand ⊇ BusHeader: q_des? / qd_des? / tau_ff? iq_ceiling? / tau_ceiling? flags # STO / soften / hold

Higher layers publish manipulation intent + soft EE / hand refs. Rate loops enforce BMS ceilings. Nobody re-implements FOC or AHRS inside the grasp planner.

Physical ↔ digital pairing for upper-body manipulation

PhysicalDigital twin / backing
Same EstimatorState consumers for EE tasksNo perfect-state cheat bus for “easy reaches”
Reach kinematics vs measured link posesMatched frame names + same EE miss metric
Grasp close vs finger / aperture feedbackSame aperture units; injected sensor delay
Foot friction / rubber under arm loadSame cone params or logged tables as Day 07
torque_scale under reach / lift peaksSag / derate replay — no infinite-torque grasp
Mid-reach stale / gated injectionScheduler that can fail the same way as hardware
Measured mid-rate manip tick + jitterCannot beat hardware cadence or hide age faults
Hand FREE vs accidental table touchTwin must not auto-promote hand to SUPPORT without measured contact

If the twin always grasps with perfect Boolean contacts and a full pack while hardware sees delayed contact_set and sag, you will tune EE gains forever and never ship a reach that survives a tired bus.

Bring-up sequence (before free teleop / learned grasp)

Day 07 stance green, Day 08 steps 1–5 green, and Day 09 recovery steps 1–5 green. Then:

  1. Stance + step + recovery green — Day 07–09 fault injection still behaves; no open recovery or gait fights.
  2. Quiet DS posture only — move arms with low EE weights; confirm foot cones and torque_scale still bind; CoM stays inside support.
  3. One scripted REACH — single soft ee_ref to a known pose; miss is residual; feet remain hard support from measured contact_set.
  4. Slow GRASP close — aperture / hand_refs while hand stays FREE; no hand friction cones; no weight transfer onto the palm.
  5. Mid-reach faults — force stale / gated / derate in twin and on hardware during reach and during grasp close; confirm abort or soften, not heroic completion.
  6. Then add teleop or learned residuals that choose EE / grasp above the QP — never replace cones, FOC, or torque_scale. Hand-as-support waits for Day 11.

Skip to “RL grasps in sim” and hardware’s first real reach becomes an unplanned tip / brownout experiment with better video.

SymptomLikely cause
Reaches then tips in placeEE weights raised without foot friction margins; ceilings ignored
Twin grasps, hardware faceplantsPerfect contacts / infinite torque_scale in sim
Completes grasp into brownoutMid-reach abort missing; ceilings not consulted
Arm “wins,” foot slipsSoft EE treated as hard; unilaterality dropped to make QP feasible
Hand claimed as support, robot leans on airIntent owns constraints instead of measured contact_set
Teleop fights recovery / gaitMultiple writers on WbcTaskSet / mode; no single manip intent owner
Grasp chatters on every table brushAccidental hand contact promoted to SUPPORT without confidence gate
Net grasps only on full packResidual learned without torque_scale / faults in observation
QP infeasible → silent cone dropSoften/abort path missing; “make it feasible” anti-pattern
Cartesian arm controller beside QPSecond plant writing JointCommand; fights Day 07 program

What to freeze this week

Extend frames and your control config with:

  • EE / hand frame names, units, and miss metrics aligned with EstimatorState link poses
  • Who owns manipulation intent vs measured foot contact_set (disagree → abort/hold)
  • ManipulationCommand fields + mid-rate tick budget
  • WbcTaskSet.ee_refs[] / hand_refs[] and priority policy under Day 07 friction / unilaterality
  • Hand role: FREE vs CLAIM_SUPPORT vs measured SUPPORT (Day 11 enables the last)
  • Mid-reach abort / soften for stale, POWER_GATED, and low torque_scale
  • Twin hooks: matched reach loads, contact delay, sag under arm peaks — same as hardware
  • Bring-up gate: no free teleop / learned grasp until steps 1–5 above are green

The lesson is not “implement inverse kinematics vs an EE transformer.” It is make upper-body manipulation the same contact-rich program in silicon and in the twin: one estimate, honest power ceilings, soft EE / grasp that do not fight foot cones, and abort paths that stay honest when the world or the pack lies mid-reach.

Next

Day 11 — Hand contact as support / loco-manipulation on the same ceilings: promote measured hand contact into the support set, share friction / unilaterality with feet, and keep mid-contact abort / soften when power or confidence collapses — still one plant, not a bolted “arm balancer.”

Last updated on