Power transmission with Hook joint
(c) 2005 - Roberto Lot
> restart: mylib :="C:/libs": libname := mylib,libname: with(MBsymba):
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);
leading shaft
>
u2 := make_VECTOR(rotate('Y',epsilon),1,0,0):
>
w2 := make_VECTOR(ground,wx2,wy2,wz2): show(w2);
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);
transformation matrix
the second colum of transformation matrix correspond to the vecor v1, thus
>
a1 := theta1 = arctan( Zcomp(v1) , Ycomp(v1));
>
theta2;
r
otation 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));
Kinematic Model 2
frame fixed to the driving shaft
>
w1 := cross_prod(u1,v1): show(w1);
>
T1 := linalg[transpose] (matrix(4,4, [ [Comps(u1),0] , [Comps(v1),0] , [Comps(w1),0] , [Comps(A),1] ]));
frame fixed to the leading shaft
>
v2 := cross_prod(w2,u2): show(v2);
>
T2 := linalg[transpose] (matrix(4,4, [ [Comps(u2),0] , [Comps(v2),0] , [Comps(w2),0] , [Comps(A),1] ]));
constraints
>
map( simplify,evalm(inv_frame(T1) &* T1 - 1),trig);
>
map( simplify,evalm(inv_frame(T2) &* T2 - 1),trig);
>
dot_prod(u2,w2);
>
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.
>
a3 := vz1-tan(theta1)*vy1;
numerical equations
>
eqns := convert(subs(data, constraints union {a2,a3}),set);
independent variable and unknowns
>
theta1;
numerical solution
>
np:=12: solz:=array[np]:
tabbed results - natural coordinates and shaft angles
>
printf(" | vy1 vz1 | wx2 wy2 wz2 | theta1 theta2 |");
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)):
leading shaft
>
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)):
cross
>
cr1 := line([0.0,-0.1, 0.0],[0.0,0.1,0.0], color=green,thickness=5):
transmission
>
draw_transmission := proc(epsilon,theta1,theta2)
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);
#w1 := cross_prod(u1,v1): show(w1);
u2 := project(u2,ground): show(u2);
#v2 := cross_prod(w2,u2): show(u2);
where the utilization of two-arguments function makes it possible to compute the angle in the full domain [0, 2
]
In this case it is better to introduce an additional angular parameter, such as the rotation of the moving shaft
unks := q union {theta2};
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:
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 |
Warning, the name changecoords has been redefined
Warning, the name arrow has been redefined
Warning, the previous bindings of the names project rotate, and translate have been removed and they now have an assigned value
st2 := rotate(st2,Pi/2,Pi,0):
cr2 := line([0.0, 0.0,-0.1],[0.0,0.0,0.1], color=green,thickness=5):
local mov_shaft,lead_shaft,cross:
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):
display(mov_shaft,lead_shaft,cross, axes=normal, scaling=constrained):
end: