sensors.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 "sensors.hpp"
20 #include <cstdlib>
21 #include <ctime>
22 #include <boost/algorithm/clamp.hpp>
23 #include "sensors_isa_model.hpp"
24 #include "cs_converter.hpp"
25 
27  attitudeSensor(nh, "/uav/attitude", 0.005),
28  pressureSensor(nh, "/uav/static_pressure", 0.05),
29  temperatureSensor(nh, "/uav/static_temperature", 0.05),
30  diffPressureSensor(nh, "/uav/raw_air_data", 0.05),
31  iceStatusSensor(nh, "/uav/ice", 0.25),
32  imuSensor(nh, "/uav/imu", 0.00333),
33  velocitySensor_(nh, "/uav/velocity", 0.05),
34  gpsSensor(nh, "/uav/gps_point", 0.1),
35  magSensor(nh, "/uav/mag", 0.03),
36  escStatusSensor(nh, "/uav/esc_status", 0.25),
37  fuelTankSensor(nh, "/uav/fuel_tank", 1.0),
38  batteryInfoSensor(nh, "/uav/battery", 1.0)
39 {
40 }
41 
42 int8_t Sensors::init(const std::shared_ptr<UavDynamicsSimBase>& uavDynamicsSim) {
43  _uavDynamicsSim = uavDynamicsSim;
44 
45  double latRef;
46  double lonRef;
47  double altRef;
48  const std::string SIM_PARAMS_PATH = "/uav/sim_params/";
49  bool isEnabled;
50 
51  if(!ros::param::get(SIM_PARAMS_PATH + "lat_ref", latRef) ||
52  !ros::param::get(SIM_PARAMS_PATH + "lon_ref", lonRef) ||
53  !ros::param::get(SIM_PARAMS_PATH + "alt_ref", altRef)){
54  ROS_ERROR("Sensors: lat_ref, lon_ref or alt_ref in not present.");
55  return -1;
56  }
57 
58  if (ros::param::get(SIM_PARAMS_PATH + "esc_status", isEnabled) && isEnabled) {
60  }
61 
62  if (ros::param::get(SIM_PARAMS_PATH + "ice_status", isEnabled) && isEnabled) {
64  }
65 
66  if (ros::param::get(SIM_PARAMS_PATH + "fuel_tank_status", isEnabled) && isEnabled) {
68  }
69 
70  if (ros::param::get(SIM_PARAMS_PATH + "battery_status", isEnabled) && isEnabled) {
72  }
73 
75  imuSensor.enable();
77  magSensor.enable();
81  gpsSensor.enable();
82 
83  geodeticConverter.setInitialValues(latRef, lonRef, altRef);
84 
85  return 0;
86 }
87 
88 static const constexpr uint8_t PX4_NED_FRD = 0;
89 static const constexpr uint8_t ROS_ENU_FLU = 1;
90 
95 void Sensors::publishStateToCommunicator(uint8_t dynamicsNotation) {
96  // 1. Get data from simulator
97  Eigen::Vector3d acc;
98  Eigen::Vector3d gyro;
99  _uavDynamicsSim->getIMUMeasurement(acc, gyro);
100  Eigen::Vector3d position = _uavDynamicsSim->getVehiclePosition();
101  Eigen::Vector3d linVel = _uavDynamicsSim->getVehicleVelocity();
102  auto airspeed = _uavDynamicsSim->getVehicleAirspeed();
103  Eigen::Vector3d angVel = _uavDynamicsSim->getVehicleAngularVelocity();
104  Eigen::Quaterniond attitude = _uavDynamicsSim->getVehicleAttitude();
105 
106  // 2. Convert them to appropriate CS
107  Eigen::Vector3d gpsPosition;
108  Eigen::Vector3d enuPosition;
109  Eigen::Vector3d linVelNed;
110  Eigen::Vector3d airspeedFrd;
111  Eigen::Vector3d accFrd;
112  Eigen::Vector3d gyroFrd;
113  Eigen::Vector3d angVelFrd;
114  Eigen::Quaterniond attitudeFrdToNed;
115  if(dynamicsNotation == PX4_NED_FRD){
116  enuPosition = Converter::nedToEnu(position);
117  linVelNed = linVel;
118  accFrd = acc;
119  gyroFrd = gyro;
120  angVelFrd = angVel;
121  attitudeFrdToNed = attitude;
122  airspeedFrd = airspeed;
123  }else{
124  enuPosition = position;
125  linVelNed = Converter::enuToNed(linVel);
126  accFrd = Converter::fluToFrd(acc);
127  gyroFrd = Converter::fluToFrd(gyro);
128  angVelFrd = Converter::fluToFrd(angVel);
129  attitudeFrdToNed = Converter::fluEnuToFrdNed(attitude);
130  airspeedFrd = Converter::fluToFrd(airspeed);
131  }
132  geodeticConverter.enuToGeodetic(enuPosition[0], enuPosition[1], enuPosition[2],
133  &gpsPosition[0], &gpsPosition[1], &gpsPosition[2]);
134 
135  // 3. Calculate temperature, abs pressure and diff pressure using ISA model
136  float temperatureKelvin;
137  float absPressureHpa;
138  float diffPressureHpa;
139  SensorModelISA::EstimateAtmosphere(gpsPosition, airspeedFrd,
140  temperatureKelvin, absPressureHpa, diffPressureHpa);
141 
142  // Publish state to communicator
144  imuSensor.publish(accFrd, gyroFrd);
145  velocitySensor_.publish(linVelNed, angVelFrd);
146  magSensor.publish(gpsPosition, attitudeFrdToNed);
147  diffPressureSensor.publish(diffPressureHpa);
148  pressureSensor.publish(absPressureHpa);
149  temperatureSensor.publish(temperatureKelvin);
150  gpsSensor.publish(gpsPosition);
151 
152  std::vector<double> motorsRpm;
153  if(_uavDynamicsSim->getMotorsRpm(motorsRpm)){
154  escStatusSensor.publish(motorsRpm);
155  if(motorsRpm.size() >= 5){
156  iceStatusSensor.publish(motorsRpm[4]);
157  }
158  }
159 
160  static double trueFuelLevelPct = 80.0;
161  if(motorsRpm[4] > 0.0) {
162  trueFuelLevelPct -= 0.0000002 * motorsRpm[4];
163  if(trueFuelLevelPct < 0) {
164  trueFuelLevelPct = 0;
165  }
166  }
167  auto fuelNoise = (float)(std::rand() % 26 - 13);
168  float measuredFuelLevelPct = boost::algorithm::clamp(trueFuelLevelPct + fuelNoise, 0.0, 100.0);
169  fuelTankSensor.publish(measuredFuelLevelPct);
170 
172 }
Converter::fluEnuToFrdNed
Eigen::Quaterniond fluEnuToFrdNed(const Eigen::Quaterniond &q_flu_to_enu)
Definition: cs_converter.cpp:69
GpsSensor::publish
bool publish(const Eigen::Vector3d &gpsPosition)
Definition: gnss.cpp:26
sensors_isa_model.hpp
sensors.hpp
Sensors::temperatureSensor
TemperatureSensor temperatureSensor
Definition: sensors.hpp:44
PressureSensor::publish
bool publish(float staticPressureHpa)
Definition: barometer.cpp:28
TemperatureSensor::publish
bool publish(float staticTemperature)
Definition: barometer.cpp:46
ros::param::get
ROSCPP_DECL bool get(const std::string &key, bool &b)
Sensors::escStatusSensor
EscStatusSensor escStatusSensor
Definition: sensors.hpp:52
BatteryInfoSensor::publish
bool publish(float percentage)
Definition: battery.cpp:25
Sensors::publishStateToCommunicator
void publishStateToCommunicator(uint8_t dynamicsNotation)
Definition: sensors.cpp:95
Sensors::magSensor
MagSensor magSensor
Definition: sensors.hpp:50
Sensors::geodeticConverter
CoordinateConverter geodeticConverter
Definition: sensors.hpp:57
DynamicsNotation_t::PX4_NED_FRD
@ PX4_NED_FRD
FuelTankSensor::publish
bool publish(double rpm)
Definition: fuel_tank.cpp:25
IceStatusSensor::publish
bool publish(double rpm)
Definition: ice.cpp:37
Sensors::attitudeSensor
AttitudeSensor attitudeSensor
Definition: sensors.hpp:42
Converter::frdNedTofluEnu
Eigen::Quaterniond frdNedTofluEnu(const Eigen::Quaterniond &q_frd_to_ned)
Definition: cs_converter.cpp:65
Sensors::iceStatusSensor
IceStatusSensor iceStatusSensor
Definition: sensors.hpp:46
Converter::fluToFrd
Eigen::Vector3d fluToFrd(Eigen::Vector3d flu)
Definition: cs_converter.cpp:60
Sensors::gpsSensor
GpsSensor gpsSensor
Definition: sensors.hpp:49
Sensors::batteryInfoSensor
BatteryInfoSensor batteryInfoSensor
Definition: sensors.hpp:54
Sensors::diffPressureSensor
DiffPressureSensor diffPressureSensor
Definition: sensors.hpp:45
BaseSensor::enable
void enable()
Definition: sensor_base.hpp:29
AttitudeSensor::publish
bool publish(const Eigen::Quaterniond &attitudeFrdToNed)
Definition: attitude.cpp:26
Sensors::velocitySensor_
VelocitySensor velocitySensor_
Definition: sensors.hpp:48
Sensors::fuelTankSensor
FuelTankSensor fuelTankSensor
Definition: sensors.hpp:53
CoordinateConverter::setInitialValues
void setInitialValues(double lat, double lon, double alt)
Definition: geodetic.cpp:29
MagSensor::publish
bool publish(const Eigen::Vector3d &geoPosition, const Eigen::Quaterniond &attitudeFrdToNed)
Definition: mag.cpp:30
ROS_ERROR
#define ROS_ERROR(...)
Sensors::imuSensor
ImuSensor imuSensor
Definition: sensors.hpp:47
DiffPressureSensor::publish
bool publish(float diffPressureHpa)
Definition: differential_pressure.cpp:27
VelocitySensor::publish
bool publish(const Eigen::Vector3d &linVelNed, const Eigen::Vector3d &angVelFrd)
Definition: velocity.cpp:25
PX4_NED_FRD
static const constexpr uint8_t PX4_NED_FRD
Definition: sensors.cpp:88
ROS_ENU_FLU
static const constexpr uint8_t ROS_ENU_FLU
Definition: sensors.cpp:89
CoordinateConverter::enuToGeodetic
void enuToGeodetic(double enu_x, double enu_y, double enu_z, double *lat, double *lon, double *alt) const
Definition: geodetic.cpp:38
EscStatusSensor::publish
bool publish(const std::vector< double > &rpm)
Definition: esc_status.cpp:26
f
static const double f
Definition: geodetic.cpp:22
Sensors::pressureSensor
PressureSensor pressureSensor
Definition: sensors.hpp:43
SensorModelISA::EstimateAtmosphere
void EstimateAtmosphere(const Eigen::Vector3d &gpsPosition, const Eigen::Vector3d &linVelNed, float &temperatureKelvin, float &absPressureHpa, float &diffPressureHpa)
Definition: sensors_isa_model.hpp:27
Sensors::Sensors
Sensors(ros::NodeHandle *nh)
Definition: sensors.cpp:26
Sensors::_uavDynamicsSim
std::shared_ptr< UavDynamicsSimBase > _uavDynamicsSim
Definition: sensors.hpp:58
Converter::nedToEnu
Eigen::Vector3d nedToEnu(Eigen::Vector3d ned)
Definition: cs_converter.cpp:50
ImuSensor::publish
bool publish(const Eigen::Vector3d &accFrd, const Eigen::Vector3d &gyroFrd)
Definition: imu.cpp:26
Converter::enuToNed
Eigen::Vector3d enuToNed(Eigen::Vector3d enu)
Definition: cs_converter.cpp:53
ros::NodeHandle
cs_converter.hpp
Sensors::init
int8_t init(const std::shared_ptr< UavDynamicsSimBase > &uavDynamicsSim)
Definition: sensors.cpp:42


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