Repository navigation
Kinema v0.3.2
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
xacrocommand line uses:name:=ur5e ur_type:=ur5e. Some descriptions cannot render without one: the Universal Robotsur.urdf.xacrouses$(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
.xacroand 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 ofUndefined 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_resourcesnext door. Kinema never told the xacro renderer where those packages were, so any cross-package$(find …)failed withPackageNotFoundErroreven 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 afile://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_Descriptiondeclares itselfur_description, so every$(find ur_description)inside it failed. Both names work, since descriptions in the wild reference either. - A package whose
package.xmlis 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