Software Setup

SDK installation, ROS2 whole-body control interface, joint state reading and commanding, locomotion API basics, MuJoCo humanoid simulation, and the top 3 troubleshooting issues.

Jump to a section:

Step 1 — SDK Installation

Booster SDK Installation

The Booster SDK is distributed as booster_robotics_sdk_python on PyPI. It provides Python bindings to the K1's network control interface.

Create a virtual environment (recommended)

python3 -m venv ~/.venvs/booster-k1
source ~/.venvs/booster-k1/bin/activate

Install the SDK

pip install booster_robotics_sdk_python

Verify the installation

python3 -c "import booster_robotics_sdk; print('SDK ready')"

Network configuration

The K1 communicates over wired Ethernet. Configure your host PC's network interface before connecting:

# Set your PC's Ethernet interface to 192.168.10.10
sudo ip addr add 192.168.10.10/24 dev eth0
sudo ip link set eth0 up

# Verify connectivity to the K1
ping 192.168.10.102
Step 2 — ROS2 Integration

ROS2 Whole-Body Control Interface

The K1 ships with a ROS2 bridge node that exposes all joints as a standard ros2_control hardware interface. This enables integration with MoveIt2, trajectory planners, and custom controllers.

Install ROS2 Humble

sudo apt update && sudo apt install software-properties-common curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | \
  sudo apt-key add -
sudo sh -c 'echo "deb http://packages.ros.org/ros2/ubuntu jammy main" \
  > /etc/apt/sources.list.d/ros2.list'
sudo apt update
sudo apt install ros-humble-desktop ros-humble-ros2-control \
  ros-humble-ros2-controllers ros-humble-joint-state-publisher-gui -y

Clone and build the K1 ROS2 package

mkdir -p ~/k1_ws/src && cd ~/k1_ws/src
git clone https://github.com/BoosterRobotics/booster_ros2.git
cd ~/k1_ws
source /opt/ros/humble/setup.bash
colcon build --symlink-install

Launch the K1 bridge

source ~/k1_ws/install/setup.bash
ros2 launch booster_ros2 k1_bringup.launch.py \
  robot_ip:=192.168.10.102

Inspect joint states

# List all available topics
ros2 topic list

# Stream joint states (22 joints at 500 Hz)
ros2 topic echo /joint_states
Step 3 — Joint State API

Reading and Commanding Joint States

The Python SDK provides direct access to all 22 joints. Always start in DAMP mode before commanding motion.

Connect and read joint states

from booster_robotics_sdk import BoosterRobot, RobotMode

# Connect to the robot
robot = BoosterRobot(ip="192.168.10.102")
robot.connect()

# Enter DAMP mode (safe, low impedance)
robot.set_mode(RobotMode.DAMP)

# Read full joint state
state = robot.get_state()
print(f"Mode: {state.mode}")
print(f"Joint positions (rad): {state.joint_positions}")
print(f"Joint velocities (rad/s): {state.joint_velocities}")
print(f"Joint torques (Nm): {state.joint_torques}")
print(f"IMU euler (deg): {state.imu_euler}")

robot.disconnect()

Command arm joint positions (CUSTOM mode)

CUSTOM mode allows direct joint-level control of the arm. Requires a lifting fixture — the robot must not be supporting its own weight. See the Safety page.

from booster_robotics_sdk import BoosterRobot, RobotMode, ArmCommand
import numpy as np

robot = BoosterRobot(ip="192.168.10.102")
robot.connect()

# Transition: DAMP -> PREP -> CUSTOM
robot.set_mode(RobotMode.DAMP)
robot.set_mode(RobotMode.PREP)
import time; time.sleep(3)  # Wait for PREP stabilization
robot.set_mode(RobotMode.CUSTOM)

# Command right arm to a target configuration (7 DOF)
# Joints: shoulder_pitch, shoulder_roll, shoulder_yaw,
#         elbow_pitch, wrist_pitch, wrist_roll, wrist_yaw
target = [0.0, -0.3, 0.0, 0.8, 0.0, 0.0, 0.0]
cmd = ArmCommand(side="right", joint_positions=target, kp=60, kd=2)
robot.send_arm_command(cmd)

robot.disconnect()

Head pose control

from booster_robotics_sdk import BoosterRobot, HeadCommand

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

# Head: yaw in [-90, 90] deg, pitch in [-40, 30] deg
cmd = HeadCommand(yaw_deg=15.0, pitch_deg=-10.0)
robot.send_head_command(cmd)

robot.disconnect()
Step 4 — Locomotion API

Locomotion API Basics

The K1's locomotion controller manages balance and gait autonomously. You command velocity targets; the onboard controller handles stability. Always have a spotter present.

Mode transition sequence

