FabLab Seville
Robotic Hot-Wire Cutting Arm
At Fab Lab Sevilla, an ABB IRB 4600 robotic arm is installed on a linear track with an impressive length of 8 meters. So far, it has been mainly used for clay 3D printing, achieving very interesting results. At Fab Lab ETSAC Coruña, we have an ABB IRB 6620 robotic arm equipped with a spindle, which we primarily use for milling tasks. Some time ago, I built a hot wire cutting bow, which I documented during Wildcard Week.

My objective is to design a second version of this bow to be mounted on the Fab Lab Sevilla robot, documenting the entire process, with special focus on the control of the additional track axis.
Robot Arm Technical Specifications
Model: ABB 4600-60/2.05
Reach: 2.05 m
Load Capacity: 60 kg
- Workspace with floor-mounted installation
Pos. A Pos. B Pos. C Pos. D Pos. E Pos. F 2371 mm 1260 mm 1028 mm 593 mm 1701 mm 2051 mm

Axis Specifications
Axis Name Working Area Maximum Axis Speed 1 Rotation +180° to -180° 175 °/s 2 Shoulder +150° to -90° 175 °/s 3 Arm +75° to -180° 175 °/s 4 Wrist +400° to -400° 250 °/s 5 Inclination +120° to -125° 250 °/s 6 Swivel +400° to -400° 360 °/s Original Axis Calibration
Axis Resolver values 1 0.4203 2 1.4859 3 0.6596 4 0.5093 5 1.9657 6 3.6478 Maximum torque due to payload
Max wrist torque axes 4 & 5 Max wrist torque axis 6 Max payload 200 Nm 105 Nm 60 kg Maximum Cartesian design acceleration for nominal loads
E-stop m/s2 Controlled Motion m/s2 69 35 Dimensions IRB 4600-60/2.05
It is important to verify these geometric dimensions in order to configure the rotation points of each axis in the Robots plugin for Grasshopper.
Tool Flange Geometry

Synchronization marks and synchronization position for axes
Due to a failure in the 7.2V battery, which allows the robot to retain its position data, the robot lost its resolver/count configuration when powered off. After restarting, it was necessary to move each axis to its synchronization marks in order to update the counters.ℹ️It is important that each axis is moved to its mark always in the positive direction, in order to avoid loss of accuracy caused by gear backlash when rotating in opposite directions.
Label Description A Synchronization mark, axis 1 B Synchronization mark, axis 2 C Synchronization mark, axis 3 D Synchronization mark, axis 4 E Synchronization mark, axis 5 F Synchronization mark, axis 6 Note The two tips of the arrows should be inside the corresponding groove on the tilt housing when in synchronization position.
Calibration Steps (FlexPendant)
Move robot to calibration marks
- Use manual movement mode
- Start from axis 6 down to axis 1 (avoids using a ladder)
Update counters
- Go to:
Menu → Calibration → Update Counters - Select ROB_1 and Track_1 (rail)
- Tap Update
- Go to:
Restart the system
- Go to:
Menu → Restart
- Go to:
Create a backup
- Go to:
Menu → Backup/Restore - Insert a USB stick into the FlexPendant
- Select Backup current system
- Go to:
Track Technical Specifications
Model: ABB IRBT 2005
Lenght: 8,00 m
- Setting upper and lower software limits for the track
The upper and lower software limits of the track are software limits that prevent the track from being jogged beyond the mechanical limit of the track. They are the physical displacement distance from the zero position to the limit position in meters. This depends on the length of the track, and the location of the calibration pin (also referred to as the zero position of the track).⚠️A minimum distance of 20 mm should be used between where the software limit is set and the actual mechanical stop.
Example of correct values for the software limits
Track L (mm) Modules Travel L (m) Upper Joint Bound (m) Lower Joint Bound (m) 8230 8 6.85 6.35 -0.5
Changing the tracks limits
Open Control Panel
- Go to:
ABB Menu → Control Panel
- Go to:
Access Configuration
- Tap:
Configuration
- Tap:
Navigate to Motion settings
- Under Topics, select:
Motion
- Under Topics, select:
Select mechanical unit
- Tap:
Arm - Choose the corresponding mechanical unit (track)
- Tap:
Set joint limits
- Modify:
- Upper Joint Bound
- Lower Joint Bound
- Modify:
Save and restart
- Tap OK to save changes
- Restart the controller
Create a backup
- Go to:
Menu → Backup/Restore - Insert a USB stick into the FlexPendant
- Select Backup current system
- Go to:

