> 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);
leading shaft
> 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)):
##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)):
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)
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:
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);
>
>
>
>