Repository navigation
Backend registry: single name → constructor dispatch #902
Copy link
Copy link
Open
Labels
Description
Part of #886. Groundwork for the new backends; each backend issue is blocked by this one.
Problem
Backend selection is spread over several places:
backends.load_backend(): anif/elifover "swift", "pyplot", "pyplot2"BaseRobot._get_graphical_backend(): aLiteralof the same names, anisinstancechain to pick a default, a Pyodide special case, and Swift-specific fallback logicBaseRobot.plot():type(env).__name__ == "Swift"andisinstance(env, PyPlot)checks
Adding a backend means editing all of these. Also, default_backend isn't lowercased, so robot.default_backend = "Swift" fails with ValueError at plot time.
Proposal
- One registry in
roboticstoolbox.backends, mapping name → target, e.g."swift": "roboticstoolbox.backends.swift:Swift". Built-in backends are entries here. load_backend(name)looks the name up (case-insensitive). A string target is imported only when chosen. An unknown name gives an error listing the registered names. A missing optional package givesModuleNotFoundErrornaming the pip extra.register_backend(name, target, *, replace=False), public:targetis a lazy"module:Class"string, or a callable returning aConnector- registering an existing name raises unless
replace=True - registration is per process (call it before
plot()); entry-point discovery may come later - lets a backend be developed, tested and used outside the RTB tree, e.g.
register_backend("isaacsim", "rtb_isaacsim:IsaacSim"); once accepted into RTB, that call becomes a registry entry - backends that can't live in RTB (licence, GPU) can stay as separate packages
- Default choice stays in
_get_graphical_backend, but works only with names: explicit argument → robot/class default → robot kind → "pyplot". Defaults by robot kind pick only built-ins; a registered backend is used when named or set withset_default_backend(). Normalise case at every entry point. - Capability flags replace type checks. Add flags to
Connector, and usegetattr(env, flag, default)inplot():embeds_in_notebookreplaces__name__ == "Swift"supports_moviereplacesisinstance(env, PyPlot)- existing:
supports_teach,supports_ellipse
- Type hints. The
backendargument becomesstr, validated at runtime against the registry, so the names live in one place and registered names are valid too.
Out of scope
- Changing the
Connectorprotocol itself (Connector/backend API polish: addable-object superclass, teach-panel promotion, getframe() #676) - Third-party discovery via entry points
Tests
- Lookup: case-insensitivity, unknown-name error, missing-package error
register_backendwith a string target and a callable target, the duplicate-name error, andreplace=True, all using a fake backend- Default resolution for each robot kind and for Pyodide
- Capability flags read with the right defaults
- The mocked Swift tests use
register_backendand no longer need a class namedSwift
Done when
- Adding a backend is one registry entry plus the backend module
- No
__name__or backendisinstancechecks remain inBaseRobot - Existing tests pass, including the Swift ones
- The docs list the registered backends and their flags, and show
register_backendusage
Activity
alexermolovich commentedon Oct 26, 2026
Hello @petercorke, I do not see any PR associated with this issue so I will start working on this one as well in parallel with the #903, so you can assign me to both if you wish. If there is any work on this done already and I just did not see it please let me know and I will just pull it into my #903 draft.
alexermolovich commentedon Oct 26, 2026
I opened a PR to work on this issue: #904
petercorke commentedon Oct 27, 2026
Alex, I'm traveling and not getting to things quickly. I was planning on taking this one, I am assigned, leave you to do the heavy lifting on IsaacSim proper. If you've started submit a PR. I created sub issues to allow different folk to claim different backends