Robots
To control the tool’s positioning and operate the robot in space, I will use Robots, a plugin for Rhino’s Grasshopper visual programming interface under the MIT Free License.
github visose Robots
The workflow in Robots starts by loading the libraries that define the robot’s specifications. At the School of Architecture in A Coruña, our robot is the IRB 6620, available from the Aarhus School of Architecture in Denmark. In the case of the Seville robot, I found the IRB 4600-60/2.05 at the University of Pennsylvania; however, its geometric definition contains a small positioning error on axis 6, which causes the tool flange simulation to be offset.

The IRBT 2005 track could not be found in the robot libraries, so I need to create both the geometry and the XML file to define the robotic system and the robot cells.
The IRBT 2005 track is not available in the robot libraries, so I need to create both the geometry and the XML file to define the robotic system and the robot cells.
In ABB RobotStudio, I created a station and checked the robot’s position on the track. I also exported the geometry of both the robot and the track in STL format.

Next, I imported the STL meshes into Rhinoceros and positioned each element in its correct location. This will be useful later for simulating the movements of the entire system.

It is also important to organize the layers of the different elements so they can be correctly interpreted by the Robots plugin in Grasshopper. The robot and track meshes must be arranged into sublayers, and each sublayer can contain only a single mesh.
In the case of the track, for example, the fixed rail I downloaded from RobotStudio was made up of multiple modules, so I had to join them in Rhinoceros to form a single element.

The same thing happened with the ABB logo on axis 3. It took me a while to realize this, which was quite frustrating, since Robots would only load the first element in each sublayer. As soon as I realized it, everything became much easier.
The instructions for correctly defining the robot and the track in the Robots plugin are available at this GitHub link. Here are a series of tips to help with defining the XML file:
- The robot meshes must be placed in sublayers 0, 1, 2, 3, 4, 5, 6, each corresponding to a rotation axis; layer 0 contains the graphical definition of the base.
- I positioned the base of the IRB4600-60/2.05 robot at point 0,0,0; its final position
x,y,zon the track will be defined later in the XML file. - The track meshes must be placed in layers 0 and 1. I positioned the lower-left corner of the IRBT 2005 at point
0,0,0. The position of the robot carriage table along the track will be defined later in the XML file. - The parent layer names that define the robot and the track, Track.ABB.IRBT2005 and RobotArm.ABB.IRB4600-205, must match the names defined in the XML file. Otherwise, you may encounter issues and the geometric definition of the robot cell may not load.
<RobotSystems>
<!-- ROBOT + TRACK 20.03.2026 -->
<RobotCell name="Seville IRB4600 IRBT2005" manufacturer="ABB">
<Mechanisms group="0">
<!-- ROBOT MOUNTED ON THE TRACK -->
<RobotArm model="IRB4600-205" manufacturer="ABB" payload="60">
<Base x="824.500" y="292" z="460" q1="1.000" q2="0.000" q3="0.000" q4="0.000" />
<Joints>
<Revolute number="1" a="175" d="495" minrange="-180" maxrange="180" maxspeed="175" />
<Revolute number="2" a="900" d="0" minrange="-90" maxrange="150" maxspeed="175" />
<Revolute number="3" a="175" d="0" minrange="-180" maxrange="75" maxspeed="175" />
<Revolute number="4" a="0" d="960" minrange="-400" maxrange="400" maxspeed="250" />
<Revolute number="5" a="0" d="0" minrange="-125" maxrange="120" maxspeed="250" />
<Revolute number="6" a="0" d="135" minrange="-400" maxrange="400" maxspeed="360" />
</Joints>
</RobotArm>
<!-- TRACK -->
<Track model="IRBT2005" manufacturer="ABB" payload="1000" movesRobot="true">
<Base x="0.000" y="0.000" z="0.000" q1="1.000" q2="0.000" q3="0.000" q4="0.000" />
<Joints>
<Prismatic number="7" a="0" d="0" minrange="0" maxrange="6500" maxspeed="1890" />
</Joints>
</Track>
</Mechanisms>
<IO>
<DO names="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16" />
<DI names="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16" />
<AO names="1,2,3,4" />
<AI names="1,2,3,4" />
</IO>
</RobotCell>
</RobotSystems>In the images with the robot’s geometric description, you can verify the values of x, y, and z, as well as all the a and d values for each axis.
In the case of the track, you can additionally control the quaternion values q1, q2, q3, and q4 to adjust the robot’s rotation relative to the track.
The minrange and maxrange values should match the software configuration set on the FlexPendant described above.
Hot wire cutting tool
The next step is to further develop the design of the bow I used during Fab Academy. The objectives I have set are the following:
- The connections between the robot flange and the different elements of the bow will be made using 3D-printed parts.
- The wiring that supplies electricity to the nichrome wire will be arranged in the least intrusive way possible.
- The tensioning system from the first version will be replaced by a more logical solution, using a spring aligned with the nichrome wire.
- A head will be designed to accommodate an LED strip indicating whether the wire is on or off.
- A custom PCB will be designed to control the activation and deactivation of the bow directly from the RAPID code.
- The activation and deactivation of the wire will be controlled by inserting the necessary instructions into the RAPID code generated by Robots.
Tool definition To form the bows that will support the wire, a series of plywood strips with a cross-section of 20×30 mm will be used. There are a good number of leftover bars available from previous projects at Fab Lab Sevilla.
The connection piece to the robot flange, as well as the joints that ensure the rigidity of the connections between the side bars, have been designed in Rhinoceros and Grasshopper.

