Booster K1 Humanoid Robot — Python SDK, Walking Control & Teleop Guide

Complete guide to connecting, programming, and teleoprating the Booster K1 full-body humanoid robot using the Booster Python SDK and the RoboticsCenter platform agent.

Device: Booster K1 Device type: booster_k1 Agent: k1_agent Interface: Ethernet 192.168.10.102
Full Humanoid 22 DOF Walking Robot Python SDK Teleoperation ROS2

1. Overview

The Booster K1 is a full-body humanoid robot developed by Booster Robotics, designed for research-grade bipedal locomotion, whole-body manipulation, and embodied AI experiments. With 22 degrees of freedom distributed across a human-like kinematic chain — including an articulated head, bilateral arms, and full leg assemblies — the K1 is built to operate in human environments at human scale.

The K1 targets the intersection of locomotion and manipulation research. Its WALK mode enables stable bipedal gait over flat terrain and stairs, while CUSTOM mode exposes all 22 joints for direct torque and position control, enabling loco-manipulation experiments, whole-body motion planning, and novel gait development without modifying the onboard firmware. The built-in agent system adds out-of-the-box behaviors — soccer, dance, conversational interaction — that researchers can use as baselines or building blocks.

Professionals choose the K1 because the Booster Python SDK provides a clean, high-level API that abstracts motor-level complexity while still exposing low-level joint control for advanced work. Combined with the RoboticsCenter teleop platform, teams can remotely operate the K1, collect full-body demonstration data, and stream joint telemetry to dashboards — all from a browser.

2. Full Specs

Property Value
VendorBooster Robotics
ModelK1
Form factorFull-body bipedal humanoid
Total DOF22
Head DOF2 — yaw (pan) and pitch (tilt)
Head yaw rangeapprox. −90° to +90°
Head pitch rangeapprox. −40° to +30°
Arm DOFMultiple per arm (bilateral)
Leg DOFFull bipedal kinematics per leg
Control modesDAMP, PREP, WALK, CUSTOM, PROTECT
Network interfaceWired Ethernet
Default wired IP192.168.10.102
Computer IP (wired)192.168.10.10 / netmask 255.255.255.0
Wireless connectionVia Booster App (IP assigned dynamically)
SSH accessssh booster@192.168.10.102 · password: 123456
SDK packagebooster_robotics_sdk_python (PyPI)
Walk speed (forward/back)−0.5 to +0.5 m/s
Walk speed (lateral)−0.5 to +0.5 m/s
Rotation speed−1.0 to +1.0 rad/s
Battery telemetryYes — status.battery_percentage
IMU telemetryYes — status.imu_status
Agent systemDefault, Soccer, HiChat, Dance, LionDance
Platform agentk1_agent.py
Official SDK repogithub.com/BoosterRobotics/booster_robotics_sdk

3. Quick Start

From unboxing to your first walking command in five steps:

  1. Install the Booster SDK. The official Python SDK is distributed on PyPI and requires Python 3.8+.
    pip install booster_robotics_sdk_python --user
  2. Configure Ethernet and connect. Set your computer's wired interface to IP 192.168.10.10, netmask 255.255.255.0, gateway 192.168.10.1. The robot's default IP is 192.168.10.102. Verify with:
    ping 192.168.10.102
    For wireless, configure WiFi via the Booster App and note the assigned IP.
  3. Power on and wait for ready state. The robot initializes in DAMP mode. Wait until the status LEDs indicate standby before sending any SDK commands. SSH in if you need to inspect system logs:
    ssh booster@192.168.10.102   # password: 123456
    booster-cli launch -c status  # verify service is running
  4. Enter PREP mode and stand the robot.
    import booster
    import time
    
    client = booster.BoosterClient("192.168.10.102")
    client.change_mode(booster.Mode.PREP)
    time.sleep(3)  # wait for robot to stand and stabilize
    print("Robot is standing in PREP mode.")
  5. Enter WALK mode and move forward.
    client.change_mode(booster.Mode.WALK)
    time.sleep(2)
    
    client.walk(0.2, 0.0, 0.0)   # forward 0.2 m/s
    time.sleep(3)
    client.walk(0.0, 0.0, 0.0)   # stop
    
    client.change_mode(booster.Mode.PREP)  # return to standing
Safety first. Always ensure the robot is standing on flat, stable ground with no obstacles or people within 2 m before entering WALK mode. Keep a hand on the emergency stop throughout initial testing.

4. Control Modes

The K1 state machine defines five modes. Understanding the valid transitions is critical to safe operation.

