This package provides an unofficial, open-source driver for the Sixense Razer Hydra Controller. The driver opens a connection to the device using /dev/hidraw*, a feature of Linux kernel 3.0.0+. A ROS node opens the device and publishes custom messages with the state of the buttons, joysticks, and 3D poses.

Please report bugs and request features on the github issue tracker: https://github.com/aleeper/razer_hydra_ros/issues

Supported Distributions

This package has been tested on Ubuntu Precise 12.04. Based on the hidraw interface in use, it should also work with Ubuntu Oneiric 11.10; verification would be appreciated.


Install the udev rules for the Razer Hydra by running the configure script in the razer_hydra directory:

roscd razer_hydra

Then launch the device node:

roslaunch razer_hydra hydra.launch publish_tf:=true/false

You can check if things are working either by looking at the TF tree in Rviz, or by doing:

rostopic echo /hydra_calib

Frames and Offsets

The default frame location for the Razer Hydra (at least, as reported raw over USB) seems to be far back along the paddles, behind where the cord attaches to each paddle. This leads to un-intuitive motion.

To correct for this, two frames are computed from the transform reported by the hydra driver, a "pivot" frame and a "grab" frame. Parameters can be specified to define a translation to each frame from the raw frame along the local coordinate axes. Another parameter specifies which of the two frames should be used in the hydra messages.

An appropriate offset will be dependent on each user (e.g. size of hands and how the paddles are held) as well as the interaction paradigm that the hydra paddles represent and the resulting location of a virtual center-of-rotation (e.g. imagining the paddles are at the wrist of a long end-effector, vs. imagining that the point under the joystick is a "grab point" for manipulating objects, etc.).

(Note: The existence of two frames is useful for debugging while looking at the tf tree. Otherwise, it would be sufficient to just have a single offset frame.)


The raw position data for the hydra is rather jittery. To overcome this, a low-pass biquad filter is used on position, and a low-pass one-pole filter is used on the orientation.

The corner/cutoff frequency for the filters is specified at launch, with a default value of 2.5 Hz.

roslaunch razer_hydra hydra.launch corner_hz:=2.5



Driver node for Razer Hydra controller.

Published Topics

hydra_calib (razer_hydra/Hydra)
  • Publishes the state of each paddle (pose, joystick, and buttons) using ROS frame conventions.
hydra_raw (razer_hydra/HydraRaw)
  • Publishes the raw values of position, quaternion, joystick, and buttons.
hydra_joy (sensor_msgs/Joy)
  • Emulates a PS3 controller joystick message (version 0.0.6 and up)


~device (string, default: /dev/hydra)
  • The device to open. The default udev rules alias the hydra to /dev/hydra, so this will work by default.
~publish_tf (bool, default: false)
  • By default only messages are published. If true, transforms will be published to tf between hydra_base, hydra_<left/right>_pivot and hydra_<left/right>_grab.
~polling_ms (int, default: 10)
  • The max number of milliseconds to wait while polling for new data from the hydra device. Note that this does NOT set the sample rate; the sample rate is currently not controllable, and will always be 250 Hz.
~corner_hz (double, default: 2.5)
  • Corner/cutoff frequency for low-pass filtering.
~use_grab_frame (bool, default: false)
  • If true, uses the grab_frame in messages. Otherwise, uses the pivot_frame.
~px,py,pz (double, default: 0)
  • The x,y,z components of a translation offset between what is reported by the low-level hydra driver and what is set as the hydra_<left/right>_pivot frame.
~gx,gy,gz (double, default: 0)
  • The x,y,z components of a translation offset between what is reported by the low-level hydra driver and what is set as the hydra_<left/right>_grab frame.

Wiki: razer_hydra (last edited 2013-08-17 00:41:24 by DavidGossow)