WIP 20.03.2026

Work in progress…. updating
Next, I defined the tool to simulate the robot’s positioning accurately, identifying any geometric incompatibilities. I simplified the geometric model provided by the HST spindle manufacturer in STP format and the wooden arc, increasing their overall dimensions by 25 mm as a safety margin to prevent unwanted contacts.
After mounting the tool on the robot’s flange, the maximum cutting dimensions of the hot wire cutter are 900 mm in width and 640 mm in height, although we must maintain a safe distance from these maximum values during operation.
Finally, in this initial stage, I need to establish the working envelope to limit the robot’s movement and avoid interferences within the workspace.
The cutter was manufactured in our CNC router using 16 mm thick phenolic plywood and threaded rods.
One of its side bars can rotate at its connection point with the horizontal bar, and its end is spring-actuated to maintain the correct tension on the cutting wire. This adjustment compensates for the elongation caused by the heat generated from the electrical current flowing through the wire.

This current creates a Joule effect, where electrical energy is converted into heat. I will use a 0.4 mm diameter nichrome wire. Nichrome is an alloy of nickel and chromium, capable of reaching high temperatures without oxidizing or melting. The power source for this setup is a Velleman DC LAB LABPS3005N power supply.
Hot wire cutting

Foam Cutting Process with the Robotic Arm
Once the seat section was defined, I needed to adapt the available space around the robot to allow the movement of the arc without colliding with the rotary table positioned next to it. I could have placed the foam block on top of the table, but I found it more suitable to position it on the floor to have more vertical movement clearance. In the future, the robotic arm will be relocated to a space with greater height, but for now, I have to work with the existing conditions.
After running several tests, I decided to rotate the block 60º with respect to the line connecting the center of the robot and the center of the table. In Robots, I had to adjust the axes’ rotation to align them with the desired position as the origin.