Mode Description Entry method (SDK) Entry method (remote)
DAMP Damping mode. All joints have passive resistance. Safe default state for power-on and shutdown. client.change_mode(Mode.DAMP) LT + BACK
PREP Preparation mode. Robot stands upright and holds position using the balance controller. client.change_mode(Mode.PREP) LT + START
WALK Walking mode. Full bipedal gait controller active. Accepts velocity commands and predefined actions. client.change_mode(Mode.WALK) RT + A (from PREP)
CUSTOM Custom mode. Direct joint-level control for advanced research. Requires physical support fixture. client.change_mode(Mode.CUSTOM) SDK only
PROTECT Protection mode. Automatically entered when a fault is detected. Requires fault clearance to exit. Automatic Automatic

Walking velocity parameters

The client.walk(forward, lateral, angular) call accepts three float parameters:

ParameterRangeUnitsNotes
forward−0.5 to +0.5m/sPositive = forward, negative = backward
lateral−0.5 to +0.5m/sPositive = right, negative = left
angular−1.0 to +1.0rad/sPositive = turn left, negative = turn right

Remote controller shortcuts

The K1 ships with a gamepad-style remote controller. Key mappings for mode control and walking:

  • LT + START: Enter PREP mode
  • RT + A: Enter WALK mode (must be in PREP first)
  • LT + BACK: Enter DAMP mode
  • Left stick: Walk direction (WALK mode)
  • Right stick: Turn direction (WALK mode)
  • D-Pad: Head movement
  • A: Handshake · B: Wave · X: Otter Man · Y: Bow
  • RB + A: Fortune Cat · RB + B: Hip-hop Superman · RB + X: Cheer · RB + Y: Carry

Predefined actions

Call client.play_action(name) in WALK mode to trigger built-in motion sequences:

client.play_action("wave")           # wave hand
client.play_action("handshake")      # handshake
client.play_action("bow")            # bow
client.play_action("fortune_cat")    # fortune cat pose
client.play_action("hiphop_superman") # hip-hop superman
client.play_action("cheer")          # cheer
client.play_action("new_year_dance") # new year dance
client.play_action("rock_dance")     # rock dance
client.play_action("future_dance")   # future dance

5. SDK / Python Integration

Installation

pip install booster_robotics_sdk_python --user

Full status read and telemetry

import booster

client = booster.BoosterClient("192.168.10.102")
status = client.get_robot_status()

print(f"Mode:    {status.mode}")
print(f"Battery: {status.battery_percentage:.1f}%")
print(f"IMU:     {status.imu_status}")

Head pose control

Head yaw and pitch are controlled via client.set_head_pose(yaw_rad, pitch_rad). Convert degrees to radians before calling:

import math

def deg2rad(d): return d * math.pi / 180.0

# Look 30° to the left and 10° down
client.set_head_pose(deg2rad(30), deg2rad(-10))

# Return to center
client.set_head_pose(0.0, 0.0)

CUSTOM mode joint control

CUSTOM mode exposes all 22 joints. Only enter this mode with the robot on a lifting device or suspended fixture.

# WARNING: Use CUSTOM mode only with robot physically supported
client.change_mode(booster.Mode.CUSTOM)

# Joint indexing: j1=head_yaw, j2=head_pitch, j3–j22=body joints
# Refer to the K1 Instruction Manual for the full joint map

Robot service management (SSH)

ssh booster@192.168.10.102

booster-cli launch -c status    # check service state
booster-cli launch -c start     # start robot service
booster-cli launch -c stop      # stop robot service
booster-cli launch -c restart   # restart robot service

# Check firmware version
cat /opt/booster/version.txt

# Collect logs for a time window
booster-cli log -st 20260403-120000 -et 20260403-130000 -o /home/booster/Documents

Agent modes

The K1 includes a built-in agent runtime. Switch agents programmatically:

client.enter_agent("default")    # Booster default
client.enter_agent("soccer")     # soccer agent
client.enter_agent("hi_chat")    # conversational AI agent
client.enter_agent("dance")      # dance agent

6. ROS2 Integration

The Booster K1 can be integrated into a ROS2 workspace using either the URDF model for simulation and visualization, or a bridge node that forwards SDK commands and telemetry over ROS2 topics.

URDF / XACRO model

The K1 URDF is available from the Booster SDK repository and describes the full kinematic chain including all 22 joints. Load it into your workspace:

# Clone the SDK (includes URDF)
git clone https://github.com/BoosterRobotics/booster_robotics_sdk.git
cd booster_robotics_sdk

# Copy URDF to your ROS2 workspace
cp -r urdf/ ~/ros2_ws/src/booster_k1_description/

# Build
cd ~/ros2_ws && colcon build --packages-select booster_k1_description
source install/setup.bash

Visualize in RViz2

ros2 launch booster_k1_description display.launch.py

ROS2 bridge node pattern

Wrap the Booster SDK client in a ROS2 node to publish joint states and subscribe to velocity commands. Below is the minimal pattern:

import rclpy
from rclpy.node import Node
from sensor_msgs.msg import JointState
from geometry_msgs.msg import Twist
import booster, time

