Hardware

Last Updated: Sep 02, 2026

What is at your station: the arm, the gripper, the camera, and how it is all powered and connected.

Contents

Station Overview

TODO: photo of a full station and a short list of everything on it (arm, board, 24 V supply, camera frame, laptop).

UFactory Lite 6 Arm

The arm is a UFACTORY Lite 6, a 6-DOF collaborative arm with the control electronics built into its base — there is no separate controller cabinet. It is commanded over Ethernet from the station laptop using the xArm Python SDK.

Specification Value
Degrees of freedom 6
Reach 440 mm
Payload 600 g
Repeatability ±0.5 mm
Weight 7.2 kg
Max TCP speed 500 mm/s
Max joint speed 180 °/s
Power 24 V DC
Communication Ethernet
Tool flange ISO 9409-1-50

Joints

The six joints are numbered from the base outwards. You will see these numbers in the web interface, in the control station readouts, and in every error message the arm produces.

The Lite 6 with each joint labelled, Joint 1 at the base through Joint 6 at the tool flange

Each joint also has a sign convention — which way counts as a positive angle:

The Lite 6 with a plus and minus marked on each joint showing the positive direction of rotation

Check a joint’s sign here before you assume your maths is wrong. A forward-kinematics result that is right in magnitude but wrong in sign is usually a joint turning the opposite way to what you assumed.

Joint travel limits are not symmetric:

Joint Range
J1 ±360°
J2 ±150°
J3 −3.5° to 300°
J4 ±360°
J5 ±124°
J6 ±360°

J5 (±124°) and J3 (−3.5° to 300°) are the limits you will actually run into. An inverse-kinematics solution can be mathematically correct and still unreachable because it asks one of these joints to go somewhere it cannot. See the Lite 6 Arm & SDK Guide for how this shows up in the software.

The 600 g payload is the entire budget and the gripper counts against it, leaving very little for the object you are picking up.

Zero position

At the zero configuration — all six joint angles at 0 — the arm stands straight up, and the tool flange sits 87 mm out in x and 154.2 mm up in z from the base frame origin.

Line drawing of the Lite 6 at its zero configuration, dimensioned 87 mm in x and 154.2 mm in z from the base to the tool flange

These two numbers are a free check on your forward kinematics. Feed your FK all zeros and it should put the flange at (87, 0, 154.2) mm. If it does not, the error is in your DH table or your zero offsets, and it is much easier to find here than anywhere else.

The arm is otherwise unmodified for this course — the only change is the custom gripper on the tool flange.

The emergency stop is on the table next to the arm. Find it before you power the arm on. Safety rules for the lab will be covered by the staff in person.

Gripper / End Effector

The gripper is custom-built for this lab, mounted on the Lite 6’s ISO 9409-1-50 tool flange. It is commanded with the standard Lite 6 gripper calls — open_lite6_gripper(), close_lite6_gripper() and stop_lite6_gripper(); see the Lite 6 Arm & SDK Guide.

It is a binary open/closed device: no width control, no force control, and no feedback about whether a grasp succeeded.

TODO: mechanism description and photo, maximum block size it can hold, gripper mass (it counts against the 600 g payload), and the tool center point offset from the flange.

Power and Network

The Lite 6 has no separate controller cabinet — the control electronics are inside the arm’s base. Power comes from a 24 V power supply mounted underneath the board the arm is bolted to.

The arm talks to the station laptop over Ethernet, through a USB-to-Ethernet adapter. That adapter is what gives the laptop a second Ethernet port.

Item How it connects
Arm power 24 V supply mounted under the board
Arm data Ethernet → USB-to-Ethernet adapter on the laptop
Internet The laptop’s built-in Ethernet port
Camera USB 3.x to the laptop

Do not plug the arm into the laptop’s built-in Ethernet port. That port is reserved for internet access and sits on a different IP address and subnet. The arm must go through the USB-to-Ethernet adapter, or it will not be reachable.

Each arm has its own IP address, printed on a label on the back of the arm. You set it in the code during setup.

RealSense Camera

Perception uses an Intel RealSense LiDAR Camera L515. Unlike the stereo RealSense models, the L515 measures depth with a solid-state MEMS LiDAR, which gives it a clean, low-noise depth image at close range — well suited to looking down at blocks on a board.

Specification Value
Depth technology Solid-state MEMS LiDAR
Operating range 0.25 – 9 m
Depth field of view 70° × 55°
Depth stream used in this lab 1024 × 768 @ 30 fps
Color stream used in this lab 1280 × 720 @ 30 fps
Depth accuracy ~5 mm at 1 m
Connection USB 3.x (Type-C)
Size 61 mm diameter × 26 mm

The depth and color streams come from two physically separate sensors, so camera.py aligns depth to color before anything else. After alignment a pixel (u, v) means the same point in both images.

USB 3.x is required. On a USB 2 port the full-resolution profiles are unavailable and the camera will not stream at the settings the control station asks for. Check the connection type with rs-enumerate-devices -s.

The L515 is an indoor sensor — its LiDAR competes with ambient infrared, so strong sunlight degrades the depth image. It is also discontinued by Intel, which is why the lab pins librealsense to 2.54.2, the last version that supports it.

The camera runs in the Short Range visual preset. Without it the firmware discards depth closer than about 411 mm, which would blank out the near part of the workspace.

See the Camera Guide for the RealSense Viewer and calibration.

The camera is mounted on an aluminum frame above the arm, looking down at the board. Its aim is adjustable: loosen the screw with a hex key, rotate the camera to where you want it, then tighten the screw again.

Aiming the camera invalidates your extrinsic calibration. The calibration solves for where the camera sits relative to the robot, so any time you loosen that screw you have to run Calibrate again before world coordinates mean anything.

TODO: photo of the frame and the adjustment screw, and the approximate mounting height above the board.

Board and Workspace

The arm is mounted on a board carrying AprilTags at fixed positions.

Measure the board yourself. You need the grid spacing, the position of the robot frame origin, the direction of its axes, and the location of each tag relative to that origin. Those measured tag positions are exactly what goes into TAG_WORLD_POINTS in camera.py — your extrinsic calibration can be no better than these measurements, so take them carefully and record them in your report.


This site uses Just the Docs, a documentation theme for Jekyll.