Keywords

1 Introduction

The large computational time required for calculating the natural frequencies of a robot prevents to use them in many applications, such as real-time control, design optimization process, etc. To decrease the computational cost, this paper focuses on the efficient symbolic computation for the stiffness and mass matrices of flexible parallel robots. This approach could be combined with model reduction methods [6, 9, 10], but this is not the main goal of that paper.

For the computation of the robot natural frequencies, two main approaches are generally proposed (see [11] for a large literature review): (i) lumped modeling [13, 18] and (ii) modeling using distributed flexibilities [2, 3, 7, 16, 17]. The lumped modeling is generally simpler to use by non-experts in finite element methods but, to obtain a correct model accuracy, higher number of elements is required, thus increasing the computational time.

Contrary to lumped modeling, using distributed flexibilities allows the improvement of the model accuracy. However, such methods require highly-skilled users. In [2, 16, 17], some general methodologies are proposed. In the case of closed-loop mechanisms, some Jacobian matrices are computed that allow taking into account the kinematic dependencies. However, such general methodologies are not specifically designed for parallel robots and they do not guarantee the minimization of the number of operators for the symbolic computation of the model. To the best of our knowledge, a systematic procedure to compute the mass and stiffness matrices (using distributed flexibilities) of parallel robots with a minimal numbers of operators has never been proposed.

The present work aims at filling this gap. In order to minimize the number of operations, the Jacobian matrices defined in the principle of virtual powers (PVP) are computed using recursive algorithms. For computing the stiffness and mass matrices of parallel robots, the approach proposed in [5] is adapted. It proposes to (1) convert the parallel robot into a virtual system defined by a tree-structure robot composed of the kinematic chains of the actual robot for which all joints (passive and active) are considered actuated and a free body (the platform which is considered as rigid) (Fig. 1), (2) compute the elastodynamic model of this new virtual system, and (3) finally, close the loops by using the PVP.

Fig. 1
figure 1

A general parallel robot composed of flexible elements. a Kinematic chain. b Virtual tree structure. c A single flexible link

This method is effective, systematic, can be applied to any parallel robot.

2 Stiffness and Mass Matrices for the Virtual System

Let us consider a parallel robot composed of one rigid fixed base (denoted as element 0), one rigid moving platform and n legs, each leg being a serial kinematic chain composed of \( (m_{i} - 1) \) elementsFootnote 1 connected by \( m_{i} \) joints of coordinates \( q_{ik} \) (revolute, prismatic or fixed joints—\( i = 1, \ldots ,n \)) located at points \( A_{ik} \) (\( k = 1, \ldots ,m_{i} \)—Fig. 1a). The j-th element of the i-th leg is denoted by ij and its displacement can be parameterized by the coordinates \( ^{ij} {\mathbf{t}}_{ij} \) Footnote 2 which represents the twist of the body ij at the origin of the local frame \( {\fancyscript{F}}_{ij} \) (Fig. 1c) and \( {\dot{\mathbf{q}}}_{{e_{ij} }} \) that are the generalized velocities characterizing the elastic displacement of the body ij

$$ ^{ij} {\mathbf{t}}_{{e_{ij} }} (M_{ij} ) =\varvec{\varPhi}_{ij} (M_{0ij} ){\dot{\mathbf{q}}}_{{e_{ij} }} $$
(1)

where \( ^{ij} {\mathbf{t}}_{{e_{ij} }} (M_{ij} ) \) is the deformation twist due to the body elasticity that can be parameterized using truncated series of Rayleigh-Ritz shape functions \( \varvec{\varPhi}_{ij} \) [4].

The vector of generalized coordinates of the tree-structure is given by \( {\mathbf{q}}_{t} = \left[ {{\mathbf{q}}_{{t_{1} }}^{T} \cdots {\mathbf{q}}_{{t_{n} }}^{T} } \right]^{T} \), where \( {\mathbf{q}}_{{t_{i} }} \) regroups all joint variables (denoted as \( {\mathbf{q}}_{{p_{i} }}^{T} = \left[ {q_{i1} {\kern 1pt} \ldots q_{{im_{i} }} } \right] \)) and elastic generalized coordinates \( {\mathbf{q}}_{{e_{i} }}^{T} = \left[ {{\mathbf{q}}_{{e_{i1} }}^{T} \cdots {\mathbf{q}}_{{e_{{i,m_{i} }} }}^{T} } \right] \) for the real i-th leg.

