|
|
|
@@ -66,10 +66,13 @@
|
|
|
|
|
* Controller parameters, accessible via MAVLink
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
PARAM_DEFINE_FLOAT(FW_HEADING_P, 0.1f);
|
|
|
|
|
PARAM_DEFINE_FLOAT(FW_HEAD_P, 0.1f);
|
|
|
|
|
PARAM_DEFINE_FLOAT(FW_HEADR_I, 0.1f);
|
|
|
|
|
PARAM_DEFINE_FLOAT(FW_HEADR_LIM, 1.5f); //TODO: think about reasonable value
|
|
|
|
|
PARAM_DEFINE_FLOAT(FW_XTRACK_P, 0.01745f); // Radians per meter off track
|
|
|
|
|
PARAM_DEFINE_FLOAT(FW_ALT_P, 0.1f);
|
|
|
|
|
PARAM_DEFINE_FLOAT(FW_ROLL_LIM, 0.7f); // Roll angle limit in radians
|
|
|
|
|
PARAM_DEFINE_FLOAT(FW_HEADR_P, 0.1f);
|
|
|
|
|
PARAM_DEFINE_FLOAT(FW_PITCH_LIM, 0.35f); // Pitch angle limit in radians
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -77,6 +80,7 @@ struct fw_pos_control_params {
|
|
|
|
|
float heading_p;
|
|
|
|
|
float headingr_p;
|
|
|
|
|
float headingr_i;
|
|
|
|
|
float headingr_lim;
|
|
|
|
|
float xtrack_p;
|
|
|
|
|
float altitude_p;
|
|
|
|
|
float roll_lim;
|
|
|
|
@@ -87,6 +91,7 @@ struct fw_pos_control_param_handles {
|
|
|
|
|
param_t heading_p;
|
|
|
|
|
param_t headingr_p;
|
|
|
|
|
param_t headingr_i;
|
|
|
|
|
param_t headingr_lim;
|
|
|
|
|
param_t xtrack_p;
|
|
|
|
|
param_t altitude_p;
|
|
|
|
|
param_t roll_lim;
|
|
|
|
@@ -140,9 +145,10 @@ static int deamon_task; /**< Handle of deamon task / thread */
|
|
|
|
|
static int parameters_init(struct fw_pos_control_param_handles *h)
|
|
|
|
|
{
|
|
|
|
|
/* PID parameters */
|
|
|
|
|
h->heading_p = param_find("FW_HEADING_P");
|
|
|
|
|
h->headingr_p = param_find("FW_HEADINGR_P");
|
|
|
|
|
h->headingr_i = param_find("FW_HEADINGR_I");
|
|
|
|
|
h->heading_p = param_find("FW_HEAD_P");
|
|
|
|
|
h->headingr_p = param_find("FW_HEADR_P");
|
|
|
|
|
h->headingr_i = param_find("FW_HEADR_I");
|
|
|
|
|
h->headingr_lim = param_find("FW_HEADR_LIM");
|
|
|
|
|
h->xtrack_p = param_find("FW_XTRACK_P");
|
|
|
|
|
h->altitude_p = param_find("FW_ALT_P");
|
|
|
|
|
h->roll_lim = param_find("FW_ROLL_LIM");
|
|
|
|
@@ -157,6 +163,7 @@ static int parameters_update(const struct fw_pos_control_param_handles *h, struc
|
|
|
|
|
param_get(h->heading_p, &(p->heading_p));
|
|
|
|
|
param_get(h->headingr_p, &(p->headingr_p));
|
|
|
|
|
param_get(h->headingr_i, &(p->headingr_i));
|
|
|
|
|
param_get(h->headingr_lim, &(p->headingr_lim));
|
|
|
|
|
param_get(h->xtrack_p, &(p->xtrack_p));
|
|
|
|
|
param_get(h->altitude_p, &(p->altitude_p));
|
|
|
|
|
param_get(h->roll_lim, &(p->roll_lim));
|
|
|
|
@@ -239,7 +246,7 @@ int fixedwing_pos_control_thread_main(int argc, char *argv[])
|
|
|
|
|
parameters_init(&h);
|
|
|
|
|
parameters_update(&h, &p);
|
|
|
|
|
pid_init(&heading_controller, p.heading_p, 0.0f, 0.0f, 0.0f, 10000.0f, PID_MODE_DERIVATIV_NONE); //arbitrary high limit
|
|
|
|
|
pid_init(&heading_rate_controller, p.headingr_p, p.headingr_i, 0.0f, 0.0f, p.roll_lim, PID_MODE_DERIVATIV_NONE);
|
|
|
|
|
pid_init(&heading_rate_controller, p.headingr_p, p.headingr_i, 0.0f, 1.0f, p.roll_lim, PID_MODE_DERIVATIV_NONE); //TODO: integrator limit
|
|
|
|
|
pid_init(&altitude_controller, p.altitude_p, 0.0f, 0.0f, 0.0f, p.pitch_lim, PID_MODE_DERIVATIV_NONE);
|
|
|
|
|
pid_init(&offtrack_controller, p.xtrack_p, 0.0f, 0.0f, 0.0f , 60.0f*M_DEG_TO_RAD, PID_MODE_DERIVATIV_NONE); //TODO: remove hardcoded value
|
|
|
|
|
initialized = true;
|
|
|
|
@@ -250,7 +257,7 @@ int fixedwing_pos_control_thread_main(int argc, char *argv[])
|
|
|
|
|
/* update parameters from storage */
|
|
|
|
|
parameters_update(&h, &p);
|
|
|
|
|
pid_set_parameters(&heading_controller, p.heading_p, 0, 0, 0, 10000.0f); //arbitrary high limit
|
|
|
|
|
pid_set_parameters(&heading_rate_controller, p.headingr_p, p.headingr_i, 0, 0, p.roll_lim);
|
|
|
|
|
pid_set_parameters(&heading_rate_controller, p.headingr_p, p.headingr_i, 0, 1.0f, p.roll_lim); //TODO: integrator limit
|
|
|
|
|
pid_set_parameters(&altitude_controller, p.altitude_p, 0, 0, 0, p.pitch_lim);
|
|
|
|
|
pid_set_parameters(&offtrack_controller, p.xtrack_p, 0, 0, 0, 60.0f*M_DEG_TO_RAD); //TODO: remove hardcoded value
|
|
|
|
|
|
|
|
|
@@ -293,28 +300,47 @@ int fixedwing_pos_control_thread_main(int argc, char *argv[])
|
|
|
|
|
|
|
|
|
|
if(!(distance_res != OK || xtrack_err.past_end)) {
|
|
|
|
|
|
|
|
|
|
float delta_psi_c = -pid_calculate(&offtrack_controller, 0, xtrack_err.distance, 0.0f, 0.0f); //p.xtrack_p * xtrack_err.distance; //(-) because z axis points downwards
|
|
|
|
|
// printf("xtrack_err.distance %.4f ", (double)xtrack_err.distance);
|
|
|
|
|
|
|
|
|
|
float delta_psi_c = pid_calculate(&offtrack_controller, 0, xtrack_err.distance, 0.0f, 0.0f); //p.xtrack_p * xtrack_err.distance
|
|
|
|
|
|
|
|
|
|
// printf("delta_psi_c %.4f ", (double)delta_psi_c);
|
|
|
|
|
|
|
|
|
|
float psi_c = psi_track + delta_psi_c;
|
|
|
|
|
|
|
|
|
|
// printf("psi_c %.4f ", (double)psi_c);
|
|
|
|
|
|
|
|
|
|
// printf("att.yaw %.4f ", (double)att.yaw);
|
|
|
|
|
|
|
|
|
|
float psi_e = psi_c - att.yaw;
|
|
|
|
|
|
|
|
|
|
// printf("psi_e %.4f ", (double)psi_e);
|
|
|
|
|
|
|
|
|
|
/* shift error to prevent wrapping issues */
|
|
|
|
|
psi_e = _wrap_pi(psi_e);
|
|
|
|
|
|
|
|
|
|
/* calculate roll setpoint, do this artificially around zero */
|
|
|
|
|
//TODO: psi rate loop incomplete
|
|
|
|
|
float delta_psi_rate_c = pid_calculate(&heading_controller, psi_e, 0.0f, 0.0f, 0.0f);
|
|
|
|
|
float psi_rate_track = 0; //=V_gr/r_track , this will be needed for implementation of arc following
|
|
|
|
|
float psi_rate_c = delta_psi_rate_c + psi_rate_track;
|
|
|
|
|
|
|
|
|
|
//TODO limit turn rate
|
|
|
|
|
//limit turn rate
|
|
|
|
|
if(psi_rate_c > p.headingr_lim)
|
|
|
|
|
psi_rate_c = p.headingr_lim;
|
|
|
|
|
else if(psi_rate_c < -p.headingr_lim)
|
|
|
|
|
psi_rate_c = - p.headingr_lim;
|
|
|
|
|
|
|
|
|
|
// printf("psi_rate_c %.4f ", (double)psi_rate_c);
|
|
|
|
|
|
|
|
|
|
float psi_rate_e = psi_rate_c - att.yawspeed;
|
|
|
|
|
|
|
|
|
|
float psi_rate_e_scaled = psi_rate_e * sqrtf(pow(global_pos.vx,2) + pow(global_pos.vy,2)) / 9.81f; //* V_gr / g
|
|
|
|
|
float psi_rate_e_scaled = psi_rate_e * sqrtf(powf(global_pos.vx, 2.0f) + powf(global_pos.vy, 2.0f)) / 9.81f; //* V_gr / g
|
|
|
|
|
|
|
|
|
|
attitude_setpoint.roll_body = pid_calculate(&heading_rate_controller, psi_rate_e_scaled, 0.0f, 0.0f, deltaT);
|
|
|
|
|
// printf("psi_rate_e_scaled %.4f ", (double)psi_rate_e_scaled);
|
|
|
|
|
|
|
|
|
|
attitude_setpoint.roll_body = pid_calculate(&heading_rate_controller, psi_rate_e_scaled, 0.0f, 0.0f, deltaT);\
|
|
|
|
|
|
|
|
|
|
// printf("rollbody %.4f\n", (double)attitude_setpoint.roll_body);
|
|
|
|
|
|
|
|
|
|
// if (counter % 100 == 0)
|
|
|
|
|
// printf("xtrack_err.distance: %0.4f, delta_psi_c: %0.4f\n",xtrack_err.distance, delta_psi_c);
|
|
|
|
|