## Introduction: Stewart Platform

We’re working on a project where we explore robotic body language as a way to augment/replace purely digital communication protocols. For this, we need to move a cellphone with as many degrees of freedom as possible. A robot arm would have been a good option, but for aesthetic reasons, we don’t want the mechanism to draw too much attention to itself. After a bit of research, we’ve settled on a structured called a Stewart Platform.

The Stewart Platform is a really amazing and versatile building block of robotics. It exists in many sizes and is used for many purposes. Lots has been written about it. But sometimes it’s hard to find a nice intro to the basic operation of its mechanism.

After reading a couple of papers and trying out a couple of different implementations, this is the one that worked for us.

## Step 1: Hardware: Modeling, Cutting, Printing and Assembling

We designed the platform using servo motors because they are easier to find and cheaper than linear actuators. The range of motion is a bit more limited, but we were designing for expressiveness and not so much for range.

Before cutting metal and programming motors, Radamés designed a version of our platform using Fusion 360 in order to get some intuition about the range of movements and motor positioning.

The materials we used were:

- 1x RaspberryPi (with 5V/2A power supply)

- 6x Dynamixel AX-12A motors

- 1x UART circuit (with 12V/6A power supply)

- 1x aluminum base

- 1x plastic platform

- 12x M3 ball joints

- 6x threaded rods

- 6x servo brackets

- 6x servo horns

- lots of tiny screws

The servo brackets and horns came with the motors we bought, but we also modeled them in case we needed replacement parts. Simpler acrylic pieces can be used to hold whatever object you need on top of the platform, but since we wanted to hold cellphones in an upright position, we ended up designing a custom platform. STLs are attached here. The servo horns can also be cut from 1/8” acrylic or wood using a laser cutter.

## Step 2: Testing

We tested our AX-12A library and motor driver circuit using one of the motors attached to our platform. We quickly realized that the servos on the platform can’t be driven independently of each other; in most cases, all six motors have to move simultaneously in order to achieve a desired position or pose.

This is a video showing how all the motors are affected when we drive only one motor up and down.

## Step 3: Math: Papers

Before we started sending signals to all the servos, we figured it would be worthwhile to get familiar with the mathematics of the Stewart Platform.

Unlike articulated robotic arms, the Stewart Platform’s inverse kinematics are simpler than its forward kinematics. What this means is that it’s easier to calculate the leg lengths and motor parameters given a desired position for the platform, than to calculate where the platform is located for a given set of motor parameters. This is fine; we really want the inverse kinematics anyway, and that way we avoid solving a system of 18 non-linear equations with 40 possible solutions.

Some of the papers that we found were not specific to servo-based Stewart Platforms; they simply described the math based on desired leg lengths, and sometimes assumed that linear actuators would be used. This is the case for this MICS journal paper, which describes a very specific Stewart Platform and focuses on its forward kinematics.

We also found two papers that were more specific for servos. This paper by Filip Szufnarowski describes the inverse kinematic problem very nicely, but it was this document by an unknown author from the Wokingham U3A Math Group that had the most detail and cleanest notation. For example, this image that labels all the relevant points of a Stewart Platform with their corresponding coordinate system.

## Step 4: Math: Joint Equations

The inverse kinematics problem of a Stewart Platform can be broken up into two stages:

(1) Given a desired position and orientation for the platform, how far is each joint on the platform from its corresponding base joint,

and

(2) What servo angles, if any, put each platform joint in the positions calculated in the previous step.

The first problem is easy to solve; once you have the appropriate points and coordinate systems defined like in the above image, the distances between base joints and platforms joints can be calculated with simple matrix operations for rotation and translation.

Namely, the length of each leg is calculated using the li equation in the image above. T is the translation vector between base coordinate system and platform coordinate system (where you want the platform to move), bi and pi are the locations of the joints in base and platform coordinate systems, respectively, and PRB is a rotation matrix describing how you want the platform to rotate. PRB is also described in detail in one of the images above.

## Step 5: Math: Length Equations

