Example2_Griffis-Duffy.mw

Implementation of the self-motion parameterization of Example 2 

This Maple worksheet follows the notation and computations of the Section V: EXAMPLE II: THE GRIFFIS-DUFFY PLATFORM in the work 

[1] J.Borras, F. Thomas and C. Torras, "On Delta Transforms". 

Authors:  

Júlia Borràs, Federico Thomas and Carme Torras. 

URL:  

http://www-iri.upc.es/ 

Purpose: 

This worksheet shows the explicit computations performed in the section V of the above mentioned work, so the reader can follow the computations by 

just executing the present worksheet, to rise the parameterization shown in equation (33) in [1]. 

 

Image 

Fig. 8-(bottom)                                                Fig. 8-(top) 

> restart
 

First, load the DeltaTransformsTool library where the functions are defined. 

> read
 

Definition of the local coordinates of the attachments using a parameterizations that rise to an always architecturally singular Griffis-Duffy manipulator 

> a1 := `<,>`(0, 0, 0); -1; a2 := `<,>`(p, 0, 0); -1; a3 := `<,>`(1/2*p, 1/2*p*sqrt(3), 0); -1; a4 := `<,>`(0, p*sqrt(3), 0); -1; a5 := `<,>`(-1/2*p, 1/2*p*sqrt(3), 0); -1; a6 := `<,>`(-p, 0, 0); -1
a1 := `<,>`(0, 0, 0); -1; a2 := `<,>`(p, 0, 0); -1; a3 := `<,>`(1/2*p, 1/2*p*sqrt(3), 0); -1; a4 := `<,>`(0, p*sqrt(3), 0); -1; a5 := `<,>`(-1/2*p, 1/2*p*sqrt(3), 0); -1; a6 := `<,>`(-p, 0, 0); -1
a1 := `<,>`(0, 0, 0); -1; a2 := `<,>`(p, 0, 0); -1; a3 := `<,>`(1/2*p, 1/2*p*sqrt(3), 0); -1; a4 := `<,>`(0, p*sqrt(3), 0); -1; a5 := `<,>`(-1/2*p, 1/2*p*sqrt(3), 0); -1; a6 := `<,>`(-p, 0, 0); -1
a1 := `<,>`(0, 0, 0); -1; a2 := `<,>`(p, 0, 0); -1; a3 := `<,>`(1/2*p, 1/2*p*sqrt(3), 0); -1; a4 := `<,>`(0, p*sqrt(3), 0); -1; a5 := `<,>`(-1/2*p, 1/2*p*sqrt(3), 0); -1; a6 := `<,>`(-p, 0, 0); -1
a1 := `<,>`(0, 0, 0); -1; a2 := `<,>`(p, 0, 0); -1; a3 := `<,>`(1/2*p, 1/2*p*sqrt(3), 0); -1; a4 := `<,>`(0, p*sqrt(3), 0); -1; a5 := `<,>`(-1/2*p, 1/2*p*sqrt(3), 0); -1; a6 := `<,>`(-p, 0, 0); -1
a1 := `<,>`(0, 0, 0); -1; a2 := `<,>`(p, 0, 0); -1; a3 := `<,>`(1/2*p, 1/2*p*sqrt(3), 0); -1; a4 := `<,>`(0, p*sqrt(3), 0); -1; a5 := `<,>`(-1/2*p, 1/2*p*sqrt(3), 0); -1; a6 := `<,>`(-p, 0, 0); -1
 

> b1 := `<,>`(0, q*sqrt(3), 0); -1; b2 := `<,>`(-1/2*q, 1/2*q*sqrt(3), 0); -1; b3 := `<,>`(-q, 0, 0); -1; b4 := `<,>`(0, 0, 0); -1; b5 := `<,>`(q, 0, 0); -1; b6 := `<,>`(1/2*q, 1/2*q*sqrt(3), 0); -1
b1 := `<,>`(0, q*sqrt(3), 0); -1; b2 := `<,>`(-1/2*q, 1/2*q*sqrt(3), 0); -1; b3 := `<,>`(-q, 0, 0); -1; b4 := `<,>`(0, 0, 0); -1; b5 := `<,>`(q, 0, 0); -1; b6 := `<,>`(1/2*q, 1/2*q*sqrt(3), 0); -1
b1 := `<,>`(0, q*sqrt(3), 0); -1; b2 := `<,>`(-1/2*q, 1/2*q*sqrt(3), 0); -1; b3 := `<,>`(-q, 0, 0); -1; b4 := `<,>`(0, 0, 0); -1; b5 := `<,>`(q, 0, 0); -1; b6 := `<,>`(1/2*q, 1/2*q*sqrt(3), 0); -1
b1 := `<,>`(0, q*sqrt(3), 0); -1; b2 := `<,>`(-1/2*q, 1/2*q*sqrt(3), 0); -1; b3 := `<,>`(-q, 0, 0); -1; b4 := `<,>`(0, 0, 0); -1; b5 := `<,>`(q, 0, 0); -1; b6 := `<,>`(1/2*q, 1/2*q*sqrt(3), 0); -1
b1 := `<,>`(0, q*sqrt(3), 0); -1; b2 := `<,>`(-1/2*q, 1/2*q*sqrt(3), 0); -1; b3 := `<,>`(-q, 0, 0); -1; b4 := `<,>`(0, 0, 0); -1; b5 := `<,>`(q, 0, 0); -1; b6 := `<,>`(1/2*q, 1/2*q*sqrt(3), 0); -1
b1 := `<,>`(0, q*sqrt(3), 0); -1; b2 := `<,>`(-1/2*q, 1/2*q*sqrt(3), 0); -1; b3 := `<,>`(-q, 0, 0); -1; b4 := `<,>`(0, 0, 0); -1; b5 := `<,>`(q, 0, 0); -1; b6 := `<,>`(1/2*q, 1/2*q*sqrt(3), 0); -1
b1 := `<,>`(0, q*sqrt(3), 0); -1; b2 := `<,>`(-1/2*q, 1/2*q*sqrt(3), 0); -1; b3 := `<,>`(-q, 0, 0); -1; b4 := `<,>`(0, 0, 0); -1; b5 := `<,>`(q, 0, 0); -1; b6 := `<,>`(1/2*q, 1/2*q*sqrt(3), 0); -1
 

> p := 2; 1; q := 1
 

(Typesetting:-mprintslash)([p := 2], [2]) 

(Typesetting:-mprintslash)([q := 1], [1]) 

So that the local coordinates are the same listed in Table II in [1] 

> base := [a1, a2, a3, a4, a5, a6]; 1; platform := [b1, b2, b3, b4, b5, b6]
 

base := [Vector[column](%id = 147735176), Vector[column](%id = 147603724), Vector[column](%id = 147735072), Vector[column](%id = 147605928), Vector[column](%id = 147706096), Vector[column](%id = 14771... 

platform := [Vector[column](%id = 149951548), Vector[column](%id = 147162820), Vector[column](%id = 146412752), Vector[column](%id = 146069120), Vector[column](%id = 145273056), Vector[column](%id = 1... 

To obtain a coherent set of leg lengths, we compute the inverse kinematics for a given position and orientation of the platform 

> L := inverseKinematics(base, platform, `<,>`(1, 1, 1), 7/6*Pi, 0, 0)
 

(Typesetting:-mprintslash)([L := [3-3^(1/2), 2, 5-3^(1/2), 15-4*3^(1/2), 11-5*3^(1/2), 11-3*3^(1/2)]], [[3-3^(1/2), 2, 5-3^(1/2), 15-4*3^(1/2), 11-5*3^(1/2), 11-3*3^(1/2)]]) 

So, the length legs of the Griffis-Duffy manipulator listed in Table II are 

> d[1] := L[1]; 1; d[2] := L[2]; 1; d[3] := L[3]; 1; d[4] := L[4]; 1; d[5] := L[5]; 1; d[6] := L[6]
 

(Typesetting:-mprintslash)([d[1] := 3-3^(1/2)], [3-3^(1/2)]) 

(Typesetting:-mprintslash)([d[2] := 2], [2]) 

(Typesetting:-mprintslash)([d[3] := 5-3^(1/2)], [5-3^(1/2)]) 

(Typesetting:-mprintslash)([d[4] := 15-4*3^(1/2)], [15-4*3^(1/2)]) 

(Typesetting:-mprintslash)([d[5] := 11-5*3^(1/2)], [11-5*3^(1/2)]) 

(Typesetting:-mprintslash)([d[6] := 11-3*3^(1/2)], [11-3*3^(1/2)]) 

In this case there is only one step of 6 simultaneous Delta transforms. Now we obtain the corresponding implicit functions listed in equation (29) in [1]. 

> Delta1 := DeltaTransform(a6, a1, a2, l[1], d[1], l[2]); 1; Delta2 := DeltaTransform(b1, b2, b3, l[2], d[2], l[3]); 1; Delta3 := DeltaTransform(a2, a3, a4, l[3], d[3], l[4]); 1; Delta4 := DeltaTransfor...
Delta1 := DeltaTransform(a6, a1, a2, l[1], d[1], l[2]); 1; Delta2 := DeltaTransform(b1, b2, b3, l[2], d[2], l[3]); 1; Delta3 := DeltaTransform(a2, a3, a4, l[3], d[3], l[4]); 1; Delta4 := DeltaTransfor...
Delta1 := DeltaTransform(a6, a1, a2, l[1], d[1], l[2]); 1; Delta2 := DeltaTransform(b1, b2, b3, l[2], d[2], l[3]); 1; Delta3 := DeltaTransform(a2, a3, a4, l[3], d[3], l[4]); 1; Delta4 := DeltaTransfor...
Delta1 := DeltaTransform(a6, a1, a2, l[1], d[1], l[2]); 1; Delta2 := DeltaTransform(b1, b2, b3, l[2], d[2], l[3]); 1; Delta3 := DeltaTransform(a2, a3, a4, l[3], d[3], l[4]); 1; Delta4 := DeltaTransfor...
Delta1 := DeltaTransform(a6, a1, a2, l[1], d[1], l[2]); 1; Delta2 := DeltaTransform(b1, b2, b3, l[2], d[2], l[3]); 1; Delta3 := DeltaTransform(a2, a3, a4, l[3], d[3], l[4]); 1; Delta4 := DeltaTransfor...
Delta1 := DeltaTransform(a6, a1, a2, l[1], d[1], l[2]); 1; Delta2 := DeltaTransform(b1, b2, b3, l[2], d[2], l[3]); 1; Delta3 := DeltaTransform(a2, a3, a4, l[3], d[3], l[4]); 1; Delta4 := DeltaTransfor...
Delta1 := DeltaTransform(a6, a1, a2, l[1], d[1], l[2]); 1; Delta2 := DeltaTransform(b1, b2, b3, l[2], d[2], l[3]); 1; Delta3 := DeltaTransform(a2, a3, a4, l[3], d[3], l[4]); 1; Delta4 := DeltaTransfor...
 

(Typesetting:-mprintslash)([Delta1 := 2*l[2]+2*l[1]-28+4*3^(1/2)], [2*l[2]+2*l[1]-28+4*3^(1/2)]) 

(Typesetting:-mprintslash)([Delta2 := l[3]+l[2]-6], [l[3]+l[2]-6]) 

(Typesetting:-mprintslash)([Delta3 := 2*l[4]+2*l[3]-36+4*3^(1/2)], [2*l[4]+2*l[3]-36+4*3^(1/2)]) 

(Typesetting:-mprintslash)([Delta4 := l[5]+l[4]-32+8*3^(1/2)], [l[5]+l[4]-32+8*3^(1/2)]) 

(Typesetting:-mprintslash)([Delta5 := 2*l[6]+2*l[5]-60+20*3^(1/2)], [2*l[6]+2*l[5]-60+20*3^(1/2)]) 

(Typesetting:-mprintslash)([Delta6 := l[1]+l[6]-24+6*3^(1/2)], [l[1]+l[6]-24+6*3^(1/2)]) 

And the system matrices shown in equation (32) 

> A, B := simDeltaTransformsSystemMatrix([Delta1, Delta2, Delta3, Delta4, Delta5, Delta6], [l[1], l[2], l[3], l[4], l[5], l[6]])
A, B := simDeltaTransformsSystemMatrix([Delta1, Delta2, Delta3, Delta4, Delta5, Delta6], [l[1], l[2], l[3], l[4], l[5], l[6]])
 

A, B := Matrix(%id = 149570572), Vector[column](%id = 149824220) 

Notice that the matrix is rank defective, that is, its determinant is 0 

> Determinant(A)
 

0 

This system can be solved using linear solve Maple function 

> linSol := LinearSolve(A, -B)
 

linSol := Vector[column](%id = 146162044) 

Or otherwise, define the system so that we can choose which unknown is used as parameter 

> L := `<,>`(l[1], l[2], l[3], l[4], l[5], l[6]); -1
 

> syst := `.`(A, L)+B; -1
 

> solsL := solve({syst[1], syst[2], syst[3], syst[4], syst[5], syst[6]}, {l[1], l[2], l[3], l[4], l[5]})
solsL := solve({syst[1], syst[2], syst[3], syst[4], syst[5], syst[6]}, {l[1], l[2], l[3], l[4], l[5]})
 

(Typesetting:-mprintslash)([solsL := {l[1] = -l[6]+24-6*3^(1/2), l[5] = -l[6]+30-10*3^(1/2), l[3] = -l[6]+16-4*3^(1/2), l[2] = l[6]-10+4*3^(1/2), l[4] = l[6]+2+2*3^(1/2)}], [{l[1] = -l[6]+24-6*3^(1/2)...
(Typesetting:-mprintslash)([solsL := {l[1] = -l[6]+24-6*3^(1/2), l[5] = -l[6]+30-10*3^(1/2), l[3] = -l[6]+16-4*3^(1/2), l[2] = l[6]-10+4*3^(1/2), l[4] = l[6]+2+2*3^(1/2)}], [{l[1] = -l[6]+24-6*3^(1/2)...
 

The obtained parameterization shown in equation (33) is 

> Lsol := eval(L, solsL)
 

Lsol := Vector[column](%id = 150614408) 

Now we will solve the octhaedral Forward Kinematics problem for the set of legs listed in Lsol, renaming the parameter to "a". 

> l[6] := a
 

(Typesetting:-mprintslash)([l[6] := a], [a]) 

We solve the octahedral  manipulator using Cayley-Menger determinants. See comments on octahedralSystem function on DeltaTransformsTool.txt. 

> c1, c2 := octahedralSystem(4*p^2, 4*p^2, 4*p^2, 4*q^2, 4*q^2, 4*q^2, Lsol[1], Lsol[2], Lsol[3], Lsol[4], Lsol[5], Lsol[6])
c1, c2 := octahedralSystem(4*p^2, 4*p^2, 4*p^2, 4*q^2, 4*q^2, 4*q^2, Lsol[1], Lsol[2], Lsol[3], Lsol[4], Lsol[5], Lsol[6])
c1, c2 := octahedralSystem(4*p^2, 4*p^2, 4*p^2, 4*q^2, 4*q^2, 4*q^2, Lsol[1], Lsol[2], Lsol[3], Lsol[4], Lsol[5], Lsol[6])
 

X=d15^2, Y=d34^2 

(Typesetting:-mprintslash)([c1, c2 := -304384+95488*a+8*X^2*Y*3^(1/2)+23680*X+32128*Y+12*X^2*Y-X^2*Y^2+2*X^2*Y*a-5696*X*3^(1/2)+88*X*Y*a-32*X*a*Y*3^(1/2)-72*a^2*Y*3^(1/2)-8*a*Y^2*3^(1/2)-5056*Y*a-9700...
(Typesetting:-mprintslash)([c1, c2 := -304384+95488*a+8*X^2*Y*3^(1/2)+23680*X+32128*Y+12*X^2*Y-X^2*Y^2+2*X^2*Y*a-5696*X*3^(1/2)+88*X*Y*a-32*X*a*Y*3^(1/2)-72*a^2*Y*3^(1/2)-8*a*Y^2*3^(1/2)-5056*Y*a-9700...
(Typesetting:-mprintslash)([c1, c2 := -304384+95488*a+8*X^2*Y*3^(1/2)+23680*X+32128*Y+12*X^2*Y-X^2*Y^2+2*X^2*Y*a-5696*X*3^(1/2)+88*X*Y*a-32*X*a*Y*3^(1/2)-72*a^2*Y*3^(1/2)-8*a*Y^2*3^(1/2)-5056*Y*a-9700...
(Typesetting:-mprintslash)([c1, c2 := -304384+95488*a+8*X^2*Y*3^(1/2)+23680*X+32128*Y+12*X^2*Y-X^2*Y^2+2*X^2*Y*a-5696*X*3^(1/2)+88*X*Y*a-32*X*a*Y*3^(1/2)-72*a^2*Y*3^(1/2)-8*a*Y^2*3^(1/2)-5056*Y*a-9700...
(Typesetting:-mprintslash)([c1, c2 := -304384+95488*a+8*X^2*Y*3^(1/2)+23680*X+32128*Y+12*X^2*Y-X^2*Y^2+2*X^2*Y*a-5696*X*3^(1/2)+88*X*Y*a-32*X*a*Y*3^(1/2)-72*a^2*Y*3^(1/2)-8*a*Y^2*3^(1/2)-5056*Y*a-9700...
(Typesetting:-mprintslash)([c1, c2 := -304384+95488*a+8*X^2*Y*3^(1/2)+23680*X+32128*Y+12*X^2*Y-X^2*Y^2+2*X^2*Y*a-5696*X*3^(1/2)+88*X*Y*a-32*X*a*Y*3^(1/2)-72*a^2*Y*3^(1/2)-8*a*Y^2*3^(1/2)-5056*Y*a-9700...
(Typesetting:-mprintslash)([c1, c2 := -304384+95488*a+8*X^2*Y*3^(1/2)+23680*X+32128*Y+12*X^2*Y-X^2*Y^2+2*X^2*Y*a-5696*X*3^(1/2)+88*X*Y*a-32*X*a*Y*3^(1/2)-72*a^2*Y*3^(1/2)-8*a*Y^2*3^(1/2)-5056*Y*a-9700...
(Typesetting:-mprintslash)([c1, c2 := -304384+95488*a+8*X^2*Y*3^(1/2)+23680*X+32128*Y+12*X^2*Y-X^2*Y^2+2*X^2*Y*a-5696*X*3^(1/2)+88*X*Y*a-32*X*a*Y*3^(1/2)-72*a^2*Y*3^(1/2)-8*a*Y^2*3^(1/2)-5056*Y*a-9700...
(Typesetting:-mprintslash)([c1, c2 := -304384+95488*a+8*X^2*Y*3^(1/2)+23680*X+32128*Y+12*X^2*Y-X^2*Y^2+2*X^2*Y*a-5696*X*3^(1/2)+88*X*Y*a-32*X*a*Y*3^(1/2)-72*a^2*Y*3^(1/2)-8*a*Y^2*3^(1/2)-5056*Y*a-9700...
(Typesetting:-mprintslash)([c1, c2 := -304384+95488*a+8*X^2*Y*3^(1/2)+23680*X+32128*Y+12*X^2*Y-X^2*Y^2+2*X^2*Y*a-5696*X*3^(1/2)+88*X*Y*a-32*X*a*Y*3^(1/2)-72*a^2*Y*3^(1/2)-8*a*Y^2*3^(1/2)-5056*Y*a-9700...
(Typesetting:-mprintslash)([c1, c2 := -304384+95488*a+8*X^2*Y*3^(1/2)+23680*X+32128*Y+12*X^2*Y-X^2*Y^2+2*X^2*Y*a-5696*X*3^(1/2)+88*X*Y*a-32*X*a*Y*3^(1/2)-72*a^2*Y*3^(1/2)-8*a*Y^2*3^(1/2)-5056*Y*a-9700...
(Typesetting:-mprintslash)([c1, c2 := -304384+95488*a+8*X^2*Y*3^(1/2)+23680*X+32128*Y+12*X^2*Y-X^2*Y^2+2*X^2*Y*a-5696*X*3^(1/2)+88*X*Y*a-32*X*a*Y*3^(1/2)-72*a^2*Y*3^(1/2)-8*a*Y^2*3^(1/2)-5056*Y*a-9700...
(Typesetting:-mprintslash)([c1, c2 := -304384+95488*a+8*X^2*Y*3^(1/2)+23680*X+32128*Y+12*X^2*Y-X^2*Y^2+2*X^2*Y*a-5696*X*3^(1/2)+88*X*Y*a-32*X*a*Y*3^(1/2)-72*a^2*Y*3^(1/2)-8*a*Y^2*3^(1/2)-5056*Y*a-9700...
(Typesetting:-mprintslash)([c1, c2 := -304384+95488*a+8*X^2*Y*3^(1/2)+23680*X+32128*Y+12*X^2*Y-X^2*Y^2+2*X^2*Y*a-5696*X*3^(1/2)+88*X*Y*a-32*X*a*Y*3^(1/2)-72*a^2*Y*3^(1/2)-8*a*Y^2*3^(1/2)-5056*Y*a-9700...
(Typesetting:-mprintslash)([c1, c2 := -304384+95488*a+8*X^2*Y*3^(1/2)+23680*X+32128*Y+12*X^2*Y-X^2*Y^2+2*X^2*Y*a-5696*X*3^(1/2)+88*X*Y*a-32*X*a*Y*3^(1/2)-72*a^2*Y*3^(1/2)-8*a*Y^2*3^(1/2)-5056*Y*a-9700...
 

Note that de degree of each curve is 4, so the total nomber of solutions for the intersection of the two curves are 8. So, for each value of the parameter, 8 solutions {X,Y} can be found. 

> Digits := 16; 1
 

(Typesetting:-mprintslash)([Digits := 16], [16]) 

The file solve the intersection of the two curves c1,c2 numerically, obtaining 8 values of X =d15 and Y=d34 for each value of the parameter a, from 3 to 9.  For each value of X and Y, the position 

and orientation of the platform can be computed with trilaterations, obtaining two possible solutions from each {X,Y}, so, a total of 16 assembly modes can be plotted. 

> generateExample2File(3, 9, .1, c1, c2,
 

The number of steps will be 61 

 

The total number of printed solutions is 488 

 

Note that the self motion can be plotted with for example Matlab using the generated file data. 

>