Skip to content

Latest commit

 

History

History
479 lines (384 loc) · 73.2 KB

CHANGELOG.md

File metadata and controls

479 lines (384 loc) · 73.2 KB

Changelog

Highlights

Correctness fix in inverse dynamics (RNE). Robot.rne() — used by every URDF/ETS-based robot's inverse dynamics — was silently returning wrong torques for any robot with translational offsets between links (i.e. virtually all real robots), traced to an upstream spatialmath-python change to how spatial forces transform. Fixed, along with two related bugs in how static (non-actuated) link mass gets attributed to the correct joint. Verified against the compiled C++ reference path and textbook closed-form solutions.

Tool transforms now work everywhere. robot.tool, once set, is automatically honored by fkine/jacob0/jacobe/hessian0/hessiane (previously silently ignored unless passed explicitly each call), and all seven IK solvers (ik_LM/ik_NR/ik_GN/ikine_LM/ikine_NR/ikine_GN/ ikine_QP) now accept a tool= argument directly.

New: Panda(use_robot_descriptions=True) — an opt-in alternate Panda model with real inertial data, for users who need correct dynamics rather than the default's faster collision geometry.

Bug fixes: joint_velocity_damper keyword-argument misuse across several example scripts; DHRobot.ikine_6s undoing the tool transform on the wrong side; UR5's gripper link now resolved by name instead of a fragile raw index.

Wiki refresh (not reflected in this changelog — wiki edits are direct pushes to a separate repo, not commits here): a full currency pass across all 26 pages, stale/incorrect content fixed, ROS references removed, and new pages added — Panda model comparison, reactive control, inverse kinematics, and IK/RNE benchmark results with real numbers.

Changed behavior: EKF.plot_error(). The confidence bounds are now the interval containing the requested fraction of a one-dimensional Gaussian (±1.96σ for confidence=0.95); earlier versions drew ±2.45σ, which is the 95% radius of a two-dimensional region and was too wide for a scalar error. The error is now plotted against time (it was plotted against sample number on axes limited to time), bgcolor is honored, and SLAM no longer raises. Figures regenerated with this version, for example Figure 6.10 in Robotics, Vision & Control (3rd ed.), have narrower shaded bounds than the printed ones.

1.5.0 (2026-10-23)

