6dof (Six-Axis hexapod) with complete 3D motion

SPOT ON! :open_mouth:

amazing! :confused:

you just spoiled it. :frowning:

lol.

LOL :smiley:
sry :neutral_face: but… wasn’t it a contest?

lol.

Well im quite amazed at your guess.

more on this shortly. :wink:

WOW, iv been looking into solving the Stewart Platform Forward Kinematics. there is loads of info on the equations used to solve the platform position and orientation, but there are too many numbers for me. even a few symbol’s iv never seen before!? :confused: :blush:

There are a few kinematic solvers out there but they come at a cost. it seems many people have used METLAB to solve these problems.

Written in “C”
forums.trossenrobotics.com/tutor … tics-3276/

[code]// robot geometry
// (look at pics above for explanation)
const float e = 115.0; // end effector
const float f = 457.3; // base
const float re = 232.0;
const float rf = 112.0;

// trigonometric constants
const float sqrt3 = sqrt(3.0);
const float pi = 3.141592653; // PI
const float sin120 = sqrt3/2.0;
const float cos120 = -0.5;
const float tan60 = sqrt3;
const float sin30 = 0.5;
const float tan30 = 1/sqrt3;

// forward kinematics: (theta1, theta2, theta3) -> (x0, y0, z0)
// returned status: 0=OK, -1=non-existing position
int delta_calcForward(float theta1, float theta2, float theta3, float &x0, float &y0, float &z0) {
float t = (f-e)*tan30/2;
float dtr = pi/(float)180.0;

 theta1 *= dtr;
 theta2 *= dtr;
 theta3 *= dtr;

 float y1 = -(t + rf*cos(theta1));
 float z1 = -rf*sin(theta1);

 float y2 = (t + rf*cos(theta2))*sin30;
 float x2 = y2*tan60;
 float z2 = -rf*sin(theta2);

 float y3 = (t + rf*cos(theta3))*sin30;
 float x3 = -y3*tan60;
 float z3 = -rf*sin(theta3);

 float dnm = (y2-y1)*x3-(y3-y1)*x2;

 float w1 = y1*y1 + z1*z1;
 float w2 = x2*x2 + y2*y2 + z2*z2;
 float w3 = x3*x3 + y3*y3 + z3*z3;
 
 // x = (a1*z + b1)/dnm
 float a1 = (z2-z1)*(y3-y1)-(z3-z1)*(y2-y1);
 float b1 = -((w2-w1)*(y3-y1)-(w3-w1)*(y2-y1))/2.0;

 // y = (a2*z + b2)/dnm;
 float a2 = -(z2-z1)*x3+(z3-z1)*x2;
 float b2 = ((w2-w1)*x3 - (w3-w1)*x2)/2.0;

 // a*z^2 + b*z + c = 0
 float a = a1*a1 + a2*a2 + dnm*dnm;
 float b = 2*(a1*b1 + a2*(b2-y1*dnm) - z1*dnm*dnm);
 float c = (b2-y1*dnm)*(b2-y1*dnm) + b1*b1 + dnm*dnm*(z1*z1 - re*re);

 // discriminant
 float d = b*b - (float)4.0*a*c;
 if (d < 0) return -1; // non-existing point

 z0 = -(float)0.5*(b+sqrt(d))/a;
 x0 = (a1*z0 + b1)/dnm;
 y0 = (a2*z0 + b2)/dnm;
 return 0;

}

// inverse kinematics
// helper functions, calculates angle theta1 (for YZ-pane)
int delta_calcAngleYZ(float x0, float y0, float z0, float &theta) {
float y1 = -0.5 * 0.57735 * f; // f/2 * tg 30
y0 -= 0.5 * 0.57735 * e; // shift center to edge
// z = a + by
float a = (x0
x0 + y0y0 + z0z0 +rfrf - rere - y1y1)/(2z0);
float b = (y1-y0)/z0;
// discriminant
float d = -(a+by1)(a+by1)+rf(bbrf+rf);
if (d < 0) return -1; // non-existing point
float yj = (y1 - ab - sqrt(d))/(bb + 1); // choosing outer point
float zj = a + byj;
theta = 180.0
atan(-zj/(y1 - yj))/pi + ((yj>y1)?180.0:0.0);
return 0;
}

// inverse kinematics: (x0, y0, z0) -> (theta1, theta2, theta3)
// returned status: 0=OK, -1=non-existing position
int delta_calcInverse(float x0, float y0, float z0, float &theta1, float &theta2, float &theta3) {
theta1 = theta2 = theta3 = 0;
int status = delta_calcAngleYZ(x0, y0, z0, theta1);
if (status == 0) status = delta_calcAngleYZ(x0cos120 + y0sin120, y0cos120-x0sin120, z0, theta2); // rotate coords to +120 deg
if (status == 0) status = delta_calcAngleYZ(x0cos120 - y0sin120, y0cos120+x0sin120, z0, theta3); // rotate coords to -120 deg
return status;
}[/code]

My thoughts are that i should be looking to write the codes with the following labels or inputs:
**
base coordinate inputs from centre
platform coordinate inputs from centre
platform position and orientation constraint inputs
leg length data
**

anyway, i think i may have a brake through or shall we say i cheated the system and i have managed to get it working with Xans infamous Phoenix code! :wink:

standby… :astonished:

Interesting find!

However, you’ll notice that the geometry of the Delta 'bot is quite different from the Stewart Platform!

Alan KM6VV

I saw this info about a 6 DOF plattform also using servo motors instead of linear actuators. scs-europe.net/conf/ecms2007/ecms2007-cd/ecms2007/ecms2007%20pdf/is_0042.pdf.

But do you really need exact IK for controlling your “puppet”?
Have you tried a combination of group control and mixing for controlling the servos?

Thanks for the link. very interesting.
im not looking for precision. i mean i am using hobby servos after all.

i could very easily run Sequencer or something to get the servos moving to positions but i think it would make it more fun to be able to control it using the PS2 with a fully integrated code. my set up may also be extreme by using the SSC and AtomBB but i do plan to add a few other peripherals to the mix including sensors and other servos.

i may also add dampening to the rods by having servo saver horns.

servo saver horns?

Alan KM6VV

spring mounted horn that allows shock to be absorbed without putting to much force on the horn.

something else iv been thinking about is to run the Platform though a Waldo-telemetry system but building a secondary Six-Axis out of modified Pots.
This way ill get a more natural set of movements,plus the combination of
“Animatronic puppetry” “Stewart Platform Technology” and “Telemetry Control”

also less of a headache! :wink:

Thanks for the pix, I haven’t seen it before.

That could work!

For our medical robot, the master manipulators (7 axis) are weakly driven (real DC) servos commanded to a floating (Gravity Compensation) or neutral position. Then the operator moves the left and right hand manipulators which easily overdrives them. Their positions are all reported via dual encoders per axis to the system which then does a mass of calculations and transforms to position the end effectors (medical instruments) on up to four arms on a remote patient cart.

I’m wondering if you could similarly use modified servos in your masters. You would have to connect to the pots anyway; so you could split off the logic voltage in the R/C servos and give them 5 V, which would allow you to run the motors in the R/C servos down at perhaps 2-3 V, and thus give them a very weak, override-able torque. You’d then command them to a “neutral” balance point (platform up and level?). then you’d be able to move your masters, read the pots, record and command the Slave manipulators (Stewart Platform).

Supplying a regulated logic and sensor (pot) voltage would also improve the “jitters”.

Alan KM6VV

some interesting stuff there Alan. thanks for sharing

Slave manipulators (Stewart Platform) is built as you know but i have just started constructing the Master controller or Telemanipulator. i had 4 modified pots sitting about already but ill have to order another 2 soon. i have tested the code. the platform moves as told to and looks very cool. i will post images when iv ordered, modified and installed the other servos.

for more info on the process of making a servo into an output here is how:
viewtopic.php?f=6&t=4362&p=70743#p70743

now to work on the Puppet!

Oh yeah, I remember when that topic came up.

an R/C servo is a terrible thing to waste…