class K1ROS2Bridge(Node):
    def __init__(self):
        super().__init__("k1_bridge")
        self.client = booster.BoosterClient("192.168.10.102")
        self.pub = self.create_publisher(JointState, "/k1/joint_states", 10)
        self.sub = self.create_subscription(Twist, "/cmd_vel", self.on_cmd_vel, 10)
        self.create_timer(0.05, self.publish_telemetry)  # 20 Hz

    def on_cmd_vel(self, msg):
        self.client.walk(msg.linear.x, msg.linear.y, msg.angular.z)

    def publish_telemetry(self):
        status = self.client.get_robot_status()
        js = JointState()
        js.header.stamp = self.get_clock().now().to_msg()
        # Populate js.name / js.position from status
        self.pub.publish(js)

def main():
    rclpy.init()
    node = K1ROS2Bridge()
    rclpy.spin(node)

if __name__ == "__main__":
    main()

Key ROS2 topics (convention)

TopicTypeDescription
/k1/joint_statessensor_msgs/JointState22-DOF joint positions and velocities
/cmd_velgeometry_msgs/TwistWalk velocity commands (linear.x, linear.y, angular.z)
/k1/batterysensor_msgs/BatteryStateBattery percentage and charge status
/k1/imusensor_msgs/ImuIMU orientation and angular velocity

7. Platform Teleop Integration

The k1_agent.py script bridges the Booster K1 to the Fearless Platform teleop system via WebSocket, enabling remote operation, joint monitoring, and demonstration data collection from a browser.

Starting the agent

# Install dependency
pip install websockets

# Real hardware
python k1_agent.py \
  --backend wss://your-backend.run.app \
  --session YOUR_SESSION_ID \
  --node-id k1-lab-01 \
  --telemetry-hz 8

# Mock mode (no K1 required)
python k1_agent.py \
  --backend ws://localhost:8000 \
  --session test-session \
  --mock

Telemetry payload

The agent streams a structured telemetry frame at the configured rate (default 8 Hz). Each frame includes:

  • Joint angles for 6 primary joints in degrees (j1j6)
  • Motor states: position, RPM, temperature per motor
  • Walk velocity components: vx, vy, wz
  • Battery percentage and current mode string
  • Active agent name (Default / Soccer / Dance / HiChat)
  • Millisecond timestamp for frame alignment

Supported command types

The platform sends JSON command frames to the agent. Supported types:

TypeParametersEffect
moveaxis, dirWalk along x/y axis or rotate on z axis
stopZero all walk velocities immediately
move_jointjoint, dir, step_degStep a named joint by step_deg degrees
cartesian_moveaxis, dir, frameHead pitch (rx), head yaw (ry), body yaw (rz)
gesturenameExecute named gesture: wave, nod, bow
voice_commandtextNL command: "walk forward", "turn left", "dance", etc.
robot_querytextQuery robot state; agent replies via robot_reply message

8. Troubleshooting

Symptom Likely cause Fix
Connection refused / timeout Ethernet not configured correctly or robot not powered on Set your computer's IP to 192.168.10.10 / netmask 255.255.255.0. Ping 192.168.10.102. Confirm robot LED indicators show active state. SSH in and run booster-cli launch -c status.
Robot enters PROTECT mode immediately Fault condition: surface not flat, joint position error, or communication dropout Place the robot on a flat, hard surface. Restart the robot service via SSH: booster-cli launch -c restart. Allow a full boot cycle before reconnecting.
WALK mode exits unexpectedly Balance controller lost stability or step sequence failed Re-enter PREP from DAMP, wait 3 seconds for full stabilization, then re-enter WALK. Do not command lateral speeds above 0.3 m/s until the robot is well calibrated on your floor surface.
SDK ImportError: no module named booster SDK not installed or installed to wrong Python environment Run pip install booster_robotics_sdk_python --user. Verify with python -c "import booster; print('OK')". If using a virtual environment, activate it first.
Head not responding to set_head_pose Robot not in PREP or WALK mode, or angle exceeds hardware limits Confirm mode with client.get_robot_status().mode. Clamp yaw to −90°/+90° and pitch to −40°/+30° before converting to radians. Do not call set_head_pose in DAMP mode.
Still stuck? SSH into the robot and collect logs: booster-cli log -st YYYYMMDD-HHMMSS -et YYYYMMDD-HHMMSS -o /home/booster/Documents. Share the log with SVRC support or post in the community forum.
New to robotics? Learn fundamentals — bipedal locomotion, teleoperation, ROS 2, and whole-body control — at the SVRC Robotics Academy before programming your humanoid.
Have a question? Ask the community or contact support with your SSH log output and SDK version.

Ready to program your Booster K1?

Connect the K1 to the platform, start the teleop agent, and stream live joint data to your browser dashboard.