Paparazzi UAS  v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
guidance_opticflow_hover.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Hann Woei Ho
3  * 2015 Freek van Tienen <freek.v.tienen@gmail.com>
4  *
5  * This file is part of Paparazzi.
6  *
7  * Paparazzi is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2, or (at your option)
10  * any later version.
11  *
12  * Paparazzi is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with Paparazzi; see the file COPYING. If not, see
19  * <http://www.gnu.org/licenses/>.
20  */
21 
30 // Own Header
32 
33 #include "modules/core/abi.h"
34 
35 // Stabilization
38 #include "autopilot.h"
40 
42 #ifndef VISION_VELOCITY_ESTIMATE_ID
43 #define VISION_VELOCITY_ESTIMATE_ID ABI_BROADCAST
44 #endif
46 
47 #define CMD_OF_SAT 1500 // 40 deg = 2859.1851
48 
49 #ifndef VISION_PHI_PGAIN
50 #define VISION_PHI_PGAIN 400
51 #endif
53 
54 #ifndef VISION_PHI_IGAIN
55 #define VISION_PHI_IGAIN 20
56 #endif
58 
59 #ifndef VISION_THETA_PGAIN
60 #define VISION_THETA_PGAIN 400
61 #endif
63 
64 #ifndef VISION_THETA_IGAIN
65 #define VISION_THETA_IGAIN 20
66 #endif
68 
69 #ifndef VISION_DESIRED_VX
70 #define VISION_DESIRED_VX 0
71 #endif
73 
74 #ifndef VISION_DESIRED_VY
75 #define VISION_DESIRED_VY 0
76 #endif
78 
79 /* Check the control gains */
80 #if (VISION_PHI_PGAIN < 0) || \
81  (VISION_PHI_IGAIN < 0) || \
82  (VISION_THETA_PGAIN < 0) || \
83  (VISION_THETA_IGAIN < 0)
84 #error "ALL control gains have to be positive!!!"
85 #endif
86 
88 
89 /* Initialize the default gains and settings */
92  .phi_igain = VISION_PHI_IGAIN,
93  .theta_pgain = VISION_THETA_PGAIN,
94  .theta_igain = VISION_THETA_IGAIN,
95  .desired_vx = VISION_DESIRED_VX,
96  .desired_vy = VISION_DESIRED_VY
97 };
98 
99 
100 static void stabilization_opticflow_vel_cb(uint8_t sender_id __attribute__((unused)),
101  uint32_t stamp, float vel_x, float vel_y, float vel_z, float noise_x, float noise_y, float noise_z);
106 {
107  // Subscribe to the VELOCITY_ESTIMATE ABI message
109 }
110 
116 {
117  /* Reset the integrated errors */
120 
121  /* Set rool/pitch to 0 degrees and psi to current heading */
122  opticflow_stab.cmd.phi = 0;
125 
127 }
128 
133 void guidance_module_run(bool in_flight)
134 {
136  struct ThrustSetpoint th = guidance_v_run(in_flight);
137  /* Run the default attitude stabilization */
138  stabilization_attitude_run(in_flight, &sp, &th, stabilization.cmd);
139 }
140 
144 static void stabilization_opticflow_vel_cb(uint8_t sender_id __attribute__((unused)),
145  uint32_t stamp UNUSED, float vel_x, float vel_y, float vel_z UNUSED,
146  float noise_x, float noise_y, float noise_z UNUSED)
147 {
148  if (noise_x >= 0.f)
149  {
150  /* Calculate the error */
151  float err_vx = opticflow_stab.desired_vx - vel_x;
152 
153  /* Calculate the integrated errors (TODO: bound??) */
155 
156  /* Calculate the commands */
159 
160  /* Bound the roll and pitch commands */
161  BoundAbs(opticflow_stab.cmd.theta, CMD_OF_SAT);
162  }
163 
164  if (noise_y >= 0.f)
165  {
166  /* Calculate the error */
167  float err_vy = opticflow_stab.desired_vy - vel_y;
168 
169  /* Calculate the integrated errors (TODO: bound??) */
171 
172  /* Calculate the commands */
175 
176  /* Bound the roll and pitch commands */
177  BoundAbs(opticflow_stab.cmd.phi, CMD_OF_SAT);
178  }
179 }
Main include for ABI (AirBorneInterface).
Event structure to store callbacks in a linked list.
Definition: abi_common.h:67
Core autopilot interface common to all firmwares.
uint8_t last_wp UNUSED
int32_t phi
in rad with INT32_ANGLE_FRAC
int32_t psi
in rad with INT32_ANGLE_FRAC
int32_t theta
in rad with INT32_ANGLE_FRAC
static struct Int32Eulers * stateGetNedToBodyEulers_i(void)
Get vehicle body attitude euler angles (int).
Definition: state.h:1288
float err_vy
Definition: guidance_OA.c:124
float err_vx
Definition: guidance_OA.c:123
float err_vx_int
The integrated velocity error in x direction (m/s)
struct Int32Eulers cmd
The commands that are send to the hover loop.
float err_vy_int
The integrated velocity error in y direction (m/s)
int32_t theta_pgain
The pitch P gain on the err_vy.
int32_t theta_igain
The pitch I gain on the err_vy_int.
float desired_vy
The desired velocity in the y direction (cm/s)
float desired_vx
The desired velocity in the x direction (cm/s)
int32_t phi_pgain
The roll P gain on the err_vx.
int32_t phi_igain
The roll I gain on the err_vx_int.
struct opticflow_stab_t opticflow_stab
#define VISION_VELOCITY_ESTIMATE_ID
Default sender to accect VELOCITY_ESTIMATE messages from.
#define VISION_THETA_PGAIN
#define VISION_DESIRED_VY
void guidance_opticflow_hover_init(void)
Initialization of horizontal guidance module.
void guidance_module_enter(void)
guidance mode enter resets the errors and starts the controller.
static abi_event velocity_est_ev
void guidance_module_run(bool in_flight)
Main guidance loop.
static void stabilization_opticflow_vel_cb(uint8_t sender_id, uint32_t stamp, float vel_x, float vel_y, float vel_z, float noise_x, float noise_y, float noise_z)
Update the controls on a new VELOCITY_ESTIMATE ABI message.
#define VISION_DESIRED_VX
#define VISION_PHI_PGAIN
#define CMD_OF_SAT
#define VISION_PHI_IGAIN
#define VISION_THETA_IGAIN
Optical-flow based control for Linux based systems.
PRINT_CONFIG_VAR(ONELOOP_ANDI_FILT_CUTOFF)
void guidance_v_mode_changed(uint8_t new_mode)
Definition: guidance_v.c:132
struct ThrustSetpoint guidance_v_run(bool in_flight)
Guidance vertical run functions.
Definition: guidance_v.c:221
Vertical guidance for rotorcrafts.
#define GUIDANCE_V_MODE_HOVER
Definition: guidance_v.h:39
General attitude stabilization interface for rotorcrafts.
void stabilization_attitude_run(bool in_flight, struct StabilizationSetpoint *sp, struct ThrustSetpoint *thrust, int32_t *cmd)
Attitude control run function.
struct Stabilization stabilization
Definition: stabilization.c:41
struct StabilizationSetpoint stab_sp_from_eulers_i(struct Int32Eulers *eulers)
int32_t cmd[COMMANDS_NB]
output command vector, range from [-MAX_PPRZ:MAX_PPRZ] (store for messages)
Stabilization setpoint.
Definition: stabilization.h:53
union StabilizationSetpoint::@278 sp
Thrust setpoint // TODO to a setpoint header Structure to store the desired thrust vector with differ...
Definition: stabilization.h:82
union ThrustSetpoint::@284 sp
unsigned int uint32_t
Typedef defining 32 bit unsigned int type.
Definition: vl53l1_types.h:78
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.
Definition: vl53l1_types.h:98