wuji_hand2_driver, you can read joint and sensor state, view the model in RViz, and control the device through joint commands and services.
Installation
Use Ubuntu 26.04 (resolute) with ROS 2 Lyrical installed, on x86_64 or aarch64. The commands below fetch the source, load ROS, install dependencies and Hand 2 descriptions, and build the workspace. The build downloads and verifies the Wuji SDK C package for the host architecture.-
The description installer requires
/etc/apt/sources.list.d/ros2.sources. If it is missing, configure the Lyrical package source using the official ROS 2 installation steps, then rerun the script. -
If rosdep has never been initialized on the computer, run
sudo rosdep initonce beforerosdep update. Thesudocommands require administrator access. -
If the SDK download fails, download and extract
wuji-sdk-c-2026.10.12-x86_64-linux-gnu.tar.gzorwuji-sdk-c-2026.10.12-aarch64-linux-gnu.tar.gzfrom Wuji SDK v2026.10.12, matching your host architecture. Confirm that the extracted directory containsinclude/wuji_sdk.h,lib/libwuji_sdk_c.so, andLICENSE. Replace/path/to/sdkwith the absolute path to that directory, then run this command fromwuji-ros2instead of the default build command: -
CMake does not validate the SDK version when
WUJI_SDK_ROOTis set. Use the release package specified above.
Select a Device
Complete device mounting in Mechanical Integration and power and network setup in Electrical and Network Integration. Confirm that the operating requirements in User Notice are met, then run this command to scan for devices:serial_number and hand_side. If connecting by address, also record its optional endpoint.
View the Model and State
Run the Validation
1. Start the Driver and View the Model ReplaceHAND_SERIAL_NUMBER and HAND_SIDE with the serial number and hand side recorded in Select a Device.
Run hand2_view.launch.py from the built wuji_bringup package to start the driver, robot_state_publisher, and RViz:
endpoint shown in the scan, replace HAND_ENDPOINT with that IP:port address and use this command:
The driver waits up to 10 seconds for the device to connect by default. Append
connect_timeout:=20.0 to the launch command to extend the connection wait to 20 seconds. Launch arguments are read only at startup. Boolean arguments accept only lowercase true / false.serial_number and fixes auto_enable to false. It doesn’t enable joints at startup or disable a hand that was already enabled. When the launch stops, the driver calls the disable API for all joints. If the call fails, it logs a warning and continues to exit. Confirm that the device has actually stopped.
model_revision:=2 selects wuji_hand2_2_description. The model root is l_mount for the left hand or r_mount for the right hand, and RViz uses that root frame. See Model Assets and Loading for model assets and root links. The parent application must provide the transform from the mount to its robot or world frame.
2. Check State Data
Keep the launch running. Open a new terminal, enter the workspace, and load ROS and the built packages before checking state data:
joint_states, joint_diagnostics, and imu for 10 seconds by default and reports frame counts and average receive rates. It succeeds after receiving at least one joint state with 20 positions, one joint diagnostic message with 20 entries, and one IMU message. This check doesn’t validate motion control or every sensor.
The demo reports PASS/FAIL after the full observation period. To observe for 30 seconds, run:
If the driver connects but RViz shows Stop the current launch. Run this command in each terminal used for steps 1 and 2:Then rerun the commands in steps 1 and 2. Set the same ROS 2 middleware in any new terminals you open later.
No tf data or the status example receives no data, first check namespaces, ROS_DOMAIN_ID, and QoS across terminals. If the problem persists, try another ROS 2 middleware. Install Cyclone DDS:State and Sensor Topics
The driver publishes joint states, joint diagnostics, and IMU data on the topics below. Subscribe using the listed message types. Topic names are relative: withnamespace:=hand, joint_states resolves to /hand/joint_states.
For field definitions, see
wuji_msgs/msg/JointDiagnosticsArray.msg and wuji_msgs/msg/JointDiagnostics.msg in the wuji-ros2 repository, and the ROS 2 JointState.msg and Imu.msg definitions. After sourcing the workspace, run ros2 interface show wuji_msgs/msg/JointDiagnosticsArray to inspect the custom message and its nested fields.Control the Device
The driver sends position, velocity, and current-proxy targets without switching control modes. Motion depends on the device’s current control mode and parameters.Send Joint Commands
1. Start the driver Stop the view launch started in 1. Start the Driver and View the Model. Secure the unloaded hand and keep people clear of moving parts. Start control with the same serial number and hand side:auto_enable:=true enables all joints after startup. It doesn’t send motion targets yet.
2. Check the current positions
Keep the driver running. Open a new terminal.
If the driver uses Cyclone DDS, configure the same ROS 2 middleware in this terminal:
/hand/joint_commands for one second, then publishes wave commands at 100 Hz. Thumb and abduction targets stay at 0 rad. The other four fingers move between 0 and 1.0 rad with a 0.5 Hz cosine wave. Observe the hand and joint position changes.
4. Stop and disable
Press Ctrl+C to stop the wave demo, then disable all joints:
success: true before stopping the driver launch, and verify that the hand has stopped.
Joint Command Format
Publishsensor_msgs/msg/JointState messages to joint_commands. The publisher fills the name, position, velocity, and effort fields. They aren’t launch arguments.
Named commands: When writing a publisher, put joint names published in joint_states in name, and provide position values in the same order. You can specify a subset of joints in any order. The driver fills targets for unlisted joints with zero, so explicitly include any joints whose targets you want to preserve.
Fixed-order commands: Leave name empty and provide all 20 position values in the order below. The wave demo above uses this format. Prefix the listed joint names with l_ or r_ for the selected hand. Fixed-length services use the same order.
In either format, empty
velocity and effort arrays are filled with zeros. Nonempty arrays must match the number of commanded joints. Unknown, duplicate, or opposite-side names, invalid lengths, nonfinite values, and values outside the float32 range reject the complete command.
Call Control Services
Services use reliable QoS and the same namespace. Check both the success flag and error information in the response.
An all-false mask changes no joints. Fixed-length services require all 20 entries and don’t accept joint names or partial arrays. Current limits,
kp, and kd must be finite and nonnegative. kp and kd retain their SDK definitions without additional physical units.
Rejected joint commands produce rate-limited ERROR logs in the driver terminal, with no result topic. Failed service calls return success: false and error information. The driver keeps running.
To request an emergency stop, call: