Skip to main content
Connects a VR headset to the robot (or simulator) for teleoperation. IK runs in a dedicated subprocess to keep JAX off the asyncio event loop. The pipeline is: VR frames → One Euro filtering → IK solve → EMA smoothing → trapezoidal velocity profiling → motion_control().
Use step() instead of run() to integrate teleoperation into your own control loop:
To show camera feeds in the headset, register frame sources after the session is enabled — VRTeleop.set_video_sources() forwards them to the VR server’s WebRTC relay (requires the GStreamer NVENC stack, installed by axol gst.install; see almond_axol.vr). Each value is a connected ZedCamera (registered directly) or any object exposing width / height / fps + wait_next:
See the teleop CLI command for the equivalent command-line entry point (--cameras wires the ZED cameras up automatically).
set_video_sources() runs the WebRTC relay in-process. The CLI instead prefers VRTeleop.set_video_manager(), which hands the camera grab/encode and WebRTC off to a dedicated subprocess (almond_axol.video.video_proc.VideoRelayProcess) so it can’t perturb the control loops. Both deliver the same headset video — see almond_axol.vr.

VRTeleopConfig fields

Engage toggle behaviour. Grip is a toggle, not a hold. Press both grip buttons together to enable arm movement; press either grip alone to freeze the arms. A rising edge on the reset button triggers a collision-aware trajectory back to the rest pose.