The Lagrangian of the tree structure system can be expressed as:

$$ L_{t} = \frac{1}{2}\sum\limits_{i,j} \left( {\left[ {^{ij} {\mathbf{t}}_{ij}^{T} \;\;{\dot{\mathbf{q}}}_{{e_{ij} }}^{T} } \right]{\mathbf{M}}_{ij} \left[ {\begin{array}{*{20}c} {^{ij} {\mathbf{t}}_{ij} } \\ {{\dot{\mathbf{q}}}_{{e_{ij} }} } \\ \end{array} } \right] - {\mathbf{q}}_{{e_{ij} }}^{T} {\mathbf{K}}_{ij} {\mathbf{q}}_{{e_{ij} }} } \right) $$
(2)

where \( {\mathbf{M}}_{ij} \) and \( {\mathbf{K}}_{ij} \) are the mass and stiffness matrices of the link ij whose full expressions in the most compact form are given in [4, 15]. To express the Lagrangian as a function of \( {\mathbf{q}}_{t} \) and \( {\dot{\mathbf{q}}}_{t} \), let us express the displacement of the element ij frame located at \( A_{ij} \) using the following equations obtained by a recursive algorithm [4]

$$ ^{ij} {\mathbf{t}}_{ij} = {\mathbf{J}}_{{t_{ij} }} {\dot{\mathbf{q}}}_{t} \;{\text{with}}\;{\mathbf{J}}_{{t_{ij} }} =^{ij} {\mathbf{T}}_{i(j - 1)} {\mathbf{J}}_{{t_{i(j - 1)} }} +\varvec{\varPhi}_{{{\mathbf{q}}_{eij} }} + {\mathbf{A}}_{ij} \;{\text{and}}{\kern 1pt} $$
(3)
$$ \varvec{\varPhi}_{{{\mathbf{q}}_{eij} }} = \left[ {{\mathbf{0}}\; \cdots \;^{ij} \overline{{\mathbf{R}}}_{i(j - 1)}\varvec{\varPhi}_{i(j - 1)} (A_{ij} )\; \cdots \;{\mathbf{0}}} \right],{\kern 1pt} {\mathbf{A}}_{ij} = \left[ {{\mathbf{0}}\; \cdots \;^{ij} {\mathbf{a}}_{ij} \; \cdots \;{\mathbf{0}}} \right] $$
(4)

where \( {\mathbf{a}}_{ij} \) is the unit twist describing the joint ij axis [4] and, in \( \varvec{\varPhi}_{{{\mathbf{q}}_{eij} }} \) (\( {\mathbf{A}}_{ij} \), resp.), the term \( ^{ij} \overline{{\mathbf{R}}}_{i(j - 1)}\varvec{\varPhi}_{i(j - 1)} (A_{ij} ) \) (\( ^{ij} {\mathbf{a}}_{ij} \), resp.) is located at the columns corresponding to the variables \( {\dot{\mathbf{q}}}_{{e_{i(j - 1)} }} \) (\( \dot{q}_{ij} \), resp.). Moreover, in the previous expressions,

$$ ^{ij} \overline{{\mathbf{R}}}_{i(j - 1)} = \left[ {\begin{array}{*{20}c} {^{ij} {\mathbf{R}}_{i(j - 1)} } & {\mathbf{0}} \\ {\mathbf{0}} & {^{ij} {\mathbf{R}}_{i(j - 1)} } \\ \end{array} } \right],{\kern 1pt}^{ij} {\mathbf{T}}_{i(j - 1)} =\,^{ij}\overline{{\mathbf{R}}}_{i(j - 1)} \left[ {\begin{array}{*{20}c} {{\mathbf{I}}_{{\mathbf{3}}} } & { -^{i(j - 1)} {\hat{\mathbf{r}}}_{i(j - 1)} (A_{ij} )} \\ {\mathbf{0}} & {{\mathbf{I}}_{{\mathbf{3}}} } \\ \end{array} } \right] $$
(5)

