paparazzi-commits
[Top][All Lists]
Advanced

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

[paparazzi-commits] [5710] Adding twisting and state feedback controller


From: Paul Cox
Subject: [paparazzi-commits] [5710] Adding twisting and state feedback controllers.
Date: Thu, 26 Aug 2010 15:40:17 +0000

Revision: 5710
          http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=5710
Author:   paulcox
Date:     2010-08-26 15:40:02 +0000 (Thu, 26 Aug 2010)
Log Message:
-----------
Adding twisting and state feedback controllers. Twisting is done on tilt axis 
only and works mostly. sfb is just a start.

Modified Paths:
--------------
    paparazzi3/trunk/conf/airframes/Poine/beth.xml
    paparazzi3/trunk/conf/settings/settings_beth.xml
    paparazzi3/trunk/sw/airborne/beth/main_overo.c
    paparazzi3/trunk/sw/airborne/beth/overo_controller.c
    paparazzi3/trunk/sw/airborne/beth/overo_controller.h
    paparazzi3/trunk/sw/airborne/beth/overo_estimator.c
    paparazzi3/trunk/sw/airborne/beth/overo_estimator.h

Added Paths:
-----------
    paparazzi3/trunk/sw/airborne/beth/overo_sfb_controller.c
    paparazzi3/trunk/sw/airborne/beth/overo_sfb_controller.h
    paparazzi3/trunk/sw/airborne/beth/overo_twist_controller.c
    paparazzi3/trunk/sw/airborne/beth/overo_twist_controller.h

Modified: paparazzi3/trunk/conf/airframes/Poine/beth.xml
===================================================================
--- paparazzi3/trunk/conf/airframes/Poine/beth.xml      2010-08-26 15:16:52 UTC 
(rev 5709)
+++ paparazzi3/trunk/conf/airframes/Poine/beth.xml      2010-08-26 15:40:02 UTC 
(rev 5710)
@@ -238,12 +238,73 @@
 main_overo.srcs    += $(SRC_BETH)/overo_gcs_com.c
 main_overo.srcs    += $(SRC_BETH)/overo_file_logger.c
 main_overo.srcs    += $(SRC_BETH)/overo_estimator.c
+main_overo.CFLAGS  += -DCONTROLLER_H=\"overo_controller.h\"
 main_overo.srcs    += $(SRC_BETH)/overo_controller.c
 
 
 #
+# Overo twisting
 #
+
+USER =
+HOST = auto3
+TARGET_DIR = ~
+SRC_FMS=fms
+
+overo_twist.ARCHDIR = omap
+overo_twist.CFLAGS = -I. -I$(SRC_FMS)
+overo_twist.srcs  = $(SRC_BETH)/main_overo.c
+overo_twist.CFLAGS  += -DFMS_PERIODIC_FREQ=512
+overo_twist.srcs    += $(SRC_FMS)/fms_periodic.c
+overo_twist.srcs    += $(SRC_FMS)/fms_serial_port.c
+overo_twist.LDFLAGS += -lrt
+overo_twist.srcs += $(SRC_FMS)/fms_spi_link.c
+overo_twist.CFLAGS += -DOVERO_LINK_MSG_UP=AutopilotMessageBethUp 
-DOVERO_LINK_MSG_DOWN=AutopilotMessageBethDown
+
+overo_twist.CFLAGS  += -DDOWNLINK -DDOWNLINK_TRANSPORT=UdpTransport
+overo_twist.srcs    += $(SRC_FMS)/udp_transport2.c downlink.c
+overo_twist.srcs    += $(SRC_FMS)/fms_network.c
+overo_twist.LDFLAGS += -levent -lm
+
+overo_twist.srcs    += $(SRC_BETH)/overo_gcs_com.c
+overo_twist.srcs    += $(SRC_BETH)/overo_file_logger.c
+overo_twist.srcs    += $(SRC_BETH)/overo_estimator.c
+overo_twist.CFLAGS  += -DCONTROLLER_H=\"overo_twist_controller.h\"
+overo_twist.srcs    += $(SRC_BETH)/overo_twist_controller.c
+
 #
+# Overo state feedback
+#
+
+USER =
+HOST = auto3
+TARGET_DIR = ~
+SRC_FMS=fms
+
+overo_sfb.ARCHDIR = omap
+overo_sfb.CFLAGS = -I. -I$(SRC_FMS)
+overo_sfb.srcs  = $(SRC_BETH)/main_overo.c
+overo_sfb.CFLAGS  += -DFMS_PERIODIC_FREQ=512
+overo_sfb.srcs    += $(SRC_FMS)/fms_periodic.c
+overo_sfb.srcs    += $(SRC_FMS)/fms_serial_port.c
+overo_sfb.LDFLAGS += -lrt
+overo_sfb.srcs += $(SRC_FMS)/fms_spi_link.c
+overo_sfb.CFLAGS += -DOVERO_LINK_MSG_UP=AutopilotMessageBethUp 
-DOVERO_LINK_MSG_DOWN=AutopilotMessageBethDown
+
+overo_sfb.CFLAGS  += -DDOWNLINK -DDOWNLINK_TRANSPORT=UdpTransport
+overo_sfb.srcs    += $(SRC_FMS)/udp_transport2.c downlink.c
+overo_sfb.srcs    += $(SRC_FMS)/fms_network.c
+overo_sfb.LDFLAGS += -levent -lm
+
+overo_sfb.srcs    += $(SRC_BETH)/overo_gcs_com.c
+overo_sfb.srcs    += $(SRC_BETH)/overo_file_logger.c
+overo_sfb.srcs    += $(SRC_BETH)/overo_estimator.c
+overo_sfb.CFLAGS  += -DCONTROLLER_H=\"overo_sfb_controller.h\"
+overo_sfb.srcs    += $(SRC_BETH)/overo_sfb_controller.c
+
+#
+#
+#
 include $(PAPARAZZI_SRC)/conf/autopilot/lisa_test_progs.makefile
 
   </makefile>

