paparazzi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[paparazzi-commits] [4553] sorry gustavo


From: antoine drouin
Subject: [paparazzi-commits] [4553] sorry gustavo
Date: Thu, 18 Feb 2010 14:00:59 +0000

Revision: 4553
          http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=4553
Author:   poine
Date:     2010-02-18 14:00:58 +0000 (Thu, 18 Feb 2010)
Log Message:
-----------
sorry gustavo

Modified Paths:
--------------
    paparazzi3/trunk/sw/simulator/scilab/q3d/test_polynomial.sce
    paparazzi3/trunk/sw/simulator/scilab/q3d/test_stop_stop.sce

Added Paths:
-----------
    paparazzi3/trunk/sw/simulator/scilab/q3d/q3d_diff_flatness.sci
    paparazzi3/trunk/sw/simulator/scilab/q3d/q3d_polynomials.sci

Added: paparazzi3/trunk/sw/simulator/scilab/q3d/q3d_diff_flatness.sci
===================================================================
--- paparazzi3/trunk/sw/simulator/scilab/q3d/q3d_diff_flatness.sci              
                (rev 0)
+++ paparazzi3/trunk/sw/simulator/scilab/q3d/q3d_diff_flatness.sci      
2010-02-18 14:00:58 UTC (rev 4553)
@@ -0,0 +1,87 @@
+//
+// Differential Flatness
+//
+
+
+DF_OX    = 1;  // Flat output first  coordinate
+DF_OZ    = 2;  // Flat output second coordinate
+DF_OSIZE = 2;
+DF_ORANK = 5;  // Number of time derivative needed
+
+fo_g       = 9.81;
+fo_mass    = 0.25;
+fo_inertia = 0.0078;
+
+global fo_traj;
+
+// state from flat output
+function [state] = df_state_of_fo(fo)
+  state = zeros(FDM_SSIZE, 1);
+  state(FDM_SX)      = fo(1,1);
+  state(FDM_SZ)      = fo(2,1);
+  state(FDM_SXD)     = fo(1,2);
+  state(FDM_SZD)     = fo(2,2);
+  theta = -atan(fo(1,3), fo_g + fo(2,3));
+  state(FDM_STHETA)  = theta;
+  thetad = -((fo_g + fo(2,3))*fo(1,4) - fo(1,3)*fo(2,4)) / ...
+      ((fo_g + fo(2,3))^2+fo(1,3)^2);
+  state(FDM_STHETAD) = thetad;
+endfunction
+
+// control input from flat output
+function [inp] = df_input_of_fo(fo)
+
+  x2   = fo(1,3);                               
+  z2p1 = fo(2,3)+9.81;                          
+
+  u1 =  fo_mass * sqrt((x2)^2 + (z2p1)^2);
+  
+  x3   = fo(1,4);                               
+  z3   = fo(2,4);                               
+  x4   = fo(1,5);                               
+  z4   = fo(2,5);                               
+  a = x4*z2p1 - z4*x2;                                  
+  b = z2p1^2+x2^2;
+  c = 2 * (z2p1*z3 + x2*x3);
+  d = x3*z2p1-z3*x2;
+  u2 = -fo_inertia * ( a/b - c*d/b^2);
+ 
+  inp = [u1; u2];
+  
+endfunction
+
+
+// 
+function [fo] = df_get_traj_polynomial(Xin, Xout, Uin, Uout, time)
+
+  fo = zeros(DF_OSIZE*DF_ORANK, length(time));
+  // boundary conditions
+  fo(1,1)  = Xin(FDM_SX);
+  fo(2,1)  = Xin(FDM_SZ);
+  fo(3,1)  = Xin(FDM_SXD);
+  fo(4,1)  = Xin(FDM_SZD);
+  fo(5,1)  = -Uin(1)*sin(Xin(FDM_STHETA));
+  fo(6,1)  =  Uin(1)*(cos(Xin(FDM_STHETA)) - 1);
+  fo(7,1)  = 0;
+  fo(8,1)  = 0;
+  fo(9,1)  = 0;
+  fo(10,1) = 0;
+  
+  fo(1, length(time)) = Xout(FDM_SX);
+  fo(2, length(time)) = Xout(FDM_SZ);
+  fo(3, length(time)) = Xout(FDM_SXD);
+  fo(4, length(time)) = Xout(FDM_SZD);
+  fo(5, length(time)) = -Uout(1)*sin(Xout(FDM_STHETA));
+  fo(6, length(time)) =  Uout(1)*(cos(Xout(FDM_STHETA)) - 1);
+  fo(7, length(time)) = 0;
+  fo(8, length(time)) = 0;
+  fo(9, length(time)) = 0;
+  fo(10,length(time)) = 0;  
+
+ 
+endfunction
+
+
+
+
+

Added: paparazzi3/trunk/sw/simulator/scilab/q3d/q3d_polynomials.sci
===================================================================
--- paparazzi3/trunk/sw/simulator/scilab/q3d/q3d_polynomials.sci                
                (rev 0)
