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:
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.
- 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
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)
- Run
ssik build against the URDF (dev path) to confirm dispatcher classification.
- Extract DH params + write
tests/fixtures/<name>.py with a <name>_specs() function returning JointSpec per axis (pattern: tests/fixtures/jaco2.py).
- 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.
scripts/regen_artifacts.py → expect sub-second build, ~25 KB artifact.
- 500-pose Hypothesis bulletproof sweep at the per-class floor.
- Bench via
examples/04_compare_vs_eaik.py → both ssik and EAIK measured; EAIK should NOT refuse.
scripts/regen_docs.py → AUTOGEN tables update.
- PR title:
Add Standard Bots RO1 prebuilt artifact (three-parallel 6R) (or sibling equivalent).
Acceptance
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.
Coverage for Standard Bots' cobot line. Three URDFs publish through the official
standardbots/ros2-realtime-apirepo:core.urdf,spark.urdf,thor.urdf— the latter is the public RO1 (18 kg payload, 1.3 m reach).coreandsparkappear 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:
ikgeo.three_parallel(UR5's class)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-apirepo has no top-levelLICENSEfile and GitHub reportslicenseInfo: 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:
specsfixture (preferred). Extract DH parameters from the URDF and reproduce them as a Pythonspecs_fn(the pattern used byjaco2_specsandkuka_iiwa14_specs). Kinematic constants — distances, axes, angles — are data, not creative expression, and don't carry the URDF's copyright. Clean separation.standardbots/ros2-realtime-apiasking 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
specspattern is already first-class in the manifest (fixture_kind = "specs").SKUs
three_parallel(UR5 class).spherical_two_parallel.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)
ssik buildagainst the URDF (dev path) to confirm dispatcher classification.tests/fixtures/<name>.pywith a<name>_specs()function returningJointSpecper axis (pattern:tests/fixtures/jaco2.py).[arms.<name>_ik]manifest entry withfixture_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.scripts/regen_artifacts.py→ expect sub-second build, ~25 KB artifact.examples/04_compare_vs_eaik.py→ both ssik and EAIK measured; EAIK should NOT refuse.scripts/regen_docs.py→ AUTOGEN tables update.Add Standard Bots RO1 prebuilt artifact (three-parallel 6R)(or sibling equivalent).Acceptance
specsfixture confirmed as the legal path)core/sparkproduct identity confirmed before adding (or scoped out if unreleased)Not in scope
ros2-realtime-api. That's a downstream integration, not a prebuilt artifact.