vtolDynamicsSim.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 #include <iostream>
20 #include <cmath>
21 #include <boost/algorithm/clamp.hpp>
22 #include <algorithm>
23 #include "vtolDynamicsSim.hpp"
24 #include <ros/package.h>
25 #include <array>
26 #include "cs_converter.hpp"
27 #include "common_math.hpp"
28 
29 static constexpr const size_t AILERONS_INDEX = 0;
30 static constexpr const size_t ELEVATORS_INDEX = 1;
31 static constexpr const size_t RUDDERS_INDEX = 2;
32 static constexpr const size_t SERVOS_AMOUNT = 3;
33 
34 static constexpr const size_t ACTUATORS_MIN_AMOUNT = 8;
35 static constexpr const size_t ACTUATORS_MAX_AMOUNT = 12;
36 
38  _state.angularVel.setZero();
39  _state.linearVelNed.setZero();
40  _state.airspeedFrd.setZero();
41  _environment.windNED.setZero();
43  _params.accelBias.setZero();
44  _params.gyroBias.setZero();
46 }
47 
49  if (!ros::param::get("/uav/sim_params/gravity", _environment.gravity)){
50  ROS_ERROR("gravity in not present.");
51  return -1;
52  }
53  if (!ros::param::get("/uav/sim_params/atmoRho", _environment.atmoRho)){
54  ROS_ERROR("atmoRho in not present.");
55  return -1;
56  }
57 
58  loadTables("/uav/aerodynamics_coeffs/");
59  loadParams("/uav/aerodynamics_coeffs/");
60  return 0;
61 }
62 
63 template<int ROWS, int COLS, int ORDER>
64 Eigen::MatrixXd getTableNew(const std::string& path, const char* name){
65  std::vector<double> data;
66 
67  if(ros::param::get(path + name, data) == false){
68  throw std::invalid_argument(std::string("Wrong parameter name: ") + name);
69  }
70 
71  return Eigen::Matrix<double, ROWS, COLS, ORDER>(data.data());
72 }
73 
74 
75 void VtolDynamics::loadTables(const std::string& path){
76  _tables.CS_rudder = getTableNew<8, 20, Eigen::RowMajor>(path, "CS_rudder_table");
77  _tables.CS_beta = getTableNew<8, 90, Eigen::RowMajor>(path, "CS_beta");
78  _tables.AoA = getTableNew<1, 47, Eigen::RowMajor>(path, "AoA");
79  _tables.AoS = getTableNew<90, 1, Eigen::ColMajor>(path, "AoS");
80  _tables.actuator = getTableNew<20, 1, Eigen::ColMajor>(path, "actuator_table");
81  _tables.airspeed = getTableNew<8, 1, Eigen::ColMajor>(path, "airspeed_table");
82  _tables.CLPolynomial = getTableNew<8, 8, Eigen::RowMajor>(path, "CLPolynomial");
83  _tables.CSPolynomial = getTableNew<8, 8, Eigen::RowMajor>(path, "CSPolynomial");
84  _tables.CDPolynomial = getTableNew<8, 6, Eigen::RowMajor>(path, "CDPolynomial");
85  _tables.CmxPolynomial = getTableNew<8, 8, Eigen::RowMajor>(path, "CmxPolynomial");
86  _tables.CmyPolynomial = getTableNew<8, 8, Eigen::RowMajor>(path, "CmyPolynomial");
87  _tables.CmzPolynomial = getTableNew<8, 8, Eigen::RowMajor>(path, "CmzPolynomial");
88  _tables.CmxAileron = getTableNew<8, 20, Eigen::RowMajor>(path, "CmxAileron");
89  _tables.CmyElevator = getTableNew<8, 20, Eigen::RowMajor>(path, "CmyElevator");
90  _tables.CmzRudder = getTableNew<8, 20, Eigen::RowMajor>(path, "CmzRudder");
91  _tables.prop = getTableNew<40, 5, Eigen::RowMajor>(path, "prop");
92 }
93 
94 void VtolDynamics::loadParams(const std::string& path){
95  if(!ros::param::get(path + "mass", _params.mass) ||
96  !ros::param::get(path + "wingArea", _params.wingArea) ||
97  !ros::param::get(path + "characteristicLength", _params.characteristicLength) ||
98 
99  !ros::param::get(path + "motorMaxSpeed", _params.motorMaxSpeed) ||
100  !ros::param::get(path + "servoRange", _params.servoRange) ||
101 
102  !ros::param::get(path + "accVariance", _params.accVariance) ||
103  !ros::param::get(path + "gyroVariance", _params.gyroVariance)) {
104  // error
105  }
106 
107  loadMotorsGeometry(path);
108 
109  _params.inertia = getTableNew<3, 3, Eigen::RowMajor>(path, "inertia");
110 }
111 
112 void VtolDynamics::loadMotorsGeometry(const std::string& path) {
113  std::vector<double> motorPositionX;
114  std::vector<double> motorPositionY;
115  std::vector<double> motorPositionZ;
116  std::vector<bool> motorDirectionCCW;
117  std::vector<double> motorAxisX;
118  std::vector<double> motorAxisZ;
119  ros::param::get(path + "motorPositionX", motorPositionX);
120  ros::param::get(path + "motorPositionY", motorPositionY);
121  ros::param::get(path + "motorPositionZ", motorPositionZ);
122  ros::param::get(path + "motorDirectionCCW", motorDirectionCCW);
123  ros::param::get(path + "motorAxisX", motorAxisX);
124  ros::param::get(path + "motorAxisZ", motorAxisZ);
125  ros::param::get(path + "actuatorTimeConstants", _tables.actuatorTimeConstants);
126 
127  size_t motors_amount = motorPositionX.size();
128  assert(motors_amount >= MOTORS_MIN_AMOUNT && motors_amount <= MOTORS_MAX_AMOUNT);
129  _motorsSpeed.resize(motors_amount, 0.0);
130  _state.prevActuators.resize(motors_amount);
131  _state.crntActuators.resize(motors_amount);
132 
133 
134  assert(motorPositionX.size() == motors_amount);
135  assert(motorPositionY.size() == motors_amount);
136  assert(motorPositionZ.size() == motors_amount);
137  assert(motorDirectionCCW.size() == motors_amount);
138  assert(motorAxisX.size() == motors_amount);
139  assert(motorAxisZ.size() == motors_amount);
140  assert(_tables.actuatorTimeConstants.size() == motors_amount + SERVOS_AMOUNT);
141 
142  for (size_t motor_idx = 0; motor_idx < motors_amount; motor_idx++) {
143  Geometry geometry;
144  geometry.position << motorPositionX[motor_idx], motorPositionY[motor_idx], motorPositionZ[motor_idx];
145  geometry.axis << motorAxisX[motor_idx], 0.0, motorAxisZ[motor_idx];
146  geometry.directionCCW = motorDirectionCCW[motor_idx];
147  _params.geometry.push_back(geometry);
148  }
149 }
150 
151 void VtolDynamics::setInitialPosition(const Eigen::Vector3d & position,
152  const Eigen::Quaterniond& attitudeXYZW){
153  _state.position = position;
154  _state.attitude = attitudeXYZW;
155  _state.initialPose = position;
156  _state.initialAttitude = attitudeXYZW;
157 }
158 void VtolDynamics::setInitialVelocity(const Eigen::Vector3d & linearVelocity,
159  const Eigen::Vector3d& angularVelocity){
160  _state.linearVelNed = linearVelocity;
161  _state.angularVel = angularVelocity;
162 }
163 
166  _state.linearVelNed.setZero();
167  _state.position[2] = 0.00;
168 
169  // Keep previous yaw, but set roll and pitch to 0.0
170  _state.attitude.coeffs()[0] = 0;
171  _state.attitude.coeffs()[1] = 0;
172  _state.attitude.normalize();
173 
174  _state.angularVel.setZero();
175 
176  std::fill(std::begin(_state.motorsRpm), std::end(_state.motorsRpm), 0.0);
177 }
178 
180  constexpr double MAG_ROTATION_SPEED = 2 * 3.1415 / 10;
181  static SimMode_t prevCalibrationType = SimMode_t::NORMAL;
182  _state.linearVelNed.setZero();
183  _state.position[2] = 0.00;
184 
185  switch(calType) {
186  case SimMode_t::NORMAL:
187  _state.attitude = Eigen::Quaterniond(1, 0, 0, 0);
188  _state.angularVel.setZero();
189  break;
191  if(prevCalibrationType != calType){
192  _state.attitude = Eigen::Quaterniond(1, 0, 0, 0);
193  }
194  _state.angularVel << 0.000, 0.000, -MAG_ROTATION_SPEED;
195  break;
197  if(prevCalibrationType != calType){
198  _state.attitude = Eigen::Quaterniond(0, 1, 0, 0);
199  }
200  _state.angularVel << 0.000, 0.000, MAG_ROTATION_SPEED;
201  break;
203  if(prevCalibrationType != calType){
204  _state.attitude = Eigen::Quaterniond(0.707, 0, -0.707, 0);
205  }
206  _state.angularVel << -MAG_ROTATION_SPEED, 0.000, 0.000;
207  break;
209  if(prevCalibrationType != calType){
210  _state.attitude = Eigen::Quaterniond(0.707, 0, 0.707, 0);
211  }
212  _state.angularVel << MAG_ROTATION_SPEED, 0.000, 0.000;
213  break;
215  if(prevCalibrationType != calType){
216  _state.attitude = Eigen::Quaterniond(0.707, -0.707, 0, 0);
217  }
218  _state.angularVel << 0.000, MAG_ROTATION_SPEED, 0.000;
219  break;
221  if(prevCalibrationType != calType){
222  _state.attitude = Eigen::Quaterniond(0.707, 0.707, 0, 0);
223  }
224  _state.angularVel << 0.000, -MAG_ROTATION_SPEED, 0.000;
225  break;
227  _state.angularVel << MAG_ROTATION_SPEED, MAG_ROTATION_SPEED, MAG_ROTATION_SPEED;
228  break;
230  _state.angularVel << -MAG_ROTATION_SPEED, MAG_ROTATION_SPEED, MAG_ROTATION_SPEED;
231  break;
233  _state.angularVel << MAG_ROTATION_SPEED, -MAG_ROTATION_SPEED, MAG_ROTATION_SPEED;
234  break;
235 
237  if(prevCalibrationType != calType){
238  _state.attitude = Eigen::Quaterniond(1, 0, 0, 0);
239  }
240  _state.angularVel.setZero();
241  break;
243  if(prevCalibrationType != calType){
244  _state.attitude = Eigen::Quaterniond(0, 1, 0, 0);
245  }
246  _state.angularVel.setZero();
247  break;
249  if(prevCalibrationType != calType){
250  _state.attitude = Eigen::Quaterniond(0.707, 0, -0.707, 0);
251  }
252  _state.angularVel.setZero();
253  break;
255  if(prevCalibrationType != calType){
256  _state.attitude = Eigen::Quaterniond(0.707, 0, 0.707, 0);
257  }
258  _state.angularVel.setZero();
259  break;
261  if(prevCalibrationType != calType){
262  _state.attitude = Eigen::Quaterniond(0.707, -0.707, 0, 0);
263  }
264  _state.angularVel.setZero();
265  break;
267  if(prevCalibrationType != calType){
268  _state.attitude = Eigen::Quaterniond(0.707, 0.707, 0, 0);
269  }
270  _state.angularVel.setZero();
271  break;
272  case SimMode_t::AIRSPEED:
273  _state.attitude = Eigen::Quaterniond(1, 0, 0, 0);
274  _state.angularVel.setZero();
275  _state.linearVelNed[0] = 10.0;
276  _state.linearVelNed[1] = 10.0;
277  break;
278  default:
279  break;
280  }
281 
282  auto modeInteger = static_cast<int>(calType);
283  if(prevCalibrationType != calType){
284  ROS_WARN_STREAM_THROTTLE(1, "init cal " << modeInteger);
285  prevCalibrationType = calType;
286  }else{
287  ROS_WARN_STREAM_THROTTLE(1, "cal " << modeInteger);
288  }
289 
290  constexpr double DELTA_TIME = 0.001;
291 
293  Eigen::Quaterniond quaternion(0, _state.angularVel(0), _state.angularVel(1), _state.angularVel(2));
294  Eigen::Quaterniond attitudeDelta = _state.attitude * quaternion;
295  _state.attitude.coeffs() += attitudeDelta.coeffs() * 0.5 * DELTA_TIME;
296  _state.attitude.normalize();
297  return 1;
298 }
299 
300 void VtolDynamics::process(double dt_secs, const std::vector<double>& unitless_setpoint){
301  _mapUnitlessSetpointToInternal(unitless_setpoint);
302  updateActuators(dt_secs);
303 
304  Eigen::Vector3d windNed = calculateWind();
305  Eigen::Matrix3d rotationMatrix = calculateRotationMatrix();
306  _state.airspeedFrd = calculateAirSpeed(rotationMatrix, _state.linearVelNed, windNed);
312 }
313 
314 
327 void VtolDynamics::_mapUnitlessSetpointToInternal(const std::vector<double>& cmd) {
328  std::vector<double> input_cmd = cmd;
329  if (input_cmd.size() < _motorsSpeed.size()) {
330  input_cmd.resize(_motorsSpeed.size());
331  }
332 
333  for (size_t motor_idx = 0; motor_idx < _motorsSpeed.size(); motor_idx++) {
334  _motorsSpeed[motor_idx] = input_cmd[motor_idx];
335  _motorsSpeed[motor_idx] = boost::algorithm::clamp(_motorsSpeed[motor_idx], 0.0, +1.0);
336  _motorsSpeed[motor_idx] *= _params.motorMaxSpeed[motor_idx];
337  }
338 
339  for(size_t servo_idx = 0; servo_idx < SERVOS_AMOUNT; servo_idx++){
340  size_t idx = servo_idx + _motorsSpeed.size();
341  _servosValues[servo_idx] = input_cmd[idx];
342  _servosValues[servo_idx] = boost::algorithm::clamp(_servosValues[servo_idx], -1.0, +1.0);
343  _servosValues[servo_idx] *= _params.servoRange[servo_idx];
344  }
345  _servosValues[ELEVATORS_INDEX] *= -1; // elevator is inverted
346 }
347 
348 void VtolDynamics::updateActuators(double dtSecs){
349  assert(_motorsSpeed.size() == _state.prevActuators.size());
350  assert(_motorsSpeed.size() == _state.crntActuators.size());
351  assert(_motorsSpeed.size() + 3 == _tables.actuatorTimeConstants.size());
352 
353  for(size_t idx = 0; idx < _motorsSpeed.size(); idx++){
355  auto cmd_delta = _state.prevActuators[idx] - _motorsSpeed[idx];
356  assert(_tables.actuatorTimeConstants[idx] > 0.001);
357  _motorsSpeed[idx] += cmd_delta * (1 - pow(2.71, -dtSecs/_tables.actuatorTimeConstants[idx]));
358  _state.crntActuators[idx] = _motorsSpeed[idx];
359  }
360 
361  assert(_state.crntActuators.size() == _state.prevActuators.size());
362 }
363 
364 Eigen::Vector3d VtolDynamics::calculateWind(){
365  Eigen::Vector3d wind;
369 
374  Eigen::Vector3d gust;
375  gust.setZero();
376 
377  return wind + gust;
378 }
379 
381  return _state.attitude.toRotationMatrix().transpose();
382 }
383 
384 Eigen::Vector3d VtolDynamics::calculateAirSpeed(const Eigen::Matrix3d& rotationMatrix,
385  const Eigen::Vector3d& velocityNED,
386  const Eigen::Vector3d& windSpeedNED) const{
387  Eigen::Vector3d airspeedFrd = rotationMatrix * (velocityNED + windSpeedNED);
388  if(abs(airspeedFrd[0]) > 40 || abs(airspeedFrd[1]) > 40 || abs(airspeedFrd[2]) > 40){
389  airspeedFrd[0] = boost::algorithm::clamp(airspeedFrd[0], -40, +40);
390  airspeedFrd[1] = boost::algorithm::clamp(airspeedFrd[1], -40, +40);
391  airspeedFrd[2] = boost::algorithm::clamp(airspeedFrd[2], -40, +40);
392  std::cout << "Warning: airspeed is out of limit." << std::endl;
393  }
394 
395  return airspeedFrd;
396 }
397 
398 double VtolDynamics::calculateDynamicPressure(double airspeed_mod) const{
399  return _environment.atmoRho * airspeed_mod * airspeed_mod * _params.wingArea;
400 }
401 
407 double VtolDynamics::calculateAnglesOfAtack(const Eigen::Vector3d& airspeed_frd) const{
408  double A = sqrt(airspeed_frd[0] * airspeed_frd[0] + airspeed_frd[2] * airspeed_frd[2]);
409  if(A < 0.001){
410  return 0;
411  }
412  A = airspeed_frd[2] / A;
413  A = boost::algorithm::clamp(A, -1.0, +1.0);
414  A = (airspeed_frd[0] > 0) ? asin(A) : 3.1415 - asin(A);
415  return (A > 3.1415) ? A - 2 * 3.1415 : A;
416 }
417 
418 double VtolDynamics::calculateAnglesOfSideslip(const Eigen::Vector3d& airspeed_frd) const{
419  double B = airspeed_frd.norm();
420  if(B < 0.001){
421  return 0;
422  }
423  B = airspeed_frd[1] / B;
424  B = boost::algorithm::clamp(B, -1.0, +1.0);
425  return asin(B);
426 }
427 
434 void VtolDynamics::calculateAerodynamics(const Eigen::Vector3d& airspeed,
435  double AoA,
436  double AoS,
437  const std::array<double, 3>& servos,
438  Eigen::Vector3d& Faero,
439  Eigen::Vector3d& Maero){
440  // 0. Common computation
441  double AoA_deg = boost::algorithm::clamp(AoA * 180 / 3.1415, -45.0, +45.0);
442  double AoS_deg = boost::algorithm::clamp(AoS * 180 / 3.1415, -90.0, +90.0);
443  double airspeedMod = airspeed.norm();
444  double dynamicPressure = calculateDynamicPressure(airspeedMod);
445  double airspeedModClamped = boost::algorithm::clamp(airspeed.norm(), 5, 40);
446 
447  // 1. Calculate aero force
448  Eigen::VectorXd polynomialCoeffs(7);
449  Eigen::Vector3d FL;
450  Eigen::Vector3d FS;
451  Eigen::Vector3d FD;
452 
453  calculateCLPolynomial(airspeedModClamped, polynomialCoeffs);
454  double CL = Math::polyval(polynomialCoeffs, AoA_deg);
455  FL = (Eigen::Vector3d(0, 1, 0).cross(airspeed.normalized())) * CL;
456 
457  calculateCSPolynomial(airspeedModClamped, polynomialCoeffs);
458  double CS = Math::polyval(polynomialCoeffs, AoA_deg);
459  double CS_rudder = calculateCSRudder(servos[RUDDERS_INDEX], airspeedModClamped);
460  double CS_beta = calculateCSBeta(AoS_deg, airspeedModClamped);
461  FS = airspeed.cross(Eigen::Vector3d(0, 1, 0).cross(airspeed.normalized())) * (CS + CS_rudder + CS_beta);
462 
463  calculateCDPolynomial(airspeedModClamped, polynomialCoeffs);
464  double CD = Math::polyval(polynomialCoeffs.block<5, 1>(0, 0), AoA_deg);
465  FD = (-1 * airspeed).normalized() * CD;
466 
467  Faero = 0.5 * dynamicPressure * (FL + FS + FD);
468 
469  // 2. Calculate aero moment
470  calculateCmxPolynomial(airspeedModClamped, polynomialCoeffs);
471  auto Cmx = Math::polyval(polynomialCoeffs, AoA_deg);
472 
473  calculateCmyPolynomial(airspeedModClamped, polynomialCoeffs);
474  auto Cmy = Math::polyval(polynomialCoeffs, AoA_deg);
475 
476  calculateCmzPolynomial(airspeedModClamped, polynomialCoeffs);
477  auto Cmz = -Math::polyval(polynomialCoeffs, AoA_deg);
478 
479  double Cmx_aileron = calculateCmxAileron(servos[AILERONS_INDEX], airspeedModClamped);
486  double Cmy_elevator = calculateCmyElevator(abs(servos[ELEVATORS_INDEX]), airspeedModClamped);
487  double Cmz_rudder = calculateCmzRudder(servos[RUDDERS_INDEX], airspeedModClamped);
488 
489  auto Mx = Cmx + Cmx_aileron * servos[AILERONS_INDEX];
490  auto My = Cmy + Cmy_elevator * servos[ELEVATORS_INDEX];
491  auto Mz = Cmz + Cmz_rudder * servos[RUDDERS_INDEX];
492 
493  Maero = 0.5 * dynamicPressure * _params.characteristicLength * Eigen::Vector3d(Mx, My, Mz);
494 
495 
496  _state.forces.lift << 0.5 * dynamicPressure * _params.characteristicLength * FL;
497  _state.forces.drug << 0.5 * dynamicPressure * _params.characteristicLength * FD;
498  _state.forces.side << 0.5 * dynamicPressure * _params.characteristicLength * FS;
499  _state.moments.steer << Cmx_aileron * servos[AILERONS_INDEX],
500  Cmy_elevator * servos[ELEVATORS_INDEX],
501  Cmz_rudder * servos[RUDDERS_INDEX];
502  _state.moments.steer *= 0.5 * dynamicPressure * _params.characteristicLength;
503  _state.moments.airspeed << Cmx, Cmy, Cmz;
504  _state.moments.airspeed *= 0.5 * dynamicPressure * _params.characteristicLength;
505 }
506 
507 void VtolDynamics::thruster(double actuator,
508  double& thrust, double& torque, double& rpm) const{
509  constexpr size_t CONTROL_IDX = 0;
510  constexpr size_t THRUST_IDX = 1;
511  constexpr size_t TORQUE_IDX = 2;
512  constexpr size_t RPM_IDX = 4;
513 
514  size_t prev_idx = Math::findPrevRowIdxInMonotonicSequence(_tables.prop, actuator);
515  size_t next_idx = prev_idx + 1;
516  if(next_idx < _tables.prop.rows()){
517  auto prev_row = _tables.prop.row(prev_idx);
518  auto next_row = _tables.prop.row(next_idx);
519  auto t = (actuator - prev_row(CONTROL_IDX)) / (next_row(CONTROL_IDX) - prev_row(CONTROL_IDX));
520  thrust = Math::lerp(prev_row(THRUST_IDX), next_row(THRUST_IDX), t);
521  torque = Math::lerp(prev_row(TORQUE_IDX), next_row(TORQUE_IDX), t);
522  rpm = Math::lerp(prev_row(RPM_IDX), next_row(RPM_IDX), t);
523  }
524 }
525 
526 void VtolDynamics::calculateNewState(const Eigen::Vector3d& Maero,
527  const Eigen::Vector3d& Faero,
528  const std::vector<double>& motors,
529  double dt_sec){
530  assert(motors.size() >= MOTORS_MIN_AMOUNT && motors.size() <= _motorsSpeed.size());
531  for(size_t idx = 0; idx < motors.size(); idx++){
532  double thrust;
533  double torque;
534  thruster(motors[idx], thrust, torque, _state.motorsRpm[idx]);
535  _state.forces.motors[idx] = _params.geometry[idx].axis * thrust;
536 
537  // Cunterclockwise rotation means positive torque, clockwise - negative
538  double ccw = _params.geometry[idx].directionCCW ? 1.0 : -1.0;
539  Eigen::Vector3d motorTorquesInBodyCS = _params.geometry[idx].axis * (-1.0) * ccw * torque;
540 
541  Eigen::Vector3d MdueToArmOfForceInBodyCS = _params.geometry[idx].position.cross(_state.forces.motors[idx]);
542  _state.moments.motors[idx] = motorTorquesInBodyCS + MdueToArmOfForceInBodyCS;
543  }
544 
545  auto MtotalInBodyCS = std::accumulate(&_state.moments.motors[0], &_state.moments.motors[motors.size()], Maero);
547  _state.angularVel += _state.angularAccel * dt_sec;
548  Eigen::Quaterniond quaternion(0, _state.angularVel(0), _state.angularVel(1), _state.angularVel(2));
549  Eigen::Quaterniond attitudeDelta = _state.attitude * quaternion;
550  _state.attitude.coeffs() += attitudeDelta.coeffs() * 0.5 * dt_sec;
551  _state.attitude.normalize();
552 
553  Eigen::Matrix3d rotationMatrix = calculateRotationMatrix();
554  auto& Fmotors = _state.forces.motors;
555  Eigen::Vector3d Fspecific = std::accumulate(&Fmotors[0], &Fmotors[motors.size()], Faero) / _params.mass;
556  Eigen::Vector3d Ftotal = (Fspecific + rotationMatrix * Eigen::Vector3d(0, 0, _environment.gravity)) * _params.mass;
557 
558  _state.forces.total = Ftotal;
559  _state.moments.total = MtotalInBodyCS;
560 
561  _state.linearAccel = rotationMatrix.inverse() * Ftotal / _params.mass;
563  _state.position += _state.linearVelNed * dt_sec;
564 
565  if(_state.position[2] >= 0){
566  land();
567  }else{
568  _state.forces.specific = Fspecific;
569  }
570 
571  _state.bodylinearVel = rotationMatrix * _state.linearVelNed;
572 }
573 
575  Eigen::Matrix3d rotationMatrix = calculateRotationMatrix();
576  return rotationMatrix * Eigen::Vector3d(0, 0, -_environment.gravity);
577 }
578 
579 void VtolDynamics::calculateCLPolynomial(double airSpeedMod,
580  Eigen::VectorXd& polynomialCoeffs) const{
581  Math::calculatePolynomial(_tables.CLPolynomial, airSpeedMod, polynomialCoeffs);
582 }
583 void VtolDynamics::calculateCSPolynomial(double airSpeedMod,
584  Eigen::VectorXd& polynomialCoeffs) const{
585  Math::calculatePolynomial(_tables.CSPolynomial, airSpeedMod, polynomialCoeffs);
586 }
587 void VtolDynamics::calculateCDPolynomial(double airSpeedMod,
588  Eigen::VectorXd& polynomialCoeffs) const{
589  Math::calculatePolynomial(_tables.CDPolynomial, airSpeedMod, polynomialCoeffs);
590 }
591 void VtolDynamics::calculateCmxPolynomial(double airSpeedMod,
592  Eigen::VectorXd& polynomialCoeffs) const{
593  Math::calculatePolynomial(_tables.CmxPolynomial, airSpeedMod, polynomialCoeffs);
594 }
595 void VtolDynamics::calculateCmyPolynomial(double airSpeedMod,
596  Eigen::VectorXd& polynomialCoeffs) const{
597  Math::calculatePolynomial(_tables.CmyPolynomial, airSpeedMod, polynomialCoeffs);
598 }
599 void VtolDynamics::calculateCmzPolynomial(double airSpeedMod,
600  Eigen::VectorXd& polynomialCoeffs) const{
601  Math::calculatePolynomial(_tables.CmzPolynomial, airSpeedMod, polynomialCoeffs);
602 }
603 double VtolDynamics::calculateCSRudder(double rudder_pos, double airspeed) const{
604  return Math::griddata(-_tables.actuator, _tables.airspeed, _tables.CS_rudder, rudder_pos, airspeed);
605 }
606 double VtolDynamics::calculateCSBeta(double AoS_deg, double airspeed) const{
607  return Math::griddata(-_tables.AoS, _tables.airspeed, _tables.CS_beta, AoS_deg, airspeed);
608 }
609 double VtolDynamics::calculateCmxAileron(double aileron_pos, double airspeed) const{
610  return Math::griddata(_tables.actuator, _tables.airspeed, _tables.CmxAileron, aileron_pos, airspeed);
611 }
612 double VtolDynamics::calculateCmyElevator(double elevator_pos, double airspeed) const{
613  return Math::griddata(_tables.actuator, _tables.airspeed, _tables.CmyElevator, elevator_pos, airspeed);
614 }
615 double VtolDynamics::calculateCmzRudder(double rudder_pos, double airspeed) const{
616  return Math::griddata(_tables.actuator, _tables.airspeed, _tables.CmzRudder, rudder_pos, airspeed);
617 }
618 
619 // Motion dynamics equation
620 Eigen::Vector3d VtolDynamics::calculateAngularAccel(const Eigen::Matrix<double, 3, 3, Eigen::RowMajor>& inertia,
621  const Eigen::Vector3d& moment,
622  const Eigen::Vector3d& prevAngVel) const{
623  return inertia.inverse() * (moment - prevAngVel.cross(inertia * prevAngVel));
624 }
625 
629 Eigen::Vector3d VtolDynamics::getVehiclePosition() const{
630  return _state.position;
631 }
632 Eigen::Vector3d VtolDynamics::getVehicleVelocity() const{
633  return _state.linearVelNed;
634 }
635 Eigen::Vector3d VtolDynamics::getVehicleAirspeed() const{
636  return _state.airspeedFrd;
637 }
638 
642 Eigen::Quaterniond VtolDynamics::getVehicleAttitude() const{
643  return _state.attitude;
644 }
646  return _state.angularVel;
647 }
652 void VtolDynamics::getIMUMeasurement(Eigen::Vector3d& accOutFrd,
653  Eigen::Vector3d& gyroOutFrd){
654  Eigen::Vector3d accNoise(sqrt(_params.accVariance) * _distribution(_generator),
657  Eigen::Vector3d gyroNoise(sqrt(_params.gyroVariance) * _distribution(_generator),
660 
661  Eigen::Vector3d specificForce(_state.forces.specific);
662  Eigen::Vector3d angularVelocity(_state.angularVel);
663  Eigen::Quaterniond imuOrient(1, 0, 0, 0);
664  accOutFrd = imuOrient.inverse() * specificForce + _params.accelBias + accNoise;
665  gyroOutFrd = imuOrient.inverse() * angularVelocity + _params.gyroBias + gyroNoise;
666 }
667 
671 void VtolDynamics::setWindParameter(Eigen::Vector3d windMeanVelocityNED,
672  double windVariance){
673  _environment.windNED = windMeanVelocityNED;
674  _environment.windVariance = windVariance;
675 }
676 Eigen::Vector3d VtolDynamics::getAngularAcceleration() const{
677  return _state.angularAccel;
678 }
679 Eigen::Vector3d VtolDynamics::getLinearAcceleration() const{
680  return _state.linearAccel;
681 }
683  return _state.forces;
684 }
686  return _state.moments;
687 }
688 
689 Eigen::Vector3d VtolDynamics::getBodyLinearVelocity() const{
690  return _state.bodylinearVel;
691 }
692 
693 bool VtolDynamics::getMotorsRpm(std::vector<double>& motorsRpm) {
694  for (auto motor_rpm : _state.motorsRpm) {
695  motorsRpm.push_back(motor_rpm);
696  }
697 
698  return true;
699 }
TablesWithCoeffs::prop
Eigen::Matrix< double, 40, 5, Eigen::RowMajor > prop
Definition: vtolDynamicsSim.hpp:139
UavDynamicsSimBase::SimMode_t
SimMode_t
Definition: uavDynamicsSimBase.hpp:57
VtolDynamics::calculateNormalForceWithoutMass
Eigen::Vector3d calculateNormalForceWithoutMass() const
Definition: vtolDynamicsSim.cpp:574
VtolDynamics::loadMotorsGeometry
void loadMotorsGeometry(const std::string &path)
Definition: vtolDynamicsSim.cpp:112
UavDynamicsSimBase::SimMode_t::MAG_4_HEAD_UP
@ MAG_4_HEAD_UP
VtolParameters::servoRange
std::vector< double > servoRange
Definition: vtolDynamicsSim.hpp:48
VtolDynamics::_distribution
std::normal_distribution< double > _distribution
Definition: vtolDynamicsSim.hpp:244
VtolDynamics::calculateRotationMatrix
Eigen::Matrix3d calculateRotationMatrix() const
Definition: vtolDynamicsSim.cpp:380
VtolDynamics::_params
VtolParameters _params
Definition: vtolDynamicsSim.hpp:238
UavDynamicsSimBase::SimMode_t::MAG_5_TURNED_LEFT
@ MAG_5_TURNED_LEFT
VtolDynamics::init
int8_t init() override
Use rosparam here to initialize sim.
Definition: vtolDynamicsSim.cpp:48
State::prevActuators
std::vector< double > prevActuators
Definition: vtolDynamicsSim.hpp:105
VtolParameters::inertia
Eigen::Matrix< double, 3, 3, Eigen::RowMajor > inertia
Definition: vtolDynamicsSim.hpp:42
VtolDynamics::getAngularAcceleration
Eigen::Vector3d getAngularAcceleration() const
Definition: vtolDynamicsSim.cpp:676
TablesWithCoeffs::CmzPolynomial
Eigen::Matrix< double, 8, 8, Eigen::RowMajor > CmzPolynomial
Definition: vtolDynamicsSim.hpp:133
State::moments
Moments moments
Definition: vtolDynamicsSim.hpp:101
ros::param::get
ROSCPP_DECL bool get(const std::string &key, bool &b)
Forces::motors
std::array< Eigen::Vector3d, MOTORS_MAX_AMOUNT > motors
Definition: vtolDynamicsSim.hpp:69
Moments::steer
Eigen::Vector3d steer
Definition: vtolDynamicsSim.hpp:76
VtolDynamics::calculateCmyPolynomial
void calculateCmyPolynomial(double airSpeedMod, Eigen::VectorXd &polynomialCoeffs) const
Definition: vtolDynamicsSim.cpp:595
VtolDynamics::_motorsSpeed
std::vector< double > _motorsSpeed
Definition: vtolDynamicsSim.hpp:235
Moments::aero
Eigen::Vector3d aero
Definition: vtolDynamicsSim.hpp:75
Moments::total
Eigen::Vector3d total
Definition: vtolDynamicsSim.hpp:79
VtolDynamics::calculateCmyElevator
double calculateCmyElevator(double elevator_pos, double airspeed) const
Definition: vtolDynamicsSim.cpp:612
UavDynamicsSimBase::SimMode_t::ACC_4_HEAD_UP
@ ACC_4_HEAD_UP
VtolParameters::geometry
std::vector< Geometry > geometry
Definition: vtolDynamicsSim.hpp:49
VtolDynamics::getMotorsRpm
bool getMotorsRpm(std::vector< double > &motorsRpm) override
Definition: vtolDynamicsSim.cpp:693
Moments::motors
std::array< Eigen::Vector3d, MOTORS_MAX_AMOUNT > motors
Definition: vtolDynamicsSim.hpp:78
State::crntActuators
std::vector< double > crntActuators
Definition: vtolDynamicsSim.hpp:106
UavDynamicsSimBase::SimMode_t::MAG_2_OVERTURNED
@ MAG_2_OVERTURNED
State::forces
Forces forces
Definition: vtolDynamicsSim.hpp:100
TablesWithCoeffs::CmyElevator
Eigen::Matrix< double, 8, 20, Eigen::RowMajor > CmyElevator
Definition: vtolDynamicsSim.hpp:136
TablesWithCoeffs::airspeed
Eigen::Matrix< double, 8, 1, Eigen::ColMajor > airspeed
Definition: vtolDynamicsSim.hpp:126
State::bodylinearVel
Eigen::Vector3d bodylinearVel
Definition: vtolDynamicsSim.hpp:104
VtolDynamics::_generator
std::default_random_engine _generator
Definition: vtolDynamicsSim.hpp:243
Forces::aero
Eigen::Vector3d aero
Definition: vtolDynamicsSim.hpp:68
UavDynamicsSimBase::SimMode_t::NORMAL
@ NORMAL
VtolDynamics::getMoments
const Moments & getMoments() const
Definition: vtolDynamicsSim.cpp:685
Forces
Definition: vtolDynamicsSim.hpp:64
VtolDynamics::setInitialPosition
void setInitialPosition(const Eigen::Vector3d &position, const Eigen::Quaterniond &attitudeXYZW) override
Definition: vtolDynamicsSim.cpp:151
VtolParameters::motorMaxSpeed
std::vector< double > motorMaxSpeed
Definition: vtolDynamicsSim.hpp:47
VtolDynamics::calculateCmxAileron
double calculateCmxAileron(double aileron_pos, double airspeed) const
Definition: vtolDynamicsSim.cpp:609
UavDynamicsSimBase::SimMode_t::AIRSPEED
@ AIRSPEED
VtolDynamics::_mapUnitlessSetpointToInternal
void _mapUnitlessSetpointToInternal(const std::vector< double > &cmd)
cmd is flexible, but it follows these rules:
Definition: vtolDynamicsSim.cpp:327
UavDynamicsSimBase::SimMode_t::MAG_7_ARDUPILOT
@ MAG_7_ARDUPILOT
State::airspeedFrd
Eigen::Vector3d airspeedFrd
Definition: vtolDynamicsSim.hpp:98
VtolDynamics::calculateCmxPolynomial
void calculateCmxPolynomial(double airSpeedMod, Eigen::VectorXd &polynomialCoeffs) const
Definition: vtolDynamicsSim.cpp:591
VtolDynamics::updateActuators
void updateActuators(double dtSecs)
Definition: vtolDynamicsSim.cpp:348
MOTORS_MIN_AMOUNT
constexpr size_t MOTORS_MIN_AMOUNT
Definition: vtolDynamicsSim.hpp:29
VtolDynamics::getBodyLinearVelocity
Eigen::Vector3d getBodyLinearVelocity() const
Definition: vtolDynamicsSim.cpp:689
TablesWithCoeffs::CDPolynomial
Eigen::Matrix< double, 8, 6, Eigen::RowMajor > CDPolynomial
Definition: vtolDynamicsSim.hpp:130
Forces::side
Eigen::Vector3d side
Definition: vtolDynamicsSim.hpp:67
vtolDynamicsSim.hpp
VtolDynamics::getVehicleAngularVelocity
Eigen::Vector3d getVehicleAngularVelocity() const override
Definition: vtolDynamicsSim.cpp:645
Environment::gravity
double gravity
Definition: vtolDynamicsSim.hpp:114
ROS_WARN_STREAM_THROTTLE
#define ROS_WARN_STREAM_THROTTLE(period, args)
UavDynamicsSimBase::SimMode_t::MAG_3_HEAD_DOWN
@ MAG_3_HEAD_DOWN
UavDynamicsSimBase::SimMode_t::MAG_8_ARDUPILOT
@ MAG_8_ARDUPILOT
Environment::atmoRho
double atmoRho
Definition: vtolDynamicsSim.hpp:115
UavDynamicsSimBase::SimMode_t::ACC_2_OVERTURNED
@ ACC_2_OVERTURNED
getTableNew
Eigen::MatrixXd getTableNew(const std::string &path, const char *name)
Definition: vtolDynamicsSim.cpp:64
Forces::specific
Eigen::Vector3d specific
Definition: vtolDynamicsSim.hpp:70
VtolDynamics::calculateAirSpeed
Eigen::Vector3d calculateAirSpeed(const Eigen::Matrix3d &rotationMatrix, const Eigen::Vector3d &estimatedVelocity, const Eigen::Vector3d &windSpeed) const
Definition: vtolDynamicsSim.cpp:384
VtolParameters::gyroBias
Eigen::Vector3d gyroBias
Definition: vtolDynamicsSim.hpp:61
VtolDynamics::calculateAnglesOfSideslip
double calculateAnglesOfSideslip(const Eigen::Vector3d &airSpeed) const
Definition: vtolDynamicsSim.cpp:418
State::position
Eigen::Vector3d position
Definition: vtolDynamicsSim.hpp:87
VtolDynamics::calculateCSBeta
double calculateCSBeta(double AoS_deg, double airspeed) const
Definition: vtolDynamicsSim.cpp:606
VtolDynamics::calculateCLPolynomial
void calculateCLPolynomial(double airSpeedMod, Eigen::VectorXd &polynomialCoeffs) const
Definition: vtolDynamicsSim.cpp:579
VtolParameters::characteristicLength
double characteristicLength
Definition: vtolDynamicsSim.hpp:41
UavDynamicsSimBase::SimMode_t::MAG_1_NORMAL
@ MAG_1_NORMAL
VtolDynamics::calculateDynamicPressure
double calculateDynamicPressure(double airSpeedMod) const
Definition: vtolDynamicsSim.cpp:398
UavDynamicsSimBase::SimMode_t::ACC_3_HEAD_DOWN
@ ACC_3_HEAD_DOWN
State::motorsRpm
std::array< double, MOTORS_MAX_AMOUNT > motorsRpm
Definition: vtolDynamicsSim.hpp:103
Geometry::axis
Eigen::Vector3d axis
Definition: vtolDynamicsSim.hpp:34
TablesWithCoeffs::CmxPolynomial
Eigen::Matrix< double, 8, 8, Eigen::RowMajor > CmxPolynomial
Definition: vtolDynamicsSim.hpp:131
VtolDynamics::_tables
TablesWithCoeffs _tables
Definition: vtolDynamicsSim.hpp:240
ACTUATORS_MAX_AMOUNT
static constexpr const size_t ACTUATORS_MAX_AMOUNT
Definition: vtolDynamicsSim.cpp:35
RUDDERS_INDEX
static constexpr const size_t RUDDERS_INDEX
Definition: vtolDynamicsSim.cpp:31
VtolDynamics::loadParams
void loadParams(const std::string &path)
Definition: vtolDynamicsSim.cpp:94
TablesWithCoeffs::CS_beta
Eigen::Matrix< double, 8, 90, Eigen::RowMajor > CS_beta
Definition: vtolDynamicsSim.hpp:120
Forces::lift
Eigen::Vector3d lift
Definition: vtolDynamicsSim.hpp:65
Math::calculatePolynomial
bool calculatePolynomial(const Eigen::MatrixXd &table, double airSpeedMod, Eigen::VectorXd &polynomialCoeffs)
Definition: common_math.cpp:87
VtolParameters::accVariance
double accVariance
Definition: vtolDynamicsSim.hpp:51
TablesWithCoeffs::CS_rudder
Eigen::Matrix< double, 8, 20, Eigen::RowMajor > CS_rudder
Definition: vtolDynamicsSim.hpp:119
VtolDynamics::calibrate
int8_t calibrate(SimMode_t calibrationType) override
Definition: vtolDynamicsSim.cpp:179
State::angularAccel
Eigen::Vector3d angularAccel
Definition: vtolDynamicsSim.hpp:97
VtolDynamics::loadTables
void loadTables(const std::string &path)
Definition: vtolDynamicsSim.cpp:75
UavDynamicsSimBase::SimMode_t::ACC_1_NORMAL
@ ACC_1_NORMAL
VtolDynamics::calculateCSPolynomial
void calculateCSPolynomial(double airSpeedMod, Eigen::VectorXd &polynomialCoeffs) const
Definition: vtolDynamicsSim.cpp:583
State::angularVel
Eigen::Vector3d angularVel
Definition: vtolDynamicsSim.hpp:96
VtolDynamics::calculateAngularAccel
Eigen::Vector3d calculateAngularAccel(const Eigen::Matrix< double, 3, 3, Eigen::RowMajor > &inertia, const Eigen::Vector3d &moment, const Eigen::Vector3d &prevAngVel) const
Definition: vtolDynamicsSim.cpp:620
TablesWithCoeffs::CmzRudder
Eigen::Matrix< double, 8, 20, Eigen::RowMajor > CmzRudder
Definition: vtolDynamicsSim.hpp:137
package.h
VtolDynamics::getVehicleVelocity
Eigen::Vector3d getVehicleVelocity() const override
Definition: vtolDynamicsSim.cpp:632
VtolDynamics::calculateCmzPolynomial
void calculateCmzPolynomial(double airSpeedMod, Eigen::VectorXd &polynomialCoeffs) const
Definition: vtolDynamicsSim.cpp:599
State::initialPose
Eigen::Vector3d initialPose
Definition: vtolDynamicsSim.hpp:86
State::linearVelNed
Eigen::Vector3d linearVelNed
Definition: vtolDynamicsSim.hpp:88
UavDynamicsSimBase::SimMode_t::MAG_6_TURNED_RIGHT
@ MAG_6_TURNED_RIGHT
VtolDynamics::getVehicleAirspeed
Eigen::Vector3d getVehicleAirspeed() const override
Definition: vtolDynamicsSim.cpp:635
VtolDynamics::thruster
void thruster(double actuator, double &thrust, double &torque, double &rpm) const
Definition: vtolDynamicsSim.cpp:507
TablesWithCoeffs::CSPolynomial
Eigen::Matrix< double, 8, 8, Eigen::RowMajor > CSPolynomial
Definition: vtolDynamicsSim.hpp:129
VtolDynamics::getLinearAcceleration
Eigen::Vector3d getLinearAcceleration() const
Definition: vtolDynamicsSim.cpp:679
Moments
Definition: vtolDynamicsSim.hpp:74
Math::lerp
double lerp(double a, double b, double f)
Definition: common_math.cpp:26
UavDynamicsSimBase::SimMode_t::MAG_9_ARDUPILOT
@ MAG_9_ARDUPILOT
UavDynamicsSimBase::SimMode_t::ACC_5_TURNED_LEFT
@ ACC_5_TURNED_LEFT
TablesWithCoeffs::CLPolynomial
Eigen::Matrix< double, 8, 8, Eigen::RowMajor > CLPolynomial
Definition: vtolDynamicsSim.hpp:128
VtolDynamics::setWindParameter
void setWindParameter(Eigen::Vector3d windMeanVelocityNED, double wind_velocityVariance) override
Definition: vtolDynamicsSim.cpp:671
VtolDynamics::_state
State _state
Definition: vtolDynamicsSim.hpp:239
Math::griddata
double griddata(const Eigen::MatrixXd &x, const Eigen::MatrixXd &y, const Eigen::MatrixXd &z, double x_val, double y_val)
Definition: common_math.cpp:68
VtolDynamics::getForces
const Forces & getForces() const
Definition: vtolDynamicsSim.cpp:682
TablesWithCoeffs::AoS
Eigen::Matrix< double, 90, 1, Eigen::ColMajor > AoS
Definition: vtolDynamicsSim.hpp:123
VtolDynamics::calculateWind
Eigen::Vector3d calculateWind()
Definition: vtolDynamicsSim.cpp:364
Forces::total
Eigen::Vector3d total
Definition: vtolDynamicsSim.hpp:71
Geometry::position
Eigen::Vector3d position
Definition: vtolDynamicsSim.hpp:33
Environment::windNED
Eigen::Vector3d windNED
Definition: vtolDynamicsSim.hpp:111
ELEVATORS_INDEX
static constexpr const size_t ELEVATORS_INDEX
Definition: vtolDynamicsSim.cpp:30
VtolDynamics::calculateNewState
void calculateNewState(const Eigen::Vector3d &Maero, const Eigen::Vector3d &Faero, const std::vector< double > &motors, double dt_sec)
Definition: vtolDynamicsSim.cpp:526
Geometry
Definition: vtolDynamicsSim.hpp:32
VtolParameters::gyroVariance
double gyroVariance
Definition: vtolDynamicsSim.hpp:52
ROS_ERROR
#define ROS_ERROR(...)
State::initialAttitude
Eigen::Quaterniond initialAttitude
Definition: vtolDynamicsSim.hpp:94
State::attitude
Eigen::Quaterniond attitude
Definition: vtolDynamicsSim.hpp:95
MOTORS_MAX_AMOUNT
constexpr size_t MOTORS_MAX_AMOUNT
Definition: vtolDynamicsSim.hpp:30
TablesWithCoeffs::actuatorTimeConstants
std::vector< double > actuatorTimeConstants
Definition: vtolDynamicsSim.hpp:141
State::linearAccel
Eigen::Vector3d linearAccel
Definition: vtolDynamicsSim.hpp:89
UavDynamicsSimBase::SimMode_t::ACC_6_TURNED_RIGHT
@ ACC_6_TURNED_RIGHT
VtolDynamics::getVehiclePosition
Eigen::Vector3d getVehiclePosition() const override
Definition: vtolDynamicsSim.cpp:629
VtolParameters::mass
double mass
Definition: vtolDynamicsSim.hpp:39
Math::findPrevRowIdxInMonotonicSequence
size_t findPrevRowIdxInMonotonicSequence(const Eigen::MatrixXd &matrix, double key)
Given monotonic sequence (increasing or decreasing) and key, return the index of the previous element...
Definition: common_math.cpp:38
Environment::windVariance
double windVariance
Definition: vtolDynamicsSim.hpp:110
VtolDynamics::calculateCmzRudder
double calculateCmzRudder(double rudder_pos, double airspeed) const
Definition: vtolDynamicsSim.cpp:615
VtolDynamics::getVehicleAttitude
Eigen::Quaterniond getVehicleAttitude() const override
Definition: vtolDynamicsSim.cpp:642
AILERONS_INDEX
static constexpr const size_t AILERONS_INDEX
Definition: vtolDynamicsSim.cpp:29
VtolDynamics::land
void land() override
Definition: vtolDynamicsSim.cpp:164
VtolDynamics::calculateCSRudder
double calculateCSRudder(double rudder_pos, double airspeed) const
Definition: vtolDynamicsSim.cpp:603
VtolDynamics::setInitialVelocity
void setInitialVelocity(const Eigen::Vector3d &linearVelocity, const Eigen::Vector3d &angularVelocity)
Definition: vtolDynamicsSim.cpp:158
VtolDynamics::_servosValues
std::array< double, 3 > _servosValues
Definition: vtolDynamicsSim.hpp:236
VtolParameters::accelBias
Eigen::Vector3d accelBias
Definition: vtolDynamicsSim.hpp:60
common_math.hpp
VtolDynamics::VtolDynamics
VtolDynamics()
Definition: vtolDynamicsSim.cpp:37
VtolDynamics::calculateAerodynamics
void calculateAerodynamics(const Eigen::Vector3d &airspeed, double AoA, double AoS, const std::array< double, 3 > &servos, Eigen::Vector3d &Faero, Eigen::Vector3d &Maero)
Definition: vtolDynamicsSim.cpp:434
TablesWithCoeffs::CmxAileron
Eigen::Matrix< double, 8, 20, Eigen::RowMajor > CmxAileron
Definition: vtolDynamicsSim.hpp:135
VtolParameters::wingArea
double wingArea
Definition: vtolDynamicsSim.hpp:40
Geometry::directionCCW
bool directionCCW
Definition: vtolDynamicsSim.hpp:35
TablesWithCoeffs::AoA
Eigen::Matrix< double, 1, 47, Eigen::RowMajor > AoA
Definition: vtolDynamicsSim.hpp:122
VtolDynamics::calculateCDPolynomial
void calculateCDPolynomial(double airSpeedMod, Eigen::VectorXd &polynomialCoeffs) const
Definition: vtolDynamicsSim.cpp:587
VtolDynamics::getIMUMeasurement
void getIMUMeasurement(Eigen::Vector3d &accOut, Eigen::Vector3d &gyroOut) override
Definition: vtolDynamicsSim.cpp:652
VtolDynamics::_environment
Environment _environment
Definition: vtolDynamicsSim.hpp:241
SERVOS_AMOUNT
static constexpr const size_t SERVOS_AMOUNT
Definition: vtolDynamicsSim.cpp:32
Moments::airspeed
Eigen::Vector3d airspeed
Definition: vtolDynamicsSim.hpp:77
Forces::drug
Eigen::Vector3d drug
Definition: vtolDynamicsSim.hpp:66
ACTUATORS_MIN_AMOUNT
static constexpr const size_t ACTUATORS_MIN_AMOUNT
Definition: vtolDynamicsSim.cpp:34
VtolDynamics::calculateAnglesOfAtack
double calculateAnglesOfAtack(const Eigen::Vector3d &airSpeed) const
Definition: vtolDynamicsSim.cpp:407
Math::polyval
double polyval(const Eigen::VectorXd &poly, double val)
Definition: common_math.cpp:30
TablesWithCoeffs::actuator
Eigen::Matrix< double, 20, 1, Eigen::ColMajor > actuator
Definition: vtolDynamicsSim.hpp:125
cs_converter.hpp
VtolDynamics::process
void process(double dt_secs, const std::vector< double > &unitless_setpoint) override
Definition: vtolDynamicsSim.cpp:300
TablesWithCoeffs::CmyPolynomial
Eigen::Matrix< double, 8, 8, Eigen::RowMajor > CmyPolynomial
Definition: vtolDynamicsSim.hpp:132


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