Sonic Full-Body Teleoperation
This guide explains how to deploy and use Sonic full-body teleoperation on ELF3, including robot-side dependency installation, PICO Motion Tracker calibration, XRoboToolkit network configuration, full-body motion following, and the exit procedure.
- Motion-control repository: bxi_rl_controller_ros2_example
- Sonic Mod repository: com.bxi.sonic
- PICO client: XRoboToolkit-PICO-1.1.1.apk
Safety
Full-body teleoperation drives the robot's legs, torso, and both arms at the same time. Incorrect operation may destabilize the robot or cause a collision with nearby people or objects. Before first use, clear the operating areas around both the robot and operator, make sure the emergency stop is available, and have a safety operator stand by the robot.
Begin with slow, small movements. Do not jump, turn quickly, stand on one leg, or move beyond the robot's joint range. Stop motion following immediately if the robot shakes, assumes an abnormal posture, or starts to lose balance. Press the emergency stop if necessary.
Environment
| Item | Requirement |
|---|---|
| Robot | ELF3 with the motion-control program running normally |
| Robot-side project | Remote-controller startup: ~/bxi_ws/bxi_rl_controller_ros2_example; App startup: /opt/bxi/bxi_rl_controller_ros2_example |
| Input devices | Robot remote controller, PICO headset, and left and right PICO controllers |
| Motion tracking | 2 leg-mounted PICO Motion Trackers |
| PICO application | XRoboToolkit-PICO 1.1.1 |
| Network | PICO and the robot are on the same LAN and can communicate with each other |
Choose the Project Directory
Use the project path that matches how the robot is started. Do not place the Sonic Mod inside the App project or its private_git_mods; install it in the independent /opt/bxi/mods directory, which is outside the App download and survives App updates.
Migrating an older project
Some older project versions already contain Sonic under src/bxi_example_py_elf3/mods or private_git_mods. If that copy and /opt/bxi/mods/com.bxi.sonic are both scanned, the runtime finds the duplicate Mod ID com.bxi.sonic and refuses to start. Before migrating, locate the old copy, make a backup, and move it outside the scanned directories so that only /opt/bxi/mods/com.bxi.sonic remains:
mv ~/bxi_ws/bxi_rl_controller_ros2_example/src/bxi_example_py_elf3/mods/private_git_mods/com.bxi.sonic \
~/bxi_ws/bxi_rl_controller_ros2_example/com.bxi.sonic.backup
Apply the same procedure to an old copy inside the App project. Do not leave two scannable Sonic copies in place.
| Startup method | Project directory | Build requirement |
|---|---|---|
| Robot remote controller | ~/bxi_ws/bxi_rl_controller_ros2_example | Source tree; install the Mod in /opt/bxi/mods and rebuild after updating it. |
| App | /opt/bxi/bxi_rl_controller_ros2_example | App-downloaded prebuilt deployment; the Mod is loaded from /opt/bxi/mods, with no manual rebuild required. |
When following the commands below, use the project path for your startup method. Clone the Sonic Mod into the independent /opt/bxi/mods/com.bxi.sonic directory.
Prepare the Robot
0. Clone the Sonic Mod
The Sonic Mod is maintained in a separate repository. Clone it manually into the motion-control project's private Mod directory before building:
sudo mkdir -p /opt/bxi/mods
sudo git clone https://github.com/konodoki/com.bxi.sonic.git /opt/bxi/mods/com.bxi.sonic
If the directory already exists, update that repository separately:
cd /opt/bxi/mods/com.bxi.sonic
git pull --ff-only
The parent project does not track this directory. At runtime, the configured /opt/bxi/mods root is scanned recursively, so the Mod remains available after an App update.
1. Update the Motion-Control Project
Update bxi_rl_controller_ros2_example on the robot to the latest version:
cd /home/bxi/bxi_ws/bxi_rl_controller_ros2_example
git pull --ff-only
After updating the source, rebuild the project as described in the repository README and source the environment:
source /opt/ros/humble/setup.bash
source /opt/bxi/bxi_ros2_pkg/setup.bash
cd /home/bxi/bxi_ws/bxi_rl_controller_ros2_example
bash build.sh
sudo systemctl restart ros_elf_launch.service
Note
If your site uses another managed deployment process, follow its update and build procedure instead. Do not update the working tree directly when it contains uncommitted site-specific changes.
2. Install Sonic Dependencies
Before using Sonic for the first time, switch to the root user on the robot and install the Python dependencies required for PICO connectivity:
sudo su
python3 -m pip install -r /opt/bxi/mods/com.bxi.sonic/requirements-pico.txt
The dependencies normally need to be installed only once. Run the command again after an update if requirements-pico.txt has changed.
3. Install the PICO Application
Download XRoboToolkit-PICO-1.1.1.apk and install the APK on the PICO headset. After installation, XRoboToolkit is available under Unknown Sources in the PICO Library.
Enter the Sonic Ready State
- Start ELF3 normally, confirm that the robot has completed its self-check, and use the remote controller to put the robot into walking mode. The robot should hold its normal standing posture.
-
Press
LB + RB + Xsimultaneously on the robot remote controller to request Sonic full-body teleoperation. -
Wait for the state transition to finish. The robot assumes the ready posture shown below. Continue with PICO calibration and motion following only after the posture is stable.
Sonic Does Not Start
Confirm that the robot is already in normal walking mode, then press LB + RB + X simultaneously. If the robot still does not respond, check that the motion-control project has been updated, rebuilt, and sourced correctly.
Calibrate the PICO Motion Trackers
Recalibrate the Motion Trackers before each full-body teleoperation session to reduce body-pose and floor-height errors.
-
Secure one Motion Tracker to each leg. The side with the button and indicator light must face upward along the body. Press the button to turn on each tracker.
-
Put on the PICO headset and pick up both controllers. Select Motion Tracker in the lower-right corner of the PICO home screen.
- Confirm that both leg trackers are connected. Select Start Calibration and follow the instructions in the headset.
- After calibration, select Adjust Floor and follow the instructions to align the virtual floor with the physical floor.
- Observe the avatar on the screen. When the operator moves their head, hands, and legs, the avatar should follow those movements and its feet should remain close to the floor.
Connect XRoboToolkit
- Return to the PICO Library and open
XRoboToolkitunder Unknown Sources.
-
Confirm that PICO and the robot are connected to the same LAN, then obtain the robot's LAN IP address.
-
In the Network section of XRoboToolkit, select Enter next to
PC Service, enter the robot's IP address, and connect. -
Check the tracking and transmission options against the table below:
| Section | Option | Setting |
|---|---|---|
| Tracking | Head | Selected |
| Tracking | Controller | Selected |
| PICO Motion Tracker | Mode | Full-body |
| PICO Motion Tracker | High-Acc | Selected |
| PICO Motion Tracker | Num | 2 |
| Data & Control | Send | Selected |
- Confirm that
Statusin the Network section showsWORKINGand that the log does not contain continuous errors.
Calibrate the Reference Posture and Start Following
- Face the same direction as the robot and stand upright. Let the upper arms hang naturally, bend the elbows approximately 90 degrees, and hold the forearms horizontally in front of the body as shown below.
-
Hold the posture steady and press
A + B + X + Yacross the two PICO controllers at the same time. This aligns PICO three-point tracking with the robot's reference posture. -
After calibration, continue matching the robot's posture and heading. Confirm that body tracking in the headset does not show significant drift.
-
Press
A + Xsimultaneously on the PICO controllers. The robot begins following the operator's full-body motion. Move the arms slowly first, then make small torso and leg movements to verify that all motion directions are correct. -
To pause following and return the robot to its default posture, press
A + Xsimultaneously again. -
After confirming that real-time following has stopped, press
RB + Xsimultaneously on the robot remote controller to return the robot to normal walking mode.
Common controls:
| Device | Buttons | Function |
|---|---|---|
| Robot remote controller | LB + RB + X | Enter the Sonic ready state from walking mode |
| PICO controllers | A + B + X + Y | Align body tracking with the robot's reference posture |
| PICO controllers | A + X | Start following; press again to return to the default posture |
| Robot remote controller | X | Reset heading alignment when no shoulder or trigger button is held |
| Robot remote controller | RB + X | Exit Sonic and return to normal walking mode |
Acceptance Check
After deployment, verify all of the following:
- Both leg trackers show as connected in the PICO Motion Tracker screen;
- The avatar's head, hands, and legs follow the operator's movements;
- XRoboToolkit shows
WORKING,Modeis set toFull-body, andSendis selected; - The robot enters and stably holds the Sonic ready posture after
LB + RB + Xis pressed; - After calibration with
A + B + X + Y, pressingA + Xmakes the robot follow small movements with low latency; - Pressing
A + Xagain returns the robot to its default posture, and pressingRB + Xreturns it to normal walking mode.
Troubleshooting
XRoboToolkit Cannot Connect to the Robot
- Confirm that PICO and the robot are on the same LAN;
- Confirm that
PC Servicecontains the robot's IP address, not the PICO IP address; - Check whether the IP address changed after switching networks;
- Confirm that XRoboToolkit shows
WORKING, and review its log for connection errors.
The Avatar's Legs Do Not Follow or Its Feet Float
- Confirm that both leg trackers are connected and sufficiently charged;
- Make sure the button and indicator side of each tracker faces upward along the body;
- Run Start Calibration and Adjust Floor again;
- Confirm that XRoboToolkit uses
Full-bodymode withNumset to2.
The Robot Cannot Enter the Sonic Ready State
- Confirm that the robot has completed its self-check and is in normal walking mode;
- Confirm that
LB + RB + Xis pressed as a three-button combination; - Confirm that the project has been updated to the latest version and rebuilt;
- On first use, confirm that the packages in
requirements-pico.txtwere installed into the Python environment used by the robot process.
The Robot Does Not Follow After Calibration
- Confirm that
Sendis selected in XRoboToolkit and its status isWORKING; - Confirm that the avatar in PICO Motion Tracker follows the operator correctly;
- Return to the initial posture and press
A + B + X + Yagain; - Wait for calibration to finish, then press
A + Xto start real-time following.
The Robot Moves in a Different Direction From the Operator
Stop real-time following, face the same direction as the robot, and recalibrate. If only the heading is offset, press X alone on the robot remote controller while no shoulder or trigger button is held to reset heading alignment.
Motion Stutters or the Posture Jumps
Stop large movements and check the wireless network quality between PICO and the robot, the tracker connections, and the XRoboToolkit log. Before resuming, verify the initial posture and surrounding safety again. If the issue continues, exit Sonic, then recalibrate and reconnect.








