Skip to content

Kinema v0.3.2

Choose a tag to compare

@ebgenius ebgenius released this 04 Sep 19:26
· 23 commits to main since this release
b813cc4

Real robot descriptions, from the repositories they actually ship in.

Two of the most widely used ROS description repositories would not import: a KUKA LBR iiwa, because its xacro reaches into a sibling package for its materials, and a Universal Robots arm, because its xacro requires an argument. Neither layout is unusual — that is simply how vendor descriptions are laid out — and behind each was a small stack of further defects that only became visible once the one in front was fixed.

Nothing here changes an existing rig. If your robots already import, this release is about the ones that did not.

Requires Blender 5.2 LTS or newer. Every dependency ships inside the extension zip; nothing is downloaded at runtime.

Download

Platform File Size
Windows kinema-0.3.2-windows_x64.zip 116.5 MB
Linux kinema-0.3.2-linux_x64.zip 136.4 MB
macOS (Apple silicon) kinema-0.3.2-macos_arm64.zip 99.7 MB

Install with Edit → Preferences → Add-ons → Install from Disk.

Added

  • Xacro arguments. A field in the import options — file picker and sidebar both — taking the syntax the xacro command line uses: name:=ur5e ur_type:=ur5e. Some descriptions cannot render without one: the Universal Robots ur.urdf.xacro uses $(arg name) on the line above the one that declares it, so its default never applies and the file will not load unless you supply a name.

    Pick a .xacro and the file browser lists the arguments it declares with their defaults, so you can see what it wants before importing rather than after failing. Get one wrong and the error names the argument and lists the rest, instead of Undefined substitution argument name.

    The arguments are stored on the rig, because the solver reloads the description later to build its model — a rig that imported cleanly and then quietly lost PyRoki would be a poor trade.

  • Package Search Paths in the preferences: extra directories to find ROS packages in, searched in addition to the repository holding the file. For a cell whose macros live in a different repository from its robots.

Fixed

  • Xacro robots that reach into a sibling package now import. A ROS repository puts packages side by side, and a robot in one routinely includes files from another — a KUKA LBR iiwa pulls its materials from kuka_resources next door. Kinema never told the xacro renderer where those packages were, so any cross-package $(find …) failed with PackageNotFoundError even though the package was in the same clone.
  • Mesh paths in rendered xacros resolved to the wrong place on Windows. Rendering rewrites every package:// into a file:// URI, and on Windows the drive letter ends up in the URI's authority rather than its path — so Kinema, reading only the path, got either nothing or a path with the drive removed. It fell back to the description's own directory, which exists, so the robot imported without a single mesh and without an error.
  • Xacro rigs no longer lose the PyRoki solver. The solver reloads the description to build its model and handed the xacro to the URDF parser unrendered, so $(arg …) reached a float parser and the rig dropped to the NumPy fallback — silently, because falling back is what happens whenever the reload fails. 38 of the catalogue's robots ship only a xacro.
  • A package is identified by the name it declares, not the name of its folder. Universal_Robots_ROS2_Description declares itself ur_description, so every $(find ur_description) inside it failed. Both names work, since descriptions in the wild reference either.
  • A package whose package.xml is not plain ASCII no longer breaks the import. It is parsed as XML rather than read with the system codec, so a maintainer's name with an accent stops mattering — on Windows this crashed with 'charmap' codec can't decode byte 0x9d.

Changed

  • Package discovery is bounded to the checkout. Kinema used to look for ROS packages by scanning several directories above the description, which for a robot saved anywhere near a drive root meant scanning the entire drive — no error, just an import that never finished. It now searches the containing package's parent, stops at a repository boundary, and never walks to a filesystem root.

Full changelog: v0.3.1...v0.3.2