A platform for UR-arm–based autonomous sample handling at synchrotron beamlines. Currently deployed at NSLS-II CMS; designed to generalize to other UR-based beamline setups.
The system pairs a UR5e with swappable end effectors, a Zivid 3D camera, and a ROS 2 / MoveIt Task Constructor stack behind a JSON task interface, so experiments can be authored manually, driven by an LLM over MCP, or — eventually — orchestrated by Bluesky.
Documentation: https://bondada-a.github.io/erobs/ — installation, operator guides, architecture, and the function reference. The docs are still being written and reviewed.
- Robot: Universal Robots UR5e 6-DOF arm (fixed 20 % velocity / acceleration scaling)
- Precision camera: Zivid 2+ 3D, eye-in-hand, single-shot (ArUco + contour detection)
- External camera: ZED stereo — present, not reliably wired up today
- End effectors (swappable via
tool_exchange): Robotiq Hand-E, Robotiq ePick (vacuum), OnRobot 2FG7, and a custom pipettor
- ROS 2 Jazzy on Ubuntu 24.04 (branch:
jazzy_dev, migrating to main;humble-devkept as legacy archive) - MoveIt 2 + MoveIt Task Constructor for planning
- Python orchestrator (
beambotpackage): one action server per task type plus a central orchestrator that tracks gripper state, manages MoveIt lifecycle across tool swaps, and batches consecutive simple tasks - JSON task format dispatched through
/beambot_execution— seesrc/beambot/beambot/agent/robot_operation.mdfor the authoritative schema, error taxonomy, and MCP tool reference (also loaded by therobot-operationClaude Code skill)
Four entry points — honest labels:
- PyQt6 GUI — primary manual interface.
ros2 run beambot_gui beambot_gui_client. Per-task dialogs, camera overlays, pose editor, experiment runner. Also hosts an experimental chat panel backed by thebeambot.agentmodule. - MCP + Claude Code — LLM-assisted operation.
./utils/start_mcp.shlaunchesrosbridge+beambot_bringup. Two MCP servers (genericros-mcp-serverand the custombeambot-mcp-server) expose task dispatch, vision, pose registry, and diagnostics to an LLM driving the robot..mcp.jsonwires them up for Claude Code. beambot.agentCLI — experimental. A direct Anthropic / Bedrock + MCP loop (python -m beambot.agent). Same system prompt as Claude Code, no Claude Code overhead. Parallel to path 2, not production-hardened yet.- Bluesky RunEngine — planned / currently broken.
src/bluesky_ros/holds an Ophyd device wrapper for the orchestrator but it has not been kept in sync with the current action set; running it end-to-end will fail. Targeted for revival.
| Path | What it contains |
|---|---|
src/beambot |
Orchestrator, per-task action servers, MTC task builders, MCP server, beambot.agent, detection algorithms, batch planner |
src/beambot_interfaces |
9 ROS 2 action definitions (BeambotExecution, MoveTo, EndEffector, PickSample, PlaceSample, ToolExchange, VisionTask, VisionScan, Pipettor) |
src/beambot_gui |
PyQt6 operator GUI (see its README) |
src/custom-ur-descriptions |
UR5e URDF/xacro and MoveIt configs (one generic config that branches per gripper) |
src/end_effectors |
Gripper drivers + epick_config overlay (README) |
src/vision |
External vision repos (Zivid; ZED listed but not currently launched) |
src/cms |
CMS beamline assets — poses.yaml and task JSONs. CMS is the live beamline; some paths are hardcoded here today |
src/lix |
Placeholder for LIX beamline |
src/demos |
hello_orchestrator_py tutorial package |
src/bluesky_ros |
Ophyd + Bluesky integration (see "How to interact" — currently broken) |
Prerequisites: ROS 2 Jazzy, MoveIt 2, Zivid SDK (for vision), Python 3.12.
These steps assume an already prepared ROS host, including colcon, vcstool and
rosdep. The separate setup.sh installs/imports declared dependencies from the
repository root; it does not install ROS/SDKs, build the workspace or select a
beamline.
git clone https://github.com/bondada-a/erobs.git
cd erobs
# Import external dependencies
vcs import src/end_effectors < src/end_effectors/end_effectors.repos
vcs import src/vision < src/vision/vision.repos
# Build
source /opt/ros/jazzy/setup.bash
colcon build
source install/setup.bashSee src/end_effectors/README.md and
src/vision/README.md for SDK and driver requirements.
From the repository root, select the deployment site in each terminal before launching:
# CMS example; use the configuration for your deployment site
export BEAMBOT_BEAMLINE_CONFIG="$(realpath src/beambot/config/cms_beamline.yaml)"
# Real hardware, vision + pipettor enabled (defaults)
ros2 launch beambot beambot_bringup.launch.py
# Mock UR hardware with camera and pipettor servers disabled
ros2 launch beambot beambot_bringup.launch.py \
use_mock_hardware:=true enable_vision:=false enable_pipettor:=false
# Disable vision/pipettor if those subsystems aren't plugged in
ros2 launch beambot beambot_bringup.launch.py enable_vision:=false enable_pipettor:=false
# Primary operator GUI
ros2 run beambot_gui beambot_gui_client
# MCP stack (rosbridge on :9090 + beambot_bringup + rosbag recording)
./utils/start_mcp.shbeambot_bringup.launch.py starts all action servers and the Zivid camera
(conditionally); the orchestrator launches MoveIt lazily on the first goal based on the
attached gripper. See CLAUDE.md for development architecture and
robot_operation.md for task and
robot-side troubleshooting details.
./test.sh # Hardware-free unit tests, including the offscreen GUI
./test.sh pure # Parser, batching, cache and geometry; no ROS required
./test.sh integration # Isolated ROS actions, model reload and process cleanup
./test.sh all # Unit and integration suitesUnit tests block ROS startup, subprocesses and external connections. Integration
tests use private localhost-only ROS domains, synthetic models and inert action
task builders; they never launch the robot or camera drivers. They do not validate
physical clearance, calibration, controller timing or hardware reliability.
Use the prepared Jazzy workspace for the full suite; pure needs pytest,
PyYAML, NumPy and OpenCV with ArUco support. Results are written under log/tests.
The deferred shutdown-child bug is exercised and reported as a known-issue skip,
not a pass; fixture or cleanup failures still fail the suite.
After building with BUILD_TESTING=ON, colcon test --packages-select beambot beambot_gui also discovers these tests. Do not run workspace-wide test discovery on
a hardware host: external driver packages have their own test requirements.
- EROBS documentation — full guides and function reference (work in progress)
CLAUDE.md— development brief auto-loaded by Claude Code (repo layout, build/test commands, invariants)src/beambot/beambot/agent/robot_operation.md— authoritative robot-operation reference: task JSON schema, MCP tool inventory, error taxonomy, gotchas (also loaded by therobot-operationskill)
BSD-3-Clause (NSLS-II / Brookhaven National Laboratory). See LICENSE
and LICENSE_README.