20 #ifndef VTOL_DYNAMICS_SIM_H 21 #define VTOL_DYNAMICS_SIM_H 23 #include <Eigen/Geometry> 36 Eigen::Matrix<double, 3, 3, Eigen::RowMajor>
inertia;
63 std::array<Eigen::Vector3d, 5>
motors;
72 std::array<Eigen::Vector3d, 5>
motors;
110 Eigen::Matrix<double, 8, 20, Eigen::RowMajor>
CS_rudder;
111 Eigen::Matrix<double, 8, 90, Eigen::RowMajor>
CS_beta;
113 Eigen::Matrix<double, 1, 47, Eigen::RowMajor>
AoA;
114 Eigen::Matrix<double, 90, 1, Eigen::ColMajor>
AoS;
116 Eigen::Matrix<double, 20, 1, Eigen::ColMajor>
actuator;
117 Eigen::Matrix<double, 8, 1, Eigen::ColMajor>
airspeed;
128 Eigen::Matrix<double, 8, 20, Eigen::RowMajor>
CmzRudder;
130 Eigen::Matrix<double, 40, 5, Eigen::RowMajor>
prop;
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;
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;
165 const Forces& getForces()
const;
166 const Moments& getMoments()
const;
167 Eigen::Vector3d getBodyLinearVelocity()
const;
170 Eigen::Vector3d getAngularAcceleration()
const;
171 Eigen::Vector3d getLinearAcceleration()
const;
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;
185 const Eigen::Vector3d& Faero,
186 const std::vector<double>& actuator,
189 void calculateAerodynamics(
const Eigen::Vector3d& airspeed,
195 Eigen::Vector3d& Faero,
196 Eigen::Vector3d& Maero);
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;
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;
211 Eigen::Vector3d calculateAngularAccel(
const Eigen::Matrix<double, 3, 3, Eigen::RowMajor>&
inertia,
212 const Eigen::Vector3d& moment,
213 const Eigen::Vector3d& prevAngVel)
const;
215 void setWindParameter(Eigen::Vector3d windMeanVelocity,
double wind_velocityVariance);
216 void setInitialVelocity(
const Eigen::Vector3d& linearVelocity,
217 const Eigen::Vector3d& angularVelocity);
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;
235 std::normal_distribution<double> distribution_{0.0, 1.0};
238 #endif // VTOL_DYNAMICS_SIM_H
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::Matrix< double, 8, 8, Eigen::RowMajor > CLPolynomial
Eigen::Quaterniond initialAttitude
void init(const M_string &remappings)
std::array< double, 8 > timeConstant
Eigen::Matrix< double, 8, 8, Eigen::RowMajor > CmxPolynomial
Eigen::Vector3d windVelocity
Eigen::Vector3d angularVel
Eigen::Vector3d linearVel
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
std::array< Eigen::Vector3d, 5 > motors
Eigen::Quaterniond attitude
Eigen::Matrix< double, 8, 20, Eigen::RowMajor > CmyElevator
double inertiaUncertainty
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 initialPose
std::vector< double > actuatorMin
Eigen::Matrix< double, 20, 1, Eigen::ColMajor > actuator
std::array< Eigen::Vector3d, 5 > motors
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_