Overview
Phone teleoperation leverages the built-in sensors and camera systems in modern smartphones to track 6-DOF pose (3D position + 3D orientation). This provides an affordable and accessible way to teleoperate robots without investing in expensive VR controllers or motion capture systems. Supported Platforms:- iOS: Uses ARKit via the HEBI Mobile I/O app
- Android: Uses WebXR via the
teleopPython package
Setup
iOS Setup (HEBI Mobile I/O)
- Install the HEBI Mobile I/O app from the App Store
-
Install Python dependencies:
-
Configure your phone in the app:
- Open HEBI Mobile I/O
- Set Family to “HEBI” and Name to “mobileIO”
- Ensure your phone and computer are on the same network
Android Setup (WebXR)
-
Install Python dependencies:
- Start the WebXR server (this will be handled automatically by LeRobot)
- Open the WebXR page on your Android phone’s browser
Configuration
Create a phone teleoperation configuration:Camera Offset
Thecamera_offset parameter compensates for the physical offset between the phone’s camera (which tracks pose) and the center of the phone. For example, iPhone 14 Pro has the camera offset by 2cm horizontally and 4cm vertically from the center.
Usage
Basic Usage
Calibration
Calibration captures a reference pose that zeros out the phone’s position and orientation: iOS Calibration:- Hold the phone so the top edge points forward (same direction as robot +x)
- Screen points up (robot +z)
- Press and hold B1 in the HEBI Mobile I/O app to capture the pose
- Hold the phone in the same orientation as above
- Touch and move on the WebXR page to capture the pose
Enabling Teleoperation
- iOS: Press and hold B1 button in the HEBI Mobile I/O app
- Android: Touch and move on the WebXR page
Action Features
The phone teleoperator provides the following action features (from/home/daytona/workspace/source/src/lerobot/teleoperators/phone/teleop_phone.py:50):
Raw Inputs
iOS (HEBI Mobile I/O):a1-a8: Analog inputs (floats, 0.0 to 1.0)b1-b8: Digital/button inputs (integers, 0 or 1)
move: Boolean indicating touch/move gesturescale: Float for pinch-to-zoom scalereservedButtonA: BooleanreservedButtonB: Boolean
Advanced Usage
Converting Rotation to Other Formats
Using Analog Inputs (iOS Only)
Integration with Robot Control
Here’s an example of using phone teleoperation to control a robot arm:Technical Details
Pose Tracking
- iOS ARKit: Provides high-quality 6-DOF tracking using visual-inertial odometry
- Android WebXR: Uses the device’s motion sensors and camera for pose estimation
Communication
- iOS: UDP communication via HEBI protocol over local network
- Android: WebSocket communication via the
teleopPython package
Reference Frame
The phone’s reference frame is defined during calibration:- +X: Forward (top edge of phone)
- +Y: Left
- +Z: Up (screen facing up)
Troubleshooting
iOS Issues
“Mobile I/O not found” error:- Check that Family = “HEBI” and Name = “mobileIO” in the app
- Ensure phone and computer are on the same Wi-Fi network
- Try restarting the app
- Ensure good lighting conditions
- Avoid reflective or featureless surfaces
- Keep phone camera unobstructed
Android Issues
No response during calibration:- Ensure WebXR is supported in your browser (try Chrome)
- Check that the teleop server is running
- Verify phone and computer are on the same network
- Recalibrate by pressing the enable button again
- Ensure stable lighting conditions
References
- Source code:
/home/daytona/workspace/source/src/lerobot/teleoperators/phone/teleop_phone.py:1 - Configuration:
/home/daytona/workspace/source/src/lerobot/teleoperators/phone/config_phone.py:1 - HEBI Mobile I/O Documentation
- Teleop Package (Android)