8 #ifndef MULTICOPTERDYNAMICSSIM_H 9 #define MULTICOPTERDYNAMICSSIM_H 11 #include <Eigen/Dense> 12 #include <Eigen/Geometry> 15 #include <geographiclib_conversions/geodetic_conv.hpp> 24 double minMotorSpeed,
double maxMotorSpeed,
25 double motorTimeConstant,
double motorRotationalInertia,
27 const Eigen::Matrix3d & vehicleInertia,
28 const Eigen::Matrix3d & aeroMomentCoefficient,
29 double dragCoefficient,
30 double momentProcessNoiseAutoCorrelation,
31 double forceProcessNoiseAutoCorrelation,
32 const Eigen::Vector3d & gravity);
35 const Eigen::Matrix3d & aeroMomentCoefficient,
36 double dragCoefficient,
37 double momentProcessNoiseAutoCorrelation,
38 double forceProcessNoiseAutoCorrelation);
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);
48 void setVehiclePosition(
const Eigen::Vector3d & position,
const Eigen::Quaterniond & attitude);
51 const Eigen::Vector3d & velocity,
52 const Eigen::Vector3d & angularVelocity,
53 const Eigen::Quaterniond & attitude,
54 const std::vector<double> & motorSpeed);
56 Eigen::Vector3d & velocity,
57 Eigen::Vector3d & angularVelocity,
58 Eigen::Quaterniond & attitude,
59 std::vector<double> & motorSpeed);
66 void proceedState_RK4(
double dt_secs,
const std::vector<double> & motorSpeedCommand,
bool isCmdPercent =
false);
68 void getIMUMeasurement(Eigen::Vector3d & accOutput, Eigen::Vector3d & gyroOutput);
129 Eigen::Quaterniond
attitude_ = Eigen::Quaterniond::Identity();
139 Eigen::Vector3d
getThrust(
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);
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);
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);
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.
Eigen::Vector3d velocity_
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.
Eigen::Vector3d position_
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.
Eigen::Quaterniond attitude_
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_
Eigen::Vector3d stochForce_
inertialMeasurementSim imu_
Eigen::Matrix3d vehicleInertia_
Eigen::Vector3d angularVelocity_
double forceProcessNoiseAutoCorrelation_
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.
double momentProcessNoiseAutoCorrelation_
Eigen::Matrix3d aeroMomentCoefficient_
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.