from booster_robotics_sdk import BoosterRobot, RobotMode, LocomotionCommand
import time

robot = BoosterRobot(ip="192.168.10.102")
robot.connect()

# Step 1: Enter DAMP (zero torque, safe to handle)
robot.set_mode(RobotMode.DAMP)
time.sleep(1)

# Step 2: Enter PREP (stand up to PREP posture)
robot.set_mode(RobotMode.PREP)
time.sleep(5)  # Wait for full PREP stabilization — do not skip

# Step 3: Enter WALK
robot.set_mode(RobotMode.WALK)
time.sleep(2)

Command locomotion (velocity mode)

# Walk forward at 0.3 m/s
cmd = LocomotionCommand(
    vx=0.3,    # forward/back (m/s), range: [-0.5, 0.5]
    vy=0.0,    # lateral (m/s),      range: [-0.3, 0.3]
    vyaw=0.0   # rotation (rad/s),   range: [-1.0, 1.0]
)
robot.send_locomotion_command(cmd)
time.sleep(2)

# Stop
robot.send_locomotion_command(LocomotionCommand(vx=0, vy=0, vyaw=0))
time.sleep(1)

# Return to PREP then DAMP
robot.set_mode(RobotMode.PREP)
time.sleep(3)
robot.set_mode(RobotMode.DAMP)
robot.disconnect()

Emergency stop in software

# Call from any thread — immediately enters DAMP mode
robot.emergency_stop()

Always prefer the hardware e-stop button for emergencies. The software e-stop is a backup only.

Optional — Simulation

MuJoCo Humanoid Simulation

The K1 URDF model is included in the SDK. Use MuJoCo to develop and test locomotion and manipulation policies before hardware deployment.

Install MuJoCo

pip install mujoco

Clone the K1 gym environment

git clone https://github.com/BoosterRobotics/booster_gym.git
cd booster_gym
pip install -e .

Run the walking simulation

python examples/walk_sim.py --render

Isaac Sim (advanced)

NVIDIA Isaac Sim provides GPU-accelerated parallel simulation for large-scale policy training. The K1 URDF imports cleanly into Isaac Sim 4.x. Requires an NVIDIA GPU (16 GB VRAM recommended) and Isaac Sim license. See the Humanoid Comparison article for simulation benchmarks.

Sim-to-Real Alignment — The K1 MuJoCo model includes calibrated inertia parameters and joint limits that match the real hardware. Policies trained in simulation can be deployed with minimal gain tuning.

Troubleshooting

Top 3 Issues for Humanoid Setup

Error 1 Cannot connect to K1: Connection refused / ping timeout

The most common issue. Almost always a network misconfiguration on the host PC side.

Fix:

# 1. Verify your PC's interface is on the correct subnet
ip addr show eth0
# Should show 192.168.10.10/24

# 2. Set it if not configured
sudo ip addr flush dev eth0
sudo ip addr add 192.168.10.10/24 dev eth0
sudo ip link set eth0 up

# 3. Ping the robot
ping -c 4 192.168.10.102

# 4. If ping fails, verify the K1 is fully booted
# The K1 takes ~60 seconds to boot. Look for the LED sequence
# to complete before attempting connection.
Error 2 Robot falls during PREP to WALK transition

The K1 requires at least 3 seconds in PREP for the balance controller to initialize. Transitioning too fast is the most common cause of falls during first setup.

Fix:

# Always wait at least 5 seconds in PREP before WALK
robot.set_mode(RobotMode.PREP)
time.sleep(5)  # Do not reduce this

# Verify PREP is fully active before proceeding
state = robot.get_state()
assert state.mode == RobotMode.PREP, "PREP not confirmed"

# Have your spotter positioned with the e-stop
robot.set_mode(RobotMode.WALK)
Error 3 ROS2 bridge fails: hardware interface not found

The ROS2 bridge cannot find the K1's hardware interface. Usually caused by missing packages or incorrect robot IP in the launch file.

Fix:

# 1. Install missing ros2_control packages
sudo apt install ros-humble-ros2-control \
  ros-humble-ros2-controllers -y

# 2. Rebuild the workspace
cd ~/k1_ws && colcon build --symlink-install

# 3. Source both ROS2 and your workspace
source /opt/ros/humble/setup.bash
source ~/k1_ws/install/setup.bash

# 4. Verify robot_ip matches actual K1 IP
ros2 launch booster_ros2 k1_bringup.launch.py \
  robot_ip:=192.168.10.102

# 5. Check the K1 is connected and responding
ping 192.168.10.102

Still stuck? Post in the SVRC Forum with your Ubuntu version, exact error message, and SDK version (pip show booster_robotics_sdk_python).

Software Working? Start Collecting Data.

Once the K1 is moving, the next step is whole-body teleoperation and demonstration recording.