Skip to content

Commit e4a23f3

Browse files
mingxueg-nvgreptile-apps[bot]kellyguo11
authored
Adds Haply device API with force feedback and teleoperation demo (#3873)
# Description Add Haply haptic device teleoperation support for robotic manipulation with force feedback. ## Type of change - New feature (non-breaking change which adds functionality) 1. Add haply devices API for teleoperation with force feedback 2. Real-time teleoperation with force feedback demo via Haply Inverse3 handle [Haply device documentation](https://docs.haply.co/docs/quick-start) and [usage](https://docs.haply.co/inverseSDK/) **Usage (make sure your Haply device is connected):** ```bash ./isaaclab.sh -p scripts/demos/haply_teleoperation.py --websocket_uri ws://localhost:10001 --pos_sensitivity 1.65 ``` ## Screenshots ![haply-frankal](https://github.com/user-attachments/assets/f2c0572e-83d6-4c10-b95d-6ea083b90f62) ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there --------- Signed-off-by: mingxueg-nv <mingxueg@nvidia.com> Signed-off-by: mingxueg <mingxueg@nvidia.com> Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Co-authored-by: Kelly Guo <kellyg@nvidia.com>
1 parent 87383c8 commit e4a23f3

File tree

14 files changed

+1222
-2
lines changed

14 files changed

+1222
-2
lines changed

CONTRIBUTORS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ Guidelines for modifications:
100100
* Michael Noseworthy
101101
* Michael Lin
102102
* Miguel Alonso Jr
103+
* Mingxue Gu
103104
* Mingyu Lee
104105
* Muhong Guo
105106
* Narendra Dahile
116 KB
Loading

docs/source/api/lab/isaaclab.devices.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
Se3Keyboard
1616
Se2SpaceMouse
1717
Se3SpaceMouse
18+
HaplyDevice
1819
OpenXRDevice
1920
ManusVive
2021
isaaclab.devices.openxr.retargeters.GripperRetargeter
@@ -79,6 +80,14 @@ Space Mouse
7980
:inherited-members:
8081
:show-inheritance:
8182

83+
Haply
84+
-----
85+
86+
.. autoclass:: HaplyDevice
87+
:members:
88+
:inherited-members:
89+
:show-inheritance:
90+
8291
OpenXR
8392
------
8493

Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
.. _haply-teleoperation:
2+
3+
Setting up Haply Teleoperation
4+
===============================
5+
6+
.. currentmodule:: isaaclab
7+
8+
`Haply Devices`_ provides haptic devices that enable intuitive robot teleoperation with
9+
directional force feedback. The Haply Inverse3 paired with the VerseGrip creates an
10+
end-effector control system with force feedback capabilities.
11+
12+
Isaac Lab supports Haply devices for teleoperation workflows that require precise spatial
13+
control with haptic feedback. This enables operators to feel contact forces during manipulation
14+
tasks, improving control quality and task performance.
15+
16+
This guide explains how to set up and use Haply devices with Isaac Lab for robot teleoperation.
17+
18+
.. _Haply Devices: https://haply.co/
19+
20+
21+
Overview
22+
--------
23+
24+
Using Haply with Isaac Lab involves the following components:
25+
26+
* **Isaac Lab** simulates the robot environment and streams contact forces back to the operator
27+
28+
* **Haply Inverse3** provides 3-DOF position tracking and force feedback in the operator's workspace
29+
30+
* **Haply VerseGrip** adds orientation sensing and button inputs for gripper control
31+
32+
* **Haply SDK** manages WebSocket communication between Isaac Lab and the Haply hardware
33+
34+
This guide will walk you through:
35+
36+
* :ref:`haply-system-requirements`
37+
* :ref:`haply-installation`
38+
* :ref:`haply-device-setup`
39+
* :ref:`haply-running-demo`
40+
* :ref:`haply-troubleshooting`
41+
42+
43+
.. _haply-system-requirements:
44+
45+
System Requirements
46+
-------------------
47+
48+
Hardware Requirements
49+
~~~~~~~~~~~~~~~~~~~~~
50+
51+
* **Isaac Lab Workstation**
52+
53+
* Ubuntu 22.04 or Ubuntu 24.04
54+
* Hardware requirements for 200Hz physics simulation:
55+
56+
* CPU: 8-Core Intel Core i7 or AMD Ryzen 7 (or higher)
57+
* Memory: 32GB RAM (64GB recommended)
58+
* GPU: RTX 3090 or higher
59+
60+
* Network: Same local network as Haply devices for WebSocket communication
61+
62+
* **Haply Devices**
63+
64+
* Haply Inverse3 - Haptic device for position tracking and force feedback
65+
* Haply VerseGrip - Wireless controller for orientation and button inputs
66+
* Both devices must be powered on and connected to the Haply SDK
67+
68+
Software Requirements
69+
~~~~~~~~~~~~~~~~~~~~~
70+
71+
* Isaac Lab (follow the :ref:`installation guide <isaaclab-installation-root>`)
72+
* Haply SDK (provided by Haply Robotics)
73+
* Python 3.10+
74+
* ``websockets`` Python package (automatically installed with Isaac Lab)
75+
76+
77+
.. _haply-installation:
78+
79+
Installation
80+
------------
81+
82+
1. Install Isaac Lab
83+
~~~~~~~~~~~~~~~~~~~~
84+
85+
Follow the Isaac Lab :ref:`installation guide <isaaclab-installation-root>` to set up your environment.
86+
87+
The ``websockets`` dependency is automatically included in Isaac Lab's requirements.
88+
89+
2. Install Haply SDK
90+
~~~~~~~~~~~~~~~~~~~~
91+
92+
Download the Haply SDK from the `Haply Devices`_ website.
93+
Install the SDK software and configure the devices.
94+
95+
3. Verify Installation
96+
~~~~~~~~~~~~~~~~~~~~~~
97+
98+
Test that your Haply devices are detected by the Haply Device Manager.
99+
You should see both Inverse3 and VerseGrip as connected.
100+
101+
102+
.. _haply-device-setup:
103+
104+
Device Setup
105+
------------
106+
107+
1. Physical Setup
108+
~~~~~~~~~~~~~~~~~
109+
110+
* Place the Haply Inverse3 on a stable surface
111+
* Ensure the VerseGrip is charged and paired
112+
* Position yourself comfortably to reach the Inverse3 workspace
113+
* Keep the workspace clear of obstacles
114+
115+
2. Start Haply SDK
116+
~~~~~~~~~~~~~~~~~~
117+
118+
Launch the Haply SDK according to Haply's documentation. The SDK typically:
119+
120+
* Runs a WebSocket server on ``localhost:10001``
121+
* Streams device data at 200Hz
122+
* Displays connection status for both devices
123+
124+
3. Test Communication
125+
~~~~~~~~~~~~~~~~~~~~~
126+
127+
You can test the WebSocket connection using the following Python script:
128+
129+
.. code:: python
130+
131+
import asyncio
132+
import websockets
133+
import json
134+
135+
async def test_haply():
136+
uri = "ws://localhost:10001"
137+
async with websockets.connect(uri) as ws:
138+
response = await ws.recv()
139+
data = json.loads(response)
140+
print("Inverse3:", data.get("inverse3", []))
141+
print("VerseGrip:", data.get("wireless_verse_grip", []))
142+
143+
asyncio.run(test_haply())
144+
145+
You should see device data streaming from both Inverse3 and VerseGrip.
146+
147+
148+
.. _haply-running-demo:
149+
150+
Running the Demo
151+
----------------
152+
153+
The Haply teleoperation demo showcases robot manipulation with force feedback using
154+
a Franka Panda arm.
155+
156+
Basic Usage
157+
~~~~~~~~~~~
158+
159+
.. tab-set::
160+
:sync-group: os
161+
162+
.. tab-item:: :icon:`fa-brands fa-linux` Linux
163+
:sync: linux
164+
165+
.. code:: bash
166+
167+
# Ensure Haply SDK is running
168+
./isaaclab.sh -p scripts/demos/haply_teleoperation.py --websocket_uri ws://localhost:10001 --pos_sensitivity 1.65
169+
170+
.. tab-item:: :icon:`fa-brands fa-windows` Windows
171+
:sync: windows
172+
173+
.. code:: batch
174+
175+
REM Ensure Haply SDK is running
176+
isaaclab.bat -p scripts\demos\haply_teleoperation.py --websocket_uri ws://localhost:10001 --pos_sensitivity 1.65
177+
178+
The demo will:
179+
180+
1. Connect to the Haply devices via WebSocket
181+
2. Spawn a Franka Panda robot and a cube in simulation
182+
3. Map Haply position to robot end-effector position
183+
4. Stream contact forces back to the Inverse3 for haptic feedback
184+
185+
Controls
186+
~~~~~~~~
187+
188+
* **Move Inverse3**: Controls the robot end-effector position
189+
* **VerseGrip Button A**: Open gripper
190+
* **VerseGrip Button B**: Close gripper
191+
* **VerseGrip Button C**: Rotate end-effector by 60°
192+
193+
Advanced Options
194+
~~~~~~~~~~~~~~~~
195+
196+
Customize the demo with command-line arguments:
197+
198+
.. code:: bash
199+
200+
# Use custom WebSocket URI
201+
./isaaclab.sh -p scripts/demos/haply_teleoperation.py \
202+
--websocket_uri ws://192.168.1.100:10001
203+
204+
# Adjust position sensitivity (default: 1.0)
205+
./isaaclab.sh -p scripts/demos/haply_teleoperation.py \
206+
--websocket_uri ws://localhost:10001 \
207+
--pos_sensitivity 2.0
208+
209+
Demo Features
210+
~~~~~~~~~~~~~
211+
212+
* **Workspace Mapping**: Haply workspace is mapped to robot reachable space with safety limits
213+
* **Inverse Kinematics**: Inverse Kinematics (IK) computes joint positions for desired end-effector pose
214+
* **Force Feedback**: Contact forces from end-effector sensors are sent to Inverse3 for haptic feedback
215+
216+
217+
.. _haply-troubleshooting:
218+
219+
Troubleshooting
220+
---------------
221+
222+
No Haptic Feedback
223+
~~~~~~~~~~~~~~~~~~
224+
225+
**Problem**: No haptic feedback felt on Inverse3
226+
227+
Solutions:
228+
229+
* Verify Inverse3 is the active device in Haply SDK
230+
* Check contact forces are non-zero in simulation (try grasping the cube)
231+
* Ensure ``limit_force`` is not set too low (default: 2.0N)
232+
233+
234+
Next Steps
235+
----------
236+
237+
* **Customize the demo**: Modify the workspace mapping or add custom button behaviors
238+
* **Implement your own controller**: Use :class:`~isaaclab.devices.HaplyDevice` in your own scripts
239+
240+
For more information on device APIs, see :class:`~isaaclab.devices.HaplyDevice` in the API documentation.

docs/source/how-to/index.rst

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,18 @@ teleoperation in Isaac Lab.
149149
cloudxr_teleoperation
150150

151151

152+
Setting up Haply Teleoperation
153+
------------------------------
154+
155+
This guide explains how to use Haply Inverse3 and VerseGrip devices for robot teleoperation
156+
with directional force feedback in Isaac Lab.
157+
158+
.. toctree::
159+
:maxdepth: 1
160+
161+
haply_teleoperation
162+
163+
152164
Understanding Simulation Performance
153165
------------------------------------
154166

docs/source/overview/showroom.rst

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,41 @@ A few quick showroom scripts to run and checkout:
228228

229229

230230

231+
- Teleoperate a Franka Panda robot using Haply haptic device with force feedback:
232+
233+
.. tab-set::
234+
:sync-group: os
235+
236+
.. tab-item:: :icon:`fa-brands fa-linux` Linux
237+
:sync: linux
238+
239+
.. code:: bash
240+
241+
./isaaclab.sh -p scripts/demos/haply_teleoperation.py --websocket_uri ws://localhost:10001 --pos_sensitivity 1.65
242+
243+
.. tab-item:: :icon:`fa-brands fa-windows` Windows
244+
:sync: windows
245+
246+
.. code:: batch
247+
248+
isaaclab.bat -p scripts\demos\haply_teleoperation.py --websocket_uri ws://localhost:10001 --pos_sensitivity 1.65
249+
250+
.. image:: ../_static/demos/haply_teleop_franka.jpg
251+
:width: 100%
252+
:alt: Haply teleoperation with force feedback
253+
254+
This demo requires Haply Inverse3 and VerseGrip devices.
255+
The goal of this demo is to pick up the cube or touch it with the end-effector.
256+
The Haply devices provide:
257+
258+
* 3 dimensional position tracking for end-effector control
259+
* Directional force feedback for contact sensing
260+
* Button inputs for gripper and end-effector rotation control
261+
262+
See :ref:`haply-teleoperation` for detailed setup instructions.
263+
264+
265+
231266
- Create and spawn procedurally generated terrains with different configurations:
232267

233268
.. tab-set::

0 commit comments

Comments
 (0)