Robots · Robot arms

UFACTORY xArm 6 teleoperation: leader arms, servo control and clean training data

The xArm 6 is one of the most common arms in robot-learning labs: affordable, open SDK, ROS 2 out of the box. Getting precise, learnable demonstrations out of it is a different matter. Here is what works.

UFACTORY xArm 6, 6-axis lightweight cobot
AI-generated illustration of the UFACTORY xArm 6. For product photos, see UFACTORY.
Degrees of freedom
6
Payload
5 kg
Reach
700 mm
Repeatability
±0.1 mm
Max TCP speed
1 m/s (joints 180°/s)
Arm weight
12.5 kg
Robot communication
Ethernet; RS-485 Modbus RTU at the tool
Software
Python and C++ SDKs, ROS / ROS 2, UFACTORY Studio

Updated

The UFACTORY xArm 6 sits in a sweet spot for robot learning: a 700 mm reach and 5 kg payload, ±0.1 mm repeatability, an open Python SDK and maintained ROS 2 packages, at a price a lab can buy several of. That is why it shows up in so many teleoperation setups. It is also why teams run into the same three problems with it: the input device, the control loop, and getting the data into a training pipeline.

Four ways to drive an xArm 6 remotely

Every option below ends at the same place: a stream of joint or Cartesian targets sent to the arm through the xArm Python SDK or the xarm_ros2 driver. What changes is how natural the operator's motion is, and how learnable the resulting trajectories are.

Leader arm (GELLO-style)

A small, passive copy of the robot built from Dynamixel servos. The operator moves it and the xArm follows joint for joint. GELLO lists the xArm among its supported robots and talks to it through the xArm SDK. It gives the most natural demonstrations, because all six joints move at once, the way a person actually reaches. The trade-off: it is joint-space, so the operator has to sit with the leader, and it does not transfer to a different arm.

3D mouse or gamepad (Cartesian)

The xarm_ros2 packages ship a MoveIt Servo demo for jogging the arm with a 3Dconnexion SpaceMouse, an Xbox controller or the keyboard. A SpaceMouse moves X, Y and Z simultaneously, plus rotation, which matters more than it sounds: see the keyboard problem below. It also works the same on any arm, so one operator station can serve a mixed fleet.

VR controllers or hand tracking

A Quest or Vision Pro mapped to the end effector gives Cartesian control with depth perception, useful when the scene needs a 3D view. There is no official UFACTORY VR stack; teams build it on top of servo mode or MoveIt Servo, so budget integration time.

Keyboard and mouse

The quickest start, and the most common source of bad data. With a mouse for X and Y and keys for Z, the operator moves one axis at a time. Human reaching motions are never like that, and policies trained on the staircase trajectories that result tend to learn the staircase. If your model struggles on the Z axis, look at the input device before the model.

Why not just move the arm by hand? The xArm has a free-drive mode, which is gravity compensation with adjustable teach sensitivity, and kinesthetic teaching is a fine way to record coarse demonstrations. But a 12.5 kg arm being pushed by hand deflects and resists unevenly, and for tasks that need half-millimetre placement that error lands straight in your dataset. A leader arm or a 3D mouse keeps the operator's hand off the robot.

The control loop: servo modes, rates and latency

For teleoperation you want streaming control, not point-to-point moves. The SDK provides three families: servo streaming of joint angles (set_servo_angle_j) or Cartesian poses (set_servo_cartesian), joint and Cartesian velocity control (vc_set_joint_velocity, vc_set_cartesian_velocity), and online trajectory planning that re-plans smoothly when a new target arrives. Leader arms usually map to joint servo; 3D mice and VR map more naturally to Cartesian velocity. One catch: UFACTORY's servo mode guide recommends streaming at 50 to 200 Hz (250 Hz at most) and warns that below 50 Hz motion may not be continuous.

Most xArm learning setups record at 10 to 30 Hz, because that is what policies such as ACT, Diffusion Policy and smolVLA are typically trained at. That mismatch matters. If your policy or your recording loop runs at 20 Hz, either interpolate its targets up to 50 Hz or more on the robot side before calling servo mode, or switch to the online trajectory planning modes (6 for joints, 7 for Cartesian), where the controller plans between targets itself and the rate requirement is lower. At 20 Hz each control step is 50 ms, and that number also sets the latency budget for a remote operator:

Under ~50 ms round trip

The operator sees the result of a command within one control step. Fine insertion and sub-millimetre placement are realistic. In practice this means an operator in the same metro area as the robot, or close to it.

~100 to 200 ms

Two to four steps behind. Pick-and-place, sorting, wiping and most tabletop tasks stay fine; precise contact work gets slow and the operator starts to overshoot. Typical for operators one or two time zones away, or across the Americas.

Above ~250 ms

Direct teleoperation of fine tasks gets frustrating. Coarse motions with local safety limits still work, and supervising a policy (approve, correct, take over) works well.

Two things narrow the gap. First, run the operator's client close to the robot over a VPN instead of streaming a remote desktop: remote desktop re-encodes and buffers the whole screen, which adds delay you cannot tune away. Second, keep a local loop on the robot side that clamps velocity and smooths targets, so a delayed command never turns into a jerk. More on budgets by task in our latency guide.

