R1 EDU Standard

FTC team getting-started guide

Hands-on session · Saturday, November 21, 2026 · 3:30–6:00 p.m. Mountain Time

First-session goal — Bring up the robot using its documented procedure, verify who controls it and how to stop it, then receive live sensor data in a program your team understands. If time and setup allow, observe one documented built-in action under operator control.

Start here · 10 minutes for everyone

Read the first-session goal above and the operating rule. Bring one question about the robot and one idea for how it could help tell a story or welcome visitors at an Artrageous event.

Programming pair. Bring one tested laptop, its charger, an Ethernet cable, and an adapter if needed. Run the laptop tests and save one successful output line. Everyone else can skip software setup.

Success on Saturday. Save five live orientation readings and notes another student can follow. If the robot or connection is unavailable, rehearse a short welcome on the laptop. Press Go to play a prerecorded line, then verify that Abort clears any queued cues.

Illustrated blue-and-white humanoid robot against a circuit-board backdrop

1. Know the robot

Item What to know before the session
Model Unitree R1 EDU Standard (U1). Confirm the hardware label and firmware on arrival so you can choose the matching manual and examples.
Onboard development The supplied specs list an expansion dock rated at 40 TOPS. Treat that as a compute rating. Verify the installed module, OS, and access before planning to run code onboard. Start with an external laptop.
Perception A binocular camera is listed. Camera streaming is a separate follow-up after basic connectivity works.
Arm payload The supplied specs list up to 2 kg per arm. Leave the arms unloaded during setup and initial operation.
Full-body product image of the blue-and-white R1 EDU humanoid
R1 EDU Standard
Product image

2. Before November 21

Session lead · Confirm with Artrageous before the visit

Operator and spotter · 25 minutes

Programming pair · Laptop setup and tests

Use one laptop with wired Ethernet. Native Ubuntu is the simplest option. A Windows laptop running Ubuntu in WSL 2 or VirtualBox can also work if it passes the wired test below.

Windows setup · WSL 2 or VirtualBox

Option 1 · Ubuntu in WSL 2

  1. Use Windows 11 version 22H2 or later for mirrored networking. Follow Microsoft’s WSL installation guide to install Ubuntu if needed. In PowerShell, run wsl -l -v and check that Ubuntu shows version 2.
  2. In Windows, open or create %USERPROFILE%\.wslconfig. Add the setting below under the existing [wsl2] heading, or add the heading if needed. Save your work in WSL, run wsl --shutdown in PowerShell, and reopen Ubuntu.
[wsl2]
networkingMode=mirrored
  1. Plug in the wired adapter. Set the wired IPv4 address in Windows and run ip -br addr in Ubuntu to confirm that the wired interface shows the expected address. Use the practice address for the test below and the documented R1 settings on site.

Mirrored networking supports the multicast traffic DDS uses for discovery. If the local exercise passes but the wired test fails, recheck mirrored mode, the Ethernet address, and the Windows or Hyper-V firewall rules that apply to WSL. Microsoft WSL networking

Option 2 · Ubuntu in VirtualBox

  1. Install Ubuntu in a VirtualBox VM. In the VM’s Settings → Network, enable an adapter and choose Bridged Adapter or Bridged Network. Select the Windows Ethernet port or USB-to-Ethernet adapter you’ll bring and confirm Cable Connected is checked.
  2. Start Ubuntu, run ip -br addr, and set the wired IPv4 address on the bridged interface inside Ubuntu. Use the practice address for the test below and the documented R1 settings on site. If you keep a second NAT adapter for downloads, temporarily disconnect it during the wired test so DDS uses Ethernet.

If the wired test fails, check that VirtualBox is bridged to the same physical adapter the cable is plugged into. Oracle VirtualBox bridged networking

Wired test · Use this for WSL 2 or VirtualBox

  1. Connect the laptop and a second computer with an Ethernet cable or an isolated switch. Use the cable and adapter you’ll bring. On this isolated link, use 192.168.50.10/24 for the laptop side and 192.168.50.11/24 for the second computer. For WSL, set the laptop address in Windows. For VirtualBox, set it in the Ubuntu guest. Temporarily disconnect Wi-Fi and VPNs on both computers so the example uses the wired link.
  2. With the Python SDK environment active on both computers, run python3 example/helloworld/subscriber.py in the Ubuntu environment you’re testing. On the second computer, run python3 example/helloworld/publisher.py. The subscriber should print Hello world messages. Unitree’s messaging example
  3. Save one received line and record which setup and adapter passed. Restore your usual network settings after practice. Receiving a message verifies that DDS crossed the wired link. The live probe will verify the robot’s telemetry on site.

3. Think like an FTC programmer

FTC Java concept R1 equivalent for this session
Driver Station and gamepad The Explore app handles setup tasks. The paired remote is the operator’s control during initial checkout.
hardwareMap The SDK binds to a network interface. DDS matches publishers and subscribers by domain, topic, and message type.
Reading an IMU in an OpMode Subscribe to robot state. A callback receives each new message. IMU roll, pitch, and yaw describe orientation about three axes.
Telemetry and logging Print a few timestamped or rate-limited samples. Treat stale data or a timeout as a failed connection check.
Autonomous state machine A later performance routine can use explicit states such as IDLE, READY, RUNNING, and ABORTED. Rehearse transitions with mock data first.

