package me.drton.flightplot.processors; import me.drton.jmavlib.conversion.RotationConversion; import java.util.HashMap; import java.util.Map; /** * Created by ton on 05.01.15. */ public class EulerFromQuaternion extends PlotProcessor { private String[] param_Fields; private double param_Scale; private boolean[] show; private double[] q; @Override public Map<String, Object> getDefaultParameters() { Map<String, Object> params = new HashMap<String, Object>(); params.put("Fields", "ATT.Q0 ATT.Q1 ATT.Q2 ATT.Q3"); params.put("Show", "RPY"); params.put("Scale", 1.0); return params; } @Override public void init() { q = new double[4]; param_Fields = ((String) parameters.get("Fields")).split(WHITESPACE_RE); param_Scale = (Double) parameters.get("Scale"); String showStr = ((String) parameters.get("Show")).toUpperCase(); show = new boolean[]{false, false, false}; String[] axes = new String[]{"Roll", "Pitch", "Yaw"}; for (int axis = 0; axis < 3; axis++) { String axisName = axes[axis]; show[axis] = showStr.contains(axisName.substring(0, 1)); if (show[axis]) { addSeries(axisName); } } } @Override public void process(double time, Map<String, Object> update) { if (param_Fields.length < 4) { return; } for (int i = 0; i < 4; i++) { Number v = (Number) update.get(param_Fields[i]); if (v == null) { return; } q[i] = v.doubleValue(); } double[] euler = RotationConversion.eulerAnglesByQuaternion(q); int plot_idx = 0; for (int axis = 0; axis < 3; axis++) { if (show[axis]) { addPoint(plot_idx++, time, euler[axis] * param_Scale); } } } }