Skip to content

Add Standard Bots prebuilts (RO1 + core/spark sibling SKUs) #302

Description

@siddhss5

Coverage for Standard Bots' cobot line. Three URDFs publish through the official standardbots/ros2-realtime-api repo: core.urdf, spark.urdf, thor.urdf — the latter is the public RO1 (18 kg payload, 1.3 m reach). core and spark appear to be sibling SKUs.

Kinematic class

Parsed from the URDFs (joint origins in parent-link frame):

thor (= RO1): j0 vertical → j1 ∩ j0 at origin (no shoulder offset) → j1 ∥ j2 ∥ j3 (three-parallel elbow around x) → j3 ∩ j4 ∩ j5 at a single point in space (spherical wrist). That's three-parallel elbow + spherical wrist + intersecting shoulder — strictly more constrained than UR5 (which has an offset wrist), strictly more constrained than Puma 560 (which has only two-parallel elbow). Easiest possible 6R from a closed-form-IK standpoint.

core / spark: same elbow + spherical-wrist topology as thor, with one structural difference — j0 and j1 do not intersect (shoulder offset ~150–190 mm). Equivalent to Puma 560 / spherical-two-parallel class.

All three should land on a tier-0 Pieper solver:

  • thor → ikgeo.three_parallel (UR5's class)
  • core / spark → ikgeo.spherical_two_parallel (Puma 560's class)

Sub-millisecond solves expected, ~8 branches per pose, machine-precision FK. EAIK supports all three natively.

Strategic read against #78

This is breadth, not wedge. Standard Bots arms are textbook Pieper-class — EAIK / IK-Geo / IKFast solve them cleanly. Adding them does not move the non-Pieper coverage story.

That said, Standard Bots is a hot, visible NYC robotics company with a sizeable user base. Their inclusion in the ssik prebuilt roster would have meaningful adoption-funnel value, similar to how UR5 / Puma 560 anchor the Pieper rows of the README table.

If we proceed, the value framing is "every arm a user is likely to type — including the ones we don't get to differentiate on", not "EAIK gap closure".

Source caveat: missing LICENSE

The standardbots/ros2-realtime-api repo has no top-level LICENSE file and GitHub reports licenseInfo: null. Vendoring URDFs without an explicit license is legally murky for a BSD-3-Clause downstream — copyright defaults to all-rights-reserved.

Two options for handling that:

  1. specs fixture (preferred). Extract DH parameters from the URDF and reproduce them as a Python specs_fn (the pattern used by jaco2_specs and kuka_iiwa14_specs). Kinematic constants — distances, axes, angles — are data, not creative expression, and don't carry the URDF's copyright. Clean separation.
  2. Wait for upstream LICENSE. File an issue on standardbots/ros2-realtime-api asking for a permissive license. Cleaner long-term; takes upstream action time.

Strong preference for option 1 — it unblocks us without waiting on Standard Bots, and the specs pattern is already first-class in the manifest (fixture_kind = "specs").

SKUs

  • thor / RO1 — 18 kg payload, 1.3 m reach. three_parallel (UR5 class).
  • core — internal codename; need product mapping. spherical_two_parallel.
  • spark — internal codename; need product mapping. spherical_two_parallel.

Before adding core / spark, confirm with Standard Bots (or via public marketing) what those codenames map to in their product catalogue. If they're unreleased or non-public, only adding the RO1 makes sense for now.

Per-arm work (modeled on #300)

  1. Run ssik build against the URDF (dev path) to confirm dispatcher classification.
  2. Extract DH params + write tests/fixtures/<name>.py with a <name>_specs() function returning JointSpec per axis (pattern: tests/fixtures/jaco2.py).
  3. Add [arms.<name>_ik] manifest entry with fixture_kind = "specs", specs_fn = "<name>_specs", solver = "ikgeo.three_parallel" or "ikgeo.spherical_two_parallel", tier = 0, fk_ceiling_fuzz = 1e-7 (Pieper class is sub-repeatability), platform_drift = false.
  4. scripts/regen_artifacts.py → expect sub-second build, ~25 KB artifact.
  5. 500-pose Hypothesis bulletproof sweep at the per-class floor.
  6. Bench via examples/04_compare_vs_eaik.py → both ssik and EAIK measured; EAIK should NOT refuse.
  7. scripts/regen_docs.py → AUTOGEN tables update.
  8. PR title: Add Standard Bots RO1 prebuilt artifact (three-parallel 6R) (or sibling equivalent).

Acceptance

  • License clarified (either upstream license added, or specs fixture confirmed as the legal path)
  • RO1 lands as a tier-0 prebuilt with sub-millisecond bench and FK at machine precision
  • core / spark product identity confirmed before adding (or scoped out if unreleased)
  • README EAIK comparison table grows by 1–3 rows showing ssik supported / EAIK supported (both measured)

Not in scope

  • Differentiation framing. Standard Bots arms don't close any EAIK gap. The PR description and outreach references should frame them as "broad coverage" rather than "wedge closure".
  • MoveIt / ROS 2 integration via Standard Bots' ros2-realtime-api. That's a downstream integration, not a prebuilt artifact.
  • Vendoring the URDF directly. Skip until the upstream license is clarified.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions