UAV Simulator
Loading...
Searching...
No Matches
aircraft.h
Go to the documentation of this file.
1
10#ifndef AIRCRAFT_H
11#define AIRCRAFT_H
12
13#include <memory> // For std::unique_ptr
14#include <string>
15#include <vector>
16#include <Eigen/Dense>
17#include <easy3d/viewer/viewer.h>
18#include <easy3d/renderer/drawable_triangles.h>
19#include <easy3d/renderer/drawable_lines.h>
20#include <easy3d/renderer/vertex_array_object.h>
21#include <easy3d/core/surface_mesh.h>
22#include <easy3d/fileio/surface_mesh_io.h>
23#include <fstream>
24#include <cmath>
25
26
27#define _USE_MATH_DEFINES
28
41{
42public:
43
44 // ===== Public state variables (documented briefly for clarity) =====
45 double clock;
46 double pn, pe, pd;
47 double u, v, w;
48 double phi, theta, psi;
49 double p, q, r;
50 double V_m;
51 double alpha, beta;
52 double fx, fy, fz;
53 double ell, m, n;
54
55 // More
56 std::vector<double> velocity_b;
57 //Rates
58 double pn_dot;
59 double pe_dot;
60 double pd_dot;
61 double u_dot;
62 double v_dot;
63 double w_dot;
64 double phi_dot;
65 double theta_dot;
66 double psi_dot;
67 double p_dot;
68 double q_dot;
69 double r_dot;
70
71 int steps;
72 double dt;
73 int id;
74 //Physical
75 double mass;
76 double Jx;
77 double Jy;
78 double Jz;
79 double Jxz;
80 double wing_area;
81 double wing_chord;
82 double wing_span;
84 double e; // oswalds efficiency factor
85 double g; // gravity
86 double rho; // density of air
87 //Electric propulsion
88 double k_motor; //motor constant
89 double prop_area; //s_[rop]
90 double prop_thrust_coef; // constant determined by experiment k_t_p
91 double prop_efficiency; // e
92 double prop_omega; //angular speed k_omega
93
94 //Inertial constants
95
96 double Gamma;
97 double Gamma_1;
98 double Gamma_2;
99 double Gamma_3;
100 double Gamma_4;
101 double Gamma_5;
102 double Gamma_6;
103 double Gamma_7;
104 double Gamma_8;
105
106 // ===== Roll/Yaw combined coefficients after applying Gamma transforms =====
107 double C_p_0;
108 double C_p_beta;
109 double C_p_p;
110 double C_p_r;
113
114 double C_r_0;
115 double C_r_beta;
116 double C_r_p;
117 double C_r_r;
120
121 //Forces&Moments function:
123
124 // sigma(alpha)
125 double sigma_num;
126 double sigma_den;
128
129 // Cl of flat plate
131 // Linear Cl
132 double Cl_linear;
133 // Combined Cl
135
136 // Coefficients for X and Z directions
137 double CxAlpha;
138 double CxqAlpha;
140 double CzAlpha;
141 double CzqAlpha;
143
144 // Sources of Forces
145 Eigen::Vector3d force_g; // Component: Gravity
147
148 Eigen::Vector3d force_aero2;
149 Eigen::Vector3d force_aero;
150
152 Eigen::Vector3d force_prop2;
153 Eigen::Vector3d force_prop;
154
155 Eigen::Vector3d Force;
156
157
158
159 // Moment/Torque calculations
160
162
163 Eigen::Vector3d Aero_t2;
164 Eigen::Vector3d Aero_torque;
165 Eigen::Vector3d Prop_torque;
166 Eigen::Vector3d Torque;
167
168
169 //Stability & Control derivatives
170
171 double C_L_0;
172 double C_L_alpha;
173 double C_L_q;
175
176 double C_D_0;
177 double C_D_alpha;
178 double C_D_p;
179 double C_D_q;
181
182 double C_m_0;
183 double C_m_alpha;
184 double C_m_q;
186
187 double C_Y_0;
188 double C_Y_beta;
189 double C_Y_p;
190 double C_Y_r;
193
194 double C_ell_0;
196 double C_ell_p;
197 double C_ell_r;
200
201 double C_n_0;
202 double C_n_beta;
203 double C_n_p;
204 double C_n_r;
207
208 double C_prop;
210 double epsilon;
211 double alpha0;
212 double beta0;
213
214 // Initial state: To set the initial condition
215 double pn_0;
216 double pe_0;
217 double pd_0;
218
219 double u_0; //body axis velocity
220 double v_0; //body axis velocity
221 double w_0; //body axis velocity
222
223 double phi_0;
224 double theta_0;
225 double psi_0;
226
227 double p_0;
228 double q_0;
229 double r_0;
230
231 double delta_t; //throttle
232 double delta_a; //aileron
233 double delta_e; //elevator
234 double delta_r; //rudder
235 // aircraft specific maximum control inputs
236 double delta_t_max;
244
245 // Geometry and init
246 float old_roll;
248 float old_yaw;
249
250 float old_pn;
251 float old_pe;
252 float old_pd;
253
254 std::vector<double> vertices_x;
255 std::vector<double> vertices_y;
256 std::vector<double> vertices_z;
258
259
260 // For scaling the thing
262
263 std::vector<std::vector<int>> faces;
264 std::vector<easy3d::vec3> vertices_aircraft;
265 std::vector<unsigned int> indices;
266
267 std::vector<easy3d::vec3> dummy_points;//DUMMY var for points
268 std::vector<easy3d::vec3> &points;
269
270 easy3d::TrianglesDrawable* aircraft;
271
272
273 easy3d::LinesDrawable* axesDrawable;
274 std::vector<easy3d::vec3> axes_vertices;
275 std::vector<easy3d::vec3> original_vertices; // to stop compound updates
276 std::vector<easy3d::vec3> axes_vertices_original;
277
278
279 //surface mesh
280 std::string file_name;
281
282 std::unique_ptr<easy3d::SurfaceMesh> mesh;// easy3d::SurfaceMesh* mesh;
283
289 Aircraft(const std::string& fname, int& vehicle_count);
293 ~Aircraft();
294
295
296
302 void load_a_plane(const std::string& filePath, int& vehicle_count);
303
304
305
306
307 //State vector
308 std::vector <double> X = {pn,pe,pd,u,v,w,p,q,r,phi,theta,psi,fx,fy,fz,ell,m,n};
309
310
311
312
320 easy3d::vec3* update_aircraft(easy3d::vec3* vertices,easy3d::vec3* axesVertices, double& dt);
321
322
323
328 void renderAircraft(easy3d::Viewer& viewer); // NEW
333 void createAxesDrawable(easy3d::Viewer& viewer);
340 bool animate(easy3d::Viewer* viewer, double dt);
341
342
348 void render_HUD(easy3d::TextRenderer& tr, easy3d::Viewer* viewer) const;
352 void printState();
353
358 easy3d::TrianglesDrawable* getAircraftDrawable() const
359 {
360 return aircraft;
361 }
362
363 //==================== FRIENDSHIP with GNC ==================
364 friend class GNC;
365
367 {
368 double delta_e; // elevator
369 double delta_a; // aileron
370 double delta_r; // rudder
371 double delta_t; // throttle
372 };
387 double alpha, double beta, double phi,
388 double p, double q, double r,
389 double theta, double Va, double R);
390
391 // Used for TF & SS calculations
392 Eigen::VectorXd getLateralState() const;
393 Eigen::VectorXd getLongitudinalState() const;
394 Eigen::VectorXd computeStateDot(const Eigen::VectorXd& X_in, const Eigen::VectorXd& U_in);
395
396
397 private:
398
400 void calculate_forces();
406 void calculate_moments();
407
409 void rotate(easy3d::vec3* vertices);
411 void rotate_axes(easy3d::vec3* axesVertices);
413 void translate(easy3d::vec3* vertices);
415 void translate_axes(easy3d::vec3* axesVertices);
416
418 void RK4(std::vector<double>& X, double dt);
419 // ===== Derivative helper functions =====
420 // Function to calculate pn_dot
421 double calculate_pn_dot(double& u, double& v, double& w, double& phi, double& theta, double& psi);
422 //Function to calculate pe_dot
423 double calculate_pe_dot(double& u, double& v, double& w, double& phi, double& theta, double& psi);
424 // Function to calculate pd_dot
425 double calculate_pd_dot(double& u, double& v, double& w, double& phi, double& theta);
426 // Function to calculate phi_dot
427 double calculate_phi_dot(double& p, double& q, double& r, double& phi, double& theta);
428 // Function to calculate theta_dot
429 double calculate_theta_dot(double& q, double& r,double& phi);
430 // Function to calculate psi_dot
431 double calculate_psi_dot(double& q, double& r, double& phi, double& theta);
432 // Function to calculate u_dot
433 double calculate_u_dot(double& v, double& w, double& q, double& r, double& fx, double& mass);
434 // Function to calculate v_dot
435 double calculate_v_dot(double& u, double& w, double&p,double& fy, double& mass);
436 // Function to calculate w_dot
437 double calculate_w_dot(double& u, double& v, double& p, double& q,double& fz, double& mass);
438 // Function to calculate p_dot
439 double calculate_p_dot(double& p, double& q, double& r, double& ell,double& n, double& Gamma_1,double& Gamma_2,double& Gamma_3,double& Gamma_4);
440 // Function to calculate q_dot
441 double calculate_q_dot(double& p, double& r, double& m ,double& Jy, double& Gamma_5,double& Gamma_6);
442 // Function to calculate r_dot
443 double calculate_r_dot(double& p, double& q, double& r, double& ell,double& n, double& Gamma_1,double& Gamma_4,double& Gamma_7,double& Gamma_8);
444
445
446
447
448};
449
450#endif
Represents a fixed‑wing UAV including its dynamics and 3D rendering.
Definition aircraft.h:41
std::vector< std::vector< int > > faces
Definition aircraft.h:263
Eigen::VectorXd getLateralState() const
Definition aircraft.cpp:1117
double calculate_w_dot(double &u, double &v, double &p, double &q, double &fz, double &mass)
Compute derivative of body-axis Z velocity.
Definition aircraft.cpp:639
double beta0
Definition aircraft.h:212
double calculate_q_dot(double &p, double &r, double &m, double &Jy, double &Gamma_5, double &Gamma_6)
Compute derivative of pitch rate q.
Definition aircraft.cpp:659
double r_dot
Definition aircraft.h:69
Eigen::Vector3d Torque
Definition aircraft.h:166
double Gamma_5
Definition aircraft.h:101
void calculate_forces()
Perform force calculations (gravity, aero, prop).
Definition aircraft.cpp:256
double prop_area
Definition aircraft.h:89
double C_Y_r
Definition aircraft.h:190
double u
Definition aircraft.h:47
double pn_0
Definition aircraft.h:215
double delta_e_max
Definition aircraft.h:240
int vertices_size
Definition aircraft.h:257
double C_m_0
Definition aircraft.h:182
double C_Y_p
Definition aircraft.h:189
double calculate_phi_dot(double &p, double &q, double &r, double &phi, double &theta)
Compute derivative of roll angle (phi_dot).
Definition aircraft.cpp:593
double pe_dot
Definition aircraft.h:59
double C_ell_r
Definition aircraft.h:197
void translate(easy3d::vec3 *vertices)
Apply translation to aircraft mesh vertices.
Definition aircraft.cpp:711
void calculate_body_frame_velocity_and_angles()
Calculate body-frame velocity and angles.
Definition aircraft.cpp:302
double v_dot
Definition aircraft.h:62
double w_dot
Definition aircraft.h:63
double C_n_delta_r
Definition aircraft.h:206
double force_prop1
Definition aircraft.h:151
std::string file_name
Definition aircraft.h:280
double e
Definition aircraft.h:84
double C_D_q
Definition aircraft.h:179
double pd
Position in NED frame [m].
Definition aircraft.h:46
double prop_thrust_coef
Definition aircraft.h:90
void rotate_axes(easy3d::vec3 *axesVertices)
Apply rotation to axes vertices.
Definition aircraft.cpp:695
int aircraft_scale
Definition aircraft.h:261
double C_Y_beta
Definition aircraft.h:188
void renderAircraft(easy3d::Viewer &viewer)
Render the aircraft model into the viewer.
Definition aircraft.cpp:751
double C_L_q
Definition aircraft.h:173
double n
Body-axis moments [Nm].
Definition aircraft.h:53
double fx
Definition aircraft.h:52
double mass
Definition aircraft.h:75
double C_ell_p
Definition aircraft.h:196
double C_n_beta
Definition aircraft.h:202
Eigen::Vector3d Aero_t2
Definition aircraft.h:163
Eigen::Vector3d force_g
Definition aircraft.h:145
double C_r_p
Definition aircraft.h:116
double phi_0
Definition aircraft.h:223
void calculate_lift_drag_coefficients()
Calculate lift and drag coefficients.
Definition aircraft.cpp:313
std::vector< easy3d::vec3 > & points
Definition aircraft.h:268
Eigen::Vector3d force_prop2
Definition aircraft.h:152
double g
Definition aircraft.h:85
double wing_span
Definition aircraft.h:82
easy3d::vec3 * update_aircraft(easy3d::vec3 *vertices, easy3d::vec3 *axesVertices, double &dt)
Update aircraft states, geometry, and axes per simulation step.
Definition aircraft.cpp:852
double C_ell_0
Definition aircraft.h:194
Eigen::Vector3d force_aero
Definition aircraft.h:149
std::vector< easy3d::vec3 > vertices_aircraft
Definition aircraft.h:264
void rotate(easy3d::vec3 *vertices)
Apply rotation to aircraft mesh vertices.
Definition aircraft.cpp:679
std::vector< double > X
Definition aircraft.h:308
double r
Angular rates [rad/s].
Definition aircraft.h:49
std::vector< easy3d::vec3 > original_vertices
Definition aircraft.h:275
double pd_0
Definition aircraft.h:217
void translate_axes(easy3d::vec3 *axesVertices)
Apply translation to axes vertices.
Definition aircraft.cpp:735
double theta_dot
Definition aircraft.h:65
Eigen::Vector3d force_aero2
Definition aircraft.h:148
Eigen::VectorXd computeStateDot(const Eigen::VectorXd &X_in, const Eigen::VectorXd &U_in)
Definition aircraft.cpp:1146
double V_m
Airspeed [m/s].
Definition aircraft.h:50
double alpha0
Definition aircraft.h:211
double delta_t_min
Definition aircraft.h:237
double p_0
Definition aircraft.h:227
double C_ell_beta
Definition aircraft.h:195
double C_D_delta_e
Definition aircraft.h:180
float old_pd
Definition aircraft.h:252
float old_yaw
Definition aircraft.h:248
std::vector< double > vertices_z
Definition aircraft.h:256
double C_D_alpha
Definition aircraft.h:177
double delta_e_min
Definition aircraft.h:241
double psi_0
Definition aircraft.h:225
double C_m_delta_e
Definition aircraft.h:185
double C_ell_delta_r
Definition aircraft.h:199
std::unique_ptr< easy3d::SurfaceMesh > mesh
Definition aircraft.h:282
int steps
Definition aircraft.h:71
double C_L_alpha
Definition aircraft.h:172
double dt
Definition aircraft.h:72
bool animate(easy3d::Viewer *viewer, double dt)
Animate the aircraft for one frame.
Definition aircraft.cpp:892
double sigma_num
Definition aircraft.h:125
double q_dot
Definition aircraft.h:68
easy3d::TrianglesDrawable * aircraft
Definition aircraft.h:270
double CxAlpha
Definition aircraft.h:137
double pd_dot
Definition aircraft.h:60
double p
Definition aircraft.h:49
double C_p_beta
Definition aircraft.h:108
double CxdeltaeAlpha
Definition aircraft.h:139
double p_dot
Definition aircraft.h:67
double calculate_p_dot(double &p, double &q, double &r, double &ell, double &n, double &Gamma_1, double &Gamma_2, double &Gamma_3, double &Gamma_4)
Compute derivative of roll rate p.
Definition aircraft.cpp:649
double prop_efficiency
Definition aircraft.h:91
double wing_area
Definition aircraft.h:80
double phi_dot
Definition aircraft.h:64
double m
Definition aircraft.h:53
double C_r_0
Definition aircraft.h:114
easy3d::LinesDrawable * axesDrawable
Definition aircraft.h:273
double Gamma_8
Definition aircraft.h:104
double calculate_pe_dot(double &u, double &v, double &w, double &phi, double &theta, double &psi)
Compute derivative of east position (pe_dot).
Definition aircraft.cpp:565
double delta_r
Definition aircraft.h:234
double Jx
Definition aircraft.h:76
double fz
Body-axis forces [N].
Definition aircraft.h:52
double theta
Definition aircraft.h:48
double psi
Euler angles [rad].
Definition aircraft.h:48
double Gamma_3
Definition aircraft.h:99
double ell
Definition aircraft.h:53
double pn_dot
Definition aircraft.h:58
double clock
Simulation clock [s].
Definition aircraft.h:45
double Cl_linear
Definition aircraft.h:132
double w_0
Definition aircraft.h:221
double CzAlpha
Definition aircraft.h:140
double pn
Definition aircraft.h:46
double C_n_0
Definition aircraft.h:201
double fy
Definition aircraft.h:52
double C_p_p
Definition aircraft.h:109
float old_roll
Definition aircraft.h:246
double Jz
Definition aircraft.h:78
double v_0
Definition aircraft.h:220
double C_r_r
Definition aircraft.h:117
int id
Definition aircraft.h:73
Eigen::Vector3d force_prop
Definition aircraft.h:153
double C_p_0
Definition aircraft.h:107
double calculate_psi_dot(double &q, double &r, double &phi, double &theta)
Compute derivative of yaw angle (psi_dot).
Definition aircraft.cpp:611
double delta_r_max
Definition aircraft.h:242
double pe_0
Definition aircraft.h:216
double C_L_delta_e
Definition aircraft.h:174
double phi
Definition aircraft.h:48
void createAxesDrawable(easy3d::Viewer &viewer)
Create and render local coordinate axes.
Definition aircraft.cpp:804
double wing_chord
Definition aircraft.h:81
double q_0
Definition aircraft.h:228
double C_p_delta_r
Definition aircraft.h:112
double C_m_alpha
Definition aircraft.h:183
std::vector< unsigned int > indices
Definition aircraft.h:265
double r_0
Definition aircraft.h:229
std::vector< easy3d::vec3 > axes_vertices
Definition aircraft.h:274
double delta_e
Definition aircraft.h:233
double C_n_r
Definition aircraft.h:204
double q
Definition aircraft.h:49
double C_D_p
Definition aircraft.h:178
double delta_a_min
Definition aircraft.h:239
double delta_a_max
Definition aircraft.h:238
double Jy
Definition aircraft.h:77
double Aero_t1
Definition aircraft.h:161
double wing_aspect_ratio
Definition aircraft.h:83
double C_p_r
Definition aircraft.h:110
void calculate_moments()
Calculate aerodynamic and propulsive moments.
Definition aircraft.cpp:344
double C_m_q
Definition aircraft.h:184
void RK4(std::vector< double > &X, double dt)
Integrate dynamics using Runge-Kutta 4th order.
Definition aircraft.cpp:389
double CzqAlpha
Definition aircraft.h:141
double delta_t_max
Definition aircraft.h:236
double CzdeltaeAlpha
Definition aircraft.h:142
double calculate_theta_dot(double &q, double &r, double &phi)
Compute derivative of pitch angle (theta_dot).
Definition aircraft.cpp:602
double calculate_v_dot(double &u, double &w, double &p, double &fy, double &mass)
Compute derivative of body-axis Y velocity.
Definition aircraft.cpp:630
void render_HUD(easy3d::TextRenderer &tr, easy3d::Viewer *viewer) const
Render HUD overlay of state variables.
Definition aircraft.cpp:968
double Gamma
Definition aircraft.h:96
~Aircraft()
Destructor for Aircraft.
Definition aircraft.cpp:247
double calculate_pn_dot(double &u, double &v, double &w, double &phi, double &theta, double &psi)
Compute derivative of north position (pn_dot).
Definition aircraft.cpp:553
double CxqAlpha
Definition aircraft.h:138
Eigen::Vector3d Force
Definition aircraft.h:155
std::vector< easy3d::vec3 > axes_vertices_original
Definition aircraft.h:276
double C_D_0
Definition aircraft.h:176
double psi_dot
Definition aircraft.h:66
float old_pitch
Definition aircraft.h:247
double C_r_delta_a
Definition aircraft.h:118
std::vector< easy3d::vec3 > dummy_points
Definition aircraft.h:267
Eigen::VectorXd getLongitudinalState() const
Definition aircraft.cpp:1134
void printState()
Print current state variables to console for debugging.
Definition aircraft.cpp:940
double u_dot
Definition aircraft.h:61
Eigen::Vector3d Prop_torque
Definition aircraft.h:165
double C_n_p
Definition aircraft.h:203
double Cd_of_alpha
Definition aircraft.h:122
double C_Y_delta_r
Definition aircraft.h:192
double calculate_r_dot(double &p, double &q, double &r, double &ell, double &n, double &Gamma_1, double &Gamma_4, double &Gamma_7, double &Gamma_8)
Compute derivative of yaw rate r.
Definition aircraft.cpp:668
double Jxz
Definition aircraft.h:79
double alpha
Definition aircraft.h:51
double theta_0
Definition aircraft.h:224
double C_L_0
Definition aircraft.h:171
float old_pe
Definition aircraft.h:251
double delta_r_min
Definition aircraft.h:243
double w
Body-axis velocities [m/s].
Definition aircraft.h:47
double Gamma_1
Definition aircraft.h:97
double delta_a
Definition aircraft.h:232
double Gamma_6
Definition aircraft.h:102
float old_pn
Definition aircraft.h:250
double sigma_of_alpha
Definition aircraft.h:127
double k_motor
Definition aircraft.h:88
double pe
Definition aircraft.h:46
double epsilon
Definition aircraft.h:210
double prop_omega
Definition aircraft.h:92
std::vector< double > velocity_b
Definition aircraft.h:56
void load_a_plane(const std::string &filePath, int &vehicle_count)
Load an aircraft parameter file.
Definition aircraft.cpp:27
double Cl_flat_plate
Definition aircraft.h:130
double delta_t
Definition aircraft.h:231
double C_Y_0
Definition aircraft.h:187
std::vector< double > vertices_x
Definition aircraft.h:254
double beta
AoA and sideslip.
Definition aircraft.h:51
double sigma_den
Definition aircraft.h:126
double C_Y_delta_a
Definition aircraft.h:191
double v
Definition aircraft.h:47
double Gamma_2
Definition aircraft.h:98
double C_prop
Definition aircraft.h:208
double C_p_delta_a
Definition aircraft.h:111
double C_r_delta_r
Definition aircraft.h:119
double Gamma_4
Definition aircraft.h:100
double Cl_of_alpha
Definition aircraft.h:134
ControlInputs computeTrimControls(double alpha, double beta, double phi, double p, double q, double r, double theta, double Va, double R)
Compute control inputs that achieve trim for given flight conditions.
Definition aircraft.cpp:1025
Eigen::Vector3d Aero_torque
Definition aircraft.h:164
double u_0
Definition aircraft.h:219
easy3d::TrianglesDrawable * getAircraftDrawable() const
Get the drawable for shading or viewer operations.
Definition aircraft.h:358
std::vector< double > vertices_y
Definition aircraft.h:255
double Gamma_7
Definition aircraft.h:103
double rho
Definition aircraft.h:86
double C_ell_delta_a
Definition aircraft.h:198
double calculate_u_dot(double &v, double &w, double &q, double &r, double &fx, double &mass)
Compute derivative of body-axis X velocity.
Definition aircraft.cpp:621
double force_aero1
Definition aircraft.h:146
double C_n_delta_a
Definition aircraft.h:205
double calculate_pd_dot(double &u, double &v, double &w, double &phi, double &theta)
Compute derivative of down position (pd_dot).
Definition aircraft.cpp:579
double trans_rate
Definition aircraft.h:209
double C_r_beta
Definition aircraft.h:115
Guidance, Navigation, and Control system for the aircraft.
Definition gnc.h:21
Vec< 3, float > vec3
Definition common.h:19
Definition aircraft.h:367
double delta_e
Definition aircraft.h:368
double delta_a
Definition aircraft.h:369
double delta_r
Definition aircraft.h:370
double delta_t
Definition aircraft.h:371