Use Python for the first SDK exercise. Your Java experience transfers directly to callbacks, typed messages, state machines, and debugging. If the team later wants a Java cue controller, it can send named cues to a small Python or C++ service that owns the robot connection. The public SDK repositories used here document Python and C++. Python SDK · C++ SDK

4. November 21 run of show

Battery plan. Unitree lists about one hour of battery life for the R1 EDU. Do laptop setup with the robot powered off where practical. Check charge at startup and again before telemetry. If time or charge runs low, skip the optional action and keep the 5:30 shutdown and handoff. Unitree R1 specifications

Mountain time Activity Checkpoint
3:30–3:50 Inspect the robot, identify revision and firmware, inventory the remote and support equipment, and clear the operating area. Review the matching stop and shutdown procedures. Operator and spotter agree on the stop procedure and know where everyone will stand.
3:50–4:20 Follow the matching startup procedure. Verify app and remote status, battery, and any alerts. With the robot in the documented safe configuration, verify the operator’s stop procedure as directed by the manual. The operator can explain what the stop mode does and how to recover or shut down.
4:20–5:00 Check battery charge and connect the laptop using the documented development port and network settings. Run the read-only probe while the operator keeps the robot stationary in the documented safe state. Save five IMU readings and note the interface, SDK commit, and firmware.
5:00–5:30 If time and charge allow, the operator can demonstrate one documented built-in action after verifying the controls and clearing the area. Otherwise, rehearse the welcome and Abort cues on the laptop. Document which capability was demonstrated or what blocked it.
5:30–6:00 Follow the documented shutdown and packing procedure. Write a handoff with what worked, the exact commands used, and the next test. Another student can repeat the connection and telemetry check from the notes.

Operating rule. Keep people outside the robot’s reach and fall area while powered. Use the support setup described in the manual when required. A stop mode can change how the joints support the robot, so verify the correct mode and support procedure before enabling motion. Pause if the stop behavior is unclear, a warning appears, or anyone enters the operating area. Leave firmware updates, calibration, scripted motion, and custom dance sequences for a separately planned session. R1 operation and remote manuals

5. First live code · Read the IMU

Use the matching development and debugging tutorial to identify the physical port and wired IP settings. In native Ubuntu or VirtualBox, apply those settings in Ubuntu. With mirrored WSL 2, apply them to the Windows Ethernet adapter. In every setup, use ip -br addr in Ubuntu to confirm the address and find the interface name for the script. Ask the operator to put the robot in the documented stationary setup for the test.

Save the following as read_r1_imu.py. It subscribes to the R1 example’s rt/lowstate topic using the unitree_hg message family. It creates only a subscriber and exits after five fresh observations or a timeout. The upstream R1 low-level example also writes motor commands and switches motion services. Use it as source reference only during this exercise. R1 message and topic reference

import argparse
import time
from queue import Empty, Queue

from unitree_sdk2py.core.channel import ChannelFactoryInitialize, ChannelSubscriber
from unitree_sdk2py.idl.unitree_hg.msg.dds_ import LowState_


def main():
    parser = argparse.ArgumentParser(description="Read five R1 IMU samples.")
    parser.add_argument("interface", help="Linux interface connected to the R1")
    parser.add_argument("--domain", type=int, default=0, help="DDS domain ID")
    args = parser.parse_args()

    samples = Queue(maxsize=1)

    def on_state(message):
        try:
            samples.get_nowait()
        except Empty:
            pass
        samples.put_nowait(tuple(message.imu_state.rpy))

    ChannelFactoryInitialize(args.domain, args.interface)
    subscriber = ChannelSubscriber("rt/lowstate", LowState_)
    subscriber.Init(on_state, 1)

    for index in range(1, 6):
        try:
            roll, pitch, yaw = samples.get(timeout=5)
        except Empty:
            raise SystemExit("No fresh state. Check the interface, DDS domain, and firmware.")
        print(f"{index}: roll={roll:.3f} pitch={pitch:.3f} yaw={yaw:.3f}", flush=True)
        if index < 5:
            time.sleep(0.5)


if __name__ == "__main__":
    main()

From the folder where you saved the script, activate your SDK environment and run the command below. Replace enp2s0 with the Ubuntu interface that faces the robot. Set --domain only if the matching documentation specifies a different DDS domain.

python3 read_r1_imu.py enp2s0

Look for five numbered readings. A sample line is 1: roll=0.100 pitch=0.200 yaw=0.300. Similar values are normal while the robot is stationary. Save the output for the handoff.

If you see… Check…
Import error Activate the environment used for the two-terminal exercise. Check which Python is running and review the SDK and Cyclone DDS installation.
No link or address Check the documented port, cable, adapter, interface selection, and laptop IP settings.
Network link but no samples Check the selected interface, subnet, DDS domain and message type against the matching documentation. Check whether a VM, VPN, or firewall is interfering with DDS discovery. A successful ping alone doesn’t establish DDS communication.
Warnings or inconsistent behavior Have the operator follow the manual’s stop or shutdown procedure. Record the alert and firmware version before retrying.

6. After the first visit

Handoff to capture — Hardware revision, firmware, confirmed accessories, app and remote status, shutdown outcome, laptop OS and SDK commit, working interface and DDS domain, sample telemetry, and the next test with an owner. Keep account credentials out of the handoff.