Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

Backend registry: single name → constructor dispatch

未关闭
#902 2 条评论 0 个 reaction 已指派 1 人 在 GitHub 查看

维护者通常 1 天内回复

@petercorke 已经在做这个了。

开始于 2026年10月25日。

  • #904 来自 @alexermolovich —— 未关闭

评估

这个 Issue 还没有评估数据。

描述

enhancement

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(): an if/elif over "swift", "pyplot", "pyplot2"
  • BaseRobot._get_graphical_backend(): a Literal of the same names, an isinstance chain to pick a default, a Pyodide special case, and Swift-specific fallback logic
  • BaseRobot.plot(): type(env).__name__ == "Swift" and isinstance(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

  1. One registry in roboticstoolbox.backends, mapping name → target, e.g. "swift": "roboticstoolbox.backends.swift:Swift". Built-in backends are entries here.
  2. 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 gives ModuleNotFoundError naming the pip extra.
  3. register_backend(name, target, *, replace=False), public:
    • target is a lazy "module:Class" string, or a callable returning a Connector
    • 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
  4. 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 with set_default_backend(). Normalise case at every entry point.
  5. Capability flags replace type checks. Add flags to Connector, and use getattr(env, flag, default) in plot():
    • embeds_in_notebook replaces __name__ == "Swift"
    • supports_movie replaces isinstance(env, PyPlot)
    • existing: supports_teach, supports_ellipse
  6. Type hints. The backend argument becomes str, validated at runtime against the registry, so the names live in one place and registered names are valid too.

Out of scope

  • Changing the Connector protocol itself (#676)
  • Third-party discovery via entry points

Tests

  • Lookup: case-insensitivity, unknown-name error, missing-package error
  • register_backend with a string target and a callable target, the duplicate-name error, and replace=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_backend and no longer need a class named Swift

Done when

  • Adding a backend is one registry entry plus the backend module
  • No __name__ or backend isinstance checks remain in BaseRobot
  • Existing tests pass, including the Swift ones
  • The docs list the registered backends and their flags, and show register_backend usage
主要语言
C++
星标
3.6k
派生
645
平均合并
1 天 8 小时
30 天内合并 PR
145

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

petercorke/robotics-toolbox-python 的其他 Issue

查看 petercorke/robotics-toolbox-python 的全部 Issue

相似的 Issue

更多 C++ Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。