R2Home/RLS_V1.0/R2Home_SOFTWARE_V1.01/R2Home_OBC_V1.04/main/position.hpp

139 wiersze
3.2 KiB
C++

#include "config.h"
#include "barometer.hpp"
#include "gps.hpp"
#include <movingAvg.h>
float merged_alt = 0;
float merged_vspeed = 0;
float baro_alt_weight = 1;
float gps_alt_weight = 1;
float baro_vspeed_weight = 1;
float gps_vspeed_weight = 1;
float ground_altitude = 0;
unsigned long tstab = 0;
float gps_stab_factor = 0;
float baro_stab_factor = 0;
bool new_baro_fusion = false;
bool new_gps_fusion = false;
movingAvg gps_v(GPS_SAFE_AVG);
movingAvg baro_v(BARO_SAFE_AVG);
movingAvg ps_p(PRE_PE_AVG);
double pressure_percentage;
void position_setup() {
gps_v.begin();
baro_v.begin();
ps_p.begin();
}
void cmpt_fusion() {
if (new_baro_fusion == true and new_gps_fusion == true) {
new_baro_fusion = false;
new_gps_fusion = false;
pressure_percentage = (ps_p.reading((pressure_baro / (baro_set*100.0))*100.0)/100.0) ;
pressure_percentage = constrain(pressure_percentage, 0.05, 1);
baro_alt_weight = pressure_percentage*pressure_percentage;
baro_vspeed_weight = pressure_percentage*pressure_percentage;
double h_dop = gps.hdop.value();
if (gps_ok) {
gps_alt_weight = constrain((gps.altitude.meters()/3000), 0.1, 10);
gps_vspeed_weight = constrain((gps.altitude.meters()/6000), 0.05, 10);
}
else {
gps_alt_weight = 0;
gps_vspeed_weight = 0;
}
merged_alt = ((alt_baro*baro_alt_weight)+(gps.altitude.meters()*gps_alt_weight))/(baro_alt_weight+gps_alt_weight);
merged_vspeed = ((baro_stab_factor*baro_vspeed_weight)+(gps_stab_factor*gps_vspeed_weight))/(baro_vspeed_weight+gps_vspeed_weight);
}
}
void cmpt_vertical_state() {
if (new_baro) {
new_baro = false;
new_baro_fusion = true;
baro_stab_factor = (baro_v.reading(baro_vspeed*100.0))/100.0;
}
if (new_gps) {
new_gps = false;
new_gps_fusion = true;
gps_stab_factor = (gps_v.reading(gps_vspeed*100))/100.0;
}
}
bool is_ascent(int v_trigger, bool mode) {
if (mode == 0) {
if (baro_stab_factor>v_trigger) {
return true;
}
else {
return false;
}
}
else {
if (gps_stab_factor>v_trigger and baro_stab_factor>v_trigger) {
return true;
}
else {
return false;
}
}
}
bool is_descent(int v_trigger, bool mode) {
if (mode == 0) {
if (baro_stab_factor<v_trigger) {
return true;
}
else {
return false;
}
}
else {
if (merged_vspeed<v_trigger) {
return true;
}
else {
return false;
}
}
}
float pressure_sqrt_ratio() {
double raw_ratio = sqrt((baro_set*100.0)/pressure_baro);
return constrain(raw_ratio, 1, 5);
}
float v_down(int vdown) {
return pressure_sqrt_ratio()*vdown;
}
String pos_text() {
String merged_alt_text = String(merged_alt,3);
String gps_weight_text = String(gps_alt_weight,2);
String baro_weight_text = String(baro_alt_weight,3);
String baro_stab_text = String(baro_stab_factor, 2);
String gps_stab_text = String(gps_stab_factor, 2);
String v_down_text = String(v_down(VDOWN), 2);
String merged_vspeed_text = String(merged_vspeed, 2);
return merged_alt_text+","+merged_vspeed_text+","+baro_weight_text+","+gps_weight_text+","+baro_stab_text+","+gps_stab_text+","+v_down_text;
}