Bill of Materials (BOM)

Full hardware requirements for the standalone configuration.

Untethered Config
$1,247.27
Component Qty Cost (USD)
NVIDIA Jetson Orin Nano Super1$249.00
microSD Card1$11.23
Anker 4-in-1 USB-C Hub1$14.99
Feetech STS3215 Servos (12 V, ST-3215-C018)17$271.83
Servo Wire: 50’ 3-Color1$15.97
Waveshare Serial Bus Servo Driver Board2$21.10
Anker SOLIX C300 DC Power Station1$159.99
PLA Filament (3kg)1$45.00
M3 Screws and Nuts Set1$14.99
IKEA RÅSKOG Utility Cart1$39.99
4” Omni Wheels3$29.97
Intel RealSense D4351$333.75
USB-C to DC5521 Cable1$8.99
USB-C to DC5525 PD 140W Cable1$11.99
DC5521 Car Cigarette Lighter Cable1$9.49
USB-C to USB-C Cable (2 pcs)1$8.99
TOTAL Untethered XLeRobot-Pro $1247.27

These are the prices we paid, and they match the bill of materials in the paper. The total includes 3 kg of PLA ($45.00). It does not include the 3D printer, a VR headset for teleoperation, TPU filament for the Fin-Ray fingers, or a DisplayPort monitor and keyboard for the first boot. Prices vary by retailer and region.

Specifications That Matter

The list above tells you what to buy. This one tells you what to check before you buy it — every row here is load-bearing, and substitutions have specific failure modes.

ItemRequirementWhy it matters
Jetson Orin Nano Super Devkit 8 GB, carrier P3768 67 INT8 TOPS. The 8 GB module ran ACT, Diffusion Policy, and SmolVLA in the paper's timing tests.
microSD card 64 GB minimum, 128 GB advised, UHS-I, A2 The A2 random-IO rating is what keeps pip installs and model loads bearable. A full install lands near 50 GB, so 64 GB runs tight.
USB-serial adapters ×2 CH343 / CH9102 class (1a86:55d3) One per bus. Each needs its own barrel-jack power — they drive the bus transceiver off the servo rail, not off USB.
Feetech STS3215 ×17 12 V model (ST-3215-C018): 12 arm, 2 neck, 3 wheel Run them from the power station's 12 V outputs. On a 5 V feed they respond erratically or not at all, and give no visible sign of it.
Intel RealSense D435 USB 3.0 Bandwidth-hungry. Give it a port that is not shared with the motor adapters.
Power outlets Arms on the 12 V car outlet (rated 10 A); head and wheels on one USB-C outlet; Jetson on another The twelve arm servos are the largest load on the robot. Their torque setting keeps the estimated arm-bus current under a 5 A budget, half the car outlet's rating, and one arm peaked at 1.41 A in testing.
DisplayPort cable + USB keyboard — The carrier has DisplayPort, not HDMI. Needed for first boot only, but you cannot flash without it.
NVMe SSD (optional) M.2 2280, M-key, PCIe Gen3 Not in the paper's bill of materials. The demonstrations and the onboard training run in the paper fit on the microSD card.
THE USB HUB IS NOT FOR THE MOTOR ADAPTERS. Both USB-serial adapters must plug directly into the Jetson. Behind a hub — especially one shared with the RealSense — they frequently fail to enumerate, which looks like a dead bus rather than a USB problem. Use the hub for keyboard and other low-bandwidth peripherals only.
BUILDING IN THE US? PLAN ON MAKING YOUR OWN SERVO CABLES. The long 3-pin servo cables that daisy-chain the motors together are hard to source domestically — most US listings only carry the short lengths that ship with the servos, and the long runs you need for the wheel base and the neck are usually import-only with slow shipping.

That is why the BOM includes bulk 3-conductor servo wire rather than a set of finished cables: expect to cut and crimp your own to length. Budget the extra time, and pick up spare 3-pin connectors and a crimping tool while you are ordering — making them is straightforward, but not something you want to discover mid-assembly.

3D-Printed Structure

The frame is an IKEA RÅSKOG steel cart. The arms, neck, head, wheel-base mounts, and Jetson enclosure are printed. The BOM above covers the PLA; download the print files below and apply the settings further down this page.

Print Files

The full XLeRobot-Pro print set, laid out and ready to slice. Download the PrusaSlicer 3MF project or a single STL of the whole model. The 3MF already applies the tested settings: the 18 parts of the two arms carry 4 perimeters (High-Shell) and are labeled as such in the object list, and everything else uses the default profile. The Jetson enclosure is included; the Jetson mounting frame and an editable STEP file of the arm base are separate downloads.

You will need:

Print the soft finray gripper fingers in TPU95A.

TIP: Pre-dry PLA at ~45°C for 8 hours in humid environments. Wet filament causes stringing, weak layer adhesion, and poor thread/fit quality on structural parts.

Print Plates

The XLeRobot-Pro print set laid out across six build plates.

Print plate 1
Plate 1 · 9 parts
Print plate 2
Plate 2 · 8 parts
Print plate 3
Plate 3 · 15 parts
Print plate 4
Plate 4 · 10 parts
Print plate 5
Plate 5 · 14 parts
Print plate 6
Plate 6 · 4 parts

Print Settings

All parts in the paper were printed in PLA at 0.2 mm layers. The setting that matters most is the wall count on the arm links: adding perimeters made them much stronger, while adding infill did not.

IMPORTANT: Print structural parts vertically where possible, so the filament rows (layer lines) run along the load direction for stronger parts.
NOTE: The wheel-base connector may need Z scaling only to balance the load across the omni-wheels and cart wheels. Do not uniformly scale the part.
TIP: Print two follower arms for the dual-arm build — leader arms are only needed for leader-follower teleop. Batch the wrist-camera mount and your preferred gripper variant with the arm prints.

Any printer that handles PLA and TPU will do; the 3MF project is set up for a Prusa CORE One. PETG and carbon-fiber filaments were not tested. Build order and assembly steps are in the Build Guide.

Hardware/Software Interface

Before calibrating, make sure the Jetson sees both driver boards under stable names. detect_buses.py pings every ID on each port, works out which board is the arms bus (IDs 1–12) and which is the head and wheels bus (IDs 1–5), and prints the udev rules that name them.

Port Verification
$ python diagnostics/detect_buses.py
$ sudo udevadm control --reload-rules && sudo udevadm trigger
$ ls -l /dev/xle_arms /dev/xle_head