Working with External Axes

6 mins read

In this tutorial I will show you how you can integrate external axes, like positioners, tracks and the like into your Fuzzy Studio projects. You will see how with just a little bit of setup you can simulate the motion of any external axis in Fuzzy Studio and make sure that your process trajectories are regenerated on the fly. Please not that these examples will all use asynchronous axis motion, which means the axes and the robot will not be moving at the same time. For example, if we have a part with two sides and we can only reach one side at a time with the robot, rather than adding a second robot, we will simply turn the part 180 degrees with a positioner (or turn-table).

Working with external axes.gif

Setting up our digital twin with the Scene Tree tool

Within Fuzzy Studio, any 3D object can be positioned and moved relative to another, or relative to a user defined Reference Frame. To do this we first add our objects to the scene using the Scene Panel.

All of these objects are currently position with respect to the World frame of reference (the center of the grid in the scene). This is fine for quick setups but as our projects get more complex it is useful to introduce relative positioning (i.e. where one part is positioned with respect to another object or reference frame). To give an example, here we want the engine block to sit on the positionner table, and when the table turns, we want our 3D engine block to turn as well – just as it will in real life when the real table turns.

To create these relationships we use the Scene Tree tool.

scene tree engine to table manual rotation.gif

As you can see, now my engine block is a child of my positioner and when I manually rotate the positioner so too does the engine block – voila!

This same principle can be used with tracks and pretty much any other moving parts.

As you can see, all objects in Fuzzy Studio move about their origins. These are typically set when creating the 3D model and can be modified if the origin is not practical for positioning purposes. For example, if the origin of my positioner is not at the center axis then when I rotate the object it will not stay “in place”.

center vs off center origins.gif

Using I/O to update object positions programmatically

Now that our simple scene is set up, it would be very impractical for a real setting to have to manually move our objects in the scene every time the real objects are moved. So to solve this problem, Fuzzy Studio allows you to configure custom inputs that will automatically set an object’s position relative to another object or another frame of reference.

To do so, we use the Exchange Table Configuration tool.

opening exchange table.gif

We then setup an input to rotate an object (as you can see there is also an input to move an object).

We start by deleting the default inputs that are configured for us and add our own Rotate object input. This input type has a few options. We want our table to rotate around it’s Zaxis and we are going to try to rotate by a certain amount of degrees each time this input is received. We will start by rotating with respect to the world reference frame just to see what happens.

configuring rotation input - world.gif

To use this input, we will use Node-RED to simulate a MQTT payload from a PLC. Checkout our getting started tutorial with Node-RED if you haven’t already.

Our MQTT message will simply by a 1 byte buffer of Int16 with the desired angle to rotate by. Here we simply use 10 degrees. When it’s received, the positionner should rotate by 10 degrees.

rotating around world.gif

As you can see we are not rotating around the positioner’s axis but rather around the world’s axis! This is not what we want. To rotate around the positioner’s axis we are going to use a Reference Frame.

Using reference frames

Reference frames allow us to set up arbitrary points of interest around our workcell which can be used for any number of purposes. Most commonly they are used to calibrate trajectories to real world positioning (since there is always a little error between our simulated digital twin and the real deal).

Fuzzy studio allows you to create and customize as many reference frames as your heart desires!

creating a rotation frame.gif

Here we add a reference frame that is coincident with the positioner’s origin. This way, we can rotate around this reference frame and it will be like we are rotating around the positioner’s origin – just like we want.

Fixing our input

We now need to go back to the Exchange Table tool and modify our input to rotate with respect to our newly created reference frame.

setting input config to a rotation frame.gif

Now when we try out our input with Node-RED we see that we have successful configured the rotation around the positioner axis. Yeehaw.

testing new rotation frame.gif

We can also use the option to set the rotation angle directly rather than rotating by a certain amount. This will be more useful for our purposes today so let’s reconfigure and test this.

testing absolute rotations.gif

That looks good! Now let’s try it out with some trajectories too.

Setting up a basic sequence of trajectories and axis motions.

We start by making sure the positioner is where we want it to start – at 0 degrees of rotation, and we generate our first process trajectories. Here we are simulating a deburring application. We won’t do all of the engine cylinders to save some time, but we do need to do both sides.


Once Traj 1 is finished we need to make it a child of the engine block object – so that it moves when the engine block moves.

traj1 child of engine.gif

Now when we go to rotate the positioner by 180 degrees manually, the trajectory will “stick” to the engine block. We then make our second trajectory, Traj 2 in the same way and attach it to the engine block as well.

Finally we can simulate our sequence of positioner rotations and deburring operations with a few more simple Node-RED nodes and a couple of inputs.

⚠️ One important thing to remember is that if we are using the rotate input in absolute terms (like we are here) then if we leave 0 for that input in our exchange table then the positioner will rotate to 0 degrees! We don’t want this, so we need to make sure to always include the desired positioner rotation in degrees every time we send a new exchange table buffer.

Working with external axes.gif

Now you are all set and the sky is the limit with what you can accomplish with these simple yet powerful tools!

Table of Contents

Ryan Lober

Ryan Lober

I believe that robots are amazing, and that more people should have access to them. Co-founding Fuzzy Logic has turned my passion for robots into my day job, and I consider myself lucky to have such an incredible career. My mission is to share knowledge and ideas that show people that industrial robotics doesn't have to be complicated or mysterious. Instead, that robots can be powerful tools that revolutionize their businesses.

Sales Inquiry?

Contact our sales and support team to get all the answers you need.


Stay up to date with the latest Fuzzy news.