Teleoperation — Leader-Follower, Bilateral & VR

Complete teleoperation documentation for OpenArm: leader-follower setup, unilateral position mirroring, bilateral force feedback control, and VR-based teleoperation using Meta Quest 3.

Leader-Follower Bilateral Control Force Feedback 500 Hz VR Meta Quest 3
Source: docs.openarm.dev/teleop/ Last updated: Apr 6, 2026

1. Teleoperation Overview

OpenArm supports 1:1 teleoperation from a leader arm to a follower arm in two control modes: unilateral (one-way position mirroring) and bilateral (two-way force feedback).

Unilateral Control

  • Follower directly mimics leader positions
  • One-way control — no force feedback
  • Simple and robust
  • Best for: initial tests, free-space motion

Bilateral Control

  • Two-way force feedback
  • Operator feels what follower touches
  • Requires 500 Hz+ control loop
  • Best for: contact-rich manipulation

Both modes are implemented in the openarm_teleop library and share the same multi-threaded architecture and per-joint control parameters.

2. Teleoperation Setup Guide

This guide walks you through building the openarm_teleop library from source.

Prerequisites

Before starting, ensure you have:

  • The openarm_description library installed (see Software > Robot Description)
  • Ubuntu 22.04 or 24.04 with SocketCAN configured
  • Two OpenArm units (leader + follower) each with their own CAN interface
  1. Clone the teleop repository.
    git clone https://github.com/enactic/openarm_teleop.git
    cd openarm_teleop
  2. Install dependencies.
    sudo apt install -y software-properties-common
    sudo add-apt-repository -y ppa:openarm/main
    sudo apt update
    sudo apt install -y \
      libeigen3-dev \
      libopenarm-can-dev \
      liborocos-kdl-dev \
      liburdfdom-dev \
      liburdfdom-headers-dev \
      libyaml-cpp-dev \
      openarm-can-utils
  3. Build the teleop library.
    cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
    cmake --build build
  4. Initialize the CAN network.

    Each arm requires a dedicated CAN interface (1 arm = 1 CAN port).

    # Single interface (one arm)
    openarm-can-configure-socketcan can0 -fd
    
    # Four interfaces (bimanual leader + follower)
    # can0 = right leader, can1 = left leader
    # can2 = right follower, can3 = left follower
    openarm-can-configure-socketcan-4-arms -fd

3. Unilateral Control

Unilateral control is the basic teleoperation setup, where the follower arm directly mimics the leader's movements through position commands. It is a one-way control scheme — the leader sends motion commands, but no force feedback is returned.

System Architecture

The system uses a multi-threaded structure with three components managed through a custom PeriodicTimerThread class:

  • Leader Thread — Reads leader arm joint states at high frequency
  • Follower Thread — Sends position commands to the follower arm
  • Admin Thread — Coordinates communication between leader and follower, handles the Control class logic

Control Parameters

Per-joint configuration for unilateral control:

ParameterDescription
KpPosition control gain
KdVelocity control gain
FcStatic friction level
kFriction transition sharpness (tanh slope)
FvViscous friction coefficient
FoFriction offset

Friction compensation formula applied per joint:

tau_f = Fc * tanh(k * dq) + Fv * dq + Fo

Running Unilateral Control

# Right arm (leader: can0, follower: can2)
cd openarm_teleop
./script/launch_unilateral.sh right_arm can0 can2

# Left arm (leader: can1, follower: can3)
./script/launch_unilateral.sh left_arm can1 can3

# Default CAN interfaces (omit arguments to use defaults)
# right_arm: can0 / can2
# left_arm:  can1 / can3

The launch script:

  1. Validates the arm side argument
  2. Applies CAN interface defaults if not specified
  3. Generates temporary URDFs via xacro
  4. Executes the unilateral control binary
  5. Cleans temporary files on exit
