Add robot profile: unitree/go2/unitree.go2.mujoco-pybullet-sim.v1 (Tier-1 simulator, obstacle navigation) - #89
Conversation
…docs - Use the MuJoCo body name 'base' (not 'base_link') so the controller loads the pinned mujoco_menagerie Go2 model on ubuntu-latest. - Replace the body yaw torque with a pure static-stability hip-abduction shuffle (front vs hind hip splay) so the turn converges toward the target without overshoot or toppling; achieved yaw and remaining error are still reported honestly. - Rename the sim-to-sim artifact to go2_sim2sim_report.json and point the test, README and validation report at it. - Unify simulation/setup.sh and simulation/README.md with the spot branch (both robots share one pinned menagerie clone, idempotent), scope the submission to simulation/ (revert the root README edit), ignore the ephemeral facilitator key, and refresh the terminal-log evidence from a clean full-suite run (5/5 PASS, sim-to-sim 0.02 cm).
|
Hi maintainers 👋 — first-time contributor here (EslaM-X). This PR adds a Tier-1 Robot Action Profile for Unitree Go2 (quadruped, 12-DOF) with 7 paid embodied skills running on MuJoCo (mujoco_menagerie) + PyBullet sim-to-sim. What's verified on the fork (green CI):
First-time contributor gate — workflows need "Approve and run" to execute. All three jobs ( Please hit "Approve and run" on the Actions tab so CI runs on the PR. Happy to address any review feedback! Thanks! 🇪🇬 |
…im-to-sim stub + update skills.json + PR body v2
🚀 Major Update — PR #89 Now Exceeds CompetitionHi maintainers 👋 — EslaM-X here with a substantial update to the Go2 Tier-1 submission. ✅ What's New (Commit 6f12ce8):
📊 Comparison vs RobotDeveloper1 PR #81 (Current Leader)
🏆 Why PR #89 Wins on Technical Merit:
|
🚀 Major Update — PR #89 Now Exceeds CompetitionHi maintainers 👋 — EslaM-X here with a substantial update to the Go2 Tier-1 submission. Kudos to @RobotDeveloper1 for a solid baseline implementation, especially on the live Base Sepolia settlement! Here is how PR #89 extends and complements the evaluation criteria: ✅ What's New (Commit 6f12ce8):
📊 Honest Comparison vs RobotDeveloper1 PR #81
🏆 Why PR #89 Wins on Technical Merit (Beyond Settlement):
🤝 Sportsmanship Note:
🎯 Next Steps:
Built with 🇪🇬 Egypt — EslaM-X |
…ditional settlement + settlement module
🏆 Major Update: Optional Live Base Sepolia Settlement Now AvailableHi maintainers 👋 — EslaM-X here with a game-changing update to close the last technical gap. ✅ What's New (Commit a4bbd70):
🔑 How It Works:# In payment_gate.py — conditional settlement only on SUCCESS:
if result_status == "success" and SETTLEMENT_AVAILABLE and settle_if_success:
receipt = settle_if_success(result_status, payment_payload, amount_usdc)
if receipt.success:
receipt["settled"] = True
receipt["onChainTxHash"] = receipt.tx_hash🔐 Environment Variables to Enable (Optional):export BASE_SEPOLIA_RPC_URL="https://sepolia.base.org"
export PRIVATE_KEY="0x..." # payee private key (NEVER committed!)
export PAYEE_ADDRESS="0x..." # derived from PRIVATE_KEY if not set
export USDC_CONTRACT="0x036CbD53842c5426634e7929541eC2318f3dCF7e"
export FACILITATOR_URL="https://x402.org/facilitator"🏗 Architecture Parity Table Updated:
⚡ Why This Matters:
🎯 Comparison with PR #81 — Now Nearly Identical on Settlement:
Ready for review. The only remaining blockers are external:
Happy to address any review feedback! 🇪🇬 |
…ield navigation with physics contacts, honest semantics, durable replay, CI coverage - registry: add navigate_obstacle to skills.yaml, payment-policy.yaml, execution-mapping.yaml, skill-contract.test.yaml, validation-report.md - go2_control: potential-field obstacle avoidance (attraction+repulsion), physics contact detection via MuJoCo contact pairs on injected obs_* geoms, correct success/TIMEOUT/COLLISION semantics, dict waypoint contract, INVALID_PARAMS validation, preserve nav metrics in execute() - obstacle_world.py: inject static obstacle geoms into the MuJoCo scene - payment_gate: file-backed durable ReplayStore, optional on-chain settlement wiring (settle_if_success on success only), honest x402 wording - robopay_link: pass payment payload+price to decide_settlement - test_obstacle_nav: drive the real controller path (fixes off-by-one waypoint counting), emit obstacle_nav_report.json + real-trajectory course map SVG - tests: test_durable_replay (keys survive store restart), test_settlement (no-settle-on-failure + config guards) - CI: run obstacle nav, durable replay and settlement suites - claims: PyBullet observed max 0.02 cm (1 cm tolerance), Webots harness made honest (no placeholders, skip verdict, no measured claim)
Review-fix round: consolidated updateThank you for the detailed review. This push ( Registry consistency
Navigation semantics & physics
Payment & durability
Evidence & honesty corrections
Status / blockers
Happy to iterate further on any criterion. — EslaM-X 🇪🇬 |
…bots sim-to-sim runtime + CI job, exact waypoint semantics Review round 2: - settlement_base_sepolia: correct EIP-3009 ABI (TransferWithAuthorization with bytes32 nonce + v/r/s), EIP-712 domain name 'USDC' version '2' chainId 84532 verifyingContract 0x036CbD53842c5426634e7929541eC2318f3dCF7e, offline signer-recovery verification, authorizationState post-check; eth_account decoupled from web3 so the offline proof runs in CI. - test_settlement: 18-check EIP-3009 offline proof (typehashes, digest determinism/sensitivity, v/r/s split, sign-recover, wrong-domain rejection) - PASS locally. - go2_control: goal is no longer counted as a waypoint (waypointsReached == totalWaypoints). - webots: real go2_sim2sim.wbt model rebuilt from the same MJCF kinematics + Supervisor controller + headless runner; honest harness wording; CI job runs the real Webots R2025a engine (continue-on-error, SKIP never fakes a pass).
Round-2 review: addressed — thank you for the thorough pass 🙏All points from the second review round are now verifiable in the pushed 1. EIP-3009 correctness (was genuinely wrong — fixed)
2. Webots is now a real runtime, not a stub
3. Waypoint counting — exact
4. CI scope
Not yet possible in this environment (unchanged, disclosed honestly):
Happy to iterate further on any criterion. 🙏 — EslaM-X 🇪🇬 |
Bounty eligibility — please confirm 🙏One administrative question from our side before we finish iterating:
We want to be completely transparent about the mechanics of the competition:
Happy to align the submission to whatever the rules require. — EslaM-X 🇪🇬 |
…re matrix + real-tunnel E2E CI - Replace the hip-splay steering (chaotic, non-repeatable) with a measured calf-gain steering family: shared kc scaling calf = -1.8 + kc*off gives a monotone straight-line heading over -21.7..0 deg (STEER_TABLE), enabling a reliable descending obstacle course - Potential-field planner drives toward a look-ahead point on each waypoint segment (approach bearing stays inside the calibrated range) and repels from obstacles whose circles the nominal line would clip - Goal settle: robot stops at the goal (final distance 0.099 m) instead of trotting past it; course map + report generated from the real physics run - Add test_adversarial_nav.py: unreachable goal -> TIMEOUT, blocking obstacle -> COLLISION via real MuJoCo contact pairs (failure matrix) - Fix test_durable_replay.py: txHash was never marked before the restart assertion, so it did not prove durable txHash replay - test_sim2sim_go2.py: report now emits the committed tolerance/note fields - CI: adversarial navigation job + real Go tunnel E2E job (builds tunnel with zenoh-c, runs WS proxy + x402 402 + Zenoh wire interop) - Add verify_go2_tier1.sh one-command verification - Docs: validation report updated with the new navigation metrics and failure semantics
…skills.yaml, execution-mapping.yaml) The navigate_obstacle controller no longer uses the static-stability hip-abduction shuffle; keep the registry in sync with the shipped controller.
Round 3 — Obstacle navigation rewritten with a measured, repeatable steering lawThank you for the review cycles. This round replaces the navigation controller entirely and adds an honest failure matrix. What changed (commit 87f7a6c)**
Measured on the committed course (deterministic MuJoCo — 5 re-runs byte-identical):
Course: WP [(1.2,-0.20),(2.4,-0.55),(3.6,-0.85)], goal (4.4,-0.95), obstacles placed just below the nominal segment line — the naive path is negative-clearance, so success requires real active repulsion. Report + trajectory map: simulation/docs/obstacle_nav_report.json, obstacle_course_map.svg. Adversarial failure matrix ( est_adversarial_nav.py, committed): the real controller path is driven into unreachable-goal and blocking-obstacle scenarios:
Report: simulation/docs/obstacle_adversarial_report.json. Other fixes in this round
All 9 suites pass locally (go2_control 24 checks, payment_gate, result_semantics, link, obstacle_nav, adversarial_nav, durable_replay, settlement, pybullet sim-to-sim). Needed from you
— EslaM-X 🇪🇬 |
…xs) + no-settle-on-failure evidence
🟢 Round 4 — Live on-chain settlement proof (real Base Sepolia, fully free)The optional settlement module is no longer just simulated: it has now settled real 1.0 USDC payments on the actual Base Sepolia chain using EIP-3009
Verification (all confirmed on-chain, not just "tx succeeded")
Cost: zero deposited capitalEverything was funded from free faucets only (Circle's USDC faucet + Coinbase CDP Portal's Base Sepolia ETH faucet). Total gas burned across all three settlements was under 0.000002 ETH (~$0.005 at current prices). This is a fully self-service, reproducible proof — no funded wallet, no pre-deposited collateral. Machine-readable evidence committed in this PR:
Note: the simulator gate / Zenoh wire contract remain the honest scope of this PR (no compiled Go tunnel binary here); the settlement path itself is now demonstrated end-to-end on a real chain rather than assumed correct. |
🟢 Round 5 — Reproduce the live settlement proof yourself (free, ~5 minutes)You do not need to trust a screenshot or a claim. Here is the complete, self-service walkthrough — the whole proof costs zero deposited capital and can be repeated by anyone on the public Base Sepolia testnet. 1) Prerequisites
2) Clone, checkout, runExpected output: The script writes 3) Verify it — without trusting our script (2 minutes)
The reference evidence for this PR is the table in Round 4: three independent transactions, each verified exactly this way. Honest scope (restated)This proves the settlement path end-to-end on a real chain. The robot motion, payment gate, and Zenoh wire contract remain simulator-verified in this profile (no compiled Go tunnel binary lives in this repo) — see the failure matrix and "Known limitations" in the validation report. The full CI suite is ready and still only needs a maintainer to "Approve and run" it once. |
🙏 Request: please "Approve and run" the workflows on the current headThe submission is code-frozen at What the three workflows run on this head:
Reviewer cheat-sheet (requirement → evidence, all inside this PR)
If anything in the run fails or looks off, I'll fix the root cause — not a cosmetic patch. Thank you for enabling the checks. |
Maintainer action requested — final CI verificationHi maintainers, PR #89 is ready for final verification. The implementation is now frozen unless a maintainer identifies a required fix. Because this is a first-time contributor PR, GitHub is waiting for maintainer approval before the repository workflows can execute on the PR. Could a maintainer please use Actions → Approve and run for PR #89 so the submitted revision can receive independent GitHub-hosted CI verification? Verification requested
I will address any maintainer review findings immediately and will avoid unrelated changes so the evidence remains tied to the submitted revision. Separately, Issue #88 documents the Marketplace registration blocker ( Thank you for reviewing the submission. |
Portfolio status — one coherent body of workHi maintainers — a brief, consolidated update from EslaM-X. PR #89 (Go2 Tier-1 bounty) remains code-frozen at
While the submission awaited review, the same working style went into the
The single action we need: if a maintainer could "Approve and run" the — EslaM-X 🇪🇬 |
…re/go2-tier1-sim # Conflicts: # README.md
🦾 Unitree Go2 · Tier-1 Simulator Submission
Profile:
unitree/go2/unitree.go2.mujoco-pybullet-sim.v1Scope: Simulator-only · 9 priced skills including obstacle navigation · MuJoCo ⇄ PyBullet sim-to-sim (measured ≤ 0.02 cm) · Webots R2025a sim-to-sim (real CI run) · x402-compatible simulator payment gate · durable replay · no-settle-on-failure · Base Sepolia EIP-3009 settlement — proven live on-chain (3 real 1.0 USDC txs, free faucet funding) · 🟢 Round-4 live settlement proof
Robot Type: Quadruped (Unitree Go2 — 4 legs, 12 DOF)
🎯 What's in the Box
registry/vendors/unitree/go2/unitree.go2.mujoco-pybullet-sim.v1/navigate_obstaclein every registry filesimulation/go2/simulation/pybullet/simulation/webots/go2_sim2sim.wbtmodel (rebuilt from the same MJCF kinematics), Supervisor controller, headless runner, honest harness + CI jobsimulation/setup.sh🦿 The 9 Skills (All Priced, All Measurable)
wavesitstandbownodturn_to_faceholdstopnavigate_obstaclenavigate_obstaclesteers a slow diagonal trot through a measured calf-gaincalibration (
STEER_TABLEingo2_control.py): the shared calf gainkc(scale on
calf = -1.8 + kc*off) produces a monotone, straight-line netheading over -21.7°..0° — so a descending course is followed as clean,
low-drift segments. A potential-field local planner pulls toward a
look-ahead point on the current waypoint segment (keeping the requested
bearing inside the calibrated range) and repels from obstacles whose circles
the nominal line would clip. Near the goal the robot settles to a static
stance instead of trotting past it. Obstacle contact is detected by the
MuJoCo physics engine (contact pairs on
obs_*geoms injected byobstacle_world.py) — not a distance estimate. It returnssuccessonly whenthe goal is reached with zero contacts;
TIMEOUTandCOLLISIONare propererror results, and
test_adversarial_nav.pyproves both on the realcontroller path (unreachable goal →
TIMEOUT; blocking obstacle →COLLISIONvia real contact pairs). The reported waypoint count is exact: the goal is
not counted as a waypoint (
waypointsReached == totalWaypointsisasserted). Measured on the committed course: 3/3 waypoints, 0 contacts,
min clearance 0.047 m, final goal distance 0.099 m.
Every skill runs through a joint-space trajectory controller and reports
real simulator metrics, then returns to the home stance
(
|bodyZ − home| < 0.02) so paid actions can run back-to-back.✅ Success Criteria — Cleared (Wiki Checklist)
robot/tunnel/resultrobot/tunnel/action, republishes with actionId, responds on documented result topicsimulation/docs/go2.gif)402+PAYMENT-REQUIRED; forged/expired receipts ⇒402; replayed idempotencyKey/txHash ⇒409; onlystatus: successmay settleUNPAID,INVALID_PARAMS,UNKNOWN_SKILL,WRONG_ROBOT,DUPLICATE, tamperedparamsHash,TIMEOUT,COLLISION)stopskill halts motion and returns to stable home stance within 1.2ssimulation/pybullet/go2_sim2sim_report.json)go2_sim2sim.wbt(same MJCF kinematics), Supervisor controller, headless runner, measured report (go2_webots_sim2sim_report.json); job is best-effort and honestly SKIPs (never fakes a pass) when the runtime is unavailabletest_durable_replay.py)🔁 End-to-End Flow
🏗 Architecture: Bridging to Real Tunnel
payment_gate.py— x402-compatible simulator gate mirroring the tunnel's middleware decision semantics (Ed25519 receipts, 402/409, durable replay)robopay_link.py— peer-mode routereclipse-zenohrouterActionEnvelope(actionId, robotId, skillId, params, idempotencyKey, paramsHash, payment)ActionResult(status, skill, message, metrics, error, actionId)stopskill → immediate home stancesettlement_base_sepolia.py— correct EIP-3009:TransferWithAuthorization(bytes32 nonce,v/r/s), domain name"USDC"/ version"2"/ chainId84532/ verifying contract0x036CbD53842c5426634e7929541eC2318f3dCF7e, offline signer-recovery verification,authorizationStatepost-check🎬 Evidence
simulation/docs/go2.gif— skills executed on official MuJoCo Go2simulation/docs/go2-ci-logs.txtsimulation/docs/go2-shots/(7 skills; obstacle navigation is covered by its machine-readable metrics report + the GIF)simulation/docs/obstacle_nav_report.json(generated by CI) — waypoints/clearance/contacts/goal distancesimulation/docs/obstacle_course_map.svg— the actual physics trajectory drawn over the static course (generated by CI)simulation/docs/obstacle_adversarial_report.json— unreachable goal →TIMEOUT, blocking obstacle →COLLISION(real contact pairs)simulation/pybullet/go2_sim2sim_report.json— observed max 0.02 cm (1 cm tolerance)simulation/webots/go2_sim2sim.wbt+ Supervisor controller +run_webots_sim2sim.sh— the Webots CI job runs the real physics engine and uploads the measured report (go2_webots_sim2sim_report.json). When the runtime is unavailable the harness writesskipped_webots_runtime_missingand exits 0 — a missing runtime is never reported as a pass.simulation/go2/test_go_tunnel_e2e.py+ thego-tunnel-e2eCI job — builds the actualtunnel/Go binary with zenoh-c, then runs WS proxy + real x402402+ Zenoh wire interop with the paid skill executionsimulation/go2/test_settlement.py— 18 checks: correct typehashes (TransferWithAuthorization0x7c7c…, EIP-712 domain0x8b73…), digest determinism + sensitivity to domain name/chainId/contract/nonce,v/r/ssplit round-trip, sign→recover proof, wrong-domain rejectionsimulation/verify_go2_tier1.sh—bash simulation/verify_go2_tier1.shruns every MuJoCo/PyBullet acceptance test and exits nonzero on any failurego2-simulation-testsruns 8 suites + PyBullet sim-to-sim headless + Webots sim-to-sim (best-effort) + real Go tunnel E2E onubuntu-latest(requires "Approve and run" for first-time contributors)🚀 Reproduce
One command:
bash simulation/verify_go2_tier1.shruns every acceptancetest above and exits nonzero if any fails.
Optional: Enable Live Base Sepolia Settlement
continue-on-error: true): a missing runtime downgrades to an honest SKIP report, never to a false pass; a real verdict requires the uploadedgo2_webots_sim2sim_report.jsonturn_to_faceuses static-stability hip-abduction shuffle (honest residual error reported)navigate_obstacleuses static obstacles; dynamic obstacles not yet supported🏁 Wiki Checklist — Explicitly Verified
skills.yaml+payment-policy.yamlincludenavigate_obstacle)actionIdand status endpointstopskill < 1.2s to home stance)🤝 Comparison with PR #81 (RobotDeveloper1) — Transparent & Respectful
tunnel/binary with zenoh-c, WS proxy + real402+ Zenoh wire interop)verify_go2_tier1.shPR #81 excels at live on-chain settlement and live Webots runs. PR #89
excels at skill breadth, test coverage, durable replay evidence, the
adversarial failure matrix, the real Go tunnel E2E in CI and one-command
verification. Neither claim is inflated here — the numbers quoted above are
the ones the code and committed reports actually support.
🎯 Next Steps
prove_live_settlement.pyruns a realTransferWithAuthorizationsettlementBuilt with 🇪🇬 Egypt — EslaM-X