RobotStudio Digital Twin
A digital twin of a class workcell in ABB RobotStudio, with self-modeled equipment, a working gripper, ball physics, and a RAPID pick-and-place program.
- Role
- CAD, simulation logic, and robot programming
- Year
- 2025
- Status
- Complete
- Context
- EMSI 320 - Modern Automation
- Rev
- A
More views
Key numbers
- Balls placed
- 11
- Robot moves
- 67
- Made by me
- Everything but the robot
Overview
This is a digital twin of a class workcell, built in ABB RobotStudio. Everything in the station except the robot was made by me, including the table, the pedestal, the conveyor belts, the ball slides, the balls, and the gripper setup.
What I built
- CAD: I modeled the station’s components in SolidWorks and brought them into RobotStudio.
- Gripper logic: I programmed the gripper’s logic so it works the way it should when grabbing a ball.
- Ball physics: The balls behave physically, including bouncing, using RobotStudio’s physics controls.
- Robot program: I coded the robot in RAPID to pick the balls and place them on the cardboard tray in the order they appear.
Matching the real workcell
I took measurements in the lab so the model would match the real cell. The table and pedestal are modeled to their real dimensions, and the conveyor belts are exact copies of the ones in the lab.
The simulation isn’t perfect. Everything had to be done within a tight deadline, from taking the measurements to designing the ball slides and table to programming the robot.
The code
This is the start of the routine. PulseDO makes a new ball appear, Set Att attaches a ball to the gripper, and Reset Att releases it. It’s copied unchanged from the final program, and the download has the full version.
PROC Blue1()
PulseDO Blue;
Set di10_2;
MoveJ PickBlueBall,v400,fine,Grippa_1\WObj:=Pallet;
Reset di10_2;
Set Att;
MoveL Target_10,v400,fine,Grippa_1\WObj:=Pallet;
MoveL Target_20,v400,fine,Grippa_1\WObj:=Pallet;
MoveL Target_30,v400,fine,Grippa_1\WObj:=Pallet;
PulseDO Red;
MoveL PlaceBlueBall,v400,fine,Grippa_1\WObj:=Pallet;
Set di10_2;
Reset Att;
MoveL Target_40,v400,fine,Grippa_1\WObj:=Pallet;
MoveL Target_60,v400,fine,Grippa_1\WObj:=Pallet;
MoveL Pickred,v400,fine,Grippa_1\WObj:=Pallet;