I’d like to see how well the gravity comp would work with a “weak” R/C servo as a master.

I wonder if one could attach a 3-Axis accelerometer as the end effector of a master, and “drive” it around to determine the amount of GC needed in the work envelope?

You want the master to stay where put, and provide minimal resistance to movement. Although incorporating Haptic feedback would really enhance the “Waldo” experience!

Alan KM6VV

Alan KM6VV

i haven’t soldered the motor wires together as the resistance would be too much and id end up with an aching wrist. The servo gears have enough resistance to allow for the Master to hold position. in fact it does still require a bit of force but im getting a nice flow of movement.

im using the Cheapo Hitec HS-311 servos for the pots. and i had a few 475’s laying about too.

Maybe that’s why no one has bothered to do it before. Too much resistance (drag).

It’s really cool to see the masters dance around when they build and test the Surgeons Consoles, and the slaves on the Patient Carts as well!

Alan KM6VV

**On the Left is the SLAVE and on the Right is the MASTER
**
http://i531.photobucket.com/albums/dd355/innerbreed/SAM_0422.jpg

Just some images of the mod: (Using a 475 servo)
Remove the back of the servo. i tend to keep one of the screws in as it help to keep the casing together.
http://i531.photobucket.com/albums/dd355/innerbreed/SAM_0418.jpg
http://i531.photobucket.com/albums/dd355/innerbreed/SAM_0419.jpg

Removed the board and resoldered RED-RED / YELLOW-YELLOW / BLACK-GREEN
http://i531.photobucket.com/albums/dd355/innerbreed/SAM_0420.jpg
http://i531.photobucket.com/albums/dd355/innerbreed/SAM_0421.jpg

I think im going to remount the Slave and Master on a better more ridged base.

Ha! That’s brilliant Jonny! You’ve made a 6 DOF joystick! :laughing:

Very simple, yet clever way to solve the control part. You could build a DIY remote around the master and have a receiver on the slave. Should be very easy to make. :smiley:

yes, just a bit of fun.

the project only really starts once i can get the puppet made. working on little bits at a time so i can try and get it looking right.

every time i do something like this i always get other ideas… lol

Yes, I like your joystick! Wish I could get the feel of it.

You could also add a PB (and/or a pot) into the grip.

Nice job!

Alan KM6VV

Okay! I have tried as hard as I can to follow along, but you guys with your “bits of fun” are giving me a serious headache now. :confused: :blush:

This forum really needs a **Genius Free Zone **so guys like me can still come out to play safely. :stuck_out_tongue:

If you fellows don’t mind indulging me, please let me restate and summarize what I think is happening, and anyone please tell me where I’m right and explain to me where I’m wrong. Bear in mind that I don’t know the full capabilities/purposes of all the goodies that Lynxmotion and BasicMicro provide:

  1. The Master provides control signals to position the Slave in a manner somewhat analogous to the way an indoor control rotor used to control an outdoor TV antenna rotator. (Little history lesson there for you young guys. :laughing: )

  2. There are many ways matched motor-like combinations can control each other: stepper motors, motor-dynamo, etc. In this case, continuous rotation is ruled out, and reversability is required. So the matched combinations are pairs of servomotors in which one of the servos is modified to act like a potentiometer. This pot servo is in the master.

  3. The pot servo modifies an output voltage which becomes the input signal that tells the servo in the slave what to do.

Here’s where I start getting shakey, so watch me carefully. :wink:

  1. The master and the slave can have completely separate power supplies of differing voltages. So to avoid power conflicts, the signal wire between them should probably be isolated somehow, perhaps through an optoisolator.

And now I am completely lost. :confused: :blush: :frowning:

  1. How does the signal wire connect? Can it go directly to the signal pin on the slave servo? Or can it go to an input pin on an SSC-32? Or must it go first to an input pin on a BotBoard II before going to the servo or to an SSC-32?

  2. Where does isolation occur? Do the BBII and/or SSC-32 provide it, or must there be an additional component?

Thanks to all who help. And remember, the fact that some of us don’t understand all this immediately does not diminish the lustre of those of you who do. :smiley: