23 #include <geometry_msgs/TransformStamped.h> 29 static void getParameter(
const std::string& name, T& parameter, T default_value, std::string unit =
""){
31 std::cout <<
"Did not get " 33 <<
" from the params, defaulting to " 38 parameter = default_value;
45 double motorTimeconstant;
46 double motorRotationalInertia;
51 getParameter(
"motor_time_constant", motorTimeconstant, 0.02,
"sec");
52 getParameter(
"motor_rotational_inertia", motorRotationalInertia, 6.62e-6,
"kg m^2");
53 getParameter(
"thrust_coefficient", thrustCoeff, 1.91e-6,
"N/(rad/s)^2");
54 getParameter(
"torque_coefficient", torqueCoeff, 2.6e-7,
"Nm/(rad/s)^2");
55 getParameter(
"drag_coefficient", dragCoeff, 0.1,
"N/(m/s)");
57 Eigen::Matrix3d aeroMomentCoefficient = Eigen::Matrix3d::Zero();
58 getParameter(
"aeromoment_coefficient_xx", aeroMomentCoefficient(0, 0), 0.003,
"Nm/(rad/s)^2");
59 getParameter(
"aeromoment_coefficient_yy", aeroMomentCoefficient(1, 1), 0.003,
"Nm/(rad/s)^2");
60 getParameter(
"aeromoment_coefficient_zz", aeroMomentCoefficient(2, 2), 0.003,
"Nm/(rad/s)^2");
62 Eigen::Matrix3d vehicleInertia = Eigen::Matrix3d::Zero();
63 getParameter(
"vehicle_inertia_xx", vehicleInertia(0, 0), 0.0049,
"kg m^2");
64 getParameter(
"vehicle_inertia_yy", vehicleInertia(1, 1), 0.0049,
"kg m^2");
65 getParameter(
"vehicle_inertia_zz", vehicleInertia(2, 2), 0.0069,
"kg m^2");
67 double minPropSpeed = 0.0;
69 double momentProcessNoiseAutoCorrelation;
70 double forceProcessNoiseAutoCorrelation;
71 getParameter(
"max_prop_speed", maxPropSpeed, 2200.0,
"rad/s");
72 getParameter(
"moment_process_noise", momentProcessNoiseAutoCorrelation, 1.25e-7,
"(Nm)^2 s");
73 getParameter(
"force_process_noise", forceProcessNoiseAutoCorrelation, 0.0005,
"N^2 s");
77 Eigen::Vector3d gravity(0., 0., -9.81);
81 multicopterSim_ = std::make_unique<MulticopterDynamicsSim>(4, thrustCoeff, torqueCoeff,
82 minPropSpeed, maxPropSpeed, motorTimeconstant, motorRotationalInertia,
83 vehicleMass, vehicleInertia,
84 aeroMomentCoefficient, dragCoeff, momentProcessNoiseAutoCorrelation,
85 forceProcessNoiseAutoCorrelation, gravity);
87 double initPropSpeed = sqrt(vehicleMass/4.*9.81/thrustCoeff);
92 double accBiasProcessNoiseAutoCorrelation;
93 double gyroBiasProcessNoiseAutoCorrelation;
94 double accBiasInitVar;
95 double gyroBiasInitVar;
96 double accMeasNoiseVariance;
97 double gyroMeasNoiseVariance;
98 getParameter(
"accelerometer_biasprocess", accBiasProcessNoiseAutoCorrelation, 1.0e-7,
"m^2/s^5");
99 getParameter(
"gyroscope_biasprocess", accBiasProcessNoiseAutoCorrelation, 1.0e-7,
"rad^2/s^3");
100 getParameter(
"accelerometer_biasinitvar", accBiasInitVar, 0.005,
"(m/s^2)^2");
101 getParameter(
"gyroscope_biasinitvar", gyroBiasInitVar, 0.003,
"(rad/s)^2");
102 getParameter(
"accelerometer_variance", accMeasNoiseVariance, 0.005,
"m^2/s^4");
103 getParameter(
"gyroscope_variance", gyroMeasNoiseVariance, 0.003,
"rad^2/s^2");
105 accBiasProcessNoiseAutoCorrelation, gyroBiasProcessNoiseAutoCorrelation);
106 multicopterSim_->imu_.setNoiseVariance(accMeasNoiseVariance, gyroMeasNoiseVariance);
114 Eigen::Isometry3d motorFrame = Eigen::Isometry3d::Identity();
118 motorFrame.translation() = Eigen::Vector3d(momentArm, momentArm, 0.);
121 motorFrame.translation() = Eigen::Vector3d(-momentArm, momentArm, 0.);
124 motorFrame.translation() = Eigen::Vector3d(-momentArm, -momentArm, 0.);
127 motorFrame.translation() = Eigen::Vector3d(momentArm, -momentArm, 0.);
132 const Eigen::Quaterniond& attitude){
137 const std::vector<double> & motorSpeedCommandIn,
140 multicopterSim_->proceedState_ExplicitEuler(dt_secs, actuators, isCmdPercent);
156 Eigen::Vector3d & gyroOutput){
161 std::vector<double> mappedCmd;
162 mappedCmd.push_back(initialCmd[2]);
163 mappedCmd.push_back(initialCmd[1]);
164 mappedCmd.push_back(initialCmd[3]);
165 mappedCmd.push_back(initialCmd[0]);
void getIMUMeasurement(Eigen::Vector3d &accOutput, Eigen::Vector3d &gyroOutput) override
static void getParameter(const std::string &name, T ¶meter, T default_value, std::string unit="")
void initStaticMotorTransform()
std::vector< double > mapCmdActuator(std::vector< double > cmd) const
Convert actuator indexes from PX4 notation to internal Flightgoggles notation.
std::unique_ptr< MulticopterDynamicsSim > multicopterSim_
ROSCPP_DECL bool get(const std::string &key, std::string &s)
static const std::string MULTICOPTER_PARAMS_NS
void process(double dt_secs, const std::vector< double > &motorSpeedCommandIn, bool isCmdPercent) override
Eigen::Vector3d getVehicleVelocity(void) const override
Eigen::Vector3d getVehicleAngularVelocity(void) const override
void setInitialPosition(const Eigen::Vector3d &position, const Eigen::Quaterniond &attitude) override
int8_t init() override
Use rosparam here to initialize sim.
Eigen::Vector3d getVehiclePosition() const override
Eigen::Quaterniond getVehicleAttitude() const override