RotorcraftMixing

From PaparazziUAV
Revision as of 14:53, 9 October 2013 by Jkg (talk | contribs) (fixed signs of first row of matrix A code to correspond to pretty-printed A values; added absolute value to max function to handle case where longest motor arm is negative)
Jump to navigation Jump to search

This page describe how to compute "mixing" for an arbitrary multirotors configuration.

Hexa 3D.png

Introduction

"Mixing" consist in converting rotational accelerations commands computed by the autopilot into throttle commands for each of the motor controllers.

Let us consider a vehicle comprising a set of Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle N} identical fixed pitch rotors located at coordinates Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle (X_i,Y_i, 0), i\in[1:N]} and spinning in the same plane in the direction Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle D_i, i\in[1:N], D_i\in[-1;1]} at a rotational speed Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \omega_i, i\in[1:N]} .

Assuming a quasi hovering regime, the force produced by each rotor can be considered normal to the rotor plane and proportional to the square of its rotational speed. Expressed in body frame ( front, right, down ), this leads to

Under the same assumption, the torque produced by each rotor can also be assumed to be in the same direction and proportional to the square of the rotational speed.

The torque produced by each rotor around the CG, expressed in body frame can then be writen

Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \overrightarrow{M}_{i}^{B} = \begin{pmatrix}X_i\\Y_i\\0\end{pmatrix}\wedge\begin{pmatrix}0\\0\\-C_t \omega_i^2\end{pmatrix} + \begin{pmatrix}0\\0\\D_i C_m \omega_i^2\end{pmatrix} }

Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \overrightarrow{M}_{i}^{B} = C_t \omega_i^2 \begin{pmatrix}-Y_i \\X_i \\D_i \frac{C_m}{C_t}\end{pmatrix} }

Where is a "thrust" coefficient and is a "torque" coefficient. It has been measured experimentally that Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \frac{Ct}{Cm} \approx 10} on a mikrokopter.

As a first approximation we can consider that the rotational speed of the propeller is proportional to the square root of the applied command Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle u_i}


This allows us to express the torque produced by the set of rotors as

which can be rewriten as a matrix vector product

Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \overrightarrow{M}^{B} = K C_t \begin{pmatrix} -Y_1&-Y_2&\ldots&-Y_n\\ X_1& X_2&\ldots& X_n\\ \frac{C_m}{Ct}D_1&\frac{C_m}{Ct}D_2&\ldots&\frac{C_m}{Ct}D_n \end{pmatrix} \begin{pmatrix} u_1\\ u_2\\ \vdots\\ u_n \end{pmatrix} }

Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \overrightarrow{M}^{B} = A \overrightarrow{U} }

Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle A} is a Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle 3*N} matrix describing the geometric positions of our rotors and is the vector of throttle commands for our set of motor controllers.

In order to express the command applied to each power train as a function of the momentum we want to apply to our vehicle, we need to find , a Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle N*3} matrix such as

If has rank 3, we know that such a matrix exists (yeah, we can't do 2 rotors or have all rotors aligned), and in this case, we have the relationship

Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle AB = \mathcal{I}_3 }

We know that one solution of this equation is the Moore-Penrose pseudoinverse of . Furthermore, this solution is the one leading to the power train command vector having the smallest euclidian norm, which is interesting as it optimizes the repartion of our control effort across our power trains.

Example

Let's consider the following H hexarotors configuration.

Hexa h.png

The first two lines of the matrix represent the coordinates of each rotor in the plan, and the third line the direction in which they spin.

Normalizing columns of Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle B} yelds

Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \tilde{B} = \begin{pmatrix} -67 & -256 & -154 \\ 67 & -256 & 154 \\ -256 & 0 & 256 \\ 256 & 0 & -256 \\ -189 & 256 & -115 \\ 189 & 256 & 115 \\ \end{pmatrix} }

which in turns yelds the following supervision section

   <section name="SUPERVISION" prefix="SUPERVISION_">
    <define name="MIN_MOTOR" value="3"/>
    <define name="MAX_MOTOR" value="200"/>
    <define name="TRIM_A" value="0"/>
    <define name="TRIM_E" value="0"/>
    <define name="TRIM_R" value="0"/>
    <define name="NB_MOTOR" value="6"/>
    <define name="SCALE" value="256"/>
    <define name="ROLL_COEF"   value="{ -67,    67, -256,  256, -189,  189}"/>
    <define name="PITCH_COEF"  value="{ -256, -256,    0,    0,  256,  256}"/>
    <define name="YAW_COEF"    value="{ -154,  154,  256, -256, -115,  115}"/>
    <define name="THRUST_COEF" value="{  256,  256,  256,  256,  256,  256}"/>
  </section>

The above computation can be performed using the following simple octave script (sudo apt-get install octave3.2)

octave
copy the flowing commands in the terminal: (ncol is the number of col from matrix B. in this example = 3 )
exit
A = [
   -0.17  0.17   -0.25  0.25   -0.33   0.33
  -0.35   -0.35   0.     0.     0.35    0.35
  -0.1     0.1    0.1   -0.1   -0.1     0.1
];

B = pinv(A)

m = max(abs(B))

[nrow,ncol] = size(B)

for i=1:ncol
   Btilde(:,i) = B(:,i)/m(i);
end

Btilde =  round(256*Btilde)