The second part of the inverse kinematics problem is a little bit trickier. For each servo, given a platform joint position P, relative to the base joint position B, and fixed lengths for the servo horn a and support leg s, what is the servo arm angle that satisfies the distance l calculated in the previous step.

Since l increases as you vary the servo arm angle from -90° to +90° (relative to base plane), one way to solve for this angle is to do a binary search over the angle values, and find the one that more closely satisfies all the distance constraints. This is done on the code for this Stewart Platform.

But, the Wokingham U3A Math Group document actually steps through the derivation of a closed-form expression for this angle, using some pretty sweet geometry, algebra and trigonometry tricks.

The form of the equation for the angle is shown in one of the images above (read the paper for the full derivation and definition of the variables).

We actually found a small bug in this part of the U3A document: instead of using the p values for the platform joint positions in the platform coordinate system, you have to use the q values, which are relative to the base coordinate system.

## Step 6: Math: Testing

We wrote a simple Stewart Platform simulator for our platform, to see the range of movements that it will be able to achieve, and to double-check the math. The code is in Processing, and is on github.

## Step 7: Controlling the Stewart Platform

Once the math was verified, it wasn’t hard to extend the code to get real-time communication going between the simulator and the platform. We used OSC to send motor angle packets to the RaspberryPi controlling the platform, and a bit of code to transform these angles into AX12-A motor commands. The code for controlling the motors using the simulator is on github.

Some of this initial controlled movement can be seen on the videos above.

## Step 8: Links

- Information about the overall project.

- Somerelevantblogposts.

- List of references.

- OtherPlatforms on Instructables.

## 47 Discussions

thanks for your shares. i have learnt much from it. but i have a question. i think when compute whether the platform can reach the commanded position/orientations, it should consider the angular limits in the joints, but i can not figure it. i would be appreciate if you can teach me how to compute the angular limits, is there any equation. thanks

Do you mean dynamically figure out joint limits based on actual and desired position? I think I tried to do that at some point, but gave up because the angle limits depend on how much your ball joints can rotate, and I didn't figure out how to model that. In the end, I think I set up some relaxed angle limits on the motors...

Thanks very much useful... got a small doubt..from my understanding Servo Base Angles and its beta are same..but in your code there are different values..

Is there something I am missing?

In one comment, as per his drawing you have told the written Base angle as beta..

Which variables in which code?

If I recall correctly, base angles are the positions of the center of the motors on the base, and betas are the directions which the motors face, relative to the center of the motors, but using the same frame of reference as the base angles.

Sorry for my incomplete question...Thanks for your reply..I understood what I missed after some research along with your explanation..I had been confused with the base and beta angles but now cleared...Thnks..

How did you compensate for the error in l generated per radian of rotation when the servo axis is not perpendicular to S? Would it be better to design a system where either the connecting rod was always in the same plane as the servo arm or beef up the math to calculate this angular error? I suppose the longer the connecting rods are the less this is a problem, but it would be a problem in a more squat system, no?

Looking at this image:

https://cdn.instructables.com/F5Q/C23K/I55MMXYX/F5QC23KI55MMXYX.MEDIUM.jpg

The servo horn 'a' doesn't have to be perpendicular to 's'. The math here computes the servo angle to make a valid triangle between 'l', 'a' and 's', but it doesn't have to be a right triangle:

https://cdn.instructables.com/FNG/4ZFP/I55NUFVG/FNG4ZFPI55NUFVG.MEDIUM.jpg

The important thing is to make sure the ball joints can move as much as possible to get to the positions calculated.

Hope this helps.

Hi Thiagohersan!

Is it possible if i use Law of Cosines to calculate α0? Because the servo horn "a" doesn't have to be perpendicular to "s".

Hi. Do you mean the angle between the leg and the plane of motion of the servo horn, to compensate for the fact that the leg is not always perpendicular to the plane of the base? Sure. Off the top of my head, I'm not sure how to solve for the servo angle in this "3D" version.

