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


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