where \( {\mathbf{I}}_{{\mathbf{3}}} \) is the (3 × 3) identity matrix, \( ^{ij} {\mathbf{R}}_{i(j - 1)} \) is the rotation matrix between frames \( {\fancyscript{F}}_{ij} \) and \( {\fancyscript{F}}_{i(j - 1)} \), \( ^{i(j - 1)} {\hat{\mathbf{r}}}_{i(j - 1)} (A_{ij} ) \) is the cross-product matrix associated with the vector \( ^{i(j - 1)} {\mathbf{r}}_{i(j - 1)} (A_{ij} ) \), i.e. the position of point \( A_{ij} \equiv B_{i(j - 1)} \) in \( {\fancyscript{F}}_{i(j - 1)} \) (Fig. 1c).

Finally, a global Jacobian matrix \( {\mathbf{J}}_{ij} \) defined such as \( \left[ {^{ij} {\mathbf{t}}_{ij}^{T} {\kern 1pt} {\dot{\mathbf{q}}}_{{e_{ij} }}^{T} } \right]^{T} = {\mathbf{J}}_{ij} {\dot{\mathbf{q}}}_{t} \) can be computed as \( {\mathbf{J}}_{ij}^{T} = \left[ {\begin{array}{*{20}c} {{\mathbf{J}}_{{t_{ij} }}^{T} } & {{\mathbf{O}}_{{{\mathbf{q}}_{eij} }}^{T} } \\ \end{array} } \right] \) where \( {\mathbf{O}}_{{{\mathbf{q}}_{eij} }} \) is defined such that \( {\dot{\mathbf{q}}}_{{e_{ij} }} = {\mathbf{O}}_{{{\mathbf{q}}_{eij} }} {\dot{\mathbf{q}}}_{t} \).

Introducing \( \left[ {^{ij} {\mathbf{t}}_{ij}^{T} {\kern 1pt} {\dot{\mathbf{q}}}_{{e_{ij} }}^{T} } \right]^{T} = {\mathbf{J}}_{ij} {\dot{\mathbf{q}}}_{t} \) into (2) leads to

$$ L_{t} = \frac{1}{2}\sum\limits_{i,j} \left( {{\dot{\mathbf{q}}}_{t}^{T} {\mathbf{J}}_{ij}^{T} {\mathbf{M}}_{ij} {\mathbf{J}}_{ij} {\dot{\mathbf{q}}}_{t} - {\mathbf{q}}_{t}^{T} {\mathbf{O}}_{{{\mathbf{q}}_{eij} }}^{T} {\mathbf{K}}_{ij} {\mathbf{O}}_{{{\mathbf{q}}_{eij} }} {\mathbf{q}}_{t} } \right) = \frac{1}{2}\left( {{\dot{\mathbf{q}}}_{t}^{T} {\mathbf{M}}_{t} {\dot{\mathbf{q}}}_{t} - {\mathbf{q}}_{t}^{T} {\mathbf{K}}_{t} {\mathbf{q}}_{t} } \right) $$
(6)

where \( {\mathbf{M}}_{t} \) and \( {\mathbf{K}}_{t} \) are the mass and stiffness matrices of the tree structure.

Adding the contribution of the rigid platform into (6), the Lagrangian of the total system can be written as:

$$ L = \frac{1}{2}\left( {\left[ {\begin{array}{*{20}c} {{\dot{\mathbf{q}}}_{t} } \\ {{\mathbf{t}}_{p} } \\ \end{array} } \right]^{T} \left[ {\begin{array}{*{20}c} {{\mathbf{M}}_{t} } & {\mathbf{0}} \\ {\mathbf{0}} & {{\mathbf{M}}_{p} } \\ \end{array} } \right]\left[ {\begin{array}{*{20}c} {{\dot{\mathbf{q}}}_{t} } \\ {{\mathbf{t}}_{p} } \\ \end{array} } \right] - \left[ {\begin{array}{*{20}c} {{\mathbf{q}}_{t} } \\ {{\mathbf{x}}_{p} } \\ \end{array} } \right]^{T} \left[ {\begin{array}{*{20}c} {{\mathbf{K}}_{t} } & {\mathbf{0}} \\ {\mathbf{0}} & {\mathbf{0}} \\ \end{array} } \right]\left[ {\begin{array}{*{20}c} {{\mathbf{q}}_{t} } \\ {{\mathbf{x}}_{p} } \\ \end{array} } \right]} \right) = \frac{1}{2}\left( {{\dot{\mathbf{q}}}_{g}^{T} {\mathbf{M}}_{g} {\dot{\mathbf{q}}}_{g} - {\mathbf{q}}_{g}^{T} {\mathbf{K}}_{g} {\mathbf{q}}_{g} } \right) $$
(7)

\( {\mathbf{M}}_{p} \) is the mass matrix of the rigid platform and \( {\mathbf{x}}_{p} \) represents the platform displacement (\( {\mathbf{t}}_{p} \) its twist). \( {\mathbf{M}}_{g} \) and \( {\mathbf{K}}_{g} \) are the total mass and stiffness matrices of the virtual system. \( {\mathbf{q}}_{g}^{T} = \left[ {{\mathbf{q}}_{t}^{T} {\kern 1pt} {\mathbf{x}}_{p}^{T} } \right] \) is its vector of generalized coordinates.

3 Stiffness and Mass Matrices for the Parallel Robot

It is now necessary to determine one possible subset of generalized coordinates for the parallel robot. Using (3) for computing the twist \( ^{{i,m_{i} }} {\mathbf{t}}_{{i,m_{i} }} \) of the tip of leg i:

$$ ^{{i,m_{i} }} {\mathbf{t}}_{{i,m_{i} }} = {\mathbf{J}}_{{t_{{i,m_{i} }} }}^{i} {\dot{\mathbf{q}}}_{{t_{i} }} $$
(8)

where \( {\mathbf{J}}_{{t_{{i,m_{i} }} }}^{i} \) can be obtained from \( {\mathbf{J}}_{{t_{{i,m_{i} }} }} \) by extracting the columns corresponding to the vector \( {\dot{\mathbf{q}}}_{{t_{i} }}^{T} = \left[ {{\dot{\mathbf{q}}}_{{p_{i} }}^{T} ,{\dot{\mathbf{q}}}_{{e_{i} }}^{T} } \right] \), i.e. the vector stacking all variables of the leg i.

As the leg extremity is also linked to the rigid platform, its twist can be related to the platform twist \( {\mathbf{t}}_{p} \) via the rigid body displacement relation:

$$ ^{{i,m_{i} }} {\mathbf{t}}_{{i,m_{i} }} = {\mathbf{J}}_{p}^{i} {\mathbf{t}}_{p} , {\text{where}}\;\,{\mathbf{J}}_{p}^{i} =\,^{{i,m_{i} }} \overline{{\mathbf{R}}}_{0} \left[ {\begin{array}{*{20}c} {{\mathbf{I}}_{3} } & { -^{0} {\hat{\mathbf{p}}}_{i} } \\ {\mathbf{0}} & {{\mathbf{I}}_{3} } \\ \end{array} } \right] $$
(9)

in which \( ^{0} {\hat{\mathbf{p}}}_{i} \) is the cross product matrix of vector \( ^{0} {\mathbf{p}}_{i} \) that characterizes the position of the attachment point \( A_{{i,m_{i} }} \) w.r.t. the platform center (Fig. 1a) and \( ^{{i,m_{i} }} \overline{{\mathbf{R}}}_{0} \) is the (6 × 6) rotation matrix between the global frame and the local frame \( {\fancyscript{F}}_{{i,m_{i} }} \).

Thus, the following set of equations can be obtained:

$$ \left[ {\begin{array}{*{20}c} {{\mathbf{J}}_{{t_{{1,m_{1} }} }}^{1} } & \cdots & {\mathbf{0}} \\ \vdots & \ddots & \vdots \\ {\mathbf{0}} & \cdots & {{\mathbf{J}}_{{t_{{n,m_{n} }} }}^{n} } \\ \end{array} } \right]\left[ {\begin{array}{*{20}c} {{\dot{\mathbf{q}}}_{{t_{1} }} } \\ \vdots \\ {{\dot{\mathbf{q}}}_{{t_{n} }} } \\ \end{array} } \right] - \left[ {\begin{array}{*{20}c} {{\mathbf{J}}_{p}^{1} } \\ \vdots \\ {{\mathbf{J}}_{p}^{n} } \\ \end{array} } \right]{\mathbf{t}}_{p} = {\mathbf{0}} \Leftrightarrow {\mathbf{J}}_{t} {\dot{\mathbf{q}}}_{t} - {\mathbf{J}}_{p} {\mathbf{t}}_{p} = \left[ {\begin{array}{*{20}c} {{\mathbf{J}}_{t} } & { - {\mathbf{J}}_{p} } \\ \end{array} } \right]\left[ {\begin{array}{*{20}c} {{\dot{\mathbf{q}}}_{t} } \\ {{\mathbf{t}}_{p} } \\ \end{array} } \right] = {\mathbf{J}}_{g} {\dot{\mathbf{q}}}_{g} = {\mathbf{0}} $$
(10)