I wasn't talking about the angle between 'a' and 's'. The math shown does not account for the fact that the further that 's' is out of the plane of rotation of the servo arm the smaller the change is in 'l' for a given change in servo angle. In the extreme, if 's' is perpendicular to the plane of servo rotation (parallel to the servo axis) 'l' does not change at all for a change in servo angle. Do you see what I'm saying now? It seems to me that there would be significant binding and error in positioning at the extremes of travel and rotation of the moving plate.

Ahhh. Yes. You mean the plane defined by 'a', 'l' and 's', in relation to the plane defined by the servo arm movement.

The platform here has that error !! What can I say... I was young and naive... : )

But one way to deal with it is to make sure 'P' is as much above the servo as possible. So, not so much the length of the rods... but if the size of the top platform is comparable to the size of the base, it helps.

This is how the latest platform looks, not sure if it's clear, but the top platform has been extended to make sure the 'a' 'l' 's' triangle is more aligned with the plane of rotation of the servo horn:

http://i.imgur.com/JZgJOHU.jpg

what are the problems that we may face when designing Stewart Platform?

I am a polytechnic student in electric engineering , and really have no idea about

this platform.I even can't understand the mathematics. I really need your help .

Thank you so much!!!

Sometimes we get carried away with math, modeling and electronics and forget about the physical stuff. Make sure your motors can handle the weight you have to move. If you're using servos, make sure you have nice ball joints. Also, read the last couple of comments here about the size of the platform compared to the size of the base (make them similar if possible).

Did you read the document that explains the math? It's a good start.

Hello thiagohersan,

This project is really interesting, well done on successful building the platform!! :D

I have build my own prototype via the help of this project. I do, however, have one question which I am trying to get an answer to.

My platform can rotate around the XYZ axes nicely, however when the platform moves along the X, Y, Z planes, it does so while also rotating slightly.

To phrase the problem in another way:

If the platform is currently at

X=0, Y=0, Z=0;

R(roll) = 0, P(pitch) = 0, Y(yaw) = 0;

and I set the platform to move to:

X=10, Y=0, Z=0;

Instead of the R, P, and Y values staying at 0,

they change to something like:

R = 1, P = 4, Y = 1;

Would this be a mechanical fault (1), an error due to the servos being inaccurate (2) (I am using Chinese servos with no feedback on their position), or would it be in my mathematical model being incorrect (3)?

Thank you for reading this.

Milutin

Hi Milutix. Thanks for the kind words.

I think all 3 points you've raised are causes for small errors to add up to larger inaccuracies.

How do you measure R,P,Y after you give it a command to move ? Do you have feedback? I've noticed this on mine, but by looking. Never measured how far off it actually was.

What does your platform look like? If you read below, the issue raised by molvikpm, there is a mechanical modeling error in the sense that the plane defined by the motor horn and the leg is not perpendicular to the plane defined by the motion of the servo horn.

I've minimized this in a new platform by making the top platform and the base be the same size, and keeping the legs as "straight up" as possible. See this image:

http://i.imgur.com/JZgJOHU.jpg

Hope this helps.

Hello thiagohersan,

My platform is identical to yours in a mechanical sense, apart from the fact that the rods are no where near perpendicular to the motion of the servo horn. (It's similar to your "instructable" platform, not your newer improved version. :)

I was trying to increase the roll, pitch and yaw capabilities of the platform by making the platform much smaller than the base, so that each servo degree would affect the rotation of the platform by a larger magnitude.

Thank you for your reply.

I have had a look at molvikpm's comment and yes, it does seem that this is the problem that I am also experiencing. Looks like it is time to do some more math research and look into how to include this parameter in the calculations.

Thanks again! :D

Cool. If you figure out what the relationship is between size of platform and angle of rotation, or if you figure out a parameter to account for non-perpendicular rods.... let us know ! Good luck.

hi

what kind of sensors did you used?

where? for what? I don't think I'm using any sensors...

I have motors, sheet metal, rods, and lots of tiny screws....