v1.7.0
v1.7.0 (2026-05-18)
New Features
- Tactile sensing glove support (Linux only): top-level
wujihandpy.TactileGloveplus typed companionsTactileFrame,TactileError,TactileHandedness, and POD types for device info, diagnostics, firmware build, and time sync. Pressure frames arenumpy.float3224×32 arrays in[0, 1]withNaNfor invalid cells. Hand and TactileGlove can coexist in one process—seeexample/joint_with_tactile.py. - Added example
6.disconnect.pydemonstrating USB disconnect handling. - Added example
joint/glove_donning.pythat smoothly drives the hand to a measured glove donning/doffing pose (thumb adducted across the palm, fingers nearly extended) at 100 Hz with low-pass filtering. Auto-selects the left- or right-hand pose viaread_handedness().
Improvements
- Changed
Handdefaultusb_pidfrom-1to0x2000, to avoid silently matching the tactile sensing glove (shared VID0x0483). Pre-production firmware with other PIDs must passusb_pid=explicitly. - Changed Hand USB transport failures to raise
ConnectionError(wasRuntimeError), matchingTactileGlove. The samewujihandcpp::device::ConnectionError(PythonConnectionError) is now also raised when the device disconnects mid-runtime — covering blocking SDO calls, in-flight async reads, and raw SDO operations. Pending async callbacks are explicitly woken so callers don't hang. Seeexample/joint/6.disconnect.pyfor the recommended catch pattern. - Changed
TactileGlove()withoutserial_numberto raiseConnectionErrorlisting found serials when multiple tactile sensing gloves are on the bus, instead of silently picking the first. - Updated CMake integration for C++ consumers to use
find_package(wujihandcpp CONFIG REQUIRED)+wujihandcpp::wujihandcpp. - Reorganized examples into
example/joint/,example/tactile/basic.py, andexample/joint_with_tactile.py.
Bug Fixes
- Fixed Linux release build (
Dockerfile.package-builder/ cibuildwheel) failing to linkwujihandcpp_testswithundefined reference to wujihandcpp::tactile::FrameDemuxer::*. Root cause wasFrameDemuxer's symbols being stripped fromlibwujihandcpp.soby-fvisibility=hidden(it's asrc/-private class with novisibility("default")annotation). The test target now compilessrc/device/frame_demuxer.cppdirectly into the executable on Linux + shared-library builds, leaving the library's public ABI unchanged.
Caution
- Removed: Removed the
@controlacquire/release protocol from the Zenoh Bridge (Python + C++); SET / PUT writes no longer require a handshake.
Full Changelog: v1.6.0...v1.7.0