Features

  • dynamics: payload_capacity() replaces pay() and paycap() (#881) (f7d5548)
  • ets: a joint has an offset, and merge() can merge a constant into a joint (#869) (4c91c01)
  • ets: a trailing underscore numbers a joint name from one; document joint descriptors (#811) (68f525a)
  • ets: add numerical inverse kinematics for planar ETS2 (#826) (aaf0902), closes #824
  • ets: fkine and eval take no argument for a sequence without joints (#830) (155a4be)
  • ets: merged() and swapped() return a modified copy, and merge() removes a transform that adds up to nothing (#868) (ee91ff9)
  • ets: replace() and replaced() put a transform on another axis (#874) (67ea1a1)
  • ets: support locking a joint in an ETS (#740) (38fc591)
  • ets: swap() carries a transform across a constant quarter or half turn (#870) (84bd1e5)
  • ik: analytic inverse kinematics for six-axis arms, with generated code in Python, C, C++ and Rust (#842) (580886e)
  • ik: verbose=True prints the progress of the Python IK solvers, and why a solution is rejected (#834) (c225baf)
  • mobile: animate range-bearing sensor beam and sensing region (#858) (9402635)
  • mobile: planners ignore unknown keywords with a warning; plot(labels=True); distance= for metric (#786) (1a3a19f)
  • plot: plot(env=) adds a robot to an earlier scene in a pose of its own, plot(ax=) draws on given axes, and color= sets the color (#873) (1daa4b3)
  • plot: plot(notebook=) chooses the Swift frame in a cell or a browser window, and browser=notebook is deprecated (#866) (f68741b)
  • plot: view="xy", "xz" or "yz" starts a PyPlot plot in an axis-aligned view of a plane (#879) (649b8fb)
  • robot: add self-collision checks for non-adjacent links (#816) (8255224)
  • typing: ship a py.typed marker so type checkers use RTB's annotations (#823) (ea8b978)

Bug Fixes

  • add the payload to the end-effector link instead of overwriting it (#699) (79b169c)
  • backends: PyPlot backend fixes, Connector as a Protocol, one window-title helper (#788) (dcb7982)
  • blocks: DiffSteer NameError and VehiclePlot shared defaults, with types and docstrings (#775) (f59eee8)
  • blocks: JTraj ends at rest, and accepts qd0 and qdf (#890) (44ebffe)
  • dh: DHRobot.jacobe applies the flip of a joint (#806) (d312bc8)
  • dhrobot: format prismatic joint limits in string output (#718) (71d07a7)
  • docs: drop the obsolete cross-repo spatialgeometry wheel fetch (#703) (477b6e3)
  • dynamics: apply prismatic offsets in Python RNE (#800) (544e574)
  • dynamics: dynamics methods require dynamic parameters, and hasdynamics is kept by the setters (#846) (b7f9096)
  • dynamics: preserve operational gravity overrides and output shape (#797) (b9e71a5)
  • dynamics: support arbitrary joint counts in paycap (#731) (6a45f73)
  • dynamics: transform operational Coriolis terms consistently (#796) (c93afaf)
  • ekf: plot_error in SLAM, against time, honouring bgcolor, with correct bounds (#749) (0119d66)
  • ets2: preserve joint indices and flipped Jacobian signs (#792) (8df90ac)
  • ets: reject boolean joint indices in fixjoint (#836) (4512e47)
  • ets: swap accepts transforms that commute, merge rejects a joint, ET2.s is a 3-vector (#832) (f7edf54)
  • ik: a q0 or mask of the wrong length is an error, in the C++ and the Python solvers (#831) (f333582)
  • ik: apply QP updates at active joint indices (#794) (38909d2)
  • ik: IKSolution is a sequence of the rows of q, true if successful (#717) (be4ad92)
  • ik: preserve arbitrary half-turn pose error magnitude (#793) (fe51972)
  • ik: Robot.ikine_* accept an (N, 4, 4) array of poses (#714) (385747b)
  • ik: trajectory residual is the maximum, and document trajectory behaviour (#712) (aee6fb2)
  • lite: the notebooks install the wheel built with the site, and a browser check proves it (#863) (126c410)
  • mobile: align grid planners and backgrounds in world coordinates (#791) (b4e05b4)
  • mobile: Bug2 animation, trapped, border handling, and docstrings (#780) (44ce707)
  • mobile: DistanceTransform, PRM, QuinticPoly and CurvaturePoly planners (#781) (53becb4)
  • mobile: EKF map coordinates and range-bearing observation rows (#784) (4a93c88)
  • mobile: EKF map ellipses use each landmark's covariance; description, state copy, sensor type (#787) (d909d7c)
  • mobile: make PurePursuit usable; rst docstrings and shaped types in drivers.py (#772) (3a3a1d8)
  • mobile: maps: stricter arguments, clearer names, docstrings and types (#779) (ec1e3fe)
  • mobile: PlannerBase argument checks, plot without side effects, and <thing>_style arguments (#778) (84a07d2)
  • mobile: PoseGraph access and errors, verbose output, style arguments, pgraph 1.0 names (#783) (7def8fa)
  • mobile: preserve angular turn-rate units for Unicycle (#719) (606223f)
  • mobile: reject negative occupancy grid indices (#790) (be029bd)
  • mobile: remove debug output from RRT query (#751) (c7c9b58)
  • mobile: resolve the workspace in one place, with a documented precedence (#776) (07090ed)
  • mobile: type ParticleFilter, and fix x0, gif and mp4 output (#883) (6b85d77)
  • mobile: VehicleBase control handling and plot_xyt, tests and docstrings (#774) (2ee9fa9)
  • particlefilter: do not pause between steps unless animating (#748) (ea7b4d6)
  • particlefilter: get_xyt returns (x, y, theta) as documented (#752) (14775a7)
  • planning: retain zero-coordinate path endpoints (#798) (72169ae)
  • plot: a trajectory is animated whatever %matplotlib says (#860) (b853cb8)
  • plot: drive Swift through its handle, and test Swift in a notebook with a real kernel (#865) (7894328)
  • plot: one implementation of the block= contract for every plot method (#820) (2881ee1)
  • plot: PyPlot and PyPlot2 step() raise ValueError for a dt of zero or less (#875) (934ca7d)
  • plot: Swift is shown in the cell of a notebook, and a trajectory is animated in real time (#864) (fa353d4)
  • poe: construct frames for x-aligned screw axes (#799) (7334f2e)
  • populate mstraj velocity and acceleration (#706) (8007e33)
  • posegraph: ignore blank lines in g2o and toro files (#745) (c66d855)
  • prm: honour explicit constructor distance threshold (#754) (788eaf3)
  • prm: query before plan raises RuntimeError rather than AttributeError (#744) (e094f89)
  • puma560: joint 2, 3 and 4 limits are those of RTB-MATLAB, as the comments say (#835) (5afb34a)
  • puma: self-contained ikine_a with trajectory and failure handling; deprecate ikine_6s (#715) (1a609c3)
  • robot: hasgeometry is true for planar robots whose links have geometry (#814) (4543500)
  • robot: improve jacob0_dot docstring, typing overloads, and representation error handling (#737) (b83b469)
  • robot: jtraj takes joint coordinates only, SE3 arguments raise (#716) (68185fc)
  • robot: qlim and printing work for a robot with symbolic parameters (#856) (7666c63)
  • robot: Robot.set_default_backend replaces rtbtool's monkey-patch; URDFRobot drops a dead guard (#810) (681c725)
  • robot: the first line of print(robot) names the class and the model (#862) (4766ca6)
  • robot: the first line of print(robot) names the class and the model, as DHRobot.Puma560 (4766ca6)
  • robot: the line of sight of vision_collision_damper has the right orientation for parallel and antiparallel vectors (82974b1)
  • robot: the line of sight of vision_collision_damper is oriented correctly for parallel and antiparallel vectors (#845) (82974b1)
  • slam: report missing PoseGraph vertices with file context (#760) (dba2bfc)
  • tests: expect forward-slash filename from spatialgeometry >= 1.4.1 (#702) (c070066)
  • tools: report original Jacobian column indices (#795) (cb4b591)
  • tools: the data.py demo block called a function that does not exist (#809) (27fd83a)
  • trajectory: honour non-zero time origins in scalar profiles (#698) (06b8716)
  • trajectory: solve the quintic in normalized time, Hermite form behind method= (#805) (97c6c0f)
  • urdf: initialise name maps before transmission validation (#801) (057751f)
  • urdf: report stage, element and line when a URDF/xacro fails to load (848114b)
  • urdf: report stage, element and line when URDF/xacro loading fails (#701) (848114b)
  • urdf: rotate inertia tensors from the inertial frame into the link frame (#707) (566cf70)

Performance Improvements

  • mobile: index completed PRM roadmaps and benchmark queries (#889) (0e8d604)
  • mobile: reduce RRT collision work and assemble sparse pose graphs (#817) (ff0e902)

Documentation

  • add Codacy grade badge to README (0372615)
  • AGENTS.md says what the Toolbox is for (#872) (a379193)
  • agents: say where the array type aliases are (#757) (5c7d3d4)
  • ask contributors to check for existing PRs and claim Issues first (#829) (02af061)
  • desiderata: bring up to date with the code, and add status markers (#885) (31d99a9)
  • ets: a section for ET and ETS, and a documentation pass: typos, cross-references, zero warnings (#833) (374720a)
  • ets: add fixjoint examples and version markers (#877) (093a760)
  • ik: add the autosummary template that the IK pages of #833 refer to (#838) (8839ac6)
  • ik: say the same thing everywhere about when the C++ ik_XX solvers cannot be used (#871) (bf42b9f)
  • ik: the QP solvers say they need qpsolvers and quadprog, and the qp extra that installs them (#841) (9b72b1a)
  • landing pages for arms, mobile robots and blocks, with tables, introductions and a clearer sidebar (#844) (f0e22c0)
  • lite: keep JupyterLite contents in memory so republished notebooks are never stale (#819) (4e8073d)
  • mobile: correct docstrings for the estimators, sensor, drivers and animations (#750) (b6e86e8)
  • notebooks: a standard generated first cell, and a shorter bootstrap cell (#850) (2b2fa83)
  • notebooks: drop the deprecated path_marker argument (#815) (689ae2a)
  • notebooks: drop the path_marker argument, which is deprecated (689ae2a)
  • notebooks: follow the notebook plotting recipe, and fix a broken qplot call (#821) (7690e80)
  • notebooks: modernise branched-robot.ipynb for the current Robot API (#852) (2d8abf1)
  • notebooks: modernise ets.ipynb for the current ET and ETS API (#851) (1460de7)
  • notebooks: modernise icra2021.ipynb for the current API (#854) (1ddf6dd)
  • notebooks: modernise iros2020.ipynb (renamed from iros2020-workshop) for the current API (#855) (af4de2c)
  • notebooks: modernise symbolic.ipynb for the current API and make it fast to run (#857) (bd9e933)
  • notebooks: modernise two-link-dynamics.ipynb, including the sign convention of gravity (#853) (e778eb6)
  • notebooks: review and refresh the notebooks, add an index (#867) (c72f1bc)
  • notebooks: the first cell is hand-written markdown again, and cell ids are committed (#859) (742b6ed)
  • one style for docstring section headings, and 1.5.0 for the next release (#882) (6497cdc)
  • say which checks are required, and that Codacy is advisory (#802) (1ec699a)
  • update copyright information in LICENSE file (#710) (fc969a3)

Build System

  • deps: bump pypa/cibuildwheel from 4.2.0 to 4.2.1 (968ed04)
  • deps: bump pypa/cibuildwheel from 4.2.0 to 4.2.1 (acc6842)

1.4.4 (2026-09-20)

Features

  • urdf: Panda(use_robot_descriptions=True) option; doc the tradeoff (#687) (124882b)

Bug Fixes

  • dhrobot: ikine_6s undoes the tool transform on the wrong side (#680) (9fbffc6), closes #640
  • docs: mock bdsim imports so blocks pages render in docs CI (436e1f3)
  • examples: call joint_velocity_damper with keyword args (#690) (95ac98e)
  • examples: call joint_velocity_damper with keyword args in fetch_vision.py (#695) (7aa2d31)
  • joint_velocity_damper: fix bug in q usage (#666) (8246559)
  • kinematics: self.tool now applies by default; ik_LM/ik_NR/ik_GN/ikine_XX gain a tool= kwarg (#697) (61d078f)
  • link_collision_damper (#685) (c040522)
  • preserve joint types and limits in numerical IK (e122ccb)
  • rne: attribute a sandwiched static link's mass to its preceding joint, not the following one (#693) (bebede0)
  • rne: don't crash when a joint's kinematic parent is a base-mounted static link (#696) (dba179e)
  • rne: propagate backward-pass force through the correct transform direction (#691) (a80c9c1)
  • rne: trailing static links after the last joint had their mass dropped (#684) (0d76187)
  • rtbtool: drop stray quote in banner's import line (#678) (b36c398)
  • urdf: resolve UR5's gripper link by name, not a raw index (#683) (12ba598), closes #578

Documentation

  • models: credit robot_descriptions in the 8 model classes that use it (#681) (5dc8618)
  • models: note UR10's near-singular inertia matrix is manufacturer data (#682) (97b0a3f)
  • readme: move research applications section to the wiki (#689) (8facc5e)

Miscellaneous

1.4.3 (2026-09-12)

Bug Fixes

  • check IK convergence before solver step (aabe415)

Documentation

Build System

  • deps: bump actions/cache from 4 to 6 (1ebf302)
  • deps: bump pypa/cibuildwheel from 4.1.1 to 4.2.0 (efbca2a)

1.4.2 (2026-08-26)

Headline: Fixes to inverse kinematics and forward kinematics for branched robots. Arising from a big trawl through long standing issues (thanks to all those users), many were resolved by recent work, but some were not. Issues down from 104 to 43 of which 20 are tech-debt to be worked through.

Features

  • ets: fkine/jacob0/jacobe/hessian0/hessiane accept compact q (#653) (d5b6990)
  • examples: add ikine_XX (C++ and pure-Python ETS) to ik_speed.py (2f41a71)
  • examples: add ikine_XX timing columns to ik_speed.py (#654) (2f41a71)

Bug Fixes

  • blocks: FDyn_X.output() crashed/asserted on unset xdd before deriv() ran (#647) (8caa363)
  • examples,dhrobot: repair broken ikine_LMS/ikine_min example references (#650) (6691113)
  • ik: _random_q() silently produces garbage for non-finite joint limits (#648) (2f43a3c)
  • ik: unify ik_XX/ikine_XX return types and fix IK docs (#652) (07a60f4)
  • kinematics: fkine_all() computes wrong poses for links past a nominal end-effector (#643) (25eedcd)
  • mobile: restore missing distance-transform diagonal (835457e)
  • models,ik: correct YuMi gripper parents and IK failure-path q compaction (#649) (7c40242)
  • pyplot: robot.plot(..., movie=...) crashes on save (#645) (2e2bfe2)
  • pyplot: scalar plot options (jointaxislength, eelength) crash on override (a4aea19)
  • pyplot: scalar plot options crash on override (#642) (a4aea19)

Documentation

  • fix broken PyPlot backend example in intro.rst (#641) (5e8d2f9)

Miscellaneous

1.4.1 (2026-08-25)

Bug Fixes

  • ci: add CIBW_ENABLE=pyodide-eol, required to build the cp312 pyodide target (2243fc2)
  • ci: drop the explicit pyodide-version override, let cibuildwheel 3.4.1 self-resolve (394d258)
  • ci: keep JupyterLite wasm build on JSPI-safe cp312, not cibuildwheel's new cp313 default (a315095)
  • ci: pin cibuildwheel 3.4.1 for the pyodide build job, not 4.1.1 (e428935)
  • ci: stop skip-cascade from release-please poisoning downstream jobs (f252325)
  • compute accel_x with analytical Jacobian derivative (1c4ffe6)
  • plot: use matplotlib colormaps registry instead of removed cm.get_cmap (ad14468)
  • two real bugs found by running the suite against the pure-Python path (d4d2af3)

Build System

  • add RTB_PURE_WHEEL to build a genuine py3-none-any wheel (d61729c)

1.4.0 (2026-08-22)

Highlights: using significantly reworked versions of Swift (v2.0.0) and Spatial Geometry (v1.4.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. robot.teach() now supports the Swift backend directly, and the docs site gained a JupyterLite-powered "Try it Now" in-browser notebook -- no install required. 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)

1.3.1 (2026-07-03)

Manual out-of-band release from the v1.3.0 tag (not via release-please — main has since diverged with in-progress, breaking work). See tech-debt.md ("Release process: single-branch release-please + stacked PRs on a red main") for why.

Bug Fixes

  • deps: pin rtb-data<2 to protect this release line from an upcoming breaking rtb-data reorganisation (renamed/deleted model folders) that will ship as rtb-data 2.0 alongside the next roboticstoolbox-python major/minor release. Without this pin, any fresh pip install roboticstoolbox-python would silently pick up the incompatible new rtb-data and fail to load bundled robot models.

1.3.0 (2026-06-14)

Features

  • bundle spatialgeometry as pure-Python (removes external dep) (1b522e6)

Build System

  • setup proper release process (d0e0559)