30 double thrustCoefficient,
double torqueCoefficient,
31 double minMotorSpeed,
double maxMotorSpeed,
32 double motorTimeConstant,
double motorRotationalInertia,
34 const Eigen::Matrix3d & vehicleInertia,
35 const Eigen::Matrix3d & aeroMomentCoefficient,
36 double dragCoefficient,
37 double momentProcessNoiseAutoCorrelation,
38 double forceProcessNoiseAutoCorrelation,
39 const Eigen::Vector3d & gravity
41 : numCopter_(numCopter)
42 , motorFrame_(numCopter)
43 , motorDirection_(numCopter)
44 , motorRotationalInertia_(numCopter)
45 , thrustCoefficient_(numCopter)
46 , torqueCoefficient_(numCopter)
47 , motorSpeed_(numCopter)
48 , motorTimeConstant_(numCopter)
49 , maxMotorSpeed_(numCopter)
50 , minMotorSpeed_(numCopter)
54 for (
int indx = 0; indx < numCopter; indx++){
96 for (
int indx = 0; indx < numCopter; indx++){
123 const Eigen::Matrix3d & vehicleInertia,
124 const Eigen::Matrix3d & aeroMomentCoefficient,
125 double dragCoefficient,
126 double momentProcessNoiseAutoCorrelation,
127 double forceProcessNoiseAutoCorrelation){
172 double minMotorSpeed,
double maxMotorSpeed,
double rotationalInertia,
int motorIndex){
192 double minMotorSpeed,
double maxMotorSpeed,
double rotationalInertia){
193 for (
int motorIndex = 0; motorIndex <
numCopter_; motorIndex++){
195 minMotorSpeed, maxMotorSpeed, rotationalInertia, motorIndex);
216 for (
int motorIndex = 0; motorIndex <
numCopter_; motorIndex++){
226 for (
int indx = 0; indx <
numCopter_; indx++){
238 const Eigen::Quaterniond & attitude){
262 const Eigen::Vector3d & velocity,
263 const Eigen::Vector3d & angularVelocity,
264 const Eigen::Quaterniond & attitude,
265 const std::vector<double> & motorSpeed){
270 for (
int indx = 0; indx <
numCopter_; indx++){
285 Eigen::Vector3d & velocity,
286 Eigen::Vector3d & angularVelocity,
287 Eigen::Quaterniond & attitude,
288 std::vector<double> & motorSpeed){
342 return specificForce;
363 Eigen::Vector3d thrust = Eigen::Vector3d::Zero();
364 for (
int indx = 0; indx <
numCopter_; indx++){
366 Eigen::Vector3d motorThrust(0.,0.,fabs(motorSpeed.at(indx))*motorSpeed.at(indx)*
thrustCoefficient_.at(indx));
367 thrust +=
motorFrame_.at(indx).linear()*motorThrust;
380 Eigen::Vector3d controlMoment = Eigen::Vector3d::Zero();
382 for (
int indx = 0; indx <
numCopter_; indx++){
384 Eigen::Vector3d motorThrust(0.,0.,fabs(motorSpeed.at(indx))*motorSpeed.at(indx)*
thrustCoefficient_.at(indx));
390 controlMoment +=
motorFrame_.at(indx).linear()*motorTorque;
393 return controlMoment;
424 Eigen::Vector3d zero_force;
425 zero_force.setZero();
440 std::vector<double> motorSpeedCommand = motorSpeedCommandIn;
443 for (
size_t i = 0; i < motorSpeedCommand.size(); i++)
449 std::vector<double> motorSpeedCommandBounded(
numCopter_);
459 Eigen::Vector3d stochMoment;
464 std::vector<double> motorSpeedDer(
numCopter_);
466 Eigen::Vector3d positionDer = velocity;
473 position_ = position + positionDer*dt_secs;
474 velocity_ = velocity + velocityDer*dt_secs;
476 attitude_.coeffs() = attitude.coeffs() + attitudeDer*dt_secs;
501 std::vector<double> motorSpeedCommand = motorSpeedCommandIn;
505 for (
size_t i = 0; i < motorSpeedCommand.size(); i++)
510 std::vector<double> motorSpeedCommandBounded(
numCopter_);
521 Eigen::Vector3d stochMoment;
527 std::vector<double> motorSpeedDer(
numCopter_);
529 Eigen::Vector3d positionDer = dt_secs*
velocity_;
537 position += (1./6.)*positionDer;
538 velocity += (1./6.)*velocityDer;
539 attitude.coeffs() += (1./6.)*attitudeDer;
540 attitude.normalize();
541 angularVelocity += (1./6.)*angularVelocityDer;
544 std::vector<double> motorSpeedIntermediate(
numCopter_);
545 Eigen::Quaterniond attitudeIntermediate;
549 attitudeIntermediate.coeffs() =
attitude_.coeffs() + attitudeDer*0.5;
550 attitudeIntermediate.normalize();
553 positionDer = dt_secs*(velocity_ + 0.5*velocityDer);
561 position += (1./3.)*positionDer;
562 velocity += (1./3.)*velocityDer;
563 attitude.coeffs() += (1./3.)*attitudeDer;
564 attitude.normalize();
565 angularVelocity += (1./3.)*angularVelocityDer;
570 attitudeIntermediate.coeffs() =
attitude_.coeffs() + attitudeDer*0.5;
571 attitudeIntermediate.normalize();
574 positionDer = dt_secs*(velocity_ + 0.5*velocityDer);
582 position += (1./3.)*positionDer;
583 velocity += (1./3.)*velocityDer;
584 attitude.coeffs() += (1./3.)*attitudeDer;
585 attitude.normalize();
586 angularVelocity += (1./3.)*angularVelocityDer;
591 attitudeIntermediate.coeffs() =
attitude_.coeffs() + attitudeDer;
592 attitudeIntermediate.normalize();
595 positionDer = dt_secs*(velocity_ + velocityDer);
604 position_ = position + positionDer*(1./6.);
605 velocity_ = velocity + velocityDer*(1./6.);
606 attitude_.coeffs() = attitude.coeffs() + attitudeDer*(1./6.);
626 std::vector<double> & vec3,
double val){
627 std::transform(vec1.begin(), vec1.end(), vec2.begin(), vec3.begin(), [val](
const double & vec1val,
const double & vec2val)->
double{
return (vec1val + val*vec2val);});
639 const std::vector<double> & minvec,
const std::vector<double> & maxvec){
640 std::transform(vec1.begin(), vec1.end(), maxvec.begin(), vec2.begin(), [](
const double & vec1val,
const double & maxvalue)->
double{
return fmin(vec1val,maxvalue);});
641 std::transform(vec2.begin(), vec2.end(), minvec.begin(), vec2.begin(), [](
const double & vec2val,
const double & minvalue)->
double{
return fmax(vec2val,minvalue);});
652 std::transform(vec1.begin(), vec1.end(), vec2.begin(), [val](
const double & vec1val){
return vec1val*val;});
663 const std::vector<double> & motorSpeed,
664 const std::vector<double> & motorSpeedCommand){
665 for (
int indx = 0; indx <
numCopter_; indx++){
666 motorSpeedDer.at(indx) = (motorSpeedCommand.at(indx) - motorSpeed.at(indx))/
motorTimeConstant_.at(indx);
680 const Eigen::Vector3d & velocity,
const std::vector<double> & motorSpeed){
692 Eigen::Quaterniond angularVelocityQuad;
693 angularVelocityQuad.w() = 0;
694 angularVelocityQuad.vec() = angularVelocity;
696 return (0.5*(attitude*angularVelocityQuad).coeffs());
709 const std::vector<double>& motorAcceleration,
const Eigen::Vector3d & angularVelocity,
const Eigen::Vector3d & stochMoment){
713 for (
int indx = 0; indx <
numCopter_; indx++){
714 Eigen::Vector3d motorAngularMomentum = Eigen::Vector3d::Zero();
718 angularMomentum +=
motorFrame_.at(indx).linear()*motorAngularMomentum;
722 - angularVelocity.cross(angularMomentum)));
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_
void proceedBiasDynamics(double dt_secs)
Proceed accelerometer and gyroscope bias dynamics.
Eigen::Quaterniond getVehicleAttitude(void)
Get vehicle attitude.
std::vector< double > thrustCoefficient_
std::vector< double > motorSpeed_
Multicopter dynamics simulator class header file.
void setVehiclePosition(const Eigen::Vector3d &position, const Eigen::Quaterniond &attitude)
Set vehicle position and attitude.
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.
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_
double time_since_epoch()
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.
void getMeasurement(Eigen::Vector3d &accOutput, Eigen::Vector3d &gyroOutput, const Eigen::Vector3d specificForce, const Eigen::Vector3d angularVelocity)
Get IMU measurement.
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.