In Rhinoceros, I positioned the foam block and the seat profile to match the angle defined in the previous step. On the floor, I placed a 4 mm extruded polystyrene sheet, on which I marked a series of guide lines to facilitate the proper placement of the foam block.
TCP Definition and Target Setup in Robots
In Robots, I need to define the position and orientation of the X, Y, and Z axes of the Tool Center Point (TCP) concerning the robot’s flange. I positioned the origin at the midpoint of the wire. Two of the axes are defined by the plane that contains the wire and the arc, while the third coordinate axis is perpendicular to that plane, all passing through the midpoint of the wire. The position and orientation of the arc follow the planes located at each waypoint, defining the target in Robots.
Input Parameters for Each Target
- Plane — Target plane
- M (Text) — Type of motion: Joint or Linear
- T (Tool) — Tool or end effector (Hot Wire)
- S (Speed) — Speed of the robot in mm/s
- Z (Zone) — Approximation zone in mm (Defines the accuracy level for the wire’s waypoint proximity)
Speed and Power Configuration
The speed depends on the material and the current, ensuring the material melts just before the wire reaches it. It is crucial to guarantee smooth movement. If the speed is too high, the wire might lag behind the arc, causing incorrect cuts. In this case, trial and error is essential. For the expanded polystyrene used in these initial tests, I defined the following parameters:
- Speed Travel: 100 mm/min
- Cut Travel: 4.5 mm/min
The power supply provides 25 V and a maximum of 3 A.

In Grasshopper, I used the Rotate3D node along with sliders to conveniently orient the positions of each point and create the targets that will define the trajectory.
Initial Positioning Strategy
First, I defined a strategy to position the wire at its starting point. This initial path is executed with the wire turned off and without placing the foam block.

When the robot stops, it becomes easy to mark the lines where the foam block should be positioned.
This ensures precise alignment with the wire’s trajectory, optimizing the cutting path and minimizing positioning errors.

Foam Block Positioning and Cutting Path Definition
Once the foam block is properly positioned, I need to prepare the cutting path for the robotic arm. Starting from the home position, I defined the following targets:
Wire approach to a safe position.
- Positioned 100 mm above the initial Z cutting height.
- Movement executed at travel speed.

Cut start point.
- Horizontal movement towards the first point of the seat profile.
- Maintains a 50 mm safety distance.
- Executed at cut speed.
Seat profile cutting.
- The curve was subdivided into 100 points to create 100 targets, ensuring a smooth trajectory.
- Executed at cut speed.

Wire exit point
- From the final point of the curve, I defined a single exit point matching the cut start position.
- This approach caused an error during the path execution, as we will see later.
Intermediate points are necessary to ensure a perfectly horizontal wire movement.
If these points are not defined, the robot’s kinematics generate a curved path between the entry and exit points.
In the image below, I have updated the target points to generate the correct cutting trajectory for the hot wire attached to the robotic arm. This adjustment ensures that the wire follows a precise and continuous path when cutting the foam blocks, avoiding undesired transitions between segments.
Movement to a safe position.
- Executed at cut speed.
Return to home position.
- Movement executed at travel speed.
Path compilation and simulation
All the targets were merged in the correct order and sent to the program and simulation modules in Robots. This allowed me to visualize the robot’s position at each point and generate an animation of the wire’s movement.

Robots simulation
Hot wire cutting
The cutting process was successful, except for a minor error in the lower path. This issue can be easily resolved by adding intermediate targets between the initial and final points of the profile curve.

As soon as the foam blocks I ordered arrive, I will proceed to manufacture the nine seats for the bending bench of my final project.

Final thoughts
I was eager to document the work with the robotic arm, and the Wildcard Week turned out to be the perfect opportunity to do so. Additionally, I took advantage of this week to create the seats for my final project.
Initially, I considered a simple wooden plank as the seating surface. Later, I planned to mill a seat with a complex surface, but eventually, I believe the design I achieved not only provides comfort but also gives a completely different aesthetic to my final project.
During this week, I also made significant progress with the development of my final project: I assembled and installed the LED panel and updated the project schedule to stay on track for the public presentation on June 10th.
Files
IRB 4600-60/2.05 & Track IRBT 2005 3dm and xml definition. zip