Safety — Zero Position Before Starting Always position the arm in its lowered straight-down posture before starting the control script. Calibrate the zero position separately for both leader and follower arms before enabling following.
No Force Feedback Unlike bilateral control, unilateral control does not provide force feedback. The operator will not sense contact forces — excessive force can be applied to objects or surfaces without awareness. Use with care in contact tasks.

4. Bilateral Control

Bilateral control enables two-way force feedback between the leader and follower arms, allowing the operator to feel what the follower arm touches. This is the recommended mode for contact-rich manipulation tasks.

System Architecture

The bilateral control system uses the same three-thread architecture as unilateral control, with the addition of force/torque feedback transmission from follower to leader:

  • Leader Thread — Reads leader states; applies reaction forces from follower
  • Follower Thread — Sends position commands; reads contact forces
  • Admin Thread — Manages the bidirectional Control class

The Control class handles both bilateral and unilateral logic — mode is selected at launch time.

Control Parameters

Same per-joint parameters as unilateral (Kp, Kd, Fc, k, Fv, Fo) with additional tuning critical for stability:

  • Kp — Higher values give stiffer position tracking; too high causes oscillation
  • Kd — Velocity damping; critical for stability in contact
  • Friction compensation uses same tanh model: tau_f = Fc * tanh(k * dq) + Fv * dq + Fo

Running Bilateral Control

# Right arm (leader: can0, follower: can2)
cd openarm_teleop
./script/launch_bilateral.sh right_arm can0 can2

# Left arm (leader: can1, follower: can3)
./script/launch_bilateral.sh left_arm can1 can3
Critical — 500 Hz Minimum Bilateral control requires a control loop frequency of 500 Hz or higher. Below this, the force feedback becomes unstable. Ensure your system (CPU + CAN interface) can sustain this rate before running.
Zero Position Before Starting Always position both leader and follower arms in the lowered straight-down zero position before starting. Failure to do so will result in immediate large position error and potentially violent arm movement.

Gain Tuning Notes

  • Start with low Kp (e.g., 5–10) and increase gradually while monitoring for oscillation
  • Increase Kd to damp oscillations before increasing Kp further
  • Test in free space before attempting contact tasks
  • Different gain sets may be needed for different joints (proximal joints typically need different tuning than distal joints)

5. VR Teleoperation

OpenArm supports real-time teleoperation using VR human body estimation streaming data. The current prototype maps Meta Quest 3 hand and arm motions to the robot's end-effector.

Key Features

  • 7DOF Control — Maps both position and rotation for natural and intuitive manipulation
  • Gesture-based Gripper Control — Uses VR finger distance for real-time open/close actions
  • Scalable Mapping — Can incorporate full arm motion (upper/lower arm) for more human-like movements
  • Real-time Operation — Runs at ~20 FPS with TCP data streaming

Current Status

The current prototype operates in NVIDIA Isaac Labs simulation, mapping Meta Quest 3 hand and arm motions to the robot's end-effector for simulated operations including object picking and placement.

Coming Soon — Real-World Hardware Real-world OpenArm VR teleoperation is coming soon. The roadmap includes:
  • Integration with real OpenArm hardware for actual-world teleoperation
  • Enhanced motion retargeting for human-like arm movement using advanced IK and VR tracking
  • Advanced gripper control and haptic feedback for improved object interaction

VR Simulation Setup

The VR teleoperation simulation uses the Isaac Lab environment. See the Simulation page for Isaac Lab setup. The VR teleoperation code will be released as part of the openarm_teleop repository.

Architecture Overview

ComponentDescription
VR DeviceMeta Quest 3 (hand + arm tracking)
Data ProtocolTCP streaming at ~20 FPS
Motion MappingVR 6DOF pose → robot end-effector pose via IK
Gripper ControlFinger pinch distance → gripper open/close
Simulation BackendNVIDIA Isaac Lab
Real HardwareComing soon
Attribution Content on this page is based on the official OpenArm documentation at docs.openarm.dev, copyright © 2025–2026 Enactic, Inc.
← Software Simulation →