⚠ CUSTOM mode requires a lifting fixture. When commanding arm joints in CUSTOM mode, the K1's legs are not under locomotion control. The robot must be supported by a hanging fixture or supported stand to prevent falls from upper-body center-of-mass shifts.

Teleoperation Methods

VR Teleoperation (Quest 3)

Meta Quest 3 tracks your head and hand pose. The K1 mirrors head yaw/pitch and arm end-effector position in real time. Best for natural, expressive demonstrations. Requires k1_vr_teleop ROS2 node.

Leader-Follower

A physical leader exoskeleton or arm system mirrors joint angles to the K1. Higher precision for manipulation. Requires compatible leader hardware.

Step 1: Head Pose Control

Start with head control — it does not require CUSTOM mode and is lower risk.

from booster_robotics_sdk import BoosterRobot, RobotMode, HeadCommand
import time

robot = BoosterRobot(ip="192.168.10.102")
robot.connect()
robot.set_mode(RobotMode.PREP)
time.sleep(5)

# Sweep head yaw
for yaw in range(-45, 46, 5):  # -45 to +45 degrees
    cmd = HeadCommand(yaw_deg=float(yaw), pitch_deg=0.0)
    robot.send_head_command(cmd)
    time.sleep(0.1)

# Return to center
robot.send_head_command(HeadCommand(yaw_deg=0.0, pitch_deg=0.0))
time.sleep(1)

robot.set_mode(RobotMode.DAMP)
robot.disconnect()

Step 2: Arm Control in CUSTOM Mode

Install the lifting fixture before proceeding. Verify the K1 is suspended or on a supporting stand such that leg falls are not possible.

from booster_robotics_sdk import ArmCommand

robot = BoosterRobot(ip="192.168.10.102")
robot.connect()
robot.set_mode(RobotMode.DAMP)
time.sleep(1)
robot.set_mode(RobotMode.PREP)
time.sleep(5)
robot.set_mode(RobotMode.CUSTOM)
time.sleep(2)

# Move right arm to a predefined configuration
# Joints: [shoulder_pitch, shoulder_roll, shoulder_yaw, elbow_pitch,
#          wrist_pitch, wrist_roll, wrist_yaw]  — in radians
home_config = [0.0, -0.3, 0.0, 0.5, 0.0, 0.0, 0.0]
cmd = ArmCommand(side="right", joint_positions=home_config, kp=40, kd=2)
robot.send_arm_command(cmd)
time.sleep(2)

# Reach forward
reach_config = [0.4, -0.3, 0.0, 1.2, 0.0, 0.0, 0.0]
cmd = ArmCommand(side="right", joint_positions=reach_config, kp=40, kd=2)
robot.send_arm_command(cmd)
time.sleep(3)

# Return to home and shutdown
robot.send_arm_command(ArmCommand(side="right", joint_positions=home_config, kp=40, kd=2))
time.sleep(2)
robot.set_mode(RobotMode.PREP)
time.sleep(3)
robot.set_mode(RobotMode.DAMP)
robot.disconnect()

Step 3: VR Teleoperation Session

# Launch K1 VR teleop node (requires Quest 3 connected via Air Link or USB)
ros2 launch k1_teleop k1_vr_teleop.launch.py \
  robot_ip:=192.168.10.102 \
  vr_device:=quest3

The session displays a status panel on the Quest 3 overlay. Calibrate your T-pose before the first motion. Practice for 5 continuous minutes before proceeding to Unit 4.

Head and Arm Joint Limits

Joint Min Max Unit
Head Yaw-90+90deg
Head Pitch-40+30deg
Shoulder Pitch-1.57+1.57rad
Elbow Pitch0.0+2.09rad

Unit 3 Complete When...

Head yaw and pitch respond correctly to commands. Arm control in CUSTOM mode works with the lifting fixture. You have completed one 5-minute VR or leader-follower teleoperation session. You can transition PREP → CUSTOM → PREP → DAMP without errors.