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
- Contents
- Station Overview
- UFactory Lite 6 Arm
- Gripper / End Effector
- Power and Network
- RealSense Camera
- Board and Workspace
- Reference Links
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.
Each joint also has a sign convention — which way counts as a positive angle:
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.
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.