Mathematica 9 is now available
Calculations Method

I am from Poznan University of Technology in Poland.

We normally work with robots. In Mathematica we solved a general robotic
problems. In our package we have implemented kinematical and dynamical
algorithms.

Package is called Robo. We use it to teach and research.

To solve robotic problem we use Newton-Euler method for forward dynamics and
Step-Descent for inverse kinematics. For other problem we don't use special
methods.

All algorithms use a spatial algebra proposed by Rodriguez.

For description a robot we use a list structures proposed by Authors.

We put all robot parameters in lists with special rules.



Links ={Link[1], ..., Link[N]}    and

Motors ={Motor[1], ..., Motor[N]}.




Each link (and motor) is characterised by several kinematics and dynamics
parameters and, in addition, by other links, which are connected to the
links. Generally speaking it is necessary to distinguish between the links
and motors from conceptual point of view. Also engineering practice decides
to treat these items separately.

Therefore i-th link is characterised by the following structure.



Link[i]= {no., kind, joints connected to it, prev joint, mass, inertia
matrix, l vector, p vector, a, motors on the link}.


First item "no." denotes the number of the link. Next item "kind"
specifies type of the joint which is associated with the i-th link. This
falls in two categories: rotational and translational. Next item in the list
is called "joint connected to it". It is a list of links, which are
connected with the i-th link via joints. By making use of this list we are
able to define the tree structure robots. In case of the last link in the
linkage this field has value {0}. Here 0 denotes an external environment.
Next field "prev. joint" locates the link itself in the topological
structure because it defines which is the predecessor to the i-th link.
"Mass" denotes the mass of the i-th link. "Inertia matrix" is inertia
tensor of the i-th link. Next field "l vector" is a vector of the length of
the link, which is a list of the three coordinates of this distance. This
vector is used to build appropriate skew-symmetric transition matrix. Next
vector, "p vector", is a distance to the centre of mass of the i-th link.
Next field describes an offset angle or offset distance both of them result
from the modified Denavit-Hartenberg notation. This parameter comes from the
geometrical description of the robot. Finally, last field,  "motors on the
link", is a list of motors which are mounted on the i-th link. Recall that
on i-th link an arbitrary number of motors can be attached.

    A similar kind of list can be proposed for the i-th motor, namely.



Motor[i] ={no., link number, driven joint, mass, inertia matrix, l vector, p
vector, a, G},




The items, which describe the i-th motor, are similar to those defining the
i-th link. Here "link number" denotes link number to which the motor is
mounted. Recall that, in general, motor's number is not the same as the
link's number. Next item "driven joint" denotes a link number driven by the
motor. Finally, "G", denotes the gear ratio between driven link and motor
which does the job.



As an example we tested algorithms using robot Puma 560 parameters. It is an
industrial robot with six degrees of freedom.  Below an example show to
define links and motors of this robot:



(* Link definitions in lists *)

Link1={1,Rotationalz,{0},2,ml[1],LinkInertia1,

     {Lxl1,Lyl1,Lzl1},{pxl1,pyl1,pzl1},alfal1,{}};



Link2={2,Rotationalz,{1},3,ml[2],LinkInertia2,

     {Lxl2,Lyl2,Lzl2},{pxl2,pyl2,pzl2},alfal2,{1,2}};



Link3={3,Rotationalz,{2},BaseLink,ml[3],LinkInertia3,

     {Lxl3,Lyl3,Lzl3},{pxl3,pyl3,pzl3},alfal3,{}};



LinkBase={4,Rotationalz,{3},BaseLink,0,IdentityMatrix[3],

     {0,0,0},{0,0,0},0,{}};

(* Motor definitions in lists *)

Motor1={1,Rotationalz,2,1,mm[1],MotorInertia1,

       {Lxm1,Lym1,Lzm1},{pxm1,pym1,pzm1},alfam1,gear1};



Motor2={2,Rotationalz,2,2,mm[2],MotorInertia2,

       {Lxm2,Lym2,Lzm2},{pxm2,pym2,pzm2},alfam2,gear2};



Motor3={3,Rotationalz,BaseMotor,3,mm[3],MotorInertia3,

       {Lxm3,Lym3,Lzm3},{pxm3,pym3,pzm3},alfam3,gear3};



(* Set of definition for all manipulator in two lists *)

Links={Link1,Link2,Link3,LinkBase};

Motors={Motor1,Motor2,Motor3};



Here we have a big problem. Because equations are stored dynamically in
memory during calculations we don't know how much memory will be needed. So
we have a problem with space. It is possible to solve the corresponding
problem for four degrees of freedoms. A robot has six. If we try more than
four we get out of memory from kernel.


Out of memory.  Exiting.