+++ paparazzi3/trunk/sw/simulator/scilab/q3d/q3d_polynomials.sci        
2010-02-18 14:00:58 UTC (rev 4553)
@@ -0,0 +1,117 @@
+//
+// traj is a n_compo*n_order*n_sample vector
+// n_compo components
+// n_order succesive time derivatives
+// n_sample time values
+//
+function poly_display_traj(time, traj)
+
+  [n_compo, n_order, n_sample] = size(traj); 
+ 
+  for compo=1:n_compo
+    for order=1:n_order
+      subplot(n_order, n_compo, compo+(order-1)*n_compo);
+      plot2d(time, matrix(traj(compo,order,:), n_sample, 1));
+      xtitle(sprintf('$X^{%d}_{%d}$', order-1, compo));
+    end
+  end
+  
+endfunction
+
+
+//
+// compute the values of a set of polynomials along a time vector
+// 
+//
+function [traj] = poly_gen_traj(time, coefs)
+ 
+  [n_comp, n_order, n_coef] = size(coefs);
+ 
+  traj = zeros(n_comp, n_coef/2, length(time));
+  for compo=1:n_comp 
+    for order=1:n_order
+      for i=1:length(time)
+       traj(compo, order, i) = ...
+           poly_compute_val(matrix(coefs(compo,order, :),1,n_coef), time(1), 
time(i));
+      end
+    end
+  end
+
+endfunction
+
+
+//
+// compute v = a_{n}*(t-t_0)^{n} + a_{n-1}*(t-t_0)^{n-1} + ... + a_{0}
+//
+//
+function [v] = poly_compute_val(coefs, t0, t)
+  dt = t-t0;
+  v = coefs($);
+  for i=1:length(coefs)-1
+    v = v * dt;
+    v = v + coefs(length(coefs)-i); // assume coef(1) = a_0
+  end
+  
+endfunction
+
+
+//
+//  compute coefficients for a set of polynomials
+//  having bond values b0 and b1
+//
+//
+function [coefs] = poly_get_coef_from_bound(time, b0,b1)
+
+  [n_comp, n_order] = size(b0);
+  n_coef = 2*n_order
+  coefs = zeros(n_comp, n_order, n_coef); 
+  
+  // refer to paper for notations
+  
+  for compo=1:n_comp
+
+    // invert of the top left corner block  
+    invA1 = zeros(n_order, n_order);
+    for i=1:n_order
+      invA1(i,i) = 1/Arr(i-1,i-1);
+    end
+    // first half of the coefficients
+    coefs(compo, 1, 1:n_order) = (invA1*b0(compo,:)')';
+    
+    // bottom left block : triangular
+    A3 = zeros(n_order, n_order);
+    dt = time($) - time(1);
+    for i=1:n_order
+      for j=i:n_order
+       A3(i,j) = Arr(i-1,j-1) * dt^(j-i);
+      end
+    end
+    // bottom right block 
+    A4 = zeros(n_order, n_order);
+    for i=1:n_order
+      for j=1:n_order
+       A4(i,j) = Arr(i-1,j-1+n_order) * dt^(j+n_order-i);
+      end
+    end
+    coefs(compo, 1, n_order+1:2*n_order) = ...
+       (inv(A4)*(b1(compo,:)' - A3*matrix(coefs(compo,1, 1:n_order), n_order, 
1)))';
+    // fill in the coefficients for the succesive time derivatives  
+//    pause
+    
+    for order=2:n_order
+      for pow=0:2*n_order-order
+       coefs(compo, order, pow+1) = Arr(order-1,pow-1+order)*coefs(compo, 1, 
pow+order);
+      end
+    end
+  end
+  
+endfunction
+
+
+//
+// Arrangement
+//
+//
+function [akn] = Arr(k,n)
+  akn = factorial(n)/factorial(n-k);
+endfunction

Modified: paparazzi3/trunk/sw/simulator/scilab/q3d/test_polynomial.sce
===================================================================
--- paparazzi3/trunk/sw/simulator/scilab/q3d/test_polynomial.sce        
2010-02-12 17:39:12 UTC (rev 4552)
+++ paparazzi3/trunk/sw/simulator/scilab/q3d/test_polynomial.sce        
2010-02-18 14:00:58 UTC (rev 4553)
@@ -1,20 +1,20 @@
 clear()
 
 // a0 + a1(t-t0) + ... + an(t-tO)^n
-coefs = 
 
 
 
 
-if 0
+
+
 exec('q3d_utils.sci');
 exec('q3d_polynomials.sci');
 exec('q3d_diff_flatness.sci');
 exec('q3d_fdm.sci');
 exec('q3d_display.sci');
 
-b0 = [0 1 0];
-b1 = [2 0 0];
+b0 = [0 0 0 0 0];
+b1 = [2 0 0 0 0];
 t0 = 0;
 t1 = 2;
 dt = 0.01;
@@ -30,4 +30,4 @@
 f=get("current_figure");
 f.figure_name="Flat Outputs Trajectory";
 poly_display_traj(time, fo_traj);
-end
+

Modified: paparazzi3/trunk/sw/simulator/scilab/q3d/test_stop_stop.sce
===================================================================
--- paparazzi3/trunk/sw/simulator/scilab/q3d/test_stop_stop.sce 2010-02-12 
17:39:12 UTC (rev 4552)
+++ paparazzi3/trunk/sw/simulator/scilab/q3d/test_stop_stop.sce 2010-02-18 
14:00:58 UTC (rev 4553)
@@ -5,10 +5,10 @@
 exec('q3d_fdm.sci');
 exec('q3d_display.sci');
 
-b0 = [0  0 0 0 0; 0 0 0 0 0];
-b1 = [20 0 0 0 0; 0 0 0 0 0];
+b0 = [0 0 0 0 0; 0 0 0 0 0];
+b1 = [5 0 0 0 0; 0 0 0 0 0];
 t0 = 0;
-t1 = 10;
+t1 = 2.;
 dt = 0.01;
 time = t0:dt:t1;
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]