The pick-and-place demo runs an autonomous loop that finds an AprilTag-marked object, picks it up using the vacuum gripper, and deposits it at a fixed drop-off point. The arm repeats the cycle indefinitely until you trigger theDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/MRRP-lab/arm-demos/llms.txt
Use this file to discover all available pages before exploring further.
/stop service or kill the process.
How it works
Pick-and-place cycle
Move to LOOK_ONE
The arm moves to the
LOOK_ONE joint pose — a position above the workspace that gives the wrist camera a clear view of the table.Detect tag_1
TagLookup.get_tag_pose() waits 1 second then takes two TF2 readings of tag_1 relative to base_link. If the readings are more than 3 mm apart in any axis the result is discarded and the arm returns to LOOK_ONE.Approach above the object
The arm moves to the detected tag position with a +5 cm Z offset (
APPROACH_OFFSET = 0.05) to clear the object before descending.Descend and pick
The arm moves straight down to the exact tag pose, then activates the vacuum gripper (digital output pin 0, ON).
Lift
The arm rises back to the approach height (+5 cm above the pick point) while the vacuum holds the object.
Lower and release
The arm descends to
DROP_OFF exactly, then deactivates the vacuum (digital output pin 0, OFF) to release the object.Key constants
Named joint poses
These joint configurations are used for safe transit between workspace regions:Speed profiles
All motion uses the OMPL planner. Two speed profiles are available:| Profile | Velocity scaling | Acceleration scaling | Used for |
|---|---|---|---|
slow | 0.1 | 0.1 | All pick-and-place motions |
fast | 0.3 | 0.3 | Available for transit (not used by default) |
Tag stability check
TagLookup rejects unstable detections before the arm commits to a pick:
Vacuum control
VacuumControl calls the /io_and_status_controller/set_io service to toggle a digital output:
finally block to prevent the gripper from holding an object if the demo is interrupted.
Stop control
TheStopControl node exposes a /stop Trigger service. Calling it sets stop_event, which causes the main loop to exit cleanly at the next opportunity, and immediately cancels any in-progress trajectory execution.
Prerequisites
ColmanBringup must be running before you start this demo. It brings up the UR robot driver,
ros2_control, and the AprilTag detection node that publishes TF frames for tag_1.Running the demo
- pixi
- ros2 launch
Launch arguments
| Argument | Default | Description |
|---|---|---|
gripper_type | vacuum | Gripper model to load in the URDF (vacuum is the only supported type) |
Stopping the demo
Call the/stop service from another terminal: