# Hook joint

by Roberto Lot

> restart: mylib :="C:/LIBS": libname := mylib,libname: with(MBSymba_r5.1):

MBSymba release 5.1 - Copyright (C) 2009 - by Roberto.Lot@unipd.it & Matteo.Massaro@unipd.it

Warning, Non-Linear Modeling option has been choosen

## Kinematic Model

rotating axis intersection

> A := make_POINT(ground,0,0,0): show(A);

driving shaft

> u1 := make_VECTOR(ground,1,0,0): show(u1);

> v1 := make_VECTOR(ground,0,vy1,vz1): show(v1);
#w1 := cross_prod(u1,v1): show(w1);

> u2 := make_VECTOR(rotate('Y',epsilon),1,0,0):
u2 := project(u2,ground): show(u2);

> w2 := make_VECTOR(ground,wx2,wy2,wz2): show(w2);
#v2 := cross_prod(w2,u2): show(u2);

variables

> q := { vy1,vz1,wx2,wy2,wz2 }; nq := nops(q);

Since the single-degree-of-freedom mechanism is described by means of 5 variables, 4 constraint equations must be written!

magnitude of the vector v1

> phi1 := dot_prod(v1,v1)-1;

magnitude of the vector w2

> phi2 := dot_prod(w2,w2)-1;

orthogonality of vectors u2 and w2

> phi3 := dot_prod(u2,w2);

hook joint constraint

orthogonality of vectors v1 and w2

> phi4 := dot_prod(v1,w2);

collect constraints

> constraints:= [seq(phi||i, i=1..4)]:

conversion to angular coordinates

> theta1; ##rotation of the moving shaft

> rotate('X',theta1); t##transformation matrix

the second colum of transformation matrix correspond to the vecor v1, thus

> a1 := theta1 = arctan( Zcomp(v1) , Ycomp(v1));
##where the utilization of two-arguments function makes it possible to compute the angle in the full domain [0, 2]

> theta2; ##rotation of the driving shaft

> rotate('Y',epsilon)*rotate('X',theta1);##transformation matrix

The 3rd column of the matrix corresponds to the w2 vector, similarely to the previous case the shaft angle is:

> a2 := theta2 = arctan( -Ycomp(w2) , Zcomp(w2)/cos(epsilon));

## Numerical solution

mechanims characteristics

> data := epsilon=0.3;

definition of the independent variable

None of the natural coordinates may be profitably chosen as the independent coordinate, because it would be impossible to descrive a complete revolute.
In this case it is better to introduce an additional angular parameter, such as the rotation of the moving shaft

> a3 := vz1-tan(theta1)*vy1;

numerical equations

> eqns := convert(subs(data, constraints union {a2,a3}),set);

independent variable and unknowns

> theta1;
unks := q union {theta2};

numerical solution

> np:=12: solz:=array[np]:
for i from 1 to np do
x[i] := 1e-5 + 2.*Pi*(i-1)/np:
solz[i] := fsolve(subs(theta1=x[i],eqns),unks) union {theta1=x[i]}:
end do:

tabbed results - natural coordinates and shaft angles

> printf(" | vy1 vz1 | wx2 wy2 wz2 | theta1 theta2 |");
for i from 1 to np do
printf("%6.0f | %+06.3f %+06.3f | %+06.3f %+06.3f %+06.3f | %+06.3f %+06.3f |",
i ,op( subs(solz[i], [vy1, vz1, wx2, wy2, wz2, theta1, theta2 ])));
writeline(default):
end do:

| vy1 vz1 | wx2 wy2 wz2 | theta1 theta2 |

1 | +1.000 +0.000 | -0.296 +0.000 -0.955 | +0.000 -3.142 |

2 | +0.866 +0.500 | -0.259 +0.483 -0.837 | +0.524 -2.638 |

3 | +0.500 +0.866 | -0.153 +0.856 -0.494 | +1.047 -2.114 |

4 | +0.000 -1.000 | -0.000 -1.000 -0.000 | +1.571 +1.571 |

5 | +0.500 -0.866 | -0.153 -0.856 -0.494 | +2.094 +2.114 |

6 | +0.866 -0.500 | -0.259 -0.483 -0.837 | +2.618 +2.638 |

7 | +1.000 +0.000 | -0.296 +0.000 -0.955 | +3.142 -3.142 |

8 | +0.866 +0.500 | -0.259 +0.483 -0.837 | +3.665 -2.638 |

9 | +0.500 +0.866 | -0.153 +0.856 -0.494 | +4.189 -2.114 |

10 | +0.000 -1.000 | -0.000 -1.000 -0.000 | +4.712 +1.571 |

11 | +0.500 -0.866 | -0.153 -0.856 -0.494 | +5.236 +2.114 |

12 | +0.866 -0.500 | -0.259 -0.483 -0.837 | +5.760 +2.638 |

## animation

> with(plots): with(plottools):

definiton of the mechanism drawing

##line definition

> arc2D :=op(arc([0,0], 0.1, Pi/2..3/2*Pi)): arc in 2D space

> arc3D := [seq([op(arc2D[i]),0],i=1..nops(arc2D))]: arc in 3D space

##driving shaft

> ss1 := line([-0.1,0,0],[-0.4,0,0], color=red,thickness=5):

> st1 := CURVES(arc3D,COLOUR(RGB,1.,0.,0.), THICKNESS(5)):

> ss2 := line([0.1,0,0.0],[0.4,0,0], color=blue,thickness=5):

> st2 := CURVES(arc3D,COLOUR(RGB,0.,0.,1.), THICKNESS(5)):
st2 := rotate(st2,Pi/2,Pi,0):

##cross

> cr1 := line([0.0,-0.1, 0.0],[0.0,0.1,0.0], color=green,thickness=5):
cr2 := line([0.0, 0.0,-0.1],[0.0,0.0,0.1], color=green,thickness=5):

##transmission

> draw_transmission := proc(epsilon,theta1,theta2)
mov_shaft := map(rotate,[ss1,st1] , theta1,0,0):
lead_shaft := map(rotate,map(rotate,[ss2,st2], theta2,0,0), 0,epsilon,0) :
cross := rotate(cr1, theta1,0,0), rotate(rotate(cr2,theta2,0,0), 0,epsilon,0):
end:

single configuration

> #nn:=5: draw_transmission(op(subs(a1,a2,data,solz[nn],[epsilon,theta1,theta2])));

animation

> display([seq( draw_transmission(op(subs(a1,a2,data,solz[i],[epsilon,theta1,theta2]))),i=1..np)], insequence=true, scaling=constrained);

>

>

>

>