multirotor.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 
20 #include "octocopter.hpp"
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/aerodynamics_coeffs/";
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  double momentArm;
80  getParameter("moment_arm", momentArm, 0.08, "m");
81 
82  // Create quadcopter simulator
83  multicopterSim_ = std::make_unique<MulticopterDynamicsSim>(number_of_motors, thrustCoeff, torqueCoeff,
84  minPropSpeed, maxPropSpeed, motorTimeconstant, motorRotationalInertia,
85  vehicleMass, vehicleInertia,
86  aeroMomentCoefficient, dragCoeff, momentProcessNoiseAutoCorrelation,
87  forceProcessNoiseAutoCorrelation, gravity);
88 
89  double initPropSpeed = sqrt(vehicleMass/4.*9.81/thrustCoeff);
90  multicopterSim_->setMotorSpeed(initPropSpeed);
91 
92 
93  // Get and set IMU parameters
94  double accBiasProcessNoiseAutoCorrelation;
95  double gyroBiasProcessNoiseAutoCorrelation;
96  double accBiasInitVar;
97  double gyroBiasInitVar;
98  double accMeasNoiseVariance;
99  double gyroMeasNoiseVariance;
100  getParameter("accelerometer_biasprocess", accBiasProcessNoiseAutoCorrelation, 1.0e-7, "m^2/s^5");
101  getParameter("gyroscope_biasprocess", accBiasProcessNoiseAutoCorrelation, 1.0e-7, "rad^2/s^3");
102  getParameter("accelerometer_biasinitvar", accBiasInitVar, 0.005, "(m/s^2)^2");
103  getParameter("gyroscope_biasinitvar", gyroBiasInitVar, 0.003, "(rad/s)^2");
104  getParameter("accelerometer_variance", accMeasNoiseVariance, 0.005, "m^2/s^4");
105  getParameter("gyroscope_variance", gyroMeasNoiseVariance, 0.003, "rad^2/s^2");
106  multicopterSim_->imu_.setBias(accBiasInitVar, gyroBiasInitVar,
107  accBiasProcessNoiseAutoCorrelation, gyroBiasProcessNoiseAutoCorrelation);
108  multicopterSim_->imu_.setNoiseVariance(accMeasNoiseVariance, gyroMeasNoiseVariance);
109 
110  initStaticMotorTransform(momentArm);
111 
112  return 0;
113 }
114 
115 void MultirotorDynamics::setInitialPosition(const Eigen::Vector3d & position,
116  const Eigen::Quaterniond& attitude){
117  multicopterSim_->setVehiclePosition(position, attitude);
118 }
119 
120 void MultirotorDynamics::process(double dt_secs, const std::vector<double>& setpoint){
121  auto actuators = mapCmdActuator(setpoint);
122  multicopterSim_->proceedState_ExplicitEuler(dt_secs, actuators, true);
123 }
124 
126  return multicopterSim_->getVehiclePosition();
127 }
128 Eigen::Quaterniond MultirotorDynamics::getVehicleAttitude() const{
129  return multicopterSim_->getVehicleAttitude();
130 }
131 Eigen::Vector3d MultirotorDynamics::getVehicleVelocity(void) const{
132  return multicopterSim_->getVehicleVelocity();
133 }
135  return multicopterSim_->getVehicleVelocity();
136 }
138  return multicopterSim_->getVehicleAngularVelocity();
139 }
140 void MultirotorDynamics::getIMUMeasurement(Eigen::Vector3d & accOutput,
141  Eigen::Vector3d & gyroOutput){
142  return multicopterSim_->getIMUMeasurement(accOutput, gyroOutput);
143 }
144 
145 bool MultirotorDynamics::getMotorsRpm(std::vector<double>& motorsRpm) {
146  const auto motorsSpeed = multicopterSim_->getMotorsSpeed();
147  for (auto motorSpeed : motorsSpeed) {
148  motorsRpm.push_back(motorSpeed * 9.54929658551); // rad/sec to RPM
149  }
150 
151  return true;
152 }
MultirotorDynamics::number_of_motors
uint8_t number_of_motors
Definition: multirotor.hpp:56
MultirotorDynamics::getVehicleAttitude
Eigen::Quaterniond getVehicleAttitude() const override
Definition: multirotor.cpp:128
ros::param::get
ROSCPP_DECL bool get(const std::string &key, bool &b)
MultirotorDynamics::getIMUMeasurement
void getIMUMeasurement(Eigen::Vector3d &accOutput, Eigen::Vector3d &gyroOutput) override
Definition: multirotor.cpp:140
ros.h
MultirotorDynamics::process
void process(double dt_secs, const std::vector< double > &setpoint) override
Definition: multirotor.cpp:120
MultirotorDynamics::getVehicleVelocity
Eigen::Vector3d getVehicleVelocity(void) const override
Definition: multirotor.cpp:131
MultirotorDynamics::getVehiclePosition
Eigen::Vector3d getVehiclePosition() const override
Definition: multirotor.cpp:125
MultirotorDynamics::getVehicleAirspeed
Eigen::Vector3d getVehicleAirspeed() const override
Definition: multirotor.cpp:134
MultirotorDynamics::mapCmdActuator
virtual std::vector< double > mapCmdActuator(std::vector< double > cmd) const =0
Convert actuator indexes from PX4 notation to internal Flightgoggles notation.
MultirotorDynamics::getMotorsRpm
bool getMotorsRpm(std::vector< double > &motorsRpm) override
Definition: multirotor.cpp:145
octocopter.hpp
MultirotorDynamics::getVehicleAngularVelocity
Eigen::Vector3d getVehicleAngularVelocity(void) const override
Definition: multirotor.cpp:137
MultirotorDynamics::multicopterSim_
std::unique_ptr< MulticopterDynamicsSim > multicopterSim_
Definition: multirotor.hpp:55
default_value
def default_value(type_)
getParameter
static void getParameter(const std::string &name, T &parameter, T default_value, std::string unit="")
Definition: multirotor.cpp:29
MultirotorDynamics::init
int8_t init() override
Use rosparam here to initialize sim.
Definition: multirotor.cpp:42
MULTICOPTER_PARAMS_NS
static const std::string MULTICOPTER_PARAMS_NS
Definition: multirotor.cpp:27
MultirotorDynamics::setInitialPosition
void setInitialPosition(const Eigen::Vector3d &position, const Eigen::Quaterniond &attitude) override
Definition: multirotor.cpp:115
MultirotorDynamics::initStaticMotorTransform
virtual void initStaticMotorTransform(double momentArm)=0
Set motor frames.


inno_vtol_dynamics
Author(s): Roman Fedorenko, Dmitry Ponomarev, Ezra Tal, Winter Guerra
autogenerated on Mon Dec 9 2024 03:13:35