Modified: paparazzi3/trunk/conf/settings/settings_beth.xml
===================================================================
--- paparazzi3/trunk/conf/settings/settings_beth.xml    2010-08-26 15:16:52 UTC 
(rev 5709)
+++ paparazzi3/trunk/conf/settings/settings_beth.xml    2010-08-26 15:40:02 UTC 
(rev 5710)
@@ -4,15 +4,15 @@
   <dl_settings>
     <dl_settings NAME="Controller">
 
-      <dl_setting var="controller.elevation_sp" min="-25" step="1" max="20" 
module="beth/overo_controller" shortname="elev_sp" unit="rad" alt_unit="deg" 
alt_unit_coef="57.29578"/>
+      <dl_setting var="controller.elevation_sp" min="-25" step="1" max="20" 
module="beth/overo_twist_controller" shortname="elev_sp" unit="rad" 
alt_unit="deg" alt_unit_coef="57.29578"/>
 
-      <dl_setting var="controller.azimuth_sp" min="-15" step="0.5" max="15" 
module="beth/overo_controller"  shortname="azim_sp" unit="rad" alt_unit="deg" 
alt_unit_coef="57.29578">
+      <dl_setting var="controller.tilt_sp" min="-15" step="0.5" max="15" 
module="beth/overo_twist_controller"  shortname="tilt_sp" unit="rad" 
alt_unit="deg" alt_unit_coef="57.29578">
       </dl_setting>
 
       <dl_setting var="controller.azim_gain" min="0" step=".01" max=".1" 
module="beth/overo_estimator"  shortname="azim_gain">
       </dl_setting>
 
-      <dl_setting var="controller.omega_tilt_ref" min="200" step="100" 
max="1200" module="beth/overo_controller"  shortname="tilt_omega_ref" 
unit="rad/s" alt_unit="deg/s" alt_unit_coef="57.29578">
+      <dl_setting var="controller.omega_tilt_ref" min="200" step="100" 
max="1200" module="beth/overo_twist_controller"  shortname="tilt_omega_ref" 
unit="rad/s" alt_unit="deg/s" alt_unit_coef="57.29578">
       </dl_setting>
 
       <dl_setting var="estimator.elevation_lp_coeff" min="0.01" step="0.01" 
max="1" module="beth/overo_estimator"  shortname="elev_lp_coeff">

Modified: paparazzi3/trunk/sw/airborne/beth/main_overo.c
===================================================================
--- paparazzi3/trunk/sw/airborne/beth/main_overo.c      2010-08-26 15:16:52 UTC 
(rev 5709)
+++ paparazzi3/trunk/sw/airborne/beth/main_overo.c      2010-08-26 15:40:02 UTC 
(rev 5710)
@@ -42,11 +42,12 @@
 #include "overo_file_logger.h"
 #include "overo_gcs_com.h"
 #include "overo_estimator.h"
-#include "overo_controller.h"
+#include CONTROLLER_H
 
 
 static void main_periodic(int);
 //static void main_parse_cmd_line(int argc, char *argv[]);
+static void drive_output(uint8_t last_state);
 static void main_exit(int sig);
 static void main_talk_with_stm32(void);
 
@@ -120,7 +121,7 @@
 
   BoozImuScaleGyro(booz_imu);
 