where \( {\mathbf{J}}_{g} \) is a \( (r n \times n_{{q_{g} }} ) \) matrix, \( n_{{q_{g} }} > r n \) (r = 6 for a spatial robot, r = 3 for a planar robot). This means that a subset \( {\dot{\mathbf{q}}}_{d} \) of rn variables in vector \( {\dot{\mathbf{q}}}_{g} \) is linked to the others. This subset is not unique. As most of parallel robots have identical legs, an idea is to put in \( {\dot{\mathbf{q}}}_{d} \) the last r components \( {\dot{\mathbf{q}}}_{{t_{i} }}^{f} \) of each vector \( {\dot{\mathbf{q}}}_{{t_{i} }} \) which can be decomposed into two parts \( {\dot{\mathbf{q}}}_{{t_{i} }}^{T} = \left[ {{\dot{\mathbf{q}}}_{{t_{i} }}^{0T} {\dot{\mathbf{q}}}_{{t_{i} }}^{fT} } \right] \):

$$ - \left[ {\begin{array}{*{20}c} {{\mathbf{J}}_{{t_{{1,m_{1} }} }}^{f1} } & \cdots & {\mathbf{0}} \\ \vdots & \ddots & \vdots \\ {\mathbf{0}} & \cdots & {{\mathbf{J}}_{{t_{{n,m_{n} }} }}^{fn} } \\ \end{array} } \right]\left[ {\begin{array}{*{20}c} {{\dot{\mathbf{q}}}_{{t_{1} }}^{f} } \\ \vdots \\ {{\dot{\mathbf{q}}}_{{t_{n} }}^{f} } \\ \end{array} } \right] = \left[ {\begin{array}{*{20}c} {{\mathbf{J}}_{{t_{{1,m_{1} }} }}^{01} } & \cdots & {\mathbf{0}} & { - {\mathbf{J}}_{p}^{1} } \\ \vdots & \ddots & \vdots & \vdots \\ {\mathbf{0}} & \cdots & {{\mathbf{J}}_{{t_{{n,m_{n} }} }}^{0n} } & { - {\mathbf{J}}_{p}^{n} } \\ \end{array} } \right]\left[ {\begin{array}{*{20}c} {{\dot{\mathbf{q}}}_{{t_{1} }}^{0} } \\ \vdots \\ {{\dot{\mathbf{q}}}_{{t_{n} }}^{0} } \\ {{\mathbf{t}}_{p} } \\ \end{array} } \right] \Leftrightarrow {\mathbf{J}}_{t}^{f} {\dot{\mathbf{q}}}_{t}^{f} = {\mathbf{J}}_{tp} {\dot{\mathbf{q}}}. $$
(11)

This can be rewritten as

$$ {\dot{\mathbf{q}}}_{t}^{f} = \left( {{\mathbf{J}}_{t}^{f} } \right)^{ - 1} {\mathbf{J}}_{tp} {\dot{\mathbf{q}}} = \left[ {\begin{array}{*{20}c} {{\mathbf{J}}_{{d_{1,1} }} } & \cdots & {{\mathbf{J}}_{{d_{1,n} }} } & {{\mathbf{J}}_{{d_{1,n + 1} }} } \\ \vdots & \ddots & \vdots & \vdots \\ {{\mathbf{J}}_{{d_{n,1} }} } & \cdots & {{\mathbf{J}}_{{d_{n,n} }} } & {{\mathbf{J}}_{{d_{n,n + 1} }} } \\ \end{array} } \right]{\dot{\mathbf{q}}} = {\mathbf{J}}_{d} {\dot{\mathbf{q}}}. $$
(12)

If the coordinates \( {\dot{\mathbf{q}}}_{{t_{i} }}^{f} \) are those of the last elastic element of the leg (which is most often the case), the k-th column of matrix \( {\mathbf{J}}_{{t_{il} }}^{fi} \) corresponds to a unit twist that describes the displacement of the leg extremity due to the k-th coordinate of \( {\mathbf{q}}_{{t_{i} }}^{f} \), i.e. [12]

$$ {\mathbf{J}}_{{t_{il} }}^{fi} = \left[ {\begin{array}{*{20}c} {^{{i,m_{i} }} {\mathbf{R}}_{il} } & { -^{{i,m_{i} }} {\mathbf{R}}_{il}^{il} {\hat{\mathbf{p}}}_{il} } \\ {\mathbf{0}} & {^{{i,m_{i} }} {\mathbf{R}}_{il} } \\ \end{array} } \right] $$
(13)

where \( ^{{i,m_{i} }} {\mathbf{R}}_{il} \) is the rotation matrix between the local frame linked at element \( i,m_{i} \) and the local frame linked at element il and \( ^{il} {\hat{\mathbf{p}}}_{il} \) is the cross product matrix of the vector \( ^{il} {\mathbf{p}}_{il} \) that characterizes the position of the leg extremity with respect to the frame linked at element il. Thus its inverse is equal to

$$ \left( {{\mathbf{J}}_{{t_{il} }}^{fi} } \right)^{ - 1} = \left[ {\begin{array}{*{20}c} {^{{i,m_{i} }} {\mathbf{R}}_{il}^{T} } & {{\hat{\mathbf{p}}}_{il}^{{i,m_{i} }} {\mathbf{R}}_{il}^{T} } \\ {\mathbf{0}} & {^{{i,m_{i} }} {\mathbf{R}}_{il}^{T} } \\ \end{array} } \right] $$
(14)

which does not require much calculation. Finally, from (12) and the definition of \( {\dot{\mathbf{q}}}_{g}^{T} = \left[ {{\dot{\mathbf{q}}}_{{t_{1} }}^{T} , \ldots , {\dot{\mathbf{q}}}_{{t_{n} }}^{T} , {\mathbf{t}}_{p}^{T} } \right]^{T} \), the matrix J defined such that \( {\dot{\mathbf{q}}}_{g} = {\mathbf{J\dot{q}}} \) can be computed.

Introducing \( {\dot{\mathbf{q}}}_{g} = {\mathbf{J\dot{q}}} \) into (7) leads to:

$$ L = \frac{1}{2}\left( {{\dot{\mathbf{q}}}^{T} {\mathbf{J}}^{T} {\mathbf{M}}_{g} {\mathbf{J\dot{q}}} - {\mathbf{q}}^{T} {\mathbf{J}}^{T} {\mathbf{K}}_{g} {\mathbf{Jq}}} \right) = \frac{1}{2}\left( {{\dot{\mathbf{q}}}^{T} {\mathbf{M\dot{q}}} - {\mathbf{q}}^{T} {\mathbf{Kq}}} \right) $$
(15)

from which the natural frequencies \( f_{i} \;(i = 1, \ldots ,n_{{q_{g} }} - r{\kern 1pt} n) \) of the parallel robot can be computed as \( f_{i} = \sqrt {eig\left( {{\mathbf{M}}^{ - 1} {\mathbf{K}}} \right)} /(2\pi ) \). It should be noticed that obviously, matrices M and K depend on the robot configuration.

To automatize the calculation of the mass and stiffness matrices of the robot, for each computation, the elements of a vector or a matrix containing at least one mathematical operation are replaced by an intermediate variable. This variable is written in an output file which contains the model. The elements that do not contain any operations are not modified. The obtained vectors and matrices are propagated in the subsequent equations. Consequently, at the end, the model is obtained as a set of intermediate variables. Those that have no effect on the desired output can be eliminated. This algorithm has been successfully implemented with Mathematica.

4 Case Study: The NaVARo

