# Unitree G1 Robot Setup and Control

This guide covers the complete setup process for the Unitree G1 humanoid robot, from initial connection to running locomotion policies.

## 🤖 About the Unitree G1

The Unitree G1 humanoid comes in two flavors: 29-DOF and 23-DOF humanoid robot capable of whole-body control, manipulation, and locomotion. In this first PR we introduce:

- **Low-level motor control** via DDS (Data Distribution Service)
- **ZMQ socket bridge** for remote communication over WiFi, allowing one to deploy policies remotely instead of over ethernet or directly on the Orin
- **GR00T locomotion policiey** for bipedal walking and balance

---

## Part 1: Connect to Robot over Ethernet

### Step 1: Configure Your Computer's Ethernet Interface

Set a static IP on the same subnet as the robot:

```bash
# Replace 'enp131s0' with your ethernet interface name (check with `ip a`)
sudo ip addr flush dev enp131s0
sudo ip addr add 192.168.123.200/24 dev enp131s0
sudo ip link set enp131s0 up
```

> **Note**: The robot's Ethernet IP is fixed at `192.168.123.164`. Your computer must use `192.168.123.x` where x ≠ 164.

### Step 2: SSH into the Robot

```bash
ssh unitree@192.168.123.164
# Password: 123
```

You should now be connected to the robot's onboard computer.

---

## Part 2: Enable WiFi on the Robot

Once connected via Ethernet, follow these steps to enable WiFi:

### Step 1: Enable WiFi Hardware

```bash
# Unblock WiFi radio
sudo rfkill unblock wifi
sudo rfkill unblock all

# Bring up WiFi interface
sudo ip link set wlan0 up

# Enable NetworkManager control
sudo nmcli radio wifi on
sudo nmcli device set wlan0 managed yes
sudo systemctl restart NetworkManager
```

### Step 2: Enable Internet Forwarding

**On your laptop:**

```bash
# Enable IP forwarding
sudo sysctl -w net.ipv4.ip_forward=1

# Set up NAT (replace wlp132s0f0 with your WiFi interface)
sudo iptables -t nat -A POSTROUTING -o wlp132s0f0 -s 192.168.123.0/24 -j MASQUERADE
sudo iptables -A FORWARD -i wlp132s0f0 -o enp131s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i enp131s0 -o wlp132s0f0 -j ACCEPT
```

**On the robot:**

```bash
# Add laptop as default gateway
sudo ip route del default 2>/dev/null || true
sudo ip route add default via 192.168.123.200 dev eth0
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

# Test connection
ping -c 3 8.8.8.8
```

### Step 3: Connect to WiFi Network

```bash
# List available networks
nmcli device wifi list

# Connect to your WiFi (example)
sudo nmcli connection add type wifi ifname wlan0 con-name "YourNetwork" ssid "YourNetwork"
sudo nmcli connection modify "YourNetwork" wifi-sec.key-mgmt wpa-psk
sudo nmcli connection modify "YourNetwork" wifi-sec.psk "YourPassword"
sudo nmcli connection modify "YourNetwork" connection.autoconnect yes
sudo nmcli connection up "YourNetwork"

# Check WiFi IP address
ip a show wlan0
```

### Step 4: SSH Over WiFi

Once connected to WiFi, note the robot's IP address (e.g., `172.18.129.215`) and disconnect the Ethernet cable. You can now SSH over WiFi:

```bash
ssh unitree@172.18.129.215
# Password: 123
```

---

## Part 3: Robot Server Setup

The robot server introduced here acts as a DDS-to-ZMQ bridge, allowing your one to control the robot wirelessly.

### Step 1: Copy Server Script to Robot

From your laptop, copy the robot server script:

```bash
# Copy the server script and its dependencies
scp src/lerobot/robots/unitree_g1/run_g1_server.py unitree@172.18.129.215:~/run_g1_server.py
scp src/lerobot/robots/unitree_g1/g1_utils.py unitree@172.18.129.215:~/g1_utils.py
```

### Step 2: Install Dependencies on Robot

SSH into the robot and install required packages:

```bash
ssh unitree@172.18.129.215

# Install build tools and Python dependencies
sudo apt update
sudo apt install -y build-essential python3-dev python3-pip

# Install Python packages (pyzmq and Unitree SDK)
pip3 install pyzmq
pip3 install git+https://github.com/unitreerobotics/unitree_sdk2_python.git
```

> **Note**: The Unitree SDK requires CycloneDDS v0.10.2 to be installed. See the [Unitree SDK documentation](https://github.com/unitreerobotics/unitree_sdk2_python) for details.

### Step 3: Run the Robot Server

On the robot:

```bash
python3 ~/run_g1_server.py
```

You should see output like:

```
Robot server listening on:
  Commands:  tcp://*:6000 (PULL)
  State:     tcp://*:6001 (PUB)
DDS initialized, forwarding started...
```

> **Important**: Keep this terminal running. The server must be active for remote control.

---

## 🚶 Part 4: Running GR00T Locomotion

With the robot server running, you can now control the robot from your laptop.

### Step 1: Install LeRobot with Unitree G1 Support (on your laptop)

```bash
pip install -e '.[unitree_g1]'
```

### Step 2: Update Robot IP in Config

Edit the config file to match your robot's WiFi IP:

```python
# In src/lerobot/robots/unitree_g1/config_unitree_g1.py
robot_ip: str = "172.18.129.215"  # Your robot's WiFi IP
```

### Step 3: Run the Locomotion Policy

```bash
# Run GR00T locomotion controller (downloads policies from HuggingFace)
python examples/unitree_g1/gr00t_locomotion.py --repo-id "nepyope/GR00T-WholeBodyControl_g1"

# Or use the default repo (same as above):
python examples/unitree_g1/gr00t_locomotion.py
```

The script will:

1. Download Balance and Walk policies from the Hub (cached locally after first run)
2. Connect to the robot server over WiFi/ZMQ
3. Initialize the robot and locomotion controller
4. Gradually move legs to default standing position (3 seconds)
5. Start locomotion control loop at 50Hz in background thread
6. Accept commands from the wireless remote controller

**Expected output:**

```
INFO - Loading GR00T Balance policy...
INFO - Loading GR00T Walk policy...
INFO - [UnitreeG1] Initialize UnitreeG1...
INFO - [UnitreeG1] Connected to robot.
INFO - Reached default position (legs only)
INFO - Locomotion control thread started!
INFO - Robot initialized with GR00T locomotion policies
INFO - Locomotion controller running in background thread
INFO - Press Ctrl+C to stop
```

### Step 4: Control with Remote

- **Left stick**: Forward/backward and left/right movement
- **Right stick**: Rotation
- **R1 button**: Raise waist height
- **R2 button**: Lower waist height

To stop, press `Ctrl+C` in the terminal.

---

## Additional Resources

- [Unitree SDK Documentation](https://github.com/unitreerobotics/unitree_sdk2_python)
- [GR00T Policy Repository](https://huggingface.co/nepyope/GR00T-WholeBodyControl_g1)
- [LeRobot Documentation](https://github.com/huggingface/lerobot)
- [Unitree_IL_Lerobot](https://github.com/unitreerobotics/unitree_IL_lerobot)

---

_Last updated: November 2025_
