vtolDynamicsSim.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020-2023 RaccoonLab.
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, version 3.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * Author: Dmitry Ponomarev <ponomarevda96@gmail.com>
17  */
18 
19 
20 #ifndef VTOL_DYNAMICS_SIM_H
21 #define VTOL_DYNAMICS_SIM_H
22 
23 #include <Eigen/Geometry>
24 #include <vector>
25 #include <array>
26 #include <random>
27 #include "uavDynamicsSimBase.hpp"
28 
29 
31  double mass; // kg
32  double gravity; // n/sec^2
33  double atmoRho; // air density (kg/m^3)
34  double wingArea; // m^2
35  double characteristicLength; // m
36  Eigen::Matrix<double, 3, 3, Eigen::RowMajor> inertia; // kg*m^2
37 
38  std::array<Eigen::Vector3d, 5> propellersLocation;
39 
40  std::vector<double> actuatorMin; // rad/sec
41  std::vector<double> actuatorMax; // rad/sec
42  std::array<double, 8> deltaControlMax; // rad/sec^2
43  std::array<double, 8> timeConstant; // sec
44 
45  double accVariance;
46  double gyroVariance;
47 
51  double massUncertainty; // multiplier
52  double inertiaUncertainty; // multiplier
53 
54  Eigen::Vector3d accelBias;
55  Eigen::Vector3d gyroBias;
56 };
57 
58 struct Forces{
59  Eigen::Vector3d lift;
60  Eigen::Vector3d drug;
61  Eigen::Vector3d side;
62  Eigen::Vector3d aero;
63  std::array<Eigen::Vector3d, 5> motors;
64  Eigen::Vector3d specific;
65  Eigen::Vector3d total;
66 };
67 
68 struct Moments{
69  Eigen::Vector3d aero;
70  Eigen::Vector3d steer;
71  Eigen::Vector3d airspeed;
72  std::array<Eigen::Vector3d, 5> motors;
73  Eigen::Vector3d total;
74 };
75 
76 struct State{
80  Eigen::Vector3d initialPose; // meters
81  Eigen::Vector3d position; // meters
82  Eigen::Vector3d linearVel; // m/sec
83  Eigen::Vector3d linearAccel; // m/sec^2
84 
88  Eigen::Quaterniond initialAttitude; // quaternion
89  Eigen::Quaterniond attitude; // quaternion
90  Eigen::Vector3d angularVel; // rad/sec
91  Eigen::Vector3d angularAccel; // rad/sec^2
92 
95 
96  std::array<double, 5> motorsRpm; // rpm
97  Eigen::Vector3d bodylinearVel; // m/sec (just for debug only)
98  std::vector<double> prevActuators; // rad/sec
99  std::vector<double> crntActuators; // rad/sec
100 };
101 
102 struct Environment{
103  double windVariance;
104  Eigen::Vector3d windVelocity; // m/sec^2
105  Eigen::Vector3d gustVelocity; // m/sec^2
106  double gustVariance;
107 };
108 
110  Eigen::Matrix<double, 8, 20, Eigen::RowMajor> CS_rudder;
111  Eigen::Matrix<double, 8, 90, Eigen::RowMajor> CS_beta;
112 
113  Eigen::Matrix<double, 1, 47, Eigen::RowMajor> AoA;
114  Eigen::Matrix<double, 90, 1, Eigen::ColMajor> AoS;
115 
116  Eigen::Matrix<double, 20, 1, Eigen::ColMajor> actuator;
117  Eigen::Matrix<double, 8, 1, Eigen::ColMajor> airspeed;
118 
119  Eigen::Matrix<double, 8, 8, Eigen::RowMajor> CLPolynomial;
120  Eigen::Matrix<double, 8, 8, Eigen::RowMajor> CSPolynomial;
121  Eigen::Matrix<double, 8, 6, Eigen::RowMajor> CDPolynomial;
122  Eigen::Matrix<double, 8, 8, Eigen::RowMajor> CmxPolynomial;
123  Eigen::Matrix<double, 8, 8, Eigen::RowMajor> CmyPolynomial;
124  Eigen::Matrix<double, 8, 8, Eigen::RowMajor> CmzPolynomial;
125 
126  Eigen::Matrix<double, 8, 20, Eigen::RowMajor> CmxAileron;
127  Eigen::Matrix<double, 8, 20, Eigen::RowMajor> CmyElevator;
128  Eigen::Matrix<double, 8, 20, Eigen::RowMajor> CmzRudder;
129 
130  Eigen::Matrix<double, 40, 5, Eigen::RowMajor> prop;
131 
132  std::vector<double> actuatorTimeConstants;
133 };
134 
139  public:
141  ~InnoVtolDynamicsSim() final = default;
142 
143  int8_t init() override;
144  void setInitialPosition(const Eigen::Vector3d & position,
145  const Eigen::Quaterniond& attitude) override;
146  void land() override;
147  int8_t calibrate(SimMode_t calibrationType) override;
148  void process(double dt_secs,
149  const std::vector<double>& motorSpeedCommandIn,
150  bool isCmdPercent) override;
151 
155  Eigen::Vector3d getVehiclePosition() const override;
156  Eigen::Quaterniond getVehicleAttitude() const override;
157  Eigen::Vector3d getVehicleVelocity() const override;
158  Eigen::Vector3d getVehicleAngularVelocity() const override;
159  void getIMUMeasurement(Eigen::Vector3d& accOut, Eigen::Vector3d& gyroOut) override;
160  bool getMotorsRpm(std::vector<double>& motorsRpm) override;
161 
165  const Forces& getForces() const;
166  const Moments& getMoments() const;
167  Eigen::Vector3d getBodyLinearVelocity() const;
168 
169  // For tests only
170  Eigen::Vector3d getAngularAcceleration() const;
171  Eigen::Vector3d getLinearAcceleration() const;
172 
177  Eigen::Vector3d calculateNormalForceWithoutMass() const;
178  Eigen::Vector3d calculateWind();
179  Eigen::Matrix3d calculateRotationMatrix() const;
180  double calculateDynamicPressure(double airSpeedMod) const;
181  double calculateAnglesOfAtack(const Eigen::Vector3d& airSpeed) const;
182  double calculateAnglesOfSideslip(const Eigen::Vector3d& airSpeed) const;
183  void thruster(double actuator, double& thrust, double& torque, double& rpm) const;
184  void calculateNewState(const Eigen::Vector3d& Maero,
185  const Eigen::Vector3d& Faero,
186  const std::vector<double>& actuator,
187  double dt_sec);
188 
189  void calculateAerodynamics(const Eigen::Vector3d& airspeed,
190  double AoA,
191  double AoS,
192  double aileron_pos,
193  double elevator_pos,
194  double rudder_pos,
195  Eigen::Vector3d& Faero,
196  Eigen::Vector3d& Maero);
197 
198  void calculateCLPolynomial(double airSpeedMod, Eigen::VectorXd& polynomialCoeffs) const;
199  void calculateCSPolynomial(double airSpeedMod, Eigen::VectorXd& polynomialCoeffs) const;
200  void calculateCDPolynomial(double airSpeedMod, Eigen::VectorXd& polynomialCoeffs) const;
201  void calculateCmxPolynomial(double airSpeedMod, Eigen::VectorXd& polynomialCoeffs) const;
202  void calculateCmyPolynomial(double airSpeedMod, Eigen::VectorXd& polynomialCoeffs) const;
203  void calculateCmzPolynomial(double airSpeedMod, Eigen::VectorXd& polynomialCoeffs) const;
204 
205  double calculateCSRudder(double rudder_pos, double airspeed) const;
206  double calculateCSBeta(double AoS_deg, double airspeed) const;
207  double calculateCmxAileron(double aileron_pos, double airspeed) const;
208  double calculateCmyElevator(double elevator_pos, double airspeed) const;
209  double calculateCmzRudder(double rudder_pos, double airspeed) const;
210 
211  Eigen::Vector3d calculateAngularAccel(const Eigen::Matrix<double, 3, 3, Eigen::RowMajor>& inertia,
212  const Eigen::Vector3d& moment,
213  const Eigen::Vector3d& prevAngVel) const;
214 
215  void setWindParameter(Eigen::Vector3d windMeanVelocity, double wind_velocityVariance);
216  void setInitialVelocity(const Eigen::Vector3d& linearVelocity,
217  const Eigen::Vector3d& angularVelocity);
218 
219  private:
220  void loadTables(const std::string& path);
221  void loadParams(const std::string& path);
222  std::vector<double> mapCmdToActuatorStandardVTOL(const std::vector<double>& cmd) const;
223  std::vector<double> mapCmdToActuatorInnoVTOL(const std::vector<double>& cmd) const;
224  void updateActuators(std::vector<double>& cmd, double dtSecs);
225  Eigen::Vector3d calculateAirSpeed(const Eigen::Matrix3d& rotationMatrix,
226  const Eigen::Vector3d& estimatedVelocity,
227  const Eigen::Vector3d& windSpeed) const;
228 
233 
234  std::default_random_engine generator_;
235  std::normal_distribution<double> distribution_{0.0, 1.0};
236 };
237 
238 #endif // VTOL_DYNAMICS_SIM_H
Moments moments
Eigen::Vector3d total
Eigen::Matrix< double, 3, 3, Eigen::RowMajor > inertia
Eigen::Matrix< double, 8, 20, Eigen::RowMajor > CS_rudder
Vtol dynamics simulator class.
Eigen::Matrix< double, 8, 20, Eigen::RowMajor > CmzRudder
Eigen::Vector3d drug
Eigen::Matrix< double, 8, 8, Eigen::RowMajor > CLPolynomial
Eigen::Quaterniond initialAttitude
Eigen::Vector3d aero
string cmd
Eigen::Vector3d specific
void init(const M_string &remappings)
VtolParameters params_
std::array< double, 8 > timeConstant
Eigen::Matrix< double, 8, 8, Eigen::RowMajor > CmxPolynomial
Eigen::Vector3d windVelocity
Eigen::Vector3d angularVel
Eigen::Vector3d linearVel
Eigen::Vector3d lift
Eigen::Vector3d gyroBias
double characteristicLength
Eigen::Matrix< double, 90, 1, Eigen::ColMajor > AoS
Eigen::Vector3d accelBias
Eigen::Vector3d angularAccel
void calculateNewState(double dt, std::vector< double > actuators, Eigen::Vector3d Maero, Eigen::Vector3d Faero, Eigen::Vector3d initialLinearVelocity, Eigen::Vector3d initialAngularVelocity, Eigen::Vector3d initialPosition, Eigen::Quaterniond initialAttitude, Eigen::Vector3d &expectedAngAccel, Eigen::Vector3d &expectedLinAccel, Eigen::Vector3d &angularAcceleration, Eigen::Vector3d &linearAcceleration)
Eigen::Matrix< double, 8, 8, Eigen::RowMajor > CmzPolynomial
Eigen::Matrix< double, 8, 1, Eigen::ColMajor > airspeed
std::array< double, 5 > motorsRpm
Eigen::Matrix< double, 40, 5, Eigen::RowMajor > prop
std::vector< double > prevActuators
Eigen::Matrix< double, 1, 47, Eigen::RowMajor > AoA
Eigen::Vector3d side
Forces forces
Eigen::Vector3d position
std::array< Eigen::Vector3d, 5 > motors
Eigen::Quaterniond attitude
Eigen::Matrix< double, 8, 20, Eigen::RowMajor > CmyElevator
Eigen::Matrix< double, 8, 8, Eigen::RowMajor > CmyPolynomial
Eigen::Matrix< double, 8, 6, Eigen::RowMajor > CDPolynomial
Eigen::Matrix< double, 8, 20, Eigen::RowMajor > CmxAileron
std::array< double, 8 > deltaControlMax
Eigen::Vector3d steer
Eigen::Vector3d initialPose
std::vector< double > actuatorMin
Eigen::Matrix< double, 20, 1, Eigen::ColMajor > actuator
std::array< Eigen::Vector3d, 5 > motors
TablesWithCoeffs tables_
Eigen::Vector3d total
Eigen::Vector3d airspeed
Eigen::Matrix< double, 8, 90, Eigen::RowMajor > CS_beta
Eigen::Vector3d gustVelocity
std::vector< double > crntActuators
Eigen::Vector3d linearAccel
std::vector< double > actuatorTimeConstants
Eigen::Matrix< double, 8, 8, Eigen::RowMajor > CSPolynomial
Eigen::Vector3d bodylinearVel
std::array< Eigen::Vector3d, 5 > propellersLocation
std::vector< double > actuatorMax
std::default_random_engine generator_
Eigen::Vector3d aero


inno_vtol_dynamics
Author(s): Roman Fedorenko, Dmitry Ponomarev, Ezra Tal, Winter Guerra
autogenerated on Sat Jul 1 2023 02:13:44