mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-05-31 20:38:27 +08:00
example NLI controller
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
#include "overo_controller.h"
|
#include "overo_controller.h"
|
||||||
|
|
||||||
#include "overo_estimator.h"
|
#include "overo_estimator.h"
|
||||||
|
#include "std.h"
|
||||||
|
|
||||||
struct OveroController controller;
|
struct OveroController controller;
|
||||||
|
|
||||||
@@ -9,13 +10,38 @@ void control_init(void) {
|
|||||||
controller.kd = 0.01;
|
controller.kd = 0.01;
|
||||||
|
|
||||||
controller.tilt_sp = 0.;
|
controller.tilt_sp = 0.;
|
||||||
|
|
||||||
|
controller.omega_ref = RadOfDeg(200);
|
||||||
|
controller.xi_ref = 1.;
|
||||||
|
|
||||||
|
controller.tilt_ref = estimator.tilt;
|
||||||
|
controller.tilt_dot_ref = estimator.tilt_dot;
|
||||||
|
controller.tilt_ddot_ref = 0.;
|
||||||
|
|
||||||
|
controller.one_over_J = 1.;
|
||||||
|
|
||||||
|
controller.omega_cl = RadOfDeg(500);
|
||||||
|
controller.xi_cl = 1.;
|
||||||
|
|
||||||
|
controller.cmd_ff = 0.;
|
||||||
|
controller.cmd_fb = 0.;
|
||||||
controller.cmd = 0.;
|
controller.cmd = 0.;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void control_run(void) {
|
void control_run(void) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* propagate reference
|
||||||
|
*/
|
||||||
|
const float dt_ctl = 1./512.;
|
||||||
|
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_ref*controller.xi_ref*controller.tilt_dot_ref
|
||||||
|
- 2*controller.omega_ref*controller.omega_ref*(controller.tilt_ref - controller.tilt_sp);
|
||||||
|
|
||||||
|
#if 0
|
||||||
static int foo=0;
|
static int foo=0;
|
||||||
|
|
||||||
float track_err = estimator.tilt - controller.tilt_sp;
|
float track_err = estimator.tilt - controller.tilt_sp;
|
||||||
@@ -25,5 +51,16 @@ void control_run(void) {
|
|||||||
controller.cmd = pcmd + dcmd;
|
controller.cmd = pcmd + dcmd;
|
||||||
//if (!(foo%100)) printf("%f %f\n",pcmd,dcmd);
|
//if (!(foo%100)) printf("%f %f\n",pcmd,dcmd);
|
||||||
foo++;
|
foo++;
|
||||||
|
#else
|
||||||
|
|
||||||
|
const float err_tilt = estimator.tilt - controller.tilt_ref;
|
||||||
|
const float err_tilt_dot = estimator.tilt_dot - controller.tilt_dot_ref;
|
||||||
|
controller.cmd_ff = controller.one_over_J*controller.tilt_ddot_ref;
|
||||||
|
controller.cmd_fb = controller.one_over_J*(
|
||||||
|
-2*controller.xi_cl*controller.omega_cl*err_tilt_dot
|
||||||
|
-controller.omega_cl*controller.omega_cl*err_tilt);
|
||||||
|
controller.cmd = controller.cmd_ff + controller.cmd_fb;
|
||||||
|
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,23 @@ struct OveroController {
|
|||||||
float kd;
|
float kd;
|
||||||
|
|
||||||
float tilt_sp;
|
float tilt_sp;
|
||||||
|
|
||||||
|
/* modele de reference */
|
||||||
|
float tilt_ref;
|
||||||
|
float tilt_dot_ref;
|
||||||
|
float tilt_ddot_ref;
|
||||||
|
float omega_ref;
|
||||||
|
float xi_ref;
|
||||||
|
|
||||||
|
/* invert control law parameter */
|
||||||
|
float one_over_J;
|
||||||
|
|
||||||
|
/* closed loop parameters */
|
||||||
|
float omega_cl;
|
||||||
|
float xi_cl;
|
||||||
|
|
||||||
|
float cmd_ff;
|
||||||
|
float cmd_fb;
|
||||||
float cmd;
|
float cmd;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user