A new major release! (which means breaking changes!)
Breaking Changes
Robot
* The robot class now distinguishes between three sets of joints: all joints (including all fixed joints), moveable joints (excludes fixed joints), and actuated joints (the ones that the user actually wants to control). There are corresponding properties `num_total_joints`, `num_moveable_joints`, and `num_actuated_joints`, as well as `all_joint_names`, `moveable_joint_names`, and `actuated_joint_names`. The previous attribute `num_joints` has been removed, with `num_moveable_joints` being its replacement.
* The constructor argument `tool_joint_name` has been removed and is replaced with `tool_link_name` to be more intuitive: the end effector/tool is a *link*.
Collision Detector
The collision detector API has been revised to be simpler and less verbose, which also means that every method of the `CollisionDetector` class now has a slightly different signature.
* Collision pairs are now specified as plain tuples, each a pair of *collision objects*. A collision object is either a single `int` representing a body UID, a tuple `(body_uid, link_uid)`, or a tuple `(body_uid, link_name)`. This also means the verbose `NamedCollisionObject` dataclass is no longer with us.
* The `CollisionDetector` no longer takes a dictionary mapping body names to indices anymore; this was cumbersome.
* The `CollisionDetector` no longer knows anything about commanding robots. This should be handled by the user outside of the detector (see the updated example script).
Other Changes
* The `Robot` class now has the convenience methods `get_link_index` and `get_joint_index` for convenient look-up by name.
* The `Robot` class now has the property `link_names`, a list of all its link names.
* Added the `as_rotation_matrix` parameter to `BulletBody.get_pose`.
* Some additional tests and typo fixes.