1.4.0 (2026-08-22)
Highlights: using significantly reworked versions of Swift (v2.0.0) and Spatial Geometry (v1.3.0) -- lots of bug fixes, new features and documentation. Collision detection changed from PyBullet (no longer well maintained to Coal. Integrates with Robot Descriptions for access to over 150 URDF models, loaded dynamically and cached locally -- this means that RTB can now ship with a very minimum set of mesh models. Significant work on RNE models (DH Python, DH C, ETS Featherstone) all consistent and checked against analytic model. Additional work on docs, build system, and testing.
Significant amount of tech debt identified, these are now tracked in Issues. Happy for help from first time contributors, projects from bite size to a full meal.
Features
- bundle spatialgeometry as pure-Python (removes external dep) (1b522e6)
- change collision backend from PyBullet to Coal (f99c154)
- docs: add JupyterLite in-browser "Try it Now" deployment (d383f55)
- dynamics: add armature inertia and friction to Robot.rne() (1d55edf)
- et: accept a string joint descriptor in param (jindex/flip parsing) (ab0f794)
- et: rename axis -> kind, add ax for the x/y/z-only concept (8ffc493)
- et: rename eta -> param, keep eta as a deprecated alias (7f0df78)
- ets: rigorous dh/mdh split() convention, sum() support, terser tests (a0674e7)
- models: add Panda DH link centre-of-mass parameters (fc2fe20)
- refactor URDF loading, add Jaco model, fix collision and deepcopy (d8f9289)
- robot model listing cleanup, extended display, sorting option (40c4882)
- robot: add BaseRobot.graph() for multi-format link graph text (fca095c)
- robot: add Robot.fkine_geometry(q) for pure per-part FK (8dbb44e)
- rtbtool: add --test smoke-test flag, fix SG version bug (ae3ba73)
- rtbtool: add 'tool' extra for IPython/pygments, fail with clear message when missing (b791bc8)
- swift: support teach() teach panel for Swift-backed robots (1be412d)
Bug Fixes
- 343 array ordering causing fkine traj error (083cdc4)
- 355 add qlim setters (bae653b)
- 361 flipped joint causing Jacobian error (f0ec2f8)
- 366 symbolic printing handled (eeedeae)
- 377 add setitem method to ETS class (3c0e463)
- bdsim blocks and tests (43e89cf)
- ci: stopgap the JupyterLite piplite index wheel-overwrite bug (11a3f29)
- ci: stopgap the JupyterLite piplite index wheel-overwrite bug (695af7b)
- deprecate Bicycle block's vlim/slim kwargs instead of erroring (8d7449c)
- deprecate RangeBearingSensor's animate kwarg instead of erroring (#599) (1885394)
- deps: add coal/trimesh to dev extras (#528) (3bb5847)
- deps: add missing robot_descriptions dependency (#534) (66c40d4)
- deps: don't require coal on Windows, fix stale install docs (#531) (667084a)
- deps: pin robot_descriptions<3.0, UR5 broke on the unpinned major bump (48715b3)
- deps: pin robot_descriptions<3.0, UR5 broke on the unpinned major bump (b00b46b)
- docs: fix intro.rst syntax errors, dangling section, and stale claims (#549) (29ee42b)
- docs: pick a collision-checking example that actually collides (3240822)
- docs: resolve reST syntax and structural Sphinx build warnings (#540) (cd4e997)
- docstrings in robot models (912cc4b)
- drop stale ax= kwarg from ArmPlot's robot.plot() call (#590) (09dba28)
- dynamics: auto-detect symbolic models, fix rne_python()'s per-call dtype selection (c9db413)
- dynamics: fix three bugs in rne_python()'s modified-DH branch (6b28899)
- dynamics: guard Robot.rne() against standard-DH DHRobot instances (13e62a7)
- dynamics: Robot.rne() dropped the rotational inertia tensor (8434fc9)
- dynamics: rotate gravity by robot base in rne(), move handling into ne.c (9a800e0)
- examples: repair ik_speed.py after fknm/frne refactor and API renames (227f854)
- forward name/base/tool/etc through Robot's clone-from-Robot constructor (16b8974)
- ik: pin seed and tighten tol in flaky ikine tests, document quadratic tol (bc3770a)
- ik: return pre-step q on convergence, not unverified post-step q (3606c3b)
- install swift/spatialgeometry from jhavl upstream, not petercorke's stale forks (#601) (4fd2dff)
- Mesh filename handling (#443) (4f0d3ff)
- mobile: DistanceTransformPlanner.next() calls undefined Error() (e876f58)
- mobile: gate driveto()'s per-step print behind verbose flag (aac83e1)
- mobile: gate driveto()'s per-step print behind verbose flag (ef4853a)
- mobile: gate driveto()'s per-step print behind verbose flag (2115bb3)
- mobile: guard VehicleDriverBase against workspace=None, fix RandomPath docstring example (#541) (901cabb)
- models: add missing URDFRobot.py and Jaco.py (839ab74)
- models: distinguish not-found vs renamed robot_descriptions models (#537) (68da27f)
- models: fall back to robot_descriptions' new naming, hide wrapped dependency on failure (#529) (d8441a3)
- models: fix 3 more addconfiguration() length mismatches surfaced on current main (41ef991)
- models: fix qz configuration size mismatch in px150/rx150/rx200 (a1f10c8)
- models: make KinovaGen3 load via robot_descriptions, add XACRO_ARGS support (#546) (d746ce4)
- models: patch broken upstream RD files for Valkyrie and Fetch (#543) (acb8c6b)
- models: remove FetchCamera, not used in RVC3 and its URDF is unshippable (#545) (17c67d2)
- models: rename list()'s type= param to mtype=, matching stale docs (#542) (c1402f6)
- models: validate addconfiguration() input, fix 5 broken named configs (19dae9a)
- models: validate addconfiguration() input, fix broken named configs (756e101)
- package eigdemo/tripleangledemo/twistdemo entry points correctly (#600) (b19eaa6)
- pin spatialgeometry/swift-sim to their real published versions (7da1125)
- remove vendored spatialgeometry, restore real dependency (bedf504)
- resolve all 9 Sphinx build warnings (#610) (0437ae6)
- Robot._to_dict() uses set_alpha(), deprecated by spatialgeometry (3f73c26)
- rtb-data: add missing rtb-data package config and data files (aaff234)
- rtbtool's %precision line spuriously echoes its own return value (#592) (40198dc)
- rtbtool: don't let spatialgeometry's Path shadow pathlib.Path (f061415)
- rtbtool: fix arg-parsing bugs and converge CLI with mvtbtool (#557) (b111856)
- ShapePlot uses SG Shape.base (removed) instead of .T for pose (#595) (638d673)
- swift: use label kwarg/property, not deprecated desc (17bcfad)
- swift: use Slider/Label/Button's label kwarg, not deprecated desc (bc9ded4)
- test: give test_isspherical its own link instances per robot (8dfd09a)
- tests: fix Python 3.10-only mock.patch AttributeError in fknm fallback tests (#539) (38be2c4)
- test: specify encoding=utf-8 when reading BaseRobot.py/pyproject.toml (#548) (ea4acff)
- tests: skip test_collision.py cases that require coal (#538) (fc51bc2)
- track swift's SwiftElement.py -> Elements.py rename (eecc6d9)
- URDF parser (39f14a0)
- use spatialgeometry's correctly-spelled _propagate_scene_tree() (d0fad96)
- use spatialgeometry's new update() method, not the deprecated alias (972ff0d)
- xacro: use quoteattr for attribute serialization (Python 3.14) (34bb4e2), closes #511
Performance Improvements
- dynamics: add symbolic-aware C dispatch check, safety net, batch trajectories into one C call (c2bd405)
Documentation
- add AGENTS.md stub linking to rvc-ecosystem conventions (#591) (870c840)
- add desiderata (design principles) (104671e)
- adopt rvc-ecosystem Sphinx footer and extension conventions (#606) (755614a)
- describe robot_descriptions integration and catalog() (#608) (f759fa4)
- desiderata: move joint vel/accel limits under actuator params (1325bb3)
- dynamics: housekeeping and write up the full investigation in rne.md (c00af8c)
- fix dead wiki/Common-Issues links, point at wiki/FAQ (#609) (fae8c27)
- fix repeated typos in IK/DHRobot/RobotKinematics/mobile docstrings (8780374)
- fix: resolve stale jointset references and joints() forward-ref warning (298f4c0)
- fix: resolve stale jointset references and joints() forward-ref warning (4531d93)
- fix: update stale roboticstoolbox.robot.ETS references to ets package (2e9f2cd)
- intro: restructure into arm/mobile robots, spatial math, history (8d438d0)
- make sphinx invocation portable for CI (5854c42)
- modernize issue/PR templates to match MVTB's community-health rollout (#607) (0b9f0c5)
- point graphics-block docstrings at |GraphicsBlockOptions| (2c487c7)
- README update (e691441)
- readme: rework top section, references, TOC, and wasm wheel docs (f169546)
- record 1.3.1 in release-please manifest and CHANGELOG (#532) (dfb38c2)
- restructure intro.rst, add JupyterLite deployment, rework README (53222a4)
- tech-debt: consolidate rtb-data entries, document LBR/Valkyrie/Fetch findings (#544) (8ac586d)
- tech-debt: note rtb-data auto-publish idea (c3cfcb2)
- tech-debt: record deferred IKProtocol idea, ahead of the /ets split (73fee37)
- tech-debt: record fknm nanobind leak on background-thread creation (c5b80b3)
- tech-debt: record post-merge CI findings (fknm 3.10, collision skip gap, flaky IK) (#535) (174d9da)
- tech-debt: record vendored spatialgeometry vs external @future install (0ed3f81)
- test: clarify test_isspherical's fix is a workaround, not a rule (6994fad)
- track docs/source/_templates/layout.html (#603) (c2be132)
- update Swift RRMC example to the AssemblyHandle API (fe892e8)
Build System
- deps: bump actions/checkout from 6 to 7 (#522) (65feed3)
- deps: bump actions/deploy-pages from 4 to 5 (c384502)
- deps: bump actions/download-artifact from 4 to 8 (69be126)
- deps: bump actions/setup-python from 6 to 7 (2e31d0f)
- deps: bump actions/upload-pages-artifact from 3 to 5 (#521) (874e4a5)
- deps: bump amannn/action-semantic-pull-request from 5 to 6 (#525) (9acab8b)
- deps: bump codecov/codecov-action from 6 to 7 (33690a0)
- deps: bump googleapis/release-please-action from 4 to 5 (#524) (a5e59ed)
- deps: bump pypa/cibuildwheel from 3.4.1 to 4.1.1 (4a0b377)
- deps: bump softprops/action-gh-release from 2 to 3 (#523) (1e6183f)
- exclude rtb-data subdir from sdist (e45363d)
- remove rules for pushing to PyPI, now done by GH actions. (569fedd)
- setup proper release process (d0e0559)