|
wuji_hand2_driver package from wuji_ros2 repowuji_bringup wuji_glove_driver wuji_hand2_driver wuji_msgs wuji_sdk_vendor wuji_tools |
ROS Distro
|
Package Summary
| Version | 2026.10.26 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/wuji-technology/wuji-ros2.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-24 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Wuji Technology
Authors
wuji_hand2_driver
wuji_hand2_driver connects one Wuji Hand 2 to ROS2. It publishes state and sensor streams, accepts joint commands, and exposes device controls.
Run the Node
Select a device by serial number:
ros2 run wuji_hand2_driver wuji_hand2_node \
--ros-args -p serial_number:=<serial-number>
You can also select a device with endpoint or hand_side. If no selector is set, the node connects only when discovery finds one unique Wuji Hand 2. It exits when discovery finds multiple candidates.
All topic and service names are relative. Use a ROS namespace to run more than one driver.
Parameters
The node reads parameters only during startup.
| Parameter | Type | Default | Description |
|---|---|---|---|
endpoint |
string | "" |
Wuji SDK address used for direct connection |
serial_number |
string | "" |
Selects a device by serial number |
hand_side |
string | "" |
Selects a left or right device. Empty doesn’t filter by side |
connect_timeout |
double | 10.0 |
Overall selection and connection timeout in seconds. Set to 0.0 to wait without a deadline |
auto_enable |
bool | false |
Enables all joints after startup |
publish_joint_diagnostics |
bool | true |
Starts the joint diagnostic stream |
publish_imu |
bool | true |
Starts the IMU stream |
publish_fingertip_tactile |
bool | false |
Starts the fingertip streams for fingers whose tactile module is online. Set it to true on a hand with fingertip tactile modules |
When both serial_number and hand_side are set, the serial number selects the device and the side validates it. When endpoint is set with another selector, the node connects to the endpoint and validates the supplied identity.
Topics
| Topic | Type | Direction | QoS | Rate |
|---|---|---|---|---|
joint_states |
sensor_msgs/msg/JointState |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
joint_commands |
sensor_msgs/msg/JointState |
Subscribed | Keep last 1, best effort, volatile | The Wuji SDK accepts up to 1 kHz |
joint_diagnostics |
wuji_msgs/msg/JointDiagnosticsArray |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
imu |
sensor_msgs/msg/Imu |
Published | Keep last 5, best effort, volatile | About 100 Hz in the Wuji SDK contract |
fingertip_tactile/thumb |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/index |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/middle |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/ring |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/pinky |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
The fingertip point_forces use N. total_force also uses N, and temperature uses degrees Celsius. IMU angular velocity uses rad/s, and linear acceleration uses m/s². The driver publishes the SDK frame ID and converts the SDK Unix timestamp in microseconds to the ROS timestamp.
Wuji Hand 2 currently doesn’t provide an orientation estimate. The driver sets orientation_covariance[0] to -1 to mark orientation unavailable.
JointState.position uses rad, velocity uses rad/s, and effort uses A as the current SDK contract. The effort field is a current-like torque proxy, not measured N·m.
Published joint_states entries follow the valid entries in each SDK frame. The driver keeps name, position, velocity, and effort aligned, but it doesn’t promise dense-index ordering for state messages.
The joint_diagnostics topic directly publishes per-joint hardware data from the Wuji SDK, including status, error, electrical, temperature, and communication fields. It isn’t a ROS standard health interface. The driver doesn’t publish /diagnostics.
Joint Diagnostics Fields
| Field | Unit | Semantics |
|---|---|---|
nid |
None | SDK node identifier. The wrapper copies it without conversion |
name |
None | Formal URDF joint name mapped from nid and the selected hand side |
status_word |
None | Raw SDK uint32 status word. The wrapper doesn’t decode or alter it |
current |
A | Phase current reported by the SDK. The wrapper passes it through without ROS-side conversion |
bus_voltage |
V | Bus voltage reported by the SDK. The wrapper passes it through without ROS-side conversion |
mcu_temperature |
°C | Joint controller temperature reported by the SDK. The wrapper passes it through without ROS-side conversion |
error_code |
None | Raw SDK uint16 error value. The wrapper passes it through without ROS-side decoding or reinterpretation |
comm_response_rate_pct |
% | Per-joint RS485 bus response rate over the last second, range 0–100 percent. The wrapper passes it through without ROS-side conversion |
comm_timeout_total |
Count | Cumulative per-joint RS485 bus timeout count from the SDK communication snapshot. The wrapper passes it through without ROS-side conversion |
JointDiagnosticsArray.header contains the converted SDK timestamp and frame ID. The array contains only valid, online joint entries from the SDK frame.
Joint Commands
Named commands are the recommended input form. Set name to formal left-side or right-side URDF joint names. Set position to the same length. Named commands can target a subset of joints and can use any order.
Leave name empty only for a full 20-joint command. In this form, position must have exactly 20 entries in the dense order below. This ordering is a driver contract because ROS doesn’t define an anonymous JointState order.
For either form, velocity and effort can be empty. The driver fills an empty field with zero. A nonempty field must match the command joint count. Unknown names, duplicate names, opposite-side names, invalid lengths, NaN, infinity, and values outside the SDK float range reject the complete command. The driver doesn’t send a partial update.
| Dense Index | nid | Name Body |
|---|---|---|
| 0 | 1 | thumb_cmc_flex |
| 1 | 2 | thumb_cmc_abd |
| 2 | 3 | thumb_mcp |
| 3 | 4 | thumb_ip |
| 4 | 6 | index_finger_mcp_flex |
| 5 | 7 | index_finger_mcp_abd |
| 6 | 8 | index_finger_pip |
| 7 | 9 | index_finger_dip |
| 8 | 11 | middle_finger_mcp_flex |
| 9 | 12 | middle_finger_mcp_abd |
| 10 | 13 | middle_finger_pip |
| 11 | 14 | middle_finger_dip |
| 12 | 16 | ring_finger_mcp_flex |
| 13 | 17 | ring_finger_mcp_abd |
| 14 | 18 | ring_finger_pip |
| 15 | 19 | ring_finger_dip |
| 16 | 21 | pinky_mcp_flex |
| 17 | 22 | pinky_mcp_abd |
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ament_cmake_gtest | |
| ament_cmake_pytest | |
| ament_lint_auto | |
| ament_lint_common | |
| rclcpp | |
| sensor_msgs | |
| std_msgs | |
| std_srvs | |
| wuji_sdk_vendor | |
| wuji_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| wuji_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged wuji_hand2_driver at Robotics Stack Exchange
|
wuji_hand2_driver package from wuji_ros2 repowuji_bringup wuji_glove_driver wuji_hand2_driver wuji_msgs wuji_sdk_vendor wuji_tools |
ROS Distro
|
Package Summary
| Version | 2026.10.26 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/wuji-technology/wuji-ros2.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-24 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Wuji Technology
Authors
wuji_hand2_driver
wuji_hand2_driver connects one Wuji Hand 2 to ROS2. It publishes state and sensor streams, accepts joint commands, and exposes device controls.
Run the Node
Select a device by serial number:
ros2 run wuji_hand2_driver wuji_hand2_node \
--ros-args -p serial_number:=<serial-number>
You can also select a device with endpoint or hand_side. If no selector is set, the node connects only when discovery finds one unique Wuji Hand 2. It exits when discovery finds multiple candidates.
All topic and service names are relative. Use a ROS namespace to run more than one driver.
Parameters
The node reads parameters only during startup.
| Parameter | Type | Default | Description |
|---|---|---|---|
endpoint |
string | "" |
Wuji SDK address used for direct connection |
serial_number |
string | "" |
Selects a device by serial number |
hand_side |
string | "" |
Selects a left or right device. Empty doesn’t filter by side |
connect_timeout |
double | 10.0 |
Overall selection and connection timeout in seconds. Set to 0.0 to wait without a deadline |
auto_enable |
bool | false |
Enables all joints after startup |
publish_joint_diagnostics |
bool | true |
Starts the joint diagnostic stream |
publish_imu |
bool | true |
Starts the IMU stream |
publish_fingertip_tactile |
bool | false |
Starts the fingertip streams for fingers whose tactile module is online. Set it to true on a hand with fingertip tactile modules |
When both serial_number and hand_side are set, the serial number selects the device and the side validates it. When endpoint is set with another selector, the node connects to the endpoint and validates the supplied identity.
Topics
| Topic | Type | Direction | QoS | Rate |
|---|---|---|---|---|
joint_states |
sensor_msgs/msg/JointState |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
joint_commands |
sensor_msgs/msg/JointState |
Subscribed | Keep last 1, best effort, volatile | The Wuji SDK accepts up to 1 kHz |
joint_diagnostics |
wuji_msgs/msg/JointDiagnosticsArray |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
imu |
sensor_msgs/msg/Imu |
Published | Keep last 5, best effort, volatile | About 100 Hz in the Wuji SDK contract |
fingertip_tactile/thumb |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/index |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/middle |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/ring |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/pinky |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
The fingertip point_forces use N. total_force also uses N, and temperature uses degrees Celsius. IMU angular velocity uses rad/s, and linear acceleration uses m/s². The driver publishes the SDK frame ID and converts the SDK Unix timestamp in microseconds to the ROS timestamp.
Wuji Hand 2 currently doesn’t provide an orientation estimate. The driver sets orientation_covariance[0] to -1 to mark orientation unavailable.
JointState.position uses rad, velocity uses rad/s, and effort uses A as the current SDK contract. The effort field is a current-like torque proxy, not measured N·m.
Published joint_states entries follow the valid entries in each SDK frame. The driver keeps name, position, velocity, and effort aligned, but it doesn’t promise dense-index ordering for state messages.
The joint_diagnostics topic directly publishes per-joint hardware data from the Wuji SDK, including status, error, electrical, temperature, and communication fields. It isn’t a ROS standard health interface. The driver doesn’t publish /diagnostics.
Joint Diagnostics Fields
| Field | Unit | Semantics |
|---|---|---|
nid |
None | SDK node identifier. The wrapper copies it without conversion |
name |
None | Formal URDF joint name mapped from nid and the selected hand side |
status_word |
None | Raw SDK uint32 status word. The wrapper doesn’t decode or alter it |
current |
A | Phase current reported by the SDK. The wrapper passes it through without ROS-side conversion |
bus_voltage |
V | Bus voltage reported by the SDK. The wrapper passes it through without ROS-side conversion |
mcu_temperature |
°C | Joint controller temperature reported by the SDK. The wrapper passes it through without ROS-side conversion |
error_code |
None | Raw SDK uint16 error value. The wrapper passes it through without ROS-side decoding or reinterpretation |
comm_response_rate_pct |
% | Per-joint RS485 bus response rate over the last second, range 0–100 percent. The wrapper passes it through without ROS-side conversion |
comm_timeout_total |
Count | Cumulative per-joint RS485 bus timeout count from the SDK communication snapshot. The wrapper passes it through without ROS-side conversion |
JointDiagnosticsArray.header contains the converted SDK timestamp and frame ID. The array contains only valid, online joint entries from the SDK frame.
Joint Commands
Named commands are the recommended input form. Set name to formal left-side or right-side URDF joint names. Set position to the same length. Named commands can target a subset of joints and can use any order.
Leave name empty only for a full 20-joint command. In this form, position must have exactly 20 entries in the dense order below. This ordering is a driver contract because ROS doesn’t define an anonymous JointState order.
For either form, velocity and effort can be empty. The driver fills an empty field with zero. A nonempty field must match the command joint count. Unknown names, duplicate names, opposite-side names, invalid lengths, NaN, infinity, and values outside the SDK float range reject the complete command. The driver doesn’t send a partial update.
| Dense Index | nid | Name Body |
|---|---|---|
| 0 | 1 | thumb_cmc_flex |
| 1 | 2 | thumb_cmc_abd |
| 2 | 3 | thumb_mcp |
| 3 | 4 | thumb_ip |
| 4 | 6 | index_finger_mcp_flex |
| 5 | 7 | index_finger_mcp_abd |
| 6 | 8 | index_finger_pip |
| 7 | 9 | index_finger_dip |
| 8 | 11 | middle_finger_mcp_flex |
| 9 | 12 | middle_finger_mcp_abd |
| 10 | 13 | middle_finger_pip |
| 11 | 14 | middle_finger_dip |
| 12 | 16 | ring_finger_mcp_flex |
| 13 | 17 | ring_finger_mcp_abd |
| 14 | 18 | ring_finger_pip |
| 15 | 19 | ring_finger_dip |
| 16 | 21 | pinky_mcp_flex |
| 17 | 22 | pinky_mcp_abd |
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ament_cmake_gtest | |
| ament_cmake_pytest | |
| ament_lint_auto | |
| ament_lint_common | |
| rclcpp | |
| sensor_msgs | |
| std_msgs | |
| std_srvs | |
| wuji_sdk_vendor | |
| wuji_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| wuji_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged wuji_hand2_driver at Robotics Stack Exchange
|
wuji_hand2_driver package from wuji_ros2 repowuji_bringup wuji_glove_driver wuji_hand2_driver wuji_msgs wuji_sdk_vendor wuji_tools |
ROS Distro
|
Package Summary
| Version | 2026.10.26 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/wuji-technology/wuji-ros2.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-24 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Wuji Technology
Authors
wuji_hand2_driver
wuji_hand2_driver connects one Wuji Hand 2 to ROS2. It publishes state and sensor streams, accepts joint commands, and exposes device controls.
Run the Node
Select a device by serial number:
ros2 run wuji_hand2_driver wuji_hand2_node \
--ros-args -p serial_number:=<serial-number>
You can also select a device with endpoint or hand_side. If no selector is set, the node connects only when discovery finds one unique Wuji Hand 2. It exits when discovery finds multiple candidates.
All topic and service names are relative. Use a ROS namespace to run more than one driver.
Parameters
The node reads parameters only during startup.
| Parameter | Type | Default | Description |
|---|---|---|---|
endpoint |
string | "" |
Wuji SDK address used for direct connection |
serial_number |
string | "" |
Selects a device by serial number |
hand_side |
string | "" |
Selects a left or right device. Empty doesn’t filter by side |
connect_timeout |
double | 10.0 |
Overall selection and connection timeout in seconds. Set to 0.0 to wait without a deadline |
auto_enable |
bool | false |
Enables all joints after startup |
publish_joint_diagnostics |
bool | true |
Starts the joint diagnostic stream |
publish_imu |
bool | true |
Starts the IMU stream |
publish_fingertip_tactile |
bool | false |
Starts the fingertip streams for fingers whose tactile module is online. Set it to true on a hand with fingertip tactile modules |
When both serial_number and hand_side are set, the serial number selects the device and the side validates it. When endpoint is set with another selector, the node connects to the endpoint and validates the supplied identity.
Topics
| Topic | Type | Direction | QoS | Rate |
|---|---|---|---|---|
joint_states |
sensor_msgs/msg/JointState |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
joint_commands |
sensor_msgs/msg/JointState |
Subscribed | Keep last 1, best effort, volatile | The Wuji SDK accepts up to 1 kHz |
joint_diagnostics |
wuji_msgs/msg/JointDiagnosticsArray |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
imu |
sensor_msgs/msg/Imu |
Published | Keep last 5, best effort, volatile | About 100 Hz in the Wuji SDK contract |
fingertip_tactile/thumb |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/index |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/middle |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/ring |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/pinky |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
The fingertip point_forces use N. total_force also uses N, and temperature uses degrees Celsius. IMU angular velocity uses rad/s, and linear acceleration uses m/s². The driver publishes the SDK frame ID and converts the SDK Unix timestamp in microseconds to the ROS timestamp.
Wuji Hand 2 currently doesn’t provide an orientation estimate. The driver sets orientation_covariance[0] to -1 to mark orientation unavailable.
JointState.position uses rad, velocity uses rad/s, and effort uses A as the current SDK contract. The effort field is a current-like torque proxy, not measured N·m.
Published joint_states entries follow the valid entries in each SDK frame. The driver keeps name, position, velocity, and effort aligned, but it doesn’t promise dense-index ordering for state messages.
The joint_diagnostics topic directly publishes per-joint hardware data from the Wuji SDK, including status, error, electrical, temperature, and communication fields. It isn’t a ROS standard health interface. The driver doesn’t publish /diagnostics.
Joint Diagnostics Fields
| Field | Unit | Semantics |
|---|---|---|
nid |
None | SDK node identifier. The wrapper copies it without conversion |
name |
None | Formal URDF joint name mapped from nid and the selected hand side |
status_word |
None | Raw SDK uint32 status word. The wrapper doesn’t decode or alter it |
current |
A | Phase current reported by the SDK. The wrapper passes it through without ROS-side conversion |
bus_voltage |
V | Bus voltage reported by the SDK. The wrapper passes it through without ROS-side conversion |
mcu_temperature |
°C | Joint controller temperature reported by the SDK. The wrapper passes it through without ROS-side conversion |
error_code |
None | Raw SDK uint16 error value. The wrapper passes it through without ROS-side decoding or reinterpretation |
comm_response_rate_pct |
% | Per-joint RS485 bus response rate over the last second, range 0–100 percent. The wrapper passes it through without ROS-side conversion |
comm_timeout_total |
Count | Cumulative per-joint RS485 bus timeout count from the SDK communication snapshot. The wrapper passes it through without ROS-side conversion |
JointDiagnosticsArray.header contains the converted SDK timestamp and frame ID. The array contains only valid, online joint entries from the SDK frame.
Joint Commands
Named commands are the recommended input form. Set name to formal left-side or right-side URDF joint names. Set position to the same length. Named commands can target a subset of joints and can use any order.
Leave name empty only for a full 20-joint command. In this form, position must have exactly 20 entries in the dense order below. This ordering is a driver contract because ROS doesn’t define an anonymous JointState order.
For either form, velocity and effort can be empty. The driver fills an empty field with zero. A nonempty field must match the command joint count. Unknown names, duplicate names, opposite-side names, invalid lengths, NaN, infinity, and values outside the SDK float range reject the complete command. The driver doesn’t send a partial update.
| Dense Index | nid | Name Body |
|---|---|---|
| 0 | 1 | thumb_cmc_flex |
| 1 | 2 | thumb_cmc_abd |
| 2 | 3 | thumb_mcp |
| 3 | 4 | thumb_ip |
| 4 | 6 | index_finger_mcp_flex |
| 5 | 7 | index_finger_mcp_abd |
| 6 | 8 | index_finger_pip |
| 7 | 9 | index_finger_dip |
| 8 | 11 | middle_finger_mcp_flex |
| 9 | 12 | middle_finger_mcp_abd |
| 10 | 13 | middle_finger_pip |
| 11 | 14 | middle_finger_dip |
| 12 | 16 | ring_finger_mcp_flex |
| 13 | 17 | ring_finger_mcp_abd |
| 14 | 18 | ring_finger_pip |
| 15 | 19 | ring_finger_dip |
| 16 | 21 | pinky_mcp_flex |
| 17 | 22 | pinky_mcp_abd |
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ament_cmake_gtest | |
| ament_cmake_pytest | |
| ament_lint_auto | |
| ament_lint_common | |
| rclcpp | |
| sensor_msgs | |
| std_msgs | |
| std_srvs | |
| wuji_sdk_vendor | |
| wuji_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| wuji_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged wuji_hand2_driver at Robotics Stack Exchange
|
wuji_hand2_driver package from wuji_ros2 repowuji_bringup wuji_glove_driver wuji_hand2_driver wuji_msgs wuji_sdk_vendor wuji_tools |
ROS Distro
|
Package Summary
| Version | 2026.10.26 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/wuji-technology/wuji-ros2.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-24 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Wuji Technology
Authors
wuji_hand2_driver
wuji_hand2_driver connects one Wuji Hand 2 to ROS2. It publishes state and sensor streams, accepts joint commands, and exposes device controls.
Run the Node
Select a device by serial number:
ros2 run wuji_hand2_driver wuji_hand2_node \
--ros-args -p serial_number:=<serial-number>
You can also select a device with endpoint or hand_side. If no selector is set, the node connects only when discovery finds one unique Wuji Hand 2. It exits when discovery finds multiple candidates.
All topic and service names are relative. Use a ROS namespace to run more than one driver.
Parameters
The node reads parameters only during startup.
| Parameter | Type | Default | Description |
|---|---|---|---|
endpoint |
string | "" |
Wuji SDK address used for direct connection |
serial_number |
string | "" |
Selects a device by serial number |
hand_side |
string | "" |
Selects a left or right device. Empty doesn’t filter by side |
connect_timeout |
double | 10.0 |
Overall selection and connection timeout in seconds. Set to 0.0 to wait without a deadline |
auto_enable |
bool | false |
Enables all joints after startup |
publish_joint_diagnostics |
bool | true |
Starts the joint diagnostic stream |
publish_imu |
bool | true |
Starts the IMU stream |
publish_fingertip_tactile |
bool | false |
Starts the fingertip streams for fingers whose tactile module is online. Set it to true on a hand with fingertip tactile modules |
When both serial_number and hand_side are set, the serial number selects the device and the side validates it. When endpoint is set with another selector, the node connects to the endpoint and validates the supplied identity.
Topics
| Topic | Type | Direction | QoS | Rate |
|---|---|---|---|---|
joint_states |
sensor_msgs/msg/JointState |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
joint_commands |
sensor_msgs/msg/JointState |
Subscribed | Keep last 1, best effort, volatile | The Wuji SDK accepts up to 1 kHz |
joint_diagnostics |
wuji_msgs/msg/JointDiagnosticsArray |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
imu |
sensor_msgs/msg/Imu |
Published | Keep last 5, best effort, volatile | About 100 Hz in the Wuji SDK contract |
fingertip_tactile/thumb |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/index |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/middle |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/ring |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/pinky |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
The fingertip point_forces use N. total_force also uses N, and temperature uses degrees Celsius. IMU angular velocity uses rad/s, and linear acceleration uses m/s². The driver publishes the SDK frame ID and converts the SDK Unix timestamp in microseconds to the ROS timestamp.
Wuji Hand 2 currently doesn’t provide an orientation estimate. The driver sets orientation_covariance[0] to -1 to mark orientation unavailable.
JointState.position uses rad, velocity uses rad/s, and effort uses A as the current SDK contract. The effort field is a current-like torque proxy, not measured N·m.
Published joint_states entries follow the valid entries in each SDK frame. The driver keeps name, position, velocity, and effort aligned, but it doesn’t promise dense-index ordering for state messages.
The joint_diagnostics topic directly publishes per-joint hardware data from the Wuji SDK, including status, error, electrical, temperature, and communication fields. It isn’t a ROS standard health interface. The driver doesn’t publish /diagnostics.
Joint Diagnostics Fields
| Field | Unit | Semantics |
|---|---|---|
nid |
None | SDK node identifier. The wrapper copies it without conversion |
name |
None | Formal URDF joint name mapped from nid and the selected hand side |
status_word |
None | Raw SDK uint32 status word. The wrapper doesn’t decode or alter it |
current |
A | Phase current reported by the SDK. The wrapper passes it through without ROS-side conversion |
bus_voltage |
V | Bus voltage reported by the SDK. The wrapper passes it through without ROS-side conversion |
mcu_temperature |
°C | Joint controller temperature reported by the SDK. The wrapper passes it through without ROS-side conversion |
error_code |
None | Raw SDK uint16 error value. The wrapper passes it through without ROS-side decoding or reinterpretation |
comm_response_rate_pct |
% | Per-joint RS485 bus response rate over the last second, range 0–100 percent. The wrapper passes it through without ROS-side conversion |
comm_timeout_total |
Count | Cumulative per-joint RS485 bus timeout count from the SDK communication snapshot. The wrapper passes it through without ROS-side conversion |
JointDiagnosticsArray.header contains the converted SDK timestamp and frame ID. The array contains only valid, online joint entries from the SDK frame.
Joint Commands
Named commands are the recommended input form. Set name to formal left-side or right-side URDF joint names. Set position to the same length. Named commands can target a subset of joints and can use any order.
Leave name empty only for a full 20-joint command. In this form, position must have exactly 20 entries in the dense order below. This ordering is a driver contract because ROS doesn’t define an anonymous JointState order.
For either form, velocity and effort can be empty. The driver fills an empty field with zero. A nonempty field must match the command joint count. Unknown names, duplicate names, opposite-side names, invalid lengths, NaN, infinity, and values outside the SDK float range reject the complete command. The driver doesn’t send a partial update.
| Dense Index | nid | Name Body |
|---|---|---|
| 0 | 1 | thumb_cmc_flex |
| 1 | 2 | thumb_cmc_abd |
| 2 | 3 | thumb_mcp |
| 3 | 4 | thumb_ip |
| 4 | 6 | index_finger_mcp_flex |
| 5 | 7 | index_finger_mcp_abd |
| 6 | 8 | index_finger_pip |
| 7 | 9 | index_finger_dip |
| 8 | 11 | middle_finger_mcp_flex |
| 9 | 12 | middle_finger_mcp_abd |
| 10 | 13 | middle_finger_pip |
| 11 | 14 | middle_finger_dip |
| 12 | 16 | ring_finger_mcp_flex |
| 13 | 17 | ring_finger_mcp_abd |
| 14 | 18 | ring_finger_pip |
| 15 | 19 | ring_finger_dip |
| 16 | 21 | pinky_mcp_flex |
| 17 | 22 | pinky_mcp_abd |
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ament_cmake_gtest | |
| ament_cmake_pytest | |
| ament_lint_auto | |
| ament_lint_common | |
| rclcpp | |
| sensor_msgs | |
| std_msgs | |
| std_srvs | |
| wuji_sdk_vendor | |
| wuji_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| wuji_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged wuji_hand2_driver at Robotics Stack Exchange
|
wuji_hand2_driver package from wuji_ros2 repowuji_bringup wuji_glove_driver wuji_hand2_driver wuji_msgs wuji_sdk_vendor wuji_tools |
ROS Distro
|
Package Summary
| Version | 2026.10.26 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/wuji-technology/wuji-ros2.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-24 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Wuji Technology
Authors
wuji_hand2_driver
wuji_hand2_driver connects one Wuji Hand 2 to ROS2. It publishes state and sensor streams, accepts joint commands, and exposes device controls.
Run the Node
Select a device by serial number:
ros2 run wuji_hand2_driver wuji_hand2_node \
--ros-args -p serial_number:=<serial-number>
You can also select a device with endpoint or hand_side. If no selector is set, the node connects only when discovery finds one unique Wuji Hand 2. It exits when discovery finds multiple candidates.
All topic and service names are relative. Use a ROS namespace to run more than one driver.
Parameters
The node reads parameters only during startup.
| Parameter | Type | Default | Description |
|---|---|---|---|
endpoint |
string | "" |
Wuji SDK address used for direct connection |
serial_number |
string | "" |
Selects a device by serial number |
hand_side |
string | "" |
Selects a left or right device. Empty doesn’t filter by side |
connect_timeout |
double | 10.0 |
Overall selection and connection timeout in seconds. Set to 0.0 to wait without a deadline |
auto_enable |
bool | false |
Enables all joints after startup |
publish_joint_diagnostics |
bool | true |
Starts the joint diagnostic stream |
publish_imu |
bool | true |
Starts the IMU stream |
publish_fingertip_tactile |
bool | false |
Starts the fingertip streams for fingers whose tactile module is online. Set it to true on a hand with fingertip tactile modules |
When both serial_number and hand_side are set, the serial number selects the device and the side validates it. When endpoint is set with another selector, the node connects to the endpoint and validates the supplied identity.
Topics
| Topic | Type | Direction | QoS | Rate |
|---|---|---|---|---|
joint_states |
sensor_msgs/msg/JointState |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
joint_commands |
sensor_msgs/msg/JointState |
Subscribed | Keep last 1, best effort, volatile | The Wuji SDK accepts up to 1 kHz |
joint_diagnostics |
wuji_msgs/msg/JointDiagnosticsArray |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
imu |
sensor_msgs/msg/Imu |
Published | Keep last 5, best effort, volatile | About 100 Hz in the Wuji SDK contract |
fingertip_tactile/thumb |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/index |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/middle |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/ring |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/pinky |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
The fingertip point_forces use N. total_force also uses N, and temperature uses degrees Celsius. IMU angular velocity uses rad/s, and linear acceleration uses m/s². The driver publishes the SDK frame ID and converts the SDK Unix timestamp in microseconds to the ROS timestamp.
Wuji Hand 2 currently doesn’t provide an orientation estimate. The driver sets orientation_covariance[0] to -1 to mark orientation unavailable.
JointState.position uses rad, velocity uses rad/s, and effort uses A as the current SDK contract. The effort field is a current-like torque proxy, not measured N·m.
Published joint_states entries follow the valid entries in each SDK frame. The driver keeps name, position, velocity, and effort aligned, but it doesn’t promise dense-index ordering for state messages.
The joint_diagnostics topic directly publishes per-joint hardware data from the Wuji SDK, including status, error, electrical, temperature, and communication fields. It isn’t a ROS standard health interface. The driver doesn’t publish /diagnostics.
Joint Diagnostics Fields
| Field | Unit | Semantics |
|---|---|---|
nid |
None | SDK node identifier. The wrapper copies it without conversion |
name |
None | Formal URDF joint name mapped from nid and the selected hand side |
status_word |
None | Raw SDK uint32 status word. The wrapper doesn’t decode or alter it |
current |
A | Phase current reported by the SDK. The wrapper passes it through without ROS-side conversion |
bus_voltage |
V | Bus voltage reported by the SDK. The wrapper passes it through without ROS-side conversion |
mcu_temperature |
°C | Joint controller temperature reported by the SDK. The wrapper passes it through without ROS-side conversion |
error_code |
None | Raw SDK uint16 error value. The wrapper passes it through without ROS-side decoding or reinterpretation |
comm_response_rate_pct |
% | Per-joint RS485 bus response rate over the last second, range 0–100 percent. The wrapper passes it through without ROS-side conversion |
comm_timeout_total |
Count | Cumulative per-joint RS485 bus timeout count from the SDK communication snapshot. The wrapper passes it through without ROS-side conversion |
JointDiagnosticsArray.header contains the converted SDK timestamp and frame ID. The array contains only valid, online joint entries from the SDK frame.
Joint Commands
Named commands are the recommended input form. Set name to formal left-side or right-side URDF joint names. Set position to the same length. Named commands can target a subset of joints and can use any order.
Leave name empty only for a full 20-joint command. In this form, position must have exactly 20 entries in the dense order below. This ordering is a driver contract because ROS doesn’t define an anonymous JointState order.
For either form, velocity and effort can be empty. The driver fills an empty field with zero. A nonempty field must match the command joint count. Unknown names, duplicate names, opposite-side names, invalid lengths, NaN, infinity, and values outside the SDK float range reject the complete command. The driver doesn’t send a partial update.
| Dense Index | nid | Name Body |
|---|---|---|
| 0 | 1 | thumb_cmc_flex |
| 1 | 2 | thumb_cmc_abd |
| 2 | 3 | thumb_mcp |
| 3 | 4 | thumb_ip |
| 4 | 6 | index_finger_mcp_flex |
| 5 | 7 | index_finger_mcp_abd |
| 6 | 8 | index_finger_pip |
| 7 | 9 | index_finger_dip |
| 8 | 11 | middle_finger_mcp_flex |
| 9 | 12 | middle_finger_mcp_abd |
| 10 | 13 | middle_finger_pip |
| 11 | 14 | middle_finger_dip |
| 12 | 16 | ring_finger_mcp_flex |
| 13 | 17 | ring_finger_mcp_abd |
| 14 | 18 | ring_finger_pip |
| 15 | 19 | ring_finger_dip |
| 16 | 21 | pinky_mcp_flex |
| 17 | 22 | pinky_mcp_abd |
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ament_cmake_gtest | |
| ament_cmake_pytest | |
| ament_lint_auto | |
| ament_lint_common | |
| rclcpp | |
| sensor_msgs | |
| std_msgs | |
| std_srvs | |
| wuji_sdk_vendor | |
| wuji_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| wuji_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged wuji_hand2_driver at Robotics Stack Exchange
|
wuji_hand2_driver package from wuji_ros2 repowuji_bringup wuji_glove_driver wuji_hand2_driver wuji_msgs wuji_sdk_vendor wuji_tools |
ROS Distro
|
Package Summary
| Version | 2026.10.26 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/wuji-technology/wuji-ros2.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-24 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Wuji Technology
Authors
wuji_hand2_driver
wuji_hand2_driver connects one Wuji Hand 2 to ROS2. It publishes state and sensor streams, accepts joint commands, and exposes device controls.
Run the Node
Select a device by serial number:
ros2 run wuji_hand2_driver wuji_hand2_node \
--ros-args -p serial_number:=<serial-number>
You can also select a device with endpoint or hand_side. If no selector is set, the node connects only when discovery finds one unique Wuji Hand 2. It exits when discovery finds multiple candidates.
All topic and service names are relative. Use a ROS namespace to run more than one driver.
Parameters
The node reads parameters only during startup.
| Parameter | Type | Default | Description |
|---|---|---|---|
endpoint |
string | "" |
Wuji SDK address used for direct connection |
serial_number |
string | "" |
Selects a device by serial number |
hand_side |
string | "" |
Selects a left or right device. Empty doesn’t filter by side |
connect_timeout |
double | 10.0 |
Overall selection and connection timeout in seconds. Set to 0.0 to wait without a deadline |
auto_enable |
bool | false |
Enables all joints after startup |
publish_joint_diagnostics |
bool | true |
Starts the joint diagnostic stream |
publish_imu |
bool | true |
Starts the IMU stream |
publish_fingertip_tactile |
bool | false |
Starts the fingertip streams for fingers whose tactile module is online. Set it to true on a hand with fingertip tactile modules |
When both serial_number and hand_side are set, the serial number selects the device and the side validates it. When endpoint is set with another selector, the node connects to the endpoint and validates the supplied identity.
Topics
| Topic | Type | Direction | QoS | Rate |
|---|---|---|---|---|
joint_states |
sensor_msgs/msg/JointState |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
joint_commands |
sensor_msgs/msg/JointState |
Subscribed | Keep last 1, best effort, volatile | The Wuji SDK accepts up to 1 kHz |
joint_diagnostics |
wuji_msgs/msg/JointDiagnosticsArray |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
imu |
sensor_msgs/msg/Imu |
Published | Keep last 5, best effort, volatile | About 100 Hz in the Wuji SDK contract |
fingertip_tactile/thumb |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/index |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/middle |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/ring |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/pinky |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
The fingertip point_forces use N. total_force also uses N, and temperature uses degrees Celsius. IMU angular velocity uses rad/s, and linear acceleration uses m/s². The driver publishes the SDK frame ID and converts the SDK Unix timestamp in microseconds to the ROS timestamp.
Wuji Hand 2 currently doesn’t provide an orientation estimate. The driver sets orientation_covariance[0] to -1 to mark orientation unavailable.
JointState.position uses rad, velocity uses rad/s, and effort uses A as the current SDK contract. The effort field is a current-like torque proxy, not measured N·m.
Published joint_states entries follow the valid entries in each SDK frame. The driver keeps name, position, velocity, and effort aligned, but it doesn’t promise dense-index ordering for state messages.
The joint_diagnostics topic directly publishes per-joint hardware data from the Wuji SDK, including status, error, electrical, temperature, and communication fields. It isn’t a ROS standard health interface. The driver doesn’t publish /diagnostics.
Joint Diagnostics Fields
| Field | Unit | Semantics |
|---|---|---|
nid |
None | SDK node identifier. The wrapper copies it without conversion |
name |
None | Formal URDF joint name mapped from nid and the selected hand side |
status_word |
None | Raw SDK uint32 status word. The wrapper doesn’t decode or alter it |
current |
A | Phase current reported by the SDK. The wrapper passes it through without ROS-side conversion |
bus_voltage |
V | Bus voltage reported by the SDK. The wrapper passes it through without ROS-side conversion |
mcu_temperature |
°C | Joint controller temperature reported by the SDK. The wrapper passes it through without ROS-side conversion |
error_code |
None | Raw SDK uint16 error value. The wrapper passes it through without ROS-side decoding or reinterpretation |
comm_response_rate_pct |
% | Per-joint RS485 bus response rate over the last second, range 0–100 percent. The wrapper passes it through without ROS-side conversion |
comm_timeout_total |
Count | Cumulative per-joint RS485 bus timeout count from the SDK communication snapshot. The wrapper passes it through without ROS-side conversion |
JointDiagnosticsArray.header contains the converted SDK timestamp and frame ID. The array contains only valid, online joint entries from the SDK frame.
Joint Commands
Named commands are the recommended input form. Set name to formal left-side or right-side URDF joint names. Set position to the same length. Named commands can target a subset of joints and can use any order.
Leave name empty only for a full 20-joint command. In this form, position must have exactly 20 entries in the dense order below. This ordering is a driver contract because ROS doesn’t define an anonymous JointState order.
For either form, velocity and effort can be empty. The driver fills an empty field with zero. A nonempty field must match the command joint count. Unknown names, duplicate names, opposite-side names, invalid lengths, NaN, infinity, and values outside the SDK float range reject the complete command. The driver doesn’t send a partial update.
| Dense Index | nid | Name Body |
|---|---|---|
| 0 | 1 | thumb_cmc_flex |
| 1 | 2 | thumb_cmc_abd |
| 2 | 3 | thumb_mcp |
| 3 | 4 | thumb_ip |
| 4 | 6 | index_finger_mcp_flex |
| 5 | 7 | index_finger_mcp_abd |
| 6 | 8 | index_finger_pip |
| 7 | 9 | index_finger_dip |
| 8 | 11 | middle_finger_mcp_flex |
| 9 | 12 | middle_finger_mcp_abd |
| 10 | 13 | middle_finger_pip |
| 11 | 14 | middle_finger_dip |
| 12 | 16 | ring_finger_mcp_flex |
| 13 | 17 | ring_finger_mcp_abd |
| 14 | 18 | ring_finger_pip |
| 15 | 19 | ring_finger_dip |
| 16 | 21 | pinky_mcp_flex |
| 17 | 22 | pinky_mcp_abd |
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ament_cmake_gtest | |
| ament_cmake_pytest | |
| ament_lint_auto | |
| ament_lint_common | |
| rclcpp | |
| sensor_msgs | |
| std_msgs | |
| std_srvs | |
| wuji_sdk_vendor | |
| wuji_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| wuji_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged wuji_hand2_driver at Robotics Stack Exchange
|
wuji_hand2_driver package from wuji_ros2 repowuji_bringup wuji_glove_driver wuji_hand2_driver wuji_msgs wuji_sdk_vendor wuji_tools |
ROS Distro
|
Package Summary
| Version | 2026.10.26 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/wuji-technology/wuji-ros2.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-24 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Wuji Technology
Authors
wuji_hand2_driver
wuji_hand2_driver connects one Wuji Hand 2 to ROS2. It publishes state and sensor streams, accepts joint commands, and exposes device controls.
Run the Node
Select a device by serial number:
ros2 run wuji_hand2_driver wuji_hand2_node \
--ros-args -p serial_number:=<serial-number>
You can also select a device with endpoint or hand_side. If no selector is set, the node connects only when discovery finds one unique Wuji Hand 2. It exits when discovery finds multiple candidates.
All topic and service names are relative. Use a ROS namespace to run more than one driver.
Parameters
The node reads parameters only during startup.
| Parameter | Type | Default | Description |
|---|---|---|---|
endpoint |
string | "" |
Wuji SDK address used for direct connection |
serial_number |
string | "" |
Selects a device by serial number |
hand_side |
string | "" |
Selects a left or right device. Empty doesn’t filter by side |
connect_timeout |
double | 10.0 |
Overall selection and connection timeout in seconds. Set to 0.0 to wait without a deadline |
auto_enable |
bool | false |
Enables all joints after startup |
publish_joint_diagnostics |
bool | true |
Starts the joint diagnostic stream |
publish_imu |
bool | true |
Starts the IMU stream |
publish_fingertip_tactile |
bool | false |
Starts the fingertip streams for fingers whose tactile module is online. Set it to true on a hand with fingertip tactile modules |
When both serial_number and hand_side are set, the serial number selects the device and the side validates it. When endpoint is set with another selector, the node connects to the endpoint and validates the supplied identity.
Topics
| Topic | Type | Direction | QoS | Rate |
|---|---|---|---|---|
joint_states |
sensor_msgs/msg/JointState |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
joint_commands |
sensor_msgs/msg/JointState |
Subscribed | Keep last 1, best effort, volatile | The Wuji SDK accepts up to 1 kHz |
joint_diagnostics |
wuji_msgs/msg/JointDiagnosticsArray |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
imu |
sensor_msgs/msg/Imu |
Published | Keep last 5, best effort, volatile | About 100 Hz in the Wuji SDK contract |
fingertip_tactile/thumb |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/index |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/middle |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/ring |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/pinky |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
The fingertip point_forces use N. total_force also uses N, and temperature uses degrees Celsius. IMU angular velocity uses rad/s, and linear acceleration uses m/s². The driver publishes the SDK frame ID and converts the SDK Unix timestamp in microseconds to the ROS timestamp.
Wuji Hand 2 currently doesn’t provide an orientation estimate. The driver sets orientation_covariance[0] to -1 to mark orientation unavailable.
JointState.position uses rad, velocity uses rad/s, and effort uses A as the current SDK contract. The effort field is a current-like torque proxy, not measured N·m.
Published joint_states entries follow the valid entries in each SDK frame. The driver keeps name, position, velocity, and effort aligned, but it doesn’t promise dense-index ordering for state messages.
The joint_diagnostics topic directly publishes per-joint hardware data from the Wuji SDK, including status, error, electrical, temperature, and communication fields. It isn’t a ROS standard health interface. The driver doesn’t publish /diagnostics.
Joint Diagnostics Fields
| Field | Unit | Semantics |
|---|---|---|
nid |
None | SDK node identifier. The wrapper copies it without conversion |
name |
None | Formal URDF joint name mapped from nid and the selected hand side |
status_word |
None | Raw SDK uint32 status word. The wrapper doesn’t decode or alter it |
current |
A | Phase current reported by the SDK. The wrapper passes it through without ROS-side conversion |
bus_voltage |
V | Bus voltage reported by the SDK. The wrapper passes it through without ROS-side conversion |
mcu_temperature |
°C | Joint controller temperature reported by the SDK. The wrapper passes it through without ROS-side conversion |
error_code |
None | Raw SDK uint16 error value. The wrapper passes it through without ROS-side decoding or reinterpretation |
comm_response_rate_pct |
% | Per-joint RS485 bus response rate over the last second, range 0–100 percent. The wrapper passes it through without ROS-side conversion |
comm_timeout_total |
Count | Cumulative per-joint RS485 bus timeout count from the SDK communication snapshot. The wrapper passes it through without ROS-side conversion |
JointDiagnosticsArray.header contains the converted SDK timestamp and frame ID. The array contains only valid, online joint entries from the SDK frame.
Joint Commands
Named commands are the recommended input form. Set name to formal left-side or right-side URDF joint names. Set position to the same length. Named commands can target a subset of joints and can use any order.
Leave name empty only for a full 20-joint command. In this form, position must have exactly 20 entries in the dense order below. This ordering is a driver contract because ROS doesn’t define an anonymous JointState order.
For either form, velocity and effort can be empty. The driver fills an empty field with zero. A nonempty field must match the command joint count. Unknown names, duplicate names, opposite-side names, invalid lengths, NaN, infinity, and values outside the SDK float range reject the complete command. The driver doesn’t send a partial update.
| Dense Index | nid | Name Body |
|---|---|---|
| 0 | 1 | thumb_cmc_flex |
| 1 | 2 | thumb_cmc_abd |
| 2 | 3 | thumb_mcp |
| 3 | 4 | thumb_ip |
| 4 | 6 | index_finger_mcp_flex |
| 5 | 7 | index_finger_mcp_abd |
| 6 | 8 | index_finger_pip |
| 7 | 9 | index_finger_dip |
| 8 | 11 | middle_finger_mcp_flex |
| 9 | 12 | middle_finger_mcp_abd |
| 10 | 13 | middle_finger_pip |
| 11 | 14 | middle_finger_dip |
| 12 | 16 | ring_finger_mcp_flex |
| 13 | 17 | ring_finger_mcp_abd |
| 14 | 18 | ring_finger_pip |
| 15 | 19 | ring_finger_dip |
| 16 | 21 | pinky_mcp_flex |
| 17 | 22 | pinky_mcp_abd |
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ament_cmake_gtest | |
| ament_cmake_pytest | |
| ament_lint_auto | |
| ament_lint_common | |
| rclcpp | |
| sensor_msgs | |
| std_msgs | |
| std_srvs | |
| wuji_sdk_vendor | |
| wuji_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| wuji_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged wuji_hand2_driver at Robotics Stack Exchange
|
wuji_hand2_driver package from wuji_ros2 repowuji_bringup wuji_glove_driver wuji_hand2_driver wuji_msgs wuji_sdk_vendor wuji_tools |
ROS Distro
|
Package Summary
| Version | 2026.10.26 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/wuji-technology/wuji-ros2.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-24 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Wuji Technology
Authors
wuji_hand2_driver
wuji_hand2_driver connects one Wuji Hand 2 to ROS2. It publishes state and sensor streams, accepts joint commands, and exposes device controls.
Run the Node
Select a device by serial number:
ros2 run wuji_hand2_driver wuji_hand2_node \
--ros-args -p serial_number:=<serial-number>
You can also select a device with endpoint or hand_side. If no selector is set, the node connects only when discovery finds one unique Wuji Hand 2. It exits when discovery finds multiple candidates.
All topic and service names are relative. Use a ROS namespace to run more than one driver.
Parameters
The node reads parameters only during startup.
| Parameter | Type | Default | Description |
|---|---|---|---|
endpoint |
string | "" |
Wuji SDK address used for direct connection |
serial_number |
string | "" |
Selects a device by serial number |
hand_side |
string | "" |
Selects a left or right device. Empty doesn’t filter by side |
connect_timeout |
double | 10.0 |
Overall selection and connection timeout in seconds. Set to 0.0 to wait without a deadline |
auto_enable |
bool | false |
Enables all joints after startup |
publish_joint_diagnostics |
bool | true |
Starts the joint diagnostic stream |
publish_imu |
bool | true |
Starts the IMU stream |
publish_fingertip_tactile |
bool | false |
Starts the fingertip streams for fingers whose tactile module is online. Set it to true on a hand with fingertip tactile modules |
When both serial_number and hand_side are set, the serial number selects the device and the side validates it. When endpoint is set with another selector, the node connects to the endpoint and validates the supplied identity.
Topics
| Topic | Type | Direction | QoS | Rate |
|---|---|---|---|---|
joint_states |
sensor_msgs/msg/JointState |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
joint_commands |
sensor_msgs/msg/JointState |
Subscribed | Keep last 1, best effort, volatile | The Wuji SDK accepts up to 1 kHz |
joint_diagnostics |
wuji_msgs/msg/JointDiagnosticsArray |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
imu |
sensor_msgs/msg/Imu |
Published | Keep last 5, best effort, volatile | About 100 Hz in the Wuji SDK contract |
fingertip_tactile/thumb |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/index |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/middle |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/ring |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/pinky |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
The fingertip point_forces use N. total_force also uses N, and temperature uses degrees Celsius. IMU angular velocity uses rad/s, and linear acceleration uses m/s². The driver publishes the SDK frame ID and converts the SDK Unix timestamp in microseconds to the ROS timestamp.
Wuji Hand 2 currently doesn’t provide an orientation estimate. The driver sets orientation_covariance[0] to -1 to mark orientation unavailable.
JointState.position uses rad, velocity uses rad/s, and effort uses A as the current SDK contract. The effort field is a current-like torque proxy, not measured N·m.
Published joint_states entries follow the valid entries in each SDK frame. The driver keeps name, position, velocity, and effort aligned, but it doesn’t promise dense-index ordering for state messages.
The joint_diagnostics topic directly publishes per-joint hardware data from the Wuji SDK, including status, error, electrical, temperature, and communication fields. It isn’t a ROS standard health interface. The driver doesn’t publish /diagnostics.
Joint Diagnostics Fields
| Field | Unit | Semantics |
|---|---|---|
nid |
None | SDK node identifier. The wrapper copies it without conversion |
name |
None | Formal URDF joint name mapped from nid and the selected hand side |
status_word |
None | Raw SDK uint32 status word. The wrapper doesn’t decode or alter it |
current |
A | Phase current reported by the SDK. The wrapper passes it through without ROS-side conversion |
bus_voltage |
V | Bus voltage reported by the SDK. The wrapper passes it through without ROS-side conversion |
mcu_temperature |
°C | Joint controller temperature reported by the SDK. The wrapper passes it through without ROS-side conversion |
error_code |
None | Raw SDK uint16 error value. The wrapper passes it through without ROS-side decoding or reinterpretation |
comm_response_rate_pct |
% | Per-joint RS485 bus response rate over the last second, range 0–100 percent. The wrapper passes it through without ROS-side conversion |
comm_timeout_total |
Count | Cumulative per-joint RS485 bus timeout count from the SDK communication snapshot. The wrapper passes it through without ROS-side conversion |
JointDiagnosticsArray.header contains the converted SDK timestamp and frame ID. The array contains only valid, online joint entries from the SDK frame.
Joint Commands
Named commands are the recommended input form. Set name to formal left-side or right-side URDF joint names. Set position to the same length. Named commands can target a subset of joints and can use any order.
Leave name empty only for a full 20-joint command. In this form, position must have exactly 20 entries in the dense order below. This ordering is a driver contract because ROS doesn’t define an anonymous JointState order.
For either form, velocity and effort can be empty. The driver fills an empty field with zero. A nonempty field must match the command joint count. Unknown names, duplicate names, opposite-side names, invalid lengths, NaN, infinity, and values outside the SDK float range reject the complete command. The driver doesn’t send a partial update.
| Dense Index | nid | Name Body |
|---|---|---|
| 0 | 1 | thumb_cmc_flex |
| 1 | 2 | thumb_cmc_abd |
| 2 | 3 | thumb_mcp |
| 3 | 4 | thumb_ip |
| 4 | 6 | index_finger_mcp_flex |
| 5 | 7 | index_finger_mcp_abd |
| 6 | 8 | index_finger_pip |
| 7 | 9 | index_finger_dip |
| 8 | 11 | middle_finger_mcp_flex |
| 9 | 12 | middle_finger_mcp_abd |
| 10 | 13 | middle_finger_pip |
| 11 | 14 | middle_finger_dip |
| 12 | 16 | ring_finger_mcp_flex |
| 13 | 17 | ring_finger_mcp_abd |
| 14 | 18 | ring_finger_pip |
| 15 | 19 | ring_finger_dip |
| 16 | 21 | pinky_mcp_flex |
| 17 | 22 | pinky_mcp_abd |
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ament_cmake_gtest | |
| ament_cmake_pytest | |
| ament_lint_auto | |
| ament_lint_common | |
| rclcpp | |
| sensor_msgs | |
| std_msgs | |
| std_srvs | |
| wuji_sdk_vendor | |
| wuji_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| wuji_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged wuji_hand2_driver at Robotics Stack Exchange
|
wuji_hand2_driver package from wuji_ros2 repowuji_bringup wuji_glove_driver wuji_hand2_driver wuji_msgs wuji_sdk_vendor wuji_tools |
ROS Distro
|
Package Summary
| Version | 2026.10.26 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/wuji-technology/wuji-ros2.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-24 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Wuji Technology
Authors
wuji_hand2_driver
wuji_hand2_driver connects one Wuji Hand 2 to ROS2. It publishes state and sensor streams, accepts joint commands, and exposes device controls.
Run the Node
Select a device by serial number:
ros2 run wuji_hand2_driver wuji_hand2_node \
--ros-args -p serial_number:=<serial-number>
You can also select a device with endpoint or hand_side. If no selector is set, the node connects only when discovery finds one unique Wuji Hand 2. It exits when discovery finds multiple candidates.
All topic and service names are relative. Use a ROS namespace to run more than one driver.
Parameters
The node reads parameters only during startup.
| Parameter | Type | Default | Description |
|---|---|---|---|
endpoint |
string | "" |
Wuji SDK address used for direct connection |
serial_number |
string | "" |
Selects a device by serial number |
hand_side |
string | "" |
Selects a left or right device. Empty doesn’t filter by side |
connect_timeout |
double | 10.0 |
Overall selection and connection timeout in seconds. Set to 0.0 to wait without a deadline |
auto_enable |
bool | false |
Enables all joints after startup |
publish_joint_diagnostics |
bool | true |
Starts the joint diagnostic stream |
publish_imu |
bool | true |
Starts the IMU stream |
publish_fingertip_tactile |
bool | false |
Starts the fingertip streams for fingers whose tactile module is online. Set it to true on a hand with fingertip tactile modules |
When both serial_number and hand_side are set, the serial number selects the device and the side validates it. When endpoint is set with another selector, the node connects to the endpoint and validates the supplied identity.
Topics
| Topic | Type | Direction | QoS | Rate |
|---|---|---|---|---|
joint_states |
sensor_msgs/msg/JointState |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
joint_commands |
sensor_msgs/msg/JointState |
Subscribed | Keep last 1, best effort, volatile | The Wuji SDK accepts up to 1 kHz |
joint_diagnostics |
wuji_msgs/msg/JointDiagnosticsArray |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
imu |
sensor_msgs/msg/Imu |
Published | Keep last 5, best effort, volatile | About 100 Hz in the Wuji SDK contract |
fingertip_tactile/thumb |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/index |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/middle |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/ring |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/pinky |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
The fingertip point_forces use N. total_force also uses N, and temperature uses degrees Celsius. IMU angular velocity uses rad/s, and linear acceleration uses m/s². The driver publishes the SDK frame ID and converts the SDK Unix timestamp in microseconds to the ROS timestamp.
Wuji Hand 2 currently doesn’t provide an orientation estimate. The driver sets orientation_covariance[0] to -1 to mark orientation unavailable.
JointState.position uses rad, velocity uses rad/s, and effort uses A as the current SDK contract. The effort field is a current-like torque proxy, not measured N·m.
Published joint_states entries follow the valid entries in each SDK frame. The driver keeps name, position, velocity, and effort aligned, but it doesn’t promise dense-index ordering for state messages.
The joint_diagnostics topic directly publishes per-joint hardware data from the Wuji SDK, including status, error, electrical, temperature, and communication fields. It isn’t a ROS standard health interface. The driver doesn’t publish /diagnostics.
Joint Diagnostics Fields
| Field | Unit | Semantics |
|---|---|---|
nid |
None | SDK node identifier. The wrapper copies it without conversion |
name |
None | Formal URDF joint name mapped from nid and the selected hand side |
status_word |
None | Raw SDK uint32 status word. The wrapper doesn’t decode or alter it |
current |
A | Phase current reported by the SDK. The wrapper passes it through without ROS-side conversion |
bus_voltage |
V | Bus voltage reported by the SDK. The wrapper passes it through without ROS-side conversion |
mcu_temperature |
°C | Joint controller temperature reported by the SDK. The wrapper passes it through without ROS-side conversion |
error_code |
None | Raw SDK uint16 error value. The wrapper passes it through without ROS-side decoding or reinterpretation |
comm_response_rate_pct |
% | Per-joint RS485 bus response rate over the last second, range 0–100 percent. The wrapper passes it through without ROS-side conversion |
comm_timeout_total |
Count | Cumulative per-joint RS485 bus timeout count from the SDK communication snapshot. The wrapper passes it through without ROS-side conversion |
JointDiagnosticsArray.header contains the converted SDK timestamp and frame ID. The array contains only valid, online joint entries from the SDK frame.
Joint Commands
Named commands are the recommended input form. Set name to formal left-side or right-side URDF joint names. Set position to the same length. Named commands can target a subset of joints and can use any order.
Leave name empty only for a full 20-joint command. In this form, position must have exactly 20 entries in the dense order below. This ordering is a driver contract because ROS doesn’t define an anonymous JointState order.
For either form, velocity and effort can be empty. The driver fills an empty field with zero. A nonempty field must match the command joint count. Unknown names, duplicate names, opposite-side names, invalid lengths, NaN, infinity, and values outside the SDK float range reject the complete command. The driver doesn’t send a partial update.
| Dense Index | nid | Name Body |
|---|---|---|
| 0 | 1 | thumb_cmc_flex |
| 1 | 2 | thumb_cmc_abd |
| 2 | 3 | thumb_mcp |
| 3 | 4 | thumb_ip |
| 4 | 6 | index_finger_mcp_flex |
| 5 | 7 | index_finger_mcp_abd |
| 6 | 8 | index_finger_pip |
| 7 | 9 | index_finger_dip |
| 8 | 11 | middle_finger_mcp_flex |
| 9 | 12 | middle_finger_mcp_abd |
| 10 | 13 | middle_finger_pip |
| 11 | 14 | middle_finger_dip |
| 12 | 16 | ring_finger_mcp_flex |
| 13 | 17 | ring_finger_mcp_abd |
| 14 | 18 | ring_finger_pip |
| 15 | 19 | ring_finger_dip |
| 16 | 21 | pinky_mcp_flex |
| 17 | 22 | pinky_mcp_abd |
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ament_cmake_gtest | |
| ament_cmake_pytest | |
| ament_lint_auto | |
| ament_lint_common | |
| rclcpp | |
| sensor_msgs | |
| std_msgs | |
| std_srvs | |
| wuji_sdk_vendor | |
| wuji_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| wuji_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged wuji_hand2_driver at Robotics Stack Exchange
|
wuji_hand2_driver package from wuji_ros2 repowuji_bringup wuji_glove_driver wuji_hand2_driver wuji_msgs wuji_sdk_vendor wuji_tools |
ROS Distro
|
Package Summary
| Version | 2026.10.26 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/wuji-technology/wuji-ros2.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-24 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Wuji Technology
Authors
wuji_hand2_driver
wuji_hand2_driver connects one Wuji Hand 2 to ROS2. It publishes state and sensor streams, accepts joint commands, and exposes device controls.
Run the Node
Select a device by serial number:
ros2 run wuji_hand2_driver wuji_hand2_node \
--ros-args -p serial_number:=<serial-number>
You can also select a device with endpoint or hand_side. If no selector is set, the node connects only when discovery finds one unique Wuji Hand 2. It exits when discovery finds multiple candidates.
All topic and service names are relative. Use a ROS namespace to run more than one driver.
Parameters
The node reads parameters only during startup.
| Parameter | Type | Default | Description |
|---|---|---|---|
endpoint |
string | "" |
Wuji SDK address used for direct connection |
serial_number |
string | "" |
Selects a device by serial number |
hand_side |
string | "" |
Selects a left or right device. Empty doesn’t filter by side |
connect_timeout |
double | 10.0 |
Overall selection and connection timeout in seconds. Set to 0.0 to wait without a deadline |
auto_enable |
bool | false |
Enables all joints after startup |
publish_joint_diagnostics |
bool | true |
Starts the joint diagnostic stream |
publish_imu |
bool | true |
Starts the IMU stream |
publish_fingertip_tactile |
bool | false |
Starts the fingertip streams for fingers whose tactile module is online. Set it to true on a hand with fingertip tactile modules |
When both serial_number and hand_side are set, the serial number selects the device and the side validates it. When endpoint is set with another selector, the node connects to the endpoint and validates the supplied identity.
Topics
| Topic | Type | Direction | QoS | Rate |
|---|---|---|---|---|
joint_states |
sensor_msgs/msg/JointState |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
joint_commands |
sensor_msgs/msg/JointState |
Subscribed | Keep last 1, best effort, volatile | The Wuji SDK accepts up to 1 kHz |
joint_diagnostics |
wuji_msgs/msg/JointDiagnosticsArray |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
imu |
sensor_msgs/msg/Imu |
Published | Keep last 5, best effort, volatile | About 100 Hz in the Wuji SDK contract |
fingertip_tactile/thumb |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/index |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/middle |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/ring |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
fingertip_tactile/pinky |
wuji_msgs/msg/FingertipTactile |
Published | Keep last 5, best effort, volatile | Device-dependent, and the Wuji SDK doesn’t specify a rate |
The fingertip point_forces use N. total_force also uses N, and temperature uses degrees Celsius. IMU angular velocity uses rad/s, and linear acceleration uses m/s². The driver publishes the SDK frame ID and converts the SDK Unix timestamp in microseconds to the ROS timestamp.
Wuji Hand 2 currently doesn’t provide an orientation estimate. The driver sets orientation_covariance[0] to -1 to mark orientation unavailable.
JointState.position uses rad, velocity uses rad/s, and effort uses A as the current SDK contract. The effort field is a current-like torque proxy, not measured N·m.
Published joint_states entries follow the valid entries in each SDK frame. The driver keeps name, position, velocity, and effort aligned, but it doesn’t promise dense-index ordering for state messages.
The joint_diagnostics topic directly publishes per-joint hardware data from the Wuji SDK, including status, error, electrical, temperature, and communication fields. It isn’t a ROS standard health interface. The driver doesn’t publish /diagnostics.
Joint Diagnostics Fields
| Field | Unit | Semantics |
|---|---|---|
nid |
None | SDK node identifier. The wrapper copies it without conversion |
name |
None | Formal URDF joint name mapped from nid and the selected hand side |
status_word |
None | Raw SDK uint32 status word. The wrapper doesn’t decode or alter it |
current |
A | Phase current reported by the SDK. The wrapper passes it through without ROS-side conversion |
bus_voltage |
V | Bus voltage reported by the SDK. The wrapper passes it through without ROS-side conversion |
mcu_temperature |
°C | Joint controller temperature reported by the SDK. The wrapper passes it through without ROS-side conversion |
error_code |
None | Raw SDK uint16 error value. The wrapper passes it through without ROS-side decoding or reinterpretation |
comm_response_rate_pct |
% | Per-joint RS485 bus response rate over the last second, range 0–100 percent. The wrapper passes it through without ROS-side conversion |
comm_timeout_total |
Count | Cumulative per-joint RS485 bus timeout count from the SDK communication snapshot. The wrapper passes it through without ROS-side conversion |
JointDiagnosticsArray.header contains the converted SDK timestamp and frame ID. The array contains only valid, online joint entries from the SDK frame.
Joint Commands
Named commands are the recommended input form. Set name to formal left-side or right-side URDF joint names. Set position to the same length. Named commands can target a subset of joints and can use any order.
Leave name empty only for a full 20-joint command. In this form, position must have exactly 20 entries in the dense order below. This ordering is a driver contract because ROS doesn’t define an anonymous JointState order.
For either form, velocity and effort can be empty. The driver fills an empty field with zero. A nonempty field must match the command joint count. Unknown names, duplicate names, opposite-side names, invalid lengths, NaN, infinity, and values outside the SDK float range reject the complete command. The driver doesn’t send a partial update.
| Dense Index | nid | Name Body |
|---|---|---|
| 0 | 1 | thumb_cmc_flex |
| 1 | 2 | thumb_cmc_abd |
| 2 | 3 | thumb_mcp |
| 3 | 4 | thumb_ip |
| 4 | 6 | index_finger_mcp_flex |
| 5 | 7 | index_finger_mcp_abd |
| 6 | 8 | index_finger_pip |
| 7 | 9 | index_finger_dip |
| 8 | 11 | middle_finger_mcp_flex |
| 9 | 12 | middle_finger_mcp_abd |
| 10 | 13 | middle_finger_pip |
| 11 | 14 | middle_finger_dip |
| 12 | 16 | ring_finger_mcp_flex |
| 13 | 17 | ring_finger_mcp_abd |
| 14 | 18 | ring_finger_pip |
| 15 | 19 | ring_finger_dip |
| 16 | 21 | pinky_mcp_flex |
| 17 | 22 | pinky_mcp_abd |
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ament_cmake_gtest | |
| ament_cmake_pytest | |
| ament_lint_auto | |
| ament_lint_common | |
| rclcpp | |
| sensor_msgs | |
| std_msgs | |
| std_srvs | |
| wuji_sdk_vendor | |
| wuji_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| wuji_bringup |