package me.drton.flightplot.processors; import me.drton.flightplot.processors.tools.DispersionTracker; import me.drton.flightplot.processors.tools.LowPassFilter; import java.util.HashMap; import java.util.Map; /** * User: ton Date: 25.07.13 Time: 14:20 */ public class LandDetector extends PlotProcessor { private String param_Field_Baro; private String param_Field_Thrust; private String[] param_Fields_Gyro; private double param_Thrust; private double param_Baro_Disp_Max; private double param_Gyro_Disp_Max; private DispersionTracker dispersionTrackerBaro; private DispersionTracker[] dispersionTrackerGyro; private double thrust; private double dispBaro; private double[] dispGyro; @Override public Map<String, Object> getDefaultParameters() { Map<String, Object> params = new HashMap<String, Object>(); params.put("Field Baro", "SENS.BaroAlt"); params.put("Field Thrust", "ATTC.Thrust"); params.put("Fields Gyro", "IMU.GyrX IMU.GyrY IMU.GyrZ"); params.put("Baro Disp", 0.2); params.put("Baro LPF", 10.0); params.put("Baro HPF", 0.5); params.put("Gyro Disp", 0.02); params.put("Gyro LPF", 10.0); params.put("Gyro HPF", 1.0); params.put("Thrust", 0.2); return params; } @Override public void init() { thrust = 0; dispBaro = 0; dispGyro = new double[]{0, 0, 0}; param_Field_Baro = (String) parameters.get("Field Baro"); param_Field_Thrust = (String) parameters.get("Field Thrust"); param_Fields_Gyro = ((String) parameters.get("Fields Gyro")).split(WHITESPACE_RE); param_Thrust = (Double) parameters.get("Thrust"); param_Baro_Disp_Max = (Double) parameters.get("Baro Disp"); param_Baro_Disp_Max *= param_Baro_Disp_Max; param_Gyro_Disp_Max = (Double) parameters.get("Gyro Disp"); param_Gyro_Disp_Max *= param_Gyro_Disp_Max; dispersionTrackerBaro = new DispersionTracker(); dispersionTrackerBaro.setCutoffFreq((Double) parameters.get("Baro HPF"), (Double) parameters.get("Baro LPF")); dispersionTrackerGyro = new DispersionTracker[3]; for (int i = 0; i < 3; ++i) { DispersionTracker tracker = new DispersionTracker(); tracker.setCutoffFreq((Double) parameters.get("Gyro HPF"), (Double) parameters.get("Gyro LPF")); dispersionTrackerGyro[i] = tracker; } addSeries("DispBaro"); addSeries("DispGyro"); addSeries("Thrust"); addSeries("Landed"); } @Override public void process(double time, Map<String, Object> update) { Number baroNum = (Number) update.get(param_Field_Baro); if (baroNum != null) { dispBaro = dispersionTrackerBaro.getOutput(time, baroNum.doubleValue()); addPoint(0, time, Math.sqrt(dispBaro)); } for (int i = 0; i < 3; ++i) { Number accNum = (Number) update.get(param_Fields_Gyro[i]); if (accNum != null) { dispGyro[i] = dispersionTrackerGyro[i].getOutput(time, accNum.doubleValue()); } } double dispGyroSum = dispGyro[0] + dispGyro[1] + dispGyro[2]; addPoint(1, time, Math.sqrt(dispGyroSum)); Number thrustNum = (Number) update.get(param_Field_Thrust); if (thrustNum != null) { thrust = thrustNum.doubleValue(); addPoint(2, time, thrust); } boolean landed = thrust < param_Thrust && dispBaro < param_Baro_Disp_Max && dispGyroSum < param_Gyro_Disp_Max; addPoint(3, time, landed ? 1 : 0); } }