flightgogglesDynamicsSim.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020-2023 RaccoonLab.
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, version 3.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * Author: Dmitry Ponomarev <ponomarevda96@gmail.com>
17  */
18 
19 
21 #include <iostream>
22 #include <ros/ros.h>
23 #include <geometry_msgs/TransformStamped.h>
24 
25 
26 
27 static const std::string MULTICOPTER_PARAMS_NS = "/uav/multicopter_params/";
28 template <class T>
29 static void getParameter(const std::string& name, T& parameter, T default_value, std::string unit = ""){
30  if (!ros::param::get(MULTICOPTER_PARAMS_NS + name, parameter)){
31  std::cout << "Did not get "
32  << name
33  << " from the params, defaulting to "
34  << default_value
35  << " "
36  << unit
37  << std::endl;
38  parameter = default_value;
39  }
40 }
41 
43  // Vehicle parameters
44  double vehicleMass;
45  double motorTimeconstant;
46  double motorRotationalInertia;
47  double thrustCoeff;
48  double torqueCoeff;
49  double dragCoeff;
50  getParameter("vehicle_mass", vehicleMass, 1., "kg");
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)");
56 
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");
61 
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");
66 
67  double minPropSpeed = 0.0;
68  double maxPropSpeed;
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");
74 
75 
76  // Set gravity vector according to ROS reference axis system, see header file
77  Eigen::Vector3d gravity(0., 0., -9.81);
78 
79 
80  // Create quadcopter simulator
81  multicopterSim_ = std::make_unique<MulticopterDynamicsSim>(4, thrustCoeff, torqueCoeff,
82  minPropSpeed, maxPropSpeed, motorTimeconstant, motorRotationalInertia,
83  vehicleMass, vehicleInertia,
84  aeroMomentCoefficient, dragCoeff, momentProcessNoiseAutoCorrelation,
85  forceProcessNoiseAutoCorrelation, gravity);
86 
87  double initPropSpeed = sqrt(vehicleMass/4.*9.81/thrustCoeff);
88  multicopterSim_->setMotorSpeed(initPropSpeed);
89 
90 
91  // Get and set IMU parameters
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");
104  multicopterSim_->imu_.setBias(accBiasInitVar, gyroBiasInitVar,
105  accBiasProcessNoiseAutoCorrelation, gyroBiasProcessNoiseAutoCorrelation);
106  multicopterSim_->imu_.setNoiseVariance(accMeasNoiseVariance, gyroMeasNoiseVariance);
107 
109 
110  return 0;
111 }
112 
114  Eigen::Isometry3d motorFrame = Eigen::Isometry3d::Identity();
115  double momentArm;
116  getParameter("moment_arm", momentArm, 0.08, "m");
117 
118  motorFrame.translation() = Eigen::Vector3d(momentArm, momentArm, 0.);
119  multicopterSim_->setMotorFrame(motorFrame, 1, 0);
120 
121  motorFrame.translation() = Eigen::Vector3d(-momentArm, momentArm, 0.);
122  multicopterSim_->setMotorFrame(motorFrame, -1, 1);
123 
124  motorFrame.translation() = Eigen::Vector3d(-momentArm, -momentArm, 0.);
125  multicopterSim_->setMotorFrame(motorFrame, 1, 2);
126 
127  motorFrame.translation() = Eigen::Vector3d(momentArm, -momentArm, 0.);
128  multicopterSim_->setMotorFrame(motorFrame, -1, 3);
129 }
130 
131 void FlightgogglesDynamics::setInitialPosition(const Eigen::Vector3d & position,
132  const Eigen::Quaterniond& attitude){
133  multicopterSim_->setVehiclePosition(position, attitude);
134 }
135 
136 void FlightgogglesDynamics::process(double dt_secs,
137  const std::vector<double> & motorSpeedCommandIn,
138  bool isCmdPercent){
139  auto actuators = mapCmdActuator(motorSpeedCommandIn);
140  multicopterSim_->proceedState_ExplicitEuler(dt_secs, actuators, isCmdPercent);
141 }
142 
144  return multicopterSim_->getVehiclePosition();
145 }
146 Eigen::Quaterniond FlightgogglesDynamics::getVehicleAttitude() const{
147  return multicopterSim_->getVehicleAttitude();
148 }
149 Eigen::Vector3d FlightgogglesDynamics::getVehicleVelocity(void) const{
150  return multicopterSim_->getVehicleVelocity();
151 }
153  return multicopterSim_->getVehicleAngularVelocity();
154 }
155 void FlightgogglesDynamics::getIMUMeasurement(Eigen::Vector3d & accOutput,
156  Eigen::Vector3d & gyroOutput){
157  return multicopterSim_->getIMUMeasurement(accOutput, gyroOutput);
158 }
159 
160 std::vector<double> FlightgogglesDynamics::mapCmdActuator(std::vector<double> initialCmd) const{
161  std::vector<double> mappedCmd;
162  mappedCmd.push_back(initialCmd[2]); // PX4: motor 3, front left
163  mappedCmd.push_back(initialCmd[1]); // PX4: motor 2, tail left
164  mappedCmd.push_back(initialCmd[3]); // PX4: motor 4, tail right
165  mappedCmd.push_back(initialCmd[0]); // PX4: motor 1, front right
166  return mappedCmd;
167 }
void getIMUMeasurement(Eigen::Vector3d &accOutput, Eigen::Vector3d &gyroOutput) override
static void getParameter(const std::string &name, T &parameter, T default_value, std::string unit="")
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


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