UAV Simulator
|
Represents a fixed‑wing UAV including its dynamics and 3D rendering. More...
#include <aircraft.h>
Classes | |
struct | ControlInputs |
Public Member Functions | |
Aircraft (const std::string &fname, int &vehicle_count) | |
Construct a new Aircraft, load parameters, and initialize states. | |
~Aircraft () | |
Destructor for Aircraft. | |
void | load_a_plane (const std::string &filePath, int &vehicle_count) |
Load an aircraft parameter file. | |
easy3d::vec3 * | update_aircraft (easy3d::vec3 *vertices, easy3d::vec3 *axesVertices, double &dt) |
Update aircraft states, geometry, and axes per simulation step. | |
void | renderAircraft (easy3d::Viewer &viewer) |
Render the aircraft model into the viewer. | |
void | createAxesDrawable (easy3d::Viewer &viewer) |
Create and render local coordinate axes. | |
bool | animate (easy3d::Viewer *viewer, double dt) |
Animate the aircraft for one frame. | |
void | render_HUD (easy3d::TextRenderer &tr, easy3d::Viewer *viewer) const |
Render HUD overlay of state variables. | |
void | printState () |
Print current state variables to console for debugging. | |
easy3d::TrianglesDrawable * | getAircraftDrawable () const |
Get the drawable for shading or viewer operations. | |
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. | |
Eigen::VectorXd | getLateralState () const |
Eigen::VectorXd | getLongitudinalState () const |
Eigen::VectorXd | computeStateDot (const Eigen::VectorXd &X_in, const Eigen::VectorXd &U_in) |
Public Attributes | |
double | clock |
Simulation clock [s]. | |
double | pn |
double | pe |
double | pd |
Position in NED frame [m]. | |
double | u |
double | v |
double | w |
Body-axis velocities [m/s]. | |
double | phi |
double | theta |
double | psi |
Euler angles [rad]. | |
double | p |
double | q |
double | r |
Angular rates [rad/s]. | |
double | V_m |
Airspeed [m/s]. | |
double | alpha |
double | beta |
AoA and sideslip. | |
double | fx |
double | fy |
double | fz |
Body-axis forces [N]. | |
double | ell |
double | m |
double | n |
Body-axis moments [Nm]. | |
std::vector< double > | velocity_b |
double | pn_dot |
double | pe_dot |
double | pd_dot |
double | u_dot |
double | v_dot |
double | w_dot |
double | phi_dot |
double | theta_dot |
double | psi_dot |
double | p_dot |
double | q_dot |
double | r_dot |
int | steps |
double | dt |
int | id |
double | mass |
double | Jx |
double | Jy |
double | Jz |
double | Jxz |
double | wing_area |
double | wing_chord |
double | wing_span |
double | wing_aspect_ratio = (wing_span*wing_span)/wing_area |
double | e |
double | g |
double | rho |
double | k_motor |
double | prop_area |
double | prop_thrust_coef |
double | prop_efficiency |
double | prop_omega |
double | Gamma |
double | Gamma_1 |
double | Gamma_2 |
double | Gamma_3 |
double | Gamma_4 |
double | Gamma_5 |
double | Gamma_6 |
double | Gamma_7 |
double | Gamma_8 |
double | C_p_0 |
double | C_p_beta |
double | C_p_p |
double | C_p_r |
double | C_p_delta_a |
double | C_p_delta_r |
double | C_r_0 |
double | C_r_beta |
double | C_r_p |
double | C_r_r |
double | C_r_delta_a |
double | C_r_delta_r |
double | Cd_of_alpha |
double | sigma_num |
double | sigma_den |
double | sigma_of_alpha |
double | Cl_flat_plate |
double | Cl_linear |
double | Cl_of_alpha |
double | CxAlpha |
double | CxqAlpha |
double | CxdeltaeAlpha |
double | CzAlpha |
double | CzqAlpha |
double | CzdeltaeAlpha |
Eigen::Vector3d | force_g |
double | force_aero1 |
Eigen::Vector3d | force_aero2 |
Eigen::Vector3d | force_aero |
double | force_prop1 |
Eigen::Vector3d | force_prop2 |
Eigen::Vector3d | force_prop |
Eigen::Vector3d | Force |
double | Aero_t1 = force_aero1 |
Eigen::Vector3d | Aero_t2 |
Eigen::Vector3d | Aero_torque |
Eigen::Vector3d | Prop_torque |
Eigen::Vector3d | Torque |
double | C_L_0 |
double | C_L_alpha |
double | C_L_q |
double | C_L_delta_e |
double | C_D_0 |
double | C_D_alpha |
double | C_D_p |
double | C_D_q |
double | C_D_delta_e |
double | C_m_0 |
double | C_m_alpha |
double | C_m_q |
double | C_m_delta_e |
double | C_Y_0 |
double | C_Y_beta |
double | C_Y_p |
double | C_Y_r |
double | C_Y_delta_a |
double | C_Y_delta_r |
double | C_ell_0 |
double | C_ell_beta |
double | C_ell_p |
double | C_ell_r |
double | C_ell_delta_a |
double | C_ell_delta_r |
double | C_n_0 |
double | C_n_beta |
double | C_n_p |
double | C_n_r |
double | C_n_delta_a |
double | C_n_delta_r |
double | C_prop |
double | trans_rate |
double | epsilon |
double | alpha0 |
double | beta0 |
double | pn_0 |
double | pe_0 |
double | pd_0 |
double | u_0 |
double | v_0 |
double | w_0 |
double | phi_0 |
double | theta_0 |
double | psi_0 |
double | p_0 |
double | q_0 |
double | r_0 |
double | delta_t |
double | delta_a |
double | delta_e |
double | delta_r |
double | delta_t_max |
double | delta_t_min |
double | delta_a_max |
double | delta_a_min |
double | delta_e_max |
double | delta_e_min |
double | delta_r_max |
double | delta_r_min |
float | old_roll |
float | old_pitch |
float | old_yaw |
float | old_pn |
float | old_pe |
float | old_pd |
std::vector< double > | vertices_x |
std::vector< double > | vertices_y |
std::vector< double > | vertices_z |
int | vertices_size |
int | aircraft_scale = 20 |
std::vector< std::vector< int > > | faces |
std::vector< easy3d::vec3 > | vertices_aircraft |
std::vector< unsigned int > | indices |
std::vector< easy3d::vec3 > | dummy_points |
std::vector< easy3d::vec3 > & | points |
easy3d::TrianglesDrawable * | aircraft |
easy3d::LinesDrawable * | axesDrawable |
std::vector< easy3d::vec3 > | axes_vertices |
std::vector< easy3d::vec3 > | original_vertices |
std::vector< easy3d::vec3 > | axes_vertices_original |
std::string | file_name |
std::unique_ptr< easy3d::SurfaceMesh > | mesh |
std::vector< double > | X = {pn,pe,pd,u,v,w,p,q,r,phi,theta,psi,fx,fy,fz,ell,m,n} |
Private Member Functions | |
void | calculate_forces () |
Perform force calculations (gravity, aero, prop). | |
void | calculate_body_frame_velocity_and_angles () |
Calculate body-frame velocity and angles. | |
void | calculate_lift_drag_coefficients () |
Calculate lift and drag coefficients. | |
void | calculate_moments () |
Calculate aerodynamic and propulsive moments. | |
void | rotate (easy3d::vec3 *vertices) |
Apply rotation to aircraft mesh vertices. | |
void | rotate_axes (easy3d::vec3 *axesVertices) |
Apply rotation to axes vertices. | |
void | translate (easy3d::vec3 *vertices) |
Apply translation to aircraft mesh vertices. | |
void | translate_axes (easy3d::vec3 *axesVertices) |
Apply translation to axes vertices. | |
void | RK4 (std::vector< double > &X, double dt) |
Integrate dynamics using Runge-Kutta 4th order. | |
double | calculate_pn_dot (double &u, double &v, double &w, double &phi, double &theta, double &psi) |
Compute derivative of north position (pn_dot). | |
double | calculate_pe_dot (double &u, double &v, double &w, double &phi, double &theta, double &psi) |
Compute derivative of east position (pe_dot). | |
double | calculate_pd_dot (double &u, double &v, double &w, double &phi, double &theta) |
Compute derivative of down position (pd_dot). | |
double | calculate_phi_dot (double &p, double &q, double &r, double &phi, double &theta) |
Compute derivative of roll angle (phi_dot). | |
double | calculate_theta_dot (double &q, double &r, double &phi) |
Compute derivative of pitch angle (theta_dot). | |
double | calculate_psi_dot (double &q, double &r, double &phi, double &theta) |
Compute derivative of yaw angle (psi_dot). | |
double | calculate_u_dot (double &v, double &w, double &q, double &r, double &fx, double &mass) |
Compute derivative of body-axis X velocity. | |
double | calculate_v_dot (double &u, double &w, double &p, double &fy, double &mass) |
Compute derivative of body-axis Y velocity. | |
double | calculate_w_dot (double &u, double &v, double &p, double &q, double &fz, double &mass) |
Compute derivative of body-axis Z velocity. | |
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. | |
double | calculate_q_dot (double &p, double &r, double &m, double &Jy, double &Gamma_5, double &Gamma_6) |
Compute derivative of pitch rate q. | |
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. | |
Friends | |
class | GNC |
Represents a fixed‑wing UAV including its dynamics and 3D rendering.
Public members expose state variables and parameters, while methods handle:
Aircraft::Aircraft | ( | const std::string & | fname, |
int & | vehicle_count | ||
) |
Construct a new Aircraft, load parameters, and initialize states.
Constructor. Loads parameters and initializes state variables.
Aircraft::~Aircraft | ( | ) |
bool Aircraft::animate | ( | easy3d::Viewer * | viewer, |
double | dt | ||
) |
Animate the aircraft for one frame.
Animation callback called by viewer per frame.
viewer | Pointer to Easy3D viewer. |
dt | Time step in seconds. |
viewer | Pointer to Easy3D viewer. |
dt | Time step in seconds. |
|
private |
Calculate body-frame velocity and angles.
Compute body-frame airspeed, angle of attack, and sideslip.
|
private |
Perform force calculations (gravity, aero, prop).
Calculate total aerodynamic, gravitational, and propulsion forces.
|
private |
Calculate lift and drag coefficients.
Compute lift and drag coefficients as functions of alpha and control inputs.
|
private |
Calculate aerodynamic and propulsive moments.
Calculate aerodynamic and propulsive moments (roll, pitch, yaw).
|
private |
Compute derivative of roll rate p.
|
private |
Compute derivative of down position (pd_dot).
|
private |
Compute derivative of east position (pe_dot).
|
private |
Compute derivative of roll angle (phi_dot).
|
private |
Compute derivative of north position (pn_dot).
|
private |
Compute derivative of yaw angle (psi_dot).
|
private |
Compute derivative of pitch rate q.
|
private |
Compute derivative of yaw rate r.
|
private |
Compute derivative of pitch angle (theta_dot).
|
private |
Compute derivative of body-axis X velocity.
|
private |
Compute derivative of body-axis Y velocity.
|
private |
Compute derivative of body-axis Z velocity.
Eigen::VectorXd Aircraft::computeStateDot | ( | const Eigen::VectorXd & | X_in, |
const Eigen::VectorXd & | U_in | ||
) |
Aircraft::ControlInputs Aircraft::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.
Compute control inputs (δ_e, δ_a, δ_r, δ_t) that achieve trim.
alpha | Angle of attack. |
beta | Side slip angle. |
phi | Roll angle. |
p | Roll rate. |
q | Pitch rate. |
r | Yaw rate. |
theta | Pitch angle. |
Va | Airspeed. |
R | Turn radius. |
alpha | Angle of attack. |
beta | Side slip angle. |
phi | Roll angle. |
p | Roll rate. |
q | Pitch rate. |
r | Yaw rate. |
theta | Pitch angle. |
Va | Airspeed. |
R | Turn radius. |
void Aircraft::createAxesDrawable | ( | easy3d::Viewer & | viewer | ) |
Create and render local coordinate axes.
Create and render a local coordinate frame.
viewer | Reference to Easy3D viewer. |
|
inline |
Get the drawable for shading or viewer operations.
Eigen::VectorXd Aircraft::getLateralState | ( | ) | const |
Eigen::VectorXd Aircraft::getLongitudinalState | ( | ) | const |
void Aircraft::load_a_plane | ( | const std::string & | filePath, |
int & | vehicle_count | ||
) |
Load an aircraft parameter file.
================================
filePath | File path of parameter file. |
vehicle_count | Reference to vehicle counter. |
Load aircraft parameters from a text file and assign them to members.
filePath | Path to parameter file. |
vehicle_count | Reference to vehicle counter, used to assign ID. |
void Aircraft::printState | ( | ) |
Print current state variables to console for debugging.
Debug print of current state variables to console.
void Aircraft::render_HUD | ( | easy3d::TextRenderer & | tr, |
easy3d::Viewer * | viewer | ||
) | const |
Render HUD overlay of state variables.
Render heads-up display (HUD) with aircraft states.
tr | Text renderer for HUD. |
viewer | Pointer to Easy3D viewer. |
tr | Reference to Easy3D TextRenderer. |
viewer | Pointer to Easy3D viewer. |
void Aircraft::renderAircraft | ( | easy3d::Viewer & | viewer | ) |
Render the aircraft model into the viewer.
Load and render aircraft geometry using Easy3D.
viewer | Reference to Easy3D viewer. |
|
private |
Integrate dynamics using Runge-Kutta 4th order.
Runge–Kutta 4th order integration to update state vector.
X | State vector containing position, velocity, attitude, forces & moments. |
dt | Time step (seconds). |
|
private |
Apply rotation to aircraft mesh vertices.
Apply rotation to aircraft mesh vertices using Euler angles.
|
private |
Apply rotation to axes vertices.
Apply rotation to local axes vertices.
|
private |
Apply translation to aircraft mesh vertices.
|
private |
Apply translation to axes vertices.
easy3d::vec3 * Aircraft::update_aircraft | ( | easy3d::vec3 * | vertices, |
easy3d::vec3 * | axesVertices, | ||
double & | dt | ||
) |
Update aircraft states, geometry, and axes per simulation step.
Update aircraft state each simulation step, applying dynamics and geometry transforms.
vertices | Pointer to aircraft vertex buffer. |
axesVertices | Pointer to axes vertex buffer. |
dt | Time step in seconds. |
vertices | Vertex buffer for aircraft. |
axesVertices | Vertex buffer for axes. |
dt | Time step in seconds. |
|
friend |
double Aircraft::Aero_t1 = force_aero1 |
Eigen::Vector3d Aircraft::Aero_t2 |
Eigen::Vector3d Aircraft::Aero_torque |
easy3d::TrianglesDrawable* Aircraft::aircraft |
int Aircraft::aircraft_scale = 20 |
double Aircraft::alpha |
double Aircraft::alpha0 |
std::vector<easy3d::vec3> Aircraft::axes_vertices |
std::vector<easy3d::vec3> Aircraft::axes_vertices_original |
easy3d::LinesDrawable* Aircraft::axesDrawable |
double Aircraft::beta |
AoA and sideslip.
double Aircraft::beta0 |
double Aircraft::C_D_0 |
double Aircraft::C_D_alpha |
double Aircraft::C_D_delta_e |
double Aircraft::C_D_p |
double Aircraft::C_D_q |
double Aircraft::C_ell_0 |
double Aircraft::C_ell_beta |
double Aircraft::C_ell_delta_a |
double Aircraft::C_ell_delta_r |
double Aircraft::C_ell_p |
double Aircraft::C_ell_r |
double Aircraft::C_L_0 |
double Aircraft::C_L_alpha |
double Aircraft::C_L_delta_e |
double Aircraft::C_L_q |
double Aircraft::C_m_0 |
double Aircraft::C_m_alpha |
double Aircraft::C_m_delta_e |
double Aircraft::C_m_q |
double Aircraft::C_n_0 |
double Aircraft::C_n_beta |
double Aircraft::C_n_delta_a |
double Aircraft::C_n_delta_r |
double Aircraft::C_n_p |
double Aircraft::C_n_r |
double Aircraft::C_p_0 |
double Aircraft::C_p_beta |
double Aircraft::C_p_delta_a |
double Aircraft::C_p_delta_r |
double Aircraft::C_p_p |
double Aircraft::C_p_r |
double Aircraft::C_prop |
double Aircraft::C_r_0 |
double Aircraft::C_r_beta |
double Aircraft::C_r_delta_a |
double Aircraft::C_r_delta_r |
double Aircraft::C_r_p |
double Aircraft::C_r_r |
double Aircraft::C_Y_0 |
double Aircraft::C_Y_beta |
double Aircraft::C_Y_delta_a |
double Aircraft::C_Y_delta_r |
double Aircraft::C_Y_p |
double Aircraft::C_Y_r |
double Aircraft::Cd_of_alpha |
double Aircraft::Cl_flat_plate |
double Aircraft::Cl_linear |
double Aircraft::Cl_of_alpha |
double Aircraft::clock |
Simulation clock [s].
double Aircraft::CxAlpha |
double Aircraft::CxdeltaeAlpha |
double Aircraft::CxqAlpha |
double Aircraft::CzAlpha |
double Aircraft::CzdeltaeAlpha |
double Aircraft::CzqAlpha |
double Aircraft::delta_a |
double Aircraft::delta_a_max |
double Aircraft::delta_a_min |
double Aircraft::delta_e |
double Aircraft::delta_e_max |
double Aircraft::delta_e_min |
double Aircraft::delta_r |
double Aircraft::delta_r_max |
double Aircraft::delta_r_min |
double Aircraft::delta_t |
double Aircraft::delta_t_max |
double Aircraft::delta_t_min |
double Aircraft::dt |
std::vector<easy3d::vec3> Aircraft::dummy_points |
double Aircraft::e |
double Aircraft::ell |
double Aircraft::epsilon |
std::vector<std::vector<int> > Aircraft::faces |
std::string Aircraft::file_name |
Eigen::Vector3d Aircraft::Force |
Eigen::Vector3d Aircraft::force_aero |
double Aircraft::force_aero1 |
Eigen::Vector3d Aircraft::force_aero2 |
Eigen::Vector3d Aircraft::force_g |
Eigen::Vector3d Aircraft::force_prop |
double Aircraft::force_prop1 |
Eigen::Vector3d Aircraft::force_prop2 |
double Aircraft::fx |
double Aircraft::fy |
double Aircraft::fz |
Body-axis forces [N].
double Aircraft::g |
double Aircraft::Gamma |
double Aircraft::Gamma_1 |
double Aircraft::Gamma_2 |
double Aircraft::Gamma_3 |
double Aircraft::Gamma_4 |
double Aircraft::Gamma_5 |
double Aircraft::Gamma_6 |
double Aircraft::Gamma_7 |
double Aircraft::Gamma_8 |
int Aircraft::id |
std::vector<unsigned int> Aircraft::indices |
double Aircraft::Jx |
double Aircraft::Jxz |
double Aircraft::Jy |
double Aircraft::Jz |
double Aircraft::k_motor |
double Aircraft::m |
double Aircraft::mass |
std::unique_ptr<easy3d::SurfaceMesh> Aircraft::mesh |
double Aircraft::n |
Body-axis moments [Nm].
float Aircraft::old_pd |
float Aircraft::old_pe |
float Aircraft::old_pitch |
float Aircraft::old_pn |
float Aircraft::old_roll |
float Aircraft::old_yaw |
std::vector<easy3d::vec3> Aircraft::original_vertices |
double Aircraft::p |
double Aircraft::p_0 |
double Aircraft::p_dot |
double Aircraft::pd |
Position in NED frame [m].
double Aircraft::pd_0 |
double Aircraft::pd_dot |
double Aircraft::pe |
double Aircraft::pe_0 |
double Aircraft::pe_dot |
double Aircraft::phi |
double Aircraft::phi_0 |
double Aircraft::phi_dot |
double Aircraft::pn |
double Aircraft::pn_0 |
double Aircraft::pn_dot |
std::vector<easy3d::vec3>& Aircraft::points |
double Aircraft::prop_area |
double Aircraft::prop_efficiency |
double Aircraft::prop_omega |
double Aircraft::prop_thrust_coef |
Eigen::Vector3d Aircraft::Prop_torque |
double Aircraft::psi |
Euler angles [rad].
double Aircraft::psi_0 |
double Aircraft::psi_dot |
double Aircraft::q |
double Aircraft::q_0 |
double Aircraft::q_dot |
double Aircraft::r |
Angular rates [rad/s].
double Aircraft::r_0 |
double Aircraft::r_dot |
double Aircraft::rho |
double Aircraft::sigma_den |
double Aircraft::sigma_num |
double Aircraft::sigma_of_alpha |
int Aircraft::steps |
double Aircraft::theta |
double Aircraft::theta_0 |
double Aircraft::theta_dot |
Eigen::Vector3d Aircraft::Torque |
double Aircraft::trans_rate |
double Aircraft::u |
double Aircraft::u_0 |
double Aircraft::u_dot |
double Aircraft::v |
double Aircraft::v_0 |
double Aircraft::v_dot |
double Aircraft::V_m |
Airspeed [m/s].
std::vector<double> Aircraft::velocity_b |
std::vector<easy3d::vec3> Aircraft::vertices_aircraft |
int Aircraft::vertices_size |
std::vector<double> Aircraft::vertices_x |
std::vector<double> Aircraft::vertices_y |
std::vector<double> Aircraft::vertices_z |
double Aircraft::w |
Body-axis velocities [m/s].
double Aircraft::w_0 |
double Aircraft::w_dot |
double Aircraft::wing_area |
double Aircraft::wing_chord |
double Aircraft::wing_span |