multicopterDynamicsSim.hpp
Go to the documentation of this file.
1 
8 #ifndef MULTICOPTERDYNAMICSSIM_H
9 #define MULTICOPTERDYNAMICSSIM_H
10 
11 #include <Eigen/Dense>
12 #include <Eigen/Geometry>
13 #include <vector>
15 #include <geographiclib_conversions/geodetic_conv.hpp>
16 
22  public:
23  MulticopterDynamicsSim(int numCopter, double thrustCoefficient, double torqueCoefficient,
24  double minMotorSpeed, double maxMotorSpeed,
25  double motorTimeConstant, double motorRotationalInertia,
26  double vehicleMass,
27  const Eigen::Matrix3d & vehicleInertia,
28  const Eigen::Matrix3d & aeroMomentCoefficient,
29  double dragCoefficient,
30  double momentProcessNoiseAutoCorrelation,
31  double forceProcessNoiseAutoCorrelation,
32  const Eigen::Vector3d & gravity);
33  MulticopterDynamicsSim(int numCopter);
34  void setVehicleProperties(double vehicleMass, const Eigen::Matrix3d & vehicleInertia,
35  const Eigen::Matrix3d & aeroMomentCoefficient,
36  double dragCoefficient,
37  double momentProcessNoiseAutoCorrelation,
38  double forceProcessNoiseAutoCorrelation);
39  void setGravityVector(const Eigen::Vector3d & gravity);
40  void setMotorFrame(const Eigen::Isometry3d & motorFrame, int motorDirection, int motorIndex);
41  void setMotorProperties(double thrustCoefficient, double torqueCoefficient, double motorTimeConstant,
42  double minMotorSpeed, double maxMotorSpeed, double rotationalInertia, int motorIndex);
43  void setMotorProperties(double thrustCoefficient, double torqueCoefficient, double motorTimeConstant,
44  double minMotorSpeed, double maxMotorSpeed, double rotationalInertia);
45  void setMotorSpeed(double motorSpeed, int motorIndex);
46  void setMotorSpeed(double motorSpeed);
47  void resetMotorSpeeds(void);
48  void setVehiclePosition(const Eigen::Vector3d & position,const Eigen::Quaterniond & attitude);
49  void setVehicleInitialAttitude(const Eigen::Quaterniond & attitude);
50  void setVehicleState(const Eigen::Vector3d & position,
51  const Eigen::Vector3d & velocity,
52  const Eigen::Vector3d & angularVelocity,
53  const Eigen::Quaterniond & attitude,
54  const std::vector<double> & motorSpeed);
55  void getVehicleState(Eigen::Vector3d & position,
56  Eigen::Vector3d & velocity,
57  Eigen::Vector3d & angularVelocity,
58  Eigen::Quaterniond & attitude,
59  std::vector<double> & motorSpeed);
60  Eigen::Vector3d getVehiclePosition(void);
61  Eigen::Quaterniond getVehicleAttitude(void);
62  Eigen::Vector3d getVehicleVelocity(void);
63  Eigen::Vector3d getVehicleAngularVelocity(void);
64 
65  void proceedState_ExplicitEuler(double dt_secs, const std::vector<double> & motorSpeedCommand, bool isCmdPercent = false);
66  void proceedState_RK4(double dt_secs, const std::vector<double> & motorSpeedCommand, bool isCmdPercent = false);
67 
68  void getIMUMeasurement(Eigen::Vector3d & accOutput, Eigen::Vector3d & gyroOutput);
69 
72 
74  geodetic_converter::GeodeticConverter geodetic_converter_;
75 
76  private:
79 
81 
82 
83  // Transform from motor to vehicle (c.o.g.) frame
84  /* Motor frame must have prop spinning around z-axis such that
85  a positive motor speed corresponds to a positive thrust in
86  positive motor z-axis direction.*/
87  std::vector<Eigen::Isometry3d> motorFrame_;
88 
89  /* +1 if positive motor speed corresponds to positive moment around the motor frame z-axis
90  -1 if positive motor speed corresponds to negative moment around the motor frame z-axis
91  i.e. -1 indicates a positive motor speed corresponds to a positive rotation rate around the motor z-axis
92  */
93  std::vector<int> motorDirection_;
94 
95  std::vector<double> thrustCoefficient_; // N/(rad/s)^2
96  std::vector<double> torqueCoefficient_; // Nm/(rad/s)^2
97  std::vector<double> motorTimeConstant_; // s
98  std::vector<double> motorRotationalInertia_; // kg m^2
99  std::vector<double> maxMotorSpeed_; // rad/s
100  std::vector<double> minMotorSpeed_; // rad/s
102 
104 
105  double dragCoefficient_; // N/(m/s)
106  Eigen::Matrix3d aeroMomentCoefficient_; // Nm/(rad/s)^2
107  double vehicleMass_; // kg
108  Eigen::Matrix3d vehicleInertia_; // kg m^2
109  double momentProcessNoiseAutoCorrelation_ = 0.; // (Nm)^2s
112 
114 
115  std::default_random_engine randomNumberGenerator_;
116  std::normal_distribution<double> standardNormalDistribution_ = std::normal_distribution<double>(0.0,1.0);
118 
119  // Default reference frame is NED, but can be set by changing gravity direction
121  Eigen::Vector3d gravity_; // m/s^2
122 
124 
125  std::vector<double> motorSpeed_; // rad/s
126  Eigen::Vector3d velocity_ = Eigen::Vector3d::Zero(); // m/s
127  Eigen::Vector3d position_ = Eigen::Vector3d::Zero(); // m
128  Eigen::Vector3d angularVelocity_ = Eigen::Vector3d::Zero(); // rad/s
129  Eigen::Quaterniond attitude_ = Eigen::Quaterniond::Identity();
130  Eigen::Quaterniond default_attitude_ = Eigen::Quaterniond::Identity();
132 
133  /* Vehicle stochastic force vector (in world frame) is maintained
134  for accelerometer output, since it must include the same
135  random linear acceleration noise as used for dynamics integration*/
137  Eigen::Vector3d stochForce_ = Eigen::Vector3d::Zero(); // N
138 
139  Eigen::Vector3d getThrust(const std::vector<double> & motorSpeed);
140  Eigen::Vector3d getControlMoment(const std::vector<double> & motorSpeed,
141  const std::vector<double> & motorAcceleration);
142  Eigen::Vector3d getAeroMoment(const Eigen::Vector3d & angularVelocity);
143  Eigen::Vector3d getDragForce(const Eigen::Vector3d & velocity);
144  Eigen::Vector3d getVehicleSpecificForce(void);
145  Eigen::Vector3d getTotalForce(void);
146 
147  void getMotorSpeedDerivative(std::vector<double> & motorSpeedDer,
148  const std::vector<double> & motorSpeed,
149  const std::vector<double> & motorSpeedCommand);
150  Eigen::Vector3d getVelocityDerivative(const Eigen::Quaterniond & attitude, const Eigen::Vector3d & stochForce,
151  const Eigen::Vector3d & velocity, const std::vector<double> & motorSpeed);
152  Eigen::Vector3d getAngularVelocityDerivative(const std::vector<double> & motorSpeed,
153  const std::vector<double>& motorAcceleration,
154  const Eigen::Vector3d & angularVelocity,
155  const Eigen::Vector3d & stochMoment);
156  Eigen::Vector4d getAttitudeDerivative(const Eigen::Quaterniond & attitude, const Eigen::Vector3d & angularVelocity);
157  void vectorAffineOp(const std::vector<double> & vec1, const std::vector<double> & vec2,
158  std::vector<double> & vec3, double val);
159  void vectorScalarProd(const std::vector<double> & vec1, std::vector<double> & vec2, double val);
160  void vectorBoundOp(const std::vector<double> & vec1, std::vector<double> & vec2,
161  const std::vector<double> & minvec, const std::vector<double> & maxvec);
162 };
163 
164 #endif // MULTICOPTERDYNAMICSSIM_H
void setMotorProperties(double thrustCoefficient, double torqueCoefficient, double motorTimeConstant, double minMotorSpeed, double maxMotorSpeed, double rotationalInertia, int motorIndex)
Set properties for individual motor.
std::vector< Eigen::Isometry3d > motorFrame_
std::vector< double > minMotorSpeed_
std::default_random_engine randomNumberGenerator_
void setVehicleInitialAttitude(const Eigen::Quaterniond &attitude)
void proceedState_ExplicitEuler(double dt_secs, const std::vector< double > &motorSpeedCommand, bool isCmdPercent=false)
Proceed vehicle dynamics using Explicit Euler integration.
void setMotorFrame(const Eigen::Isometry3d &motorFrame, int motorDirection, int motorIndex)
Set orientation and position for individual motor.
void getMotorSpeedDerivative(std::vector< double > &motorSpeedDer, const std::vector< double > &motorSpeed, const std::vector< double > &motorSpeedCommand)
Get motor acceleration.
void setVehicleProperties(double vehicleMass, const Eigen::Matrix3d &vehicleInertia, const Eigen::Matrix3d &aeroMomentCoefficient, double dragCoefficient, double momentProcessNoiseAutoCorrelation, double forceProcessNoiseAutoCorrelation)
Set vehicle properties.
Eigen::Vector3d getVehicleVelocity(void)
Get vehicle velocity.
std::normal_distribution< double > standardNormalDistribution_
void vectorBoundOp(const std::vector< double > &vec1, std::vector< double > &vec2, const std::vector< double > &minvec, const std::vector< double > &maxvec)
Element-wise vector bound operation: vec2 = max(minvalue, min(maxvalue, vec1))
void setMotorSpeed(double motorSpeed, int motorIndex)
Set motor speed for individual motor.
Eigen::Vector3d getVehicleAngularVelocity(void)
Get vehicle angular velocity.
Eigen::Vector3d getThrust(const std::vector< double > &motorSpeed)
Get thrust in vehicle-fixed reference frame.
std::vector< double > motorTimeConstant_
Eigen::Vector3d getAngularVelocityDerivative(const std::vector< double > &motorSpeed, const std::vector< double > &motorAcceleration, const Eigen::Vector3d &angularVelocity, const Eigen::Vector3d &stochMoment)
Get vehicle angular acceleration in vehicle-fixed reference frame.
Eigen::Vector3d getControlMoment(const std::vector< double > &motorSpeed, const std::vector< double > &motorAcceleration)
Get control moment in vehicle-fixed reference frame.
void vectorAffineOp(const std::vector< double > &vec1, const std::vector< double > &vec2, std::vector< double > &vec3, double val)
Element-wise affine vector calculus: vec3 = vec1 + val*vec2.
Eigen::Vector4d getAttitudeDerivative(const Eigen::Quaterniond &attitude, const Eigen::Vector3d &angularVelocity)
Get attitude quaternion time-derivative.
std::vector< double > motorRotationalInertia_
Eigen::Quaterniond default_attitude_
std::vector< int > motorDirection_
Eigen::Quaterniond getVehicleAttitude(void)
Get vehicle attitude.
std::vector< double > thrustCoefficient_
std::vector< double > motorSpeed_
void setVehiclePosition(const Eigen::Vector3d &position, const Eigen::Quaterniond &attitude)
Set vehicle position and attitude.
Inertial measurement unit (IMU) simulator class.
Multicopter dynamics simulator class.
Eigen::Vector3d getVehicleSpecificForce(void)
Get total specific force acting on vehicle, excluding gravity force.
void getIMUMeasurement(Eigen::Vector3d &accOutput, Eigen::Vector3d &gyroOutput)
Get IMU measurement.
void vectorScalarProd(const std::vector< double > &vec1, std::vector< double > &vec2, double val)
Vector-scalar product: vec2 = val*vec1.
void resetMotorSpeeds(void)
Set motor speed to zero for all motors.
MulticopterDynamicsSim(int numCopter, double thrustCoefficient, double torqueCoefficient, double minMotorSpeed, double maxMotorSpeed, double motorTimeConstant, double motorRotationalInertia, double vehicleMass, const Eigen::Matrix3d &vehicleInertia, const Eigen::Matrix3d &aeroMomentCoefficient, double dragCoefficient, double momentProcessNoiseAutoCorrelation, double forceProcessNoiseAutoCorrelation, const Eigen::Vector3d &gravity)
Construct a new Multicopter Dynamics Sim object.
void proceedState_RK4(double dt_secs, const std::vector< double > &motorSpeedCommand, bool isCmdPercent=false)
Proceed vehicle dynamics using 4th order Runge-Kutta integration.
geodetic_converter::GeodeticConverter geodetic_converter_
Geodetic coordinates converter for GPS simulation.
Eigen::Vector3d getVehiclePosition(void)
Get vehicle position.
Eigen::Vector3d getAeroMoment(const Eigen::Vector3d &angularVelocity)
Get aerodynamic moment in vehicle-fixed reference frame.
std::vector< double > torqueCoefficient_
inertialMeasurementSim imu_
Eigen::Vector3d getVelocityDerivative(const Eigen::Quaterniond &attitude, const Eigen::Vector3d &stochForce, const Eigen::Vector3d &velocity, const std::vector< double > &motorSpeed)
Get vehicle accelertion in world-fixed reference frame.
Eigen::Vector3d getDragForce(const Eigen::Vector3d &velocity)
Get drag force in world-fixed reference frame.
void getVehicleState(Eigen::Vector3d &position, Eigen::Vector3d &velocity, Eigen::Vector3d &angularVelocity, Eigen::Quaterniond &attitude, std::vector< double > &motorSpeed)
Get vehicle state.
Eigen::Vector3d getTotalForce(void)
Get total force acting on vehicle, including gravity force.
std::vector< double > maxMotorSpeed_
void setGravityVector(const Eigen::Vector3d &gravity)
Set orientation of world-fixed reference frame using gravity vector.
Inertial measurement unit (IMU) simulator class header file.
void setVehicleState(const Eigen::Vector3d &position, const Eigen::Vector3d &velocity, const Eigen::Vector3d &angularVelocity, const Eigen::Quaterniond &attitude, const std::vector< double > &motorSpeed)
Set vehicle state.


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