The NaVARo is a 3-dof planar parallel manipulator developed at IRCCyN (Fig. 2a) and composed of 3 identical legs and one moving platform made up of 3 segments \( E_{1} P \), \( E_{2} P \) and \( E_{3} P \) rigidly linked at point P. The i-th leg contains four links connected with five revolute joints in such a way that \( A_{i} B_{i} C_{i} D_{i} \) is a parallelogram linkage, \( i = 1,2,3 \). The base frame \( {\fancyscript{F}}_{b} \left( {O,{\mathbf{x}}_{0} ,{\mathbf{y}}_{0} ,{\mathbf{z}}_{0} } \right) \) (not shown in Fig. 2b) is defined such as point O is located at the geometric centre of the equilateral triangle \( A_{1} A_{2} A_{3} \). Frame \( {\fancyscript{F}}_{p} \left( {P,{\mathbf{x}}_{p} ,{\mathbf{y}}_{p} ,{\mathbf{z}}_{p} } \right) \) is attached to the moving platform. In the home configuration shown in Fig. 2, \( {\fancyscript{F}}_{b} \) and \( {\fancyscript{F}}_{p} \left( {P,{\mathbf{x}}_{p} ,{\mathbf{y}}_{p} ,{\mathbf{z}}_{p} } \right) \) (attached to the moving platform) coincide. \( \left( {x_{p} ,y_{p} } \right) \) are the Cartesian coordinates of point P expressed in frame \( {\fancyscript{F}}_{b} \) and \( \theta_{p} \) is the orientation angle of the platform (the angle between \( {\mathbf{x}}_{0} \) and \( {\mathbf{x}}_{p} \)).

Fig. 2
figure 2

The NaVARo. a Prototype of the NaVARo. b Shematics of the NaVARo

Three double clutches are mounted to the base at points \( A_{i} \), \( i = 1,2,3 \), in order to actuate either angle \( q_{1i} \) or angle \( q_{2i} \). As a consequence, the NaVARo has 8 actuation modes [1, 14]. Therefore, the platform can be moved throughout the workspace without reaching any parallel singularity thanks to a judicious actuation scheme. The kinematics of the i-th leg is described by the modified Denavit-Hartenberg parameters (MDH) [12] given in Table 1, in which \( \gamma_{i} = \pi /2 \) if i = 1, \( \gamma_{i} = - 5\pi /6 \) if i = 2 and \( \gamma_{i} = - \pi /6 \) if i = 3. Besides, the circumradius of the moving-platform is equal to \( 0.2027 \) m, i.e., \( l_{5i} = 0.2027 \) m. Each link, of rectangular cross-section, is made up of duraluminum alloy. Table 1 gives their cross-section area and inertia.

Table 1 MDH parameters of the i-th leg and characteristics of the beam cross-sections

In the experimental setup, the rotation of links 1i and 2i about point \( A_{i} \), \( i = 1,2,3 \), is locked thanks to the double clutch mechanisms. A single 3D beam element is used to model links 1i, 2i, 3i and 5i while two 3D beam elements of equal lengths are used to model links 4i, the latter being twice longer than the former.

Thus, the NaVARo is modelled as a spatial mechanism and its model contains 144 generalized coordinates, among which only 90 are independent (see Sect. 3). The model has been calculated using the proposed procedure and compiled into C code to obtain the robot natural frequencies. The computation involve the use of 36183 ‘+’ or ‘−’and 37341 ‘*’ or ‘/’ operators, while 21383 variables are defined.

To the best of our knowledge, there exist no works that try to minimize the number of operators in the elastodynamic models of parallel robots. Therefore, the efficiency of the proposed solution may be difficult to analyze. However, for reasons of comparison, the obtained frequencies were validated by means of an equivalent model developed using Cast3 M software [8]. For the simulations, Cast3 M gives the result after around 6 s of computation while our model send the results in around 0.01 s (for a Pentium 4 2.70 GHz, 8Go of RAM). Both models give the same values for the first 90 natural frequencies of the NaVARo. Table 2 gives the first 5 natural frequencies of the NaVARo for the 4 robot postures shown in Fig. 3.

Table 2 Comparison of the natural frequencies obtained with Cast3 M and Matlab
Fig. 3
figure 3

The four test poses \( \{ x_{p} ,y_{p} ,\theta_{p} \} \) (positions in meters, orientation in radian). a \( \{ 0,0,0\} \). b \( \{ 0,0, - \pi /3\} \). c \( \{ 0.12,0.07, - \pi /3\} \). d \( \{ 0.18,0.11, - \pi /3\} \)

5 Conclusions

The paper has presented a symbolic and recursive calculation of the stiffness and mass matrices of parallel robots. The proposed algorithm, that takes advantage of recursive calculations for the computation of the Jacobian matrices defining the kinematic constraints, is used to compute the natural frequencies of a robot developed at IRCCyN: the NaVARo. Results have shown that the proposed model was able to give the same values as a FEA software for the first 90 natural frequencies of the NaVARo but in a considerably reduces computational time (around 0.01 s for our model while FEA results were obtained in several sec.).