Getting xArm data into LeRobot

LeRobot itself does not include an xArm driver: its built-in robots are the SO-series, Koch, OpenArm, Reachy 2, Unitree G1 and a few others. UFACTORY fills the gap with its own plugin, lerobot_robot_ufactory, which connects xArm 6 and xArm 7 to LeRobot and ships teleop modes for GELLO, a SpaceMouse, the Pika handheld tracker and UMI. It pins a specific LeRobot release, so check it matches the version your training code uses. Teams with a custom setup (extra cameras, a depth sensor, their own gripper) often write their own Robot class around the xArm SDK instead; it is a few hundred lines, and after that LeRobot recording, visualization and training work as usual.

Observation

Joint positions (and velocities if you use them), gripper state, and every camera: usually a wrist camera plus one or two scene cameras. If you add a depth camera, record it as its own stream rather than baking it into RGB.

Action

Decide once whether actions are joint targets or end-effector deltas, and keep it fixed for the whole dataset. Mixing them is the most common reason a dataset will not train.

Timing

Timestamp everything against one clock on the robot side. A remote operator adds network delay between command and observation; you want that delay visible in the data, not hidden by mismatched clocks.

Episodes

Same start pose, a clear success or failure flag, and a scene reset between attempts. Rerun is a good way to inspect episodes before they go into training.

There is public xArm data to compare against: the Hugging Face Hub has hundreds of datasets that mention the xArm, including lerobot/utokyo_xarm_pick_and_place, a real-robot set ported from Open X-Embodiment. Our data collection guide covers formats and quality checks in more depth.

What a good xArm operator does differently

Moves the way the policy should move: smooth, direct approaches, no hunting, no pauses mid-grasp that the model will copy.
Keeps the same strategy across episodes. Ten operators with ten grasp styles produce a dataset that averages to nothing.
Labels failures honestly and resets the scene the same way every time.
Respects the collision detection sensitivity you set, and stops rather than forcing a contact.
Reports drift: a camera nudged out of place, a gripper that has started to slip. Those ruin hundreds of episodes if nobody notices.

xArm 6, xArm 7 or Lite 6?

The xArm 7 adds a seventh joint, which gives the arm an elbow it can move without moving the gripper. It is useful for reaching around obstacles and for human-like bimanual setups, but it makes leader-arm mapping and inverse kinematics slightly more involved. The Lite 6 (600 g payload, 440 mm reach, ±0.5 mm repeatability per UFACTORY) is a cheaper desktop arm, good for teaching and coarse tasks but not for sub-millimetre work. For most single-arm manipulation datasets, the xArm 6 is the straightforward choice.

How RoboPilots runs xArm teleoperation

The arm stays in your lab. We agree the input device with you (your leader arm or 3D mouse, or one we set up), install the operator client on your side of a VPN, and train a dedicated group of operators on your unit and your task protocol before they record a single episode.

One-week trial

A short run on your robot sets the number that matters, clean episodes per operator hour at your latency. If we cannot hit the rate or the precision you need, we tell you that week rather than after a contract.

Coverage

Shifts in your time zone, including US Pacific hours. Most teams keep one person on site to reload parts and clear the workspace.

Data

Episodes cleaned and labeled by task and outcome, delivered in LeRobot, RLDS or HDF5, with the clean-sample rate written into the statement of work.

Interfaces, specs and sources

  • xArm Python/C++ SDK
  • ROS 2 + MoveIt 2
  • GELLO leader arm
  • SpaceMouse / gamepad
  • UFACTORY Studio
  • VR (custom)

Specs are the maker's published figures, checked on . RoboPilots is not affiliated with UFACTORY; product names are trademarks of their owners.

Frequently asked questions

Can you teleoperate an xArm 6 with a leader arm?
Yes. GELLO, the open-source low-cost leader arm, lists the xArm among its supported robots and drives it through the xArm Python SDK. A leader arm gives joint-for-joint control, which produces the most natural demonstrations for imitation learning.
Does LeRobot support the xArm 6?
Not in LeRobot itself, but UFACTORY publishes an official plugin, lerobot_robot_ufactory, that connects the xArm 6 and xArm 7 to LeRobot with GELLO, SpaceMouse, Pika and UMI teleop modes. Teams with custom hardware often write their own small Robot class around the xArm SDK.
Does the xArm 6 work with ROS 2?
Yes. UFACTORY maintains xarm_ros2, with branches for Humble and Jazzy among others, MoveIt 2 configurations, a ros2_control hardware interface and a MoveIt Servo demo for jogging the arm with a SpaceMouse, gamepad or keyboard.
What latency is acceptable for remote xArm teleoperation?
For data recorded at 20 Hz, under about 50 ms round trip keeps fine work precise. Pick-and-place tolerates 100 to 200 ms. Above roughly 250 ms, direct control of fine tasks becomes hard and supervising a policy works better.
Is the xArm 6 precise enough for sub-millimetre tasks?
UFACTORY specifies ±0.1 mm repeatability, so the arm itself can do it. The usual limit is the demonstration: hand-guiding in teach mode adds deflection, and keyboard control produces one-axis-at-a-time motion. A leader arm or 3D mouse with a low-latency link gets much closer.