-  RunOnceEvery(15, {DOWNLINK_SEND_BETH(gcs_com.udp_transport,
+  RunOnceEvery(50, {DOWNLINK_SEND_BETH(gcs_com.udp_transport,
                        
&msg_in.payload.msg_up.bench_sensor.x,&msg_in.payload.msg_up.bench_sensor.y,
                        
&msg_in.payload.msg_up.bench_sensor.z,&msg_in.payload.msg_up.cnt,
                        
&msg_in.payload.msg_up.can_errs,&msg_in.payload.msg_up.spi_errs,
@@ -142,6 +143,60 @@
                        
msg_in.payload.msg_up.cnt,msg_in.payload.msg_up.can_errs);
   }
 
+
+  drive_output(last_state);
+
+  control_send_messages();
+
+  estimator_send_messages();
+
+  //file_logger_periodic();
+
+/*  RunOnceEvery(10, {DOWNLINK_SEND_IMU_GYRO_RAW(gcs_com.udp_transport,
+                            
//&msg_in.payload.msg_up.gyro.p,&msg_in.payload.msg_up.gyro.q,&msg_in.payload.msg_up.gyro.r)
+                               
&booz_imu.gyro_unscaled.p,&booz_imu.gyro_unscaled.q,&booz_imu.gyro_unscaled.r);});
+  RunOnceEvery(10, {DOWNLINK_SEND_IMU_ACCEL_RAW(gcs_com.udp_transport,
+                            
//&msg_in.payload.msg_up.accel.x,&msg_in.payload.msg_up.accel.y,&msg_in.payload.msg_up.accel.z
+                               
&booz_imu.accel_unscaled.x,&booz_imu.accel_unscaled.y,&booz_imu.accel_unscaled.z);})
+  RunOnceEvery(50, {DOWNLINK_SEND_BOOZ2_GYRO(gcs_com.udp_transport,
+                            
//&msg_in.payload.msg_up.gyro.p,&msg_in.payload.msg_up.gyro.q,&msg_in.payload.msg_up.gyro.r)
+                               
&booz_imu.gyro.p,&booz_imu.gyro.q,&booz_imu.gyro.r);});
+
+  RunOnceEvery(50, {DOWNLINK_SEND_AHRS_EULER(gcs_com.udp_transport,
+                       &estimator.tilt, &estimator.elevation, 
&estimator.azimuth );});
+  RunOnceEvery(50, {DOWNLINK_SEND_BOOZ2_ACCEL(DefaultChannel,
+                            
//&msg_in.payload.msg_up.accel.x,&msg_in.payload.msg_up.accel.y,&msg_in.payload.msg_up.accel.z
+                               
&booz_imu.accel.x,&booz_imu.accel.y,&booz_imu.accel.z);});*/
+
+  RunOnceEvery(33, gcs_com_periodic());
+
+}
+
+#if 0
+static void main_parse_cmd_line(int argc, char *argv[]) {
+
+  if (argc>1){
+    controller.kp = atof(argv[1]);
+    //    printf("kp set to %f\n",kp);
+    if (argc>2) {
+      controller.kd = atof(argv[2]);
+      //      printf("kd set to %f\n",kd);
+    } else {
+      controller.kd=1.0;
+      //      printf("using default value of kd %f\n",kd);
+    }
+  } else {
+    controller.kp = 0.05;
+    //    printf("using default value of kp %f\n",kp);
+  }
+/*
+  if (argc>1){
+    printf("args not currently supported\n");
+  }*/
+}
+#endif
+
+static void drive_output(uint8_t last_state) {
   switch (controller.armed) {
     case 0:
       if (last_state == 2) {
@@ -187,73 +242,8 @@
     default:
       break;
   }
-
-  RunOnceEvery(25, {DOWNLINK_SEND_BETH_ESTIMATOR(gcs_com.udp_transport,
-                       &estimator.tilt,&estimator.tilt_dot,
-                       &estimator.elevation,&estimator.elevation_dot,
-                       &estimator.azimuth,&estimator.azimuth_dot);});
-
-  RunOnceEvery(25, {DOWNLINK_SEND_BETH_CONTROLLER(gcs_com.udp_transport,
-                       &controller.cmd_pitch,&controller.cmd_thrust,
-                       &controller.cmd_pitch_ff,&controller.cmd_pitch_fb,
-                       &controller.cmd_thrust_ff,&controller.cmd_thrust_fb,
-                       
&controller.tilt_sp,&controller.tilt_ref,&controller.tilt_dot_ref,
-                       
&controller.elevation_sp,&controller.elevation_ref,&controller.elevation_dot_ref,
-                       &controller.azimuth_sp);});
-
-  //file_logger_periodic();
-
-
-/*  RunOnceEvery(10, {DOWNLINK_SEND_IMU_GYRO_RAW(gcs_com.udp_transport,
-                            
//&msg_in.payload.msg_up.gyro.p,&msg_in.payload.msg_up.gyro.q,&msg_in.payload.msg_up.gyro.r)
-                               
&booz_imu.gyro_unscaled.p,&booz_imu.gyro_unscaled.q,&booz_imu.gyro_unscaled.r);});
-    
-
-  RunOnceEvery(10, {DOWNLINK_SEND_IMU_ACCEL_RAW(gcs_com.udp_transport,
-                            
//&msg_in.payload.msg_up.accel.x,&msg_in.payload.msg_up.accel.y,&msg_in.payload.msg_up.accel.z
-                               
&booz_imu.accel_unscaled.x,&booz_imu.accel_unscaled.y,&booz_imu.accel_unscaled.z);});
-*/
-
-/*  RunOnceEvery(50, {DOWNLINK_SEND_BOOZ2_GYRO(gcs_com.udp_transport,
-                            
//&msg_in.payload.msg_up.gyro.p,&msg_in.payload.msg_up.gyro.q,&msg_in.payload.msg_up.gyro.r)
-                               
&booz_imu.gyro.p,&booz_imu.gyro.q,&booz_imu.gyro.r);});
-
-  RunOnceEvery(50, {DOWNLINK_SEND_AHRS_EULER(gcs_com.udp_transport,
-                       &estimator.tilt, &estimator.elevation, 
&estimator.azimuth );});
-*/    
-
-/*  RunOnceEvery(50, {DOWNLINK_SEND_BOOZ2_ACCEL(DefaultChannel,
-                            
//&msg_in.payload.msg_up.accel.x,&msg_in.payload.msg_up.accel.y,&msg_in.payload.msg_up.accel.z
-                               
&booz_imu.accel.x,&booz_imu.accel.y,&booz_imu.accel.z);});*/
-
-  RunOnceEvery(33, gcs_com_periodic());
-
 }
 
-#if 0
-static void main_parse_cmd_line(int argc, char *argv[]) {
-
-  if (argc>1){
-    controller.kp = atof(argv[1]);
-    //    printf("kp set to %f\n",kp);
-    if (argc>2) {
-      controller.kd = atof(argv[2]);
-      //      printf("kd set to %f\n",kd);
-    } else {
-      controller.kd=1.0;
-      //      printf("using default value of kd %f\n",kd);
-    }
-  } else {
-    controller.kp = 0.05;
-    //    printf("using default value of kp %f\n",kp);
-  }
-/*
-  if (argc>1){
-    printf("args not currently supported\n");
-  }*/
-}
-#endif
-
 static void main_exit(int sig) {
   printf("Initiating BETH shutdown...\n");
 
@@ -268,6 +258,7 @@
   }
   printf("done\n");
 #endif
+
   //If a logfile is being used, close it.
   //file_logger_exit()
   printf("Main Overo Application Exiting...\n");

Modified: paparazzi3/trunk/sw/airborne/beth/overo_controller.c
===================================================================
--- paparazzi3/trunk/sw/airborne/beth/overo_controller.c        2010-08-26 
15:16:52 UTC (rev 5709)
+++ paparazzi3/trunk/sw/airborne/beth/overo_controller.c        2010-08-26 
15:40:02 UTC (rev 5710)
@@ -4,6 +4,9 @@
 #include "std.h"
 #include "stdio.h"
 
+#include "messages2.h"
+#include "overo_gcs_com.h"
+
 struct OveroController controller;
 
 void control_init(void) {
@@ -34,7 +37,7 @@
 
   controller.one_over_J = 2.;
   controller.mass = 5.;
-  controller.azim_gain = 0.05;
+  controller.azim_gain = 0.005;
 
   controller.omega_cl = RadOfDeg(600);
   controller.xi_cl = 1.;
@@ -51,7 +54,16 @@
   controller.armed = 0;
 }
 
+void control_send_messages(void) {
 
+  RunOnceEvery(15, {DOWNLINK_SEND_BETH_CONTROLLER(gcs_com.udp_transport,
+                       &controller.cmd_pitch,&controller.cmd_thrust,
+                       &controller.cmd_pitch_ff,&controller.cmd_pitch_fb,
+                       &controller.cmd_thrust_ff,&controller.cmd_thrust_fb,
+                       
&controller.tilt_sp,&controller.tilt_ref,&controller.tilt_dot_ref,
+                       
&controller.elevation_sp,&controller.elevation_ref,&controller.elevation_dot_ref,
+                       &controller.azimuth_sp);});
+}
 
 void control_run(void) {
 

Modified: paparazzi3/trunk/sw/airborne/beth/overo_controller.h
===================================================================
--- paparazzi3/trunk/sw/airborne/beth/overo_controller.h        2010-08-26 
15:16:52 UTC (rev 5709)
+++ paparazzi3/trunk/sw/airborne/beth/overo_controller.h        2010-08-26 
15:40:02 UTC (rev 5710)
@@ -55,6 +55,7 @@
 extern struct OveroController controller;
 
 extern void control_init(void);
+extern void control_send_messages(void);
 extern void control_run(void);
 
 #endif /* OVERO_CONTROLLER_H */

Modified: paparazzi3/trunk/sw/airborne/beth/overo_estimator.c
===================================================================
--- paparazzi3/trunk/sw/airborne/beth/overo_estimator.c 2010-08-26 15:16:52 UTC 
(rev 5709)
+++ paparazzi3/trunk/sw/airborne/beth/overo_estimator.c 2010-08-26 15:40:02 UTC 
(rev 5710)
@@ -3,6 +3,9 @@
 #include "booz/booz_imu.h"
 #include <math.h>
 
+#include "messages2.h"
+#include "overo_gcs_com.h"
+
 struct OveroEstimator estimator;
 
 void estimator_init(void) {
@@ -11,6 +14,14 @@
   estimator.azimuth_lp_coeff = 0.5;
 }
 
+void estimator_send_messages(void) {
+
+  RunOnceEvery(25, {DOWNLINK_SEND_BETH_ESTIMATOR(gcs_com.udp_transport,
+                       &estimator.tilt,&estimator.tilt_dot,
+                       &estimator.elevation,&estimator.elevation_dot,
+                       &estimator.azimuth,&estimator.azimuth_dot);});
+}
+
 //bench sensors z,y,x values passed in
 void estimator_run(uint16_t tilt_measure, uint16_t elevation_measure, uint16_t 
azimuth_measure) {
   

Modified: paparazzi3/trunk/sw/airborne/beth/overo_estimator.h
===================================================================
--- paparazzi3/trunk/sw/airborne/beth/overo_estimator.h 2010-08-26 15:16:52 UTC 
(rev 5709)
+++ paparazzi3/trunk/sw/airborne/beth/overo_estimator.h 2010-08-26 15:40:02 UTC 
(rev 5710)
@@ -22,6 +22,7 @@
 extern struct OveroEstimator estimator;
 
 extern void estimator_init(void);
+extern void estimator_send_messages(void);
 extern void estimator_run(uint16_t tilt_measure, uint16_t elevation_measure, 
uint16_t azimuth_measure);
 
 #endif /* OVERO_CONTROLLER_H */

Added: paparazzi3/trunk/sw/airborne/beth/overo_sfb_controller.c
===================================================================
--- paparazzi3/trunk/sw/airborne/beth/overo_sfb_controller.c                    
        (rev 0)
+++ paparazzi3/trunk/sw/airborne/beth/overo_sfb_controller.c    2010-08-26 
15:40:02 UTC (rev 5710)
@@ -0,0 +1,104 @@
+#include "overo_sfb_controller.h"
+
+#include "overo_estimator.h"
+#include "std.h"
+#include "stdio.h"
+
+#include "messages2.h"
+#include "overo_gcs_com.h"
+
+#define _CO (controller)
+
+struct OveroController _CO;
+
+void control_send_messages(void) {
+
+  RunOnceEvery(15, {DOWNLINK_SEND_BETH_CONTROLLER_SFB(gcs_com.udp_transport,
+                       &_CO.tilt_sp);});
+
+}
+
+
+
+
+void control_init(void) {
+
+  _CO.tilt_sp = 0.;
+  _CO.elevation_sp = RadOfDeg(10);
+  _CO.azimuth_sp = 0.;
+
+  _CO.tilt_ref = 0.;
+  _CO.elevation_ref = 0;
+  _CO.azimuth_ref = 0.;
+
+  _CO.tilt_dot_ref = 0.;
+  _CO.elevation_dot_ref = 0;
+  _CO.azimuth_dot_ref = 0.;
+
+  _CO.cmd_pitch = 0.;
+  _CO.cmd_thrust = 0.;
+
+  _CO.armed = 0;
+}
+
+
+
+void control_run(void) {
+
+  static int foo=0;
+
+  /*
+   *  calculate errors
+   */
+
+  const float err_tilt = estimator.tilt - _CO.tilt_ref;
+  const float err_tilt_dot = estimator.tilt_dot - _CO.tilt_dot_ref;
+
+  const float err_elevation = estimator.elevation - _CO.elevation_ref;
+  const float err_elevation_dot = estimator.elevation_dot - 
_CO.elevation_dot_ref;
+
+  const float err_azimuth = estimator.azimuth - _CO.azimuth_ref;
+  const float err_azimuth_dot = estimator.azimuth_dot - _CO.azimuth_dot_ref;
+
+  /*
+   *  Compute state feedback
+   */
+
+  _CO.cmd_pitch =  1;
+    estimator.azimuth   
+      * ( _CO.o_tilt * _CO.o_tilt * _CO.o_azim * _CO.o_azim * 
cos(estimator.tilt) ) 
+      / ( _CO.b * _CO.a * _CO.u_t_ref) +
+    estimator.elevation    
+      * ( _CO.o_tilt * _CO.o_tilt * _CO.o_elev * _CO.o_elev * 
sin(estimator.tilt) ) 
+      / ( _CO.b * _CO.a * _CO.u_t_ref) -
+    estimator.tilt         
+      * ( _CO.o_tilt * _CO.o_tilt ) / ( _CO.b ) +
+    estimator.azimuth_dot  
+      * ( _CO.o_tilt * _CO.o_tilt * 2 * _CO.z_azim * _CO.o_azim * 
cos(estimator.tilt) ) 
+      / ( _CO.b * _CO.a * _CO.u_t_ref) +
+    estimator.elevation_dot 
+      * ( _CO.o_tilt * _CO.o_tilt * 2 * _CO.z_elev * _CO.o_elev * 
sin(estimator.tilt) ) 
+      / ( _CO.b * _CO.a * _CO.u_t_ref) -
+    estimator.tilt_dot 
+      * ( 2 * _CO.o_tilt * _CO.z_tilt ) 
+      / ( _CO.b ) ;
+ 
+  _CO.cmd_thrust = 
+    estimator.azimuth           * _CO.o_azim * _CO.o_azim * 
sin(estimator.tilt) / _CO.a + 
+    estimator.elevation         * _CO.o_elev * _CO.o_elev * 
cos(estimator.tilt) / _CO.a + 
+    estimator.azimuth_dot   * 2 * _CO.z_azim * _CO.o_azim * 
sin(estimator.tilt) / _CO.a -
+    estimator.elevation_dot * 2 * _CO.z_elev * _CO.o_elev * 
cos(estimator.tilt) / _CO.a  ;
+
+  _CO.cmd_thrust = _CO.cmd_thrust*(1/cos(estimator.elevation));
+
+  //if (_CO.cmd_thrust<0.) _CO.cmd_thrust = 0;
+  Bound(_CO.cmd_thrust,0,100);
+  Bound(_CO.cmd_pitch,-100,100);
+
+  if (!(foo%100)) {
+    //printf("%f %f %f\n",_CO.tilt_ref,_CO.tilt_dot_ref,_CO.tilt_ddot_ref);
+  }
+  foo++; 
+
+}
+

Added: paparazzi3/trunk/sw/airborne/beth/overo_sfb_controller.h
===================================================================
--- paparazzi3/trunk/sw/airborne/beth/overo_sfb_controller.h                    
        (rev 0)
+++ paparazzi3/trunk/sw/airborne/beth/overo_sfb_controller.h    2010-08-26 
15:40:02 UTC (rev 5710)
@@ -0,0 +1,48 @@
+#ifndef OVERO_CONTROLLER_H
+#define OVERO_CONTROLLER_H
+
+struct OveroController {
+  
+  float tilt_sp;
+  float elevation_sp;
+  float azimuth_sp;
+  
+  float tilt_ref;
+  float elevation_ref;
+  float azimuth_ref;
+
+  float tilt_dot_ref;
+  float elevation_dot_ref;
+  float azimuth_dot_ref;
+
+  /*omegas - natural frequencies*/
+  float o_tilt;
+  float o_elev;
+  float o_azim;
+
+  /*zetas - damping ratios*/
+  float z_tilt;
+  float z_elev;
+  float z_azim;
+
+  /*constants*/
+
+  float a; //     C_t0 / M
+  float b; // l * C_t0 / J
+
+  float u_t_ref;
+
+  float cmd_pitch;
+  float cmd_thrust;
+
+  int armed;
+};
+
+
+extern struct OveroController controller;
+
+extern void control_init(void);
+extern void control_send_messages(void);
+extern void control_run(void);
+
+#endif /* OVERO_CONTROLLER_H */

Added: paparazzi3/trunk/sw/airborne/beth/overo_twist_controller.c
===================================================================
--- paparazzi3/trunk/sw/airborne/beth/overo_twist_controller.c                  
        (rev 0)
+++ paparazzi3/trunk/sw/airborne/beth/overo_twist_controller.c  2010-08-26 
15:40:02 UTC (rev 5710)
@@ -0,0 +1,263 @@
+#include "overo_twist_controller.h"
+
+#include "overo_estimator.h"
+#include "std.h"
+#include "stdio.h"
+#include "stdlib.h" //for abs()
+
+#include "messages2.h"
+#include "overo_gcs_com.h"
+
+struct OveroTwistController controller;
+
+void control_send_messages(void) {
+
+  RunOnceEvery(15, {DOWNLINK_SEND_BETH_CONTROLLER(gcs_com.udp_transport,
+                       &controller.cmd_pitch,&controller.cmd_thrust,
+                       &controller.cmd_pitch_ff,&controller.cmd_pitch_fb,
+                       &controller.cmd_thrust_ff,&controller.cmd_thrust_fb,
+                       
&controller.tilt_sp,&controller.tilt_ref,&controller.tilt_dot_ref,
+                       
&controller.elevation_sp,&controller.elevation_ref,&controller.elevation_dot_ref,
+                       &controller.azimuth_sp);});
+
+  RunOnceEvery(15, {DOWNLINK_SEND_BETH_CONTROLLER_TWIST(gcs_com.udp_transport,
+                       
&controller.S[1],&controller.S_dot,&controller.U_twt[1],&controller.error);});
+}
+
+
+void control_init(void) {
+
+  printf("Twisting controller initializing\n");
+
+  controller.tilt_sp = 0.;
+  controller.elevation_sp = RadOfDeg(10);
+  controller.azimuth_sp = 0.;
+
+  controller.omega_tilt_ref = RadOfDeg(600);
+  controller.omega_elevation_ref = RadOfDeg(120);
+  controller.omega_azimuth_ref = RadOfDeg(60);
+  controller.xi_ref = 1.;
+
+  controller.tilt_ref = estimator.tilt;
+  controller.tilt_dot_ref = estimator.tilt_dot;
+  controller.tilt_ddot_ref = 0.;
+
+  //controller.elevation_ref = estimator.elevation;
+  controller.elevation_ref = RadOfDeg(-28);
+  controller.elevation_dot_ref = estimator.elevation_dot;
+  controller.elevation_ddot_ref = 0.;
+
+  controller.azimuth_ref = estimator.azimuth;
+  controller.azimuth_dot_ref = 0.;
+  controller.azimuth_ddot_ref = 0.;
+
+  controller.one_over_J = 2.;
+  controller.mass = 5.;
+  controller.azim_gain = 0.005;
+
+  controller.omega_cl = RadOfDeg(600);
+  controller.xi_cl = 1.;
+
+  controller.cmd_pitch_ff = 0.;
+  controller.cmd_pitch_fb = 0.;
+
+  controller.cmd_thrust_ff = 0.;
+  controller.cmd_thrust_fb = 0.;
+
+  controller.cmd_pitch = 0.;
+  controller.cmd_thrust = 0.;
+
+  controller.armed = 0;
+
+  /***** Coeficients twisting ****/
+  controller.ulim = 1.0;
+  controller.Vm = 0.1; //should this now be 1/512?
+  controller.VM = 300.0;
+
+  controller.S[1] = 0.0;
+  controller.S[0] = 0.0;
+
+  controller.U_twt[1] = 0.0;
+  controller.U_twt[0] = 0.0;
+
+  controller.satval1 = 0.176;
+  controller.satval2 = 1;
+
+  controller.c = 0.4;
+  controller.error = 0;
+}
+
+
+
+void control_run(void) {
+
+  /*
+   *  propagate reference
+   */
+  const float dt_ctl = 1./512.;
+  const float thrust_constant = 40.;
+  
+  controller.tilt_ref = controller.tilt_ref + controller.tilt_dot_ref * dt_ctl;
+  controller.tilt_dot_ref = controller.tilt_dot_ref + controller.tilt_ddot_ref 
* dt_ctl;
+  controller.tilt_ddot_ref = 
-2*controller.omega_tilt_ref*controller.xi_ref*controller.tilt_dot_ref 
+    - controller.omega_tilt_ref*controller.omega_tilt_ref*(controller.tilt_ref 
- controller.tilt_sp); 
+
+  controller.elevation_ref = controller.elevation_ref + 
controller.elevation_dot_ref * dt_ctl;
+  controller.elevation_dot_ref = controller.elevation_dot_ref + 
controller.elevation_ddot_ref * dt_ctl;
+  controller.elevation_ddot_ref = 
-2*controller.omega_elevation_ref*controller.xi_ref*controller.elevation_dot_ref
 
+    - 
controller.omega_elevation_ref*controller.omega_elevation_ref*(controller.elevation_ref
 - controller.elevation_sp); 
+
+  controller.azimuth_ref = controller.azimuth_ref + controller.azimuth_dot_ref 
* dt_ctl;
+  controller.azimuth_dot_ref = controller.azimuth_dot_ref + 
controller.azimuth_ddot_ref * dt_ctl;
+  controller.azimuth_ddot_ref = 
-2*controller.omega_azimuth_ref*controller.xi_ref*controller.azimuth_dot_ref 
+    - 
controller.omega_azimuth_ref*controller.omega_azimuth_ref*(controller.azimuth_ref
 - controller.azimuth_sp); 
+
+  static int foo=0;
+
+  /*
+   *  calculate errors
+   */
+
+/*  const float err_tilt = estimator.tilt - controller.tilt_ref;
+  const float err_tilt_dot = estimator.tilt_dot - controller.tilt_dot_ref;*/
+
+  const float err_elevation = estimator.elevation - controller.elevation_ref;
+  const float err_elevation_dot = estimator.elevation_dot - 
controller.elevation_dot_ref;
+
+  const float err_azimuth = estimator.azimuth - controller.azimuth_ref;
+  const float err_azimuth_dot = estimator.azimuth_dot - 
controller.azimuth_dot_ref;
+
+  /*
+   *  Compute feedforward and feedback commands
+   */
+
+  controller.cmd_pitch_ff = controller.one_over_J * controller.tilt_ddot_ref;
+
+/*  controller.cmd_pitch_fb = controller.one_over_J * (2 * controller.xi_cl * 
controller.omega_cl * err_tilt_dot) +
+                       controller.one_over_J * (controller.omega_cl * 
controller.omega_cl * err_tilt);*/
+
+  controller.cmd_pitch_fb = get_U_twt();
+
+  controller.cmd_thrust_ff = controller.mass * controller.elevation_ddot_ref;
+  controller.cmd_thrust_fb = -controller.mass * (2 * controller.xi_cl * 
controller.omega_cl * err_elevation_dot) -
+                       controller.mass * (controller.omega_cl * 
controller.omega_cl * err_elevation);
+
+  controller.cmd_azimuth_ff = controller.one_over_J * 
controller.azimuth_ddot_ref;
+  controller.cmd_azimuth_fb = controller.one_over_J * (2 * controller.xi_cl * 
controller.omega_cl * err_azimuth_dot) +
+                        controller.one_over_J * (controller.omega_cl * 
controller.omega_cl * err_azimuth);
+
+  controller.cmd_pitch =  /*controller.cmd_pitch_ff*/ + 
controller.cmd_pitch_fb;
+
+  //controller.tilt_sp = controller.azim_gain * (-controller.cmd_azimuth_fb );
+
+  controller.cmd_thrust = controller.cmd_thrust_ff + controller.cmd_thrust_fb 
+ thrust_constant;
+  controller.cmd_thrust = controller.cmd_thrust*(1/cos(estimator.elevation));
+
+  //if (controller.cmd_thrust<0.) controller.cmd_thrust = 0;
+  Bound(controller.cmd_thrust,0,100);
+  Bound(controller.cmd_pitch,-100,100);
+
+  if (!(foo%128)) {
+    //printf("pitch : ff:%f fb:%f (%f)\n",controller.cmd_pitch_ff, 
controller.cmd_pitch_fb,estimator.tilt_dot);
+    //printf("thrust: ff:%f fb:%f (%f %f)\n",controller.cmd_thrust_ff, 
controller.cmd_thrust_fb,estimator.elevation,estimator.elevation_dot);
+    //printf("%f %f 
%f\n",controller.tilt_ref,controller.tilt_dot_ref,controller.tilt_ddot_ref);
+    printf("t: %f\n",controller.cmd_pitch_fb);
+  }
+  foo++; 
+
+}
+
+
+/*Fonction qui obtient la commande twisiting à appliquer chaque periode*/
+float get_U_twt()
+{ 
+
+       /**Definition des constantes du modèle**/
+       const float Res = 0.4 ;
+       const double Kphi = 0.0129;
+       const double alpha = 3.2248e-7 ;
+       const float cte = 60.0  ;
+       const float Te = 1/512.;
+
+       /**Variables utilisés par la loi de commande**/
+       static volatile float yd[2] = {0.0,0.0};
+       static volatile float y[2] = {0.,0.}; 
+       //static float emax = 0.035;            // en rad, initialement 2
+
+       //Variables auxiliaires utilisés
+       static volatile int aux_y = 0;
+
+       /**Variables pour l'algorithme**/
+       float udot;
+       float sens;
+       
+        /**Acquisiton des donnes**/
+       //Acquisition consigne
+       yd[1] = controller.tilt_ref;
+       //Acquisition mesure
+       y[1] = estimator.tilt;
+
+       //On initialise au début angle courant=angle anterieur
+       if (aux_y == 0){        
+               y[0] = y[1];
+               aux_y = 1;
+       } 
+
+       /***************************/
+
+       /**Calcul Surface et derive Surface**/
+       // S[1],y[1],yd[1] new value
+       // S[0],y[0],yd[0] last value
+
+       //gain K=Te
+       //controller.S[1] = (double)( ( (1+controller.c) * (y[1]-yd[1]) - 
(y[0]-yd[0]) )  ) ;
+       controller.S[1] = (double)( ( (1+controller.c) * (y[1]-yd[1]) - 
estimator.tilt_dot ) * 0.8 ) ;
+       //controller.S[1] = (float)( ( controller.c * (y[1]-yd[1]) ) + 
(estimator.tilt_dot - controller.tilt_dot_ref)  );
+       controller.S_dot = (controller.S[1] - controller.S[0]);
+       /*************************************/
+       
+       //On va dire que si l'erreur est d'un valeur inferieur a emax, on 
applique la commande anterieure
+/*     if ( abs(y[1] - yd[1]) < emax ) {  
+               U_twt[1] = U_twt[0];    
+       } else {*/
+               /**Algorithme twisting**/
+               if ( controller.S[1] < 0.0 ) sens = -1.0;
+               else if ( controller.S[1] > 0.0 ) sens = 1.0;
+               if ( abs(controller.U_twt[1]) < controller.ulim ) {
+                       if ( (controller.S[1] * controller.S_dot) > 0) {
+                               udot = -controller.VM * sens;
+                       }
+                       else {
+                               udot = -controller.Vm * sens;
+                       }
+               }
+               else {
+                       udot = -controller.U_twt[1];
+               }
+       
+               // Integration de u, qu'avec 2 valeurs, penser à faire plus
+               // u[1] new , u[0] old
+               controller.U_twt[1] = controller.U_twt[0] + (Te * udot);
+       //}
+       /**********************/ 
+
+       /**Saturation de l'integrateur**/
+
+       if ( (controller.S[1] > -controller.satval1) && (controller.S[1] < 
controller.satval1) ){
+               
Bound(controller.U_twt[1],-controller.satval1,controller.satval1);
+       }
+       else {
+               
Bound(controller.U_twt[1],-controller.satval2,controller.satval2);
+       }        
+       /********************************/
+         
+       /**Mises à jour**/
+       controller.U_twt[0] = controller.U_twt[1];
+       yd[0] = yd[1];
+       y[0] = y[1];
+        
+       controller.S[0] = controller.S[1];
+
+       return -80000. * (cte * Res * alpha/(2 * Kphi) ) * controller.U_twt[1];
+
+}

Added: paparazzi3/trunk/sw/airborne/beth/overo_twist_controller.h
===================================================================
--- paparazzi3/trunk/sw/airborne/beth/overo_twist_controller.h                  
        (rev 0)
+++ paparazzi3/trunk/sw/airborne/beth/overo_twist_controller.h  2010-08-26 
15:40:02 UTC (rev 5710)
@@ -0,0 +1,81 @@
+#ifndef OVERO_TWIST_CONTROLLER_H
+#define OVERO_TWIST_CONTROLLER_H
+
+struct OveroTwistController {
+//  float kp;
+//  float kd;
+  
+  float tilt_sp;
+  float elevation_sp;
+  float azimuth_sp;
+  
+  /* modele de reference */
+  float tilt_ref;
+  float tilt_dot_ref;
+  float tilt_ddot_ref;
+
+  float elevation_ref;
+  float elevation_dot_ref;
+  float elevation_ddot_ref;
+
+  float azimuth_ref;
+  float azimuth_dot_ref;
+  float azimuth_ddot_ref;
+
+  float omega_tilt_ref;
+  float omega_elevation_ref;
+  float omega_azimuth_ref;
+  float xi_ref;
+
+  /* invert control law parameter */
+  float one_over_J;
+  float mass;
+
+  /* closed loop parameters */
+  float omega_cl;
+  float xi_cl;
+  float azim_gain;
+
+  float cmd_pitch_ff;
+  float cmd_pitch_fb;
+
+  float cmd_thrust_ff;
+  float cmd_thrust_fb;
+
+  float cmd_azimuth_ff;
+  float cmd_azimuth_fb;
+
+  float cmd_pitch;
+  float cmd_thrust;
+
+  int armed;
+
+/***Twisting stuff***/
+
+  float  S[2];
+  float S_dot;
+  float U_twt[2];
+
+  /***** Coeficients twisting ****/
+  float ulim;
+  float Vm;
+  float VM;
+
+  float satval1;
+  float satval2;
+
+  float c;
+
+  float error;
+
+};
+
+
+extern struct OveroTwistController controller;
+
+extern void control_init(void);
+extern void control_send_messages(void);
+extern void control_run(void);
+float get_U_twt(void);
+
+#endif /* OVERO_TWIST_CONTROLLER_H */




reply via email to

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