<phyphox xmlns="http://phyphox.org/xml" version="1.7" locale="en"> <title>Velocity-Time-Graphs</title> <icon>3</icon> <category>Walk the graph</category> <description> Test experiment for LiDAR development. Select one of three different graphs to walk along. A score in % indicates how well graph and motion match. </description> <data-containers> <container size="1" init="1" static="false">button</container> <container size="2">tpreview</container> <container size="1">lastx</container> <container size="2">preview</container> <container size="0">xinmeter</container> <container size="0">xin</container> <container size="0">tin</container> <container size="1">tlast</container> <container size="1">tinfirst</container> <container size="1">newoffset</container> <container size="1" init="-1000">offset</container> <container size="0">tcorrected</container> <container size="0">x</container> <container size="0">t</container> <container size="0">xshow</container> <container size="0">tshow</container> <container size="1" init="0.1">dt</container> <!-- Schrittweite für Glättung (kann normalerweise so bleiben) --> <container size="1" init="0.5">d</container> <!-- Breite der Glättung in Sekunden --> <container size="0">tout</container> <container size="0">xout</container> <container size="0">vout</container> <container size="0">aout</container> <container size="0">toutpreview</container> <container size="0">xoutpreview</container> <container size="0">voutpreview</container> <container size="0">aoutpreview</container> <container size="1" init="0" static="true">linear_start</container> <container size="1" init="12" static="true">linear_stop</container> <container size="0" static="true">linear_time</container> <container size="0" static="true">linear</container> <container size="0" static="true">linear_v</container> <container size="1" init="0" static="true">sin_start</container> <container size="1" init="14" static="true">sin_stop</container> <container size="0" static="true">sin_time</container> <container size="0" static="true">sin</container> <container size="0" static="true">sin_v</container> <container size="1" init="0" static="true">piece_start</container> <container size="1" init="13" static="true">piece_stop</container> <container size="0" static="true">piece_time</container> <container size="0" static="true">piece</container> <container size="0" static="true">piece_v</container> <container size="1" init="0">plotselect</container> <container size="0">reference_plot_time</container> <container size="0">reference_plot</container> <container size="0">reference_plot_v</container> <container size="1">newsmoothstart</container> <container size="1">newsmoothstop</container> <container size="1">tmaxsmooth</container> <container size="101">newsmoothti100</container> <container size="101">newsmoothti</container> <container size="101">newsmoothxi</container> <container size="101">newsmoothvi</container> <container size="101">newsmoothai</container> <container size="101">incompletesmoothti</container> <container size="101">incompletesmoothxi</container> <container size="101">incompletesmoothvi</container> <container size="101">incompletesmoothai</container> <container size="1">temp</container> <container size="0">scorable_time</container> <container size="0">scorable_data</container> <container size="0">scorable_ref</container> <container size="0">scores</container> <container size="1">score</container> </data-containers> <input> <depth x1="0.4" x2="0.6" y1="0.4" y2="0.6" mode="average" smooth="false"> <output component="z">xinmeter</output> <output component="t">tin</output> </depth> </input> <analysis> <multiply> <input clear="true">xinmeter</input> <input type="value">100</input> <output>xin</output> </multiply> <!-- VORSCHAU DER POSITION --> <append> <input clear="false">xin</input> <output clear="false">lastx</output> </append> <append> <input clear="false">reference_plot_time</input> <input type="value">0</input> <output clear="false">tpreview</output> </append> <append> <input clear="false">lastx</input> <input clear="false">lastx</input> <output clear="false">preview</output> </append> <!-- VORGABE-KURVE --> <!-- Gerade --> <formula formula="([2]-[1])/[3]+1"> <input clear="false">linear_start</input> <input clear="false">linear_stop</input> <input clear="false">dt</input> <output>temp</output> </formula> <ramp> <input as="start" clear="false">linear_start</input> <input as="stop" clear="false">linear_stop</input> <input as="length">temp</input> <output>linear_time</output> </ramp> <formula formula="1"> <!-- Formel für die Vorgabekurve. Normalerweise muss nur diese Zeile geändert werden. Start und Stop weiter oben <data-containers> ändern. --> <input clear="false">linear_time</input> <output>linear</output> </formula> <formula formula="((heaviside([1_]-0)*heaviside(6-[1_])/(6-0)*300) + (heaviside([1_]-6)*heaviside(12-[1_])/(12-6)*1)) / max(min(abs([1_]-6)*1000,1),0)"> <!-- Formel für die Vorgabekurve. Normalerweise muss nur diese Zeile geändert werden. Start und Stop weiter oben <data-containers> ändern. --> <input clear="false">linear_time</input> <output>linear_v</output> </formula> <!-- Sinus --> <formula formula="([2]-[1])/[3]+1"> <input clear="false">sin_start</input> <input clear="false">sin_stop</input> <input clear="false">dt</input> <output>temp</output> </formula> <ramp> <input as="start" clear="false">sin_start</input> <input as="stop" clear="false">sin_stop</input> <input as="length">temp</input> <output>sin_time</output> </ramp> <formula formula="200*(sin(2*3.14*[1_]/5)+1)+100"> <!-- Formel für die Vorgabekurve. Normalerweise muss nur diese Zeile geändert werden. Start und Stop weiter oben <data-containers> ändern. --> <input clear="false">sin_time</input> <output>sin</output> </formula> <formula formula="((heaviside([1_]-0)*heaviside(4-[1_])/(4-0)*1) + (heaviside([1_]-4)*heaviside(10-[1_])/(10-4)*300) + (heaviside([1_]-10)*heaviside(14-[1_])/(14-10)*1)) / max(min(abs([1_]-4)*1000,1),0) * max(min(abs([1_]-10)*1000,1),0)"> <!-- Formel für die Vorgabekurve. Normalerweise muss nur diese Zeile geändert werden. Start und Stop weiter oben <data-containers> ändern. --> <input clear="false">sin_time</input> <output>sin_v</output> </formula> <!-- Abschnittsweise --> <formula formula="([2]-[1])/[3]+1"> <input clear="false">piece_start</input> <input clear="false">piece_stop</input> <input clear="false">dt</input> <output>temp</output> </formula> <ramp> <input as="start" clear="false">piece_start</input> <input as="stop" clear="false">piece_stop</input> <input as="length">temp</input> <output>piece_time</output> </ramp> <formula formula="100 + (min(max([1_],0),5)-0)/(5-0)*100 - (min(max([1_],5),7)-5)/(7-5)*100 + (min(max([1_],8),10)-8)/(10-8)*200"> <!-- Formel für die Vorgabekurve. Normalerweise muss nur diese Zeile geändert werden. Start und Stop weiter oben <data-containers> ändern. --> <input clear="false">piece_time</input> <output>piece</output> </formula> <formula formula="(heaviside([1_]-0)*heaviside(5-[1_])/(5-0)*100 + heaviside([1_]-5)*heaviside(13-[1_])/(13-5)*400) / max(min(abs([1_]-5)*1000,1),0)"> <!-- Formel für die Vorgabekurve. Normalerweise muss nur diese Zeile geändert werden. Start und Stop weiter oben <data-containers> ändern. --> <input clear="false">piece_time</input> <output>piece_v</output> </formula> <!-- Auswahl des Nutzers (linear, sinus, piecewise) übernehmen --> <if equal="true"> <input clear="false">plotselect</input> <input type="value">0</input> <input type="empty" /> <output clear="true">reference_plot</output> </if> <if equal="true"> <input clear="false">plotselect</input> <input type="value">0</input> <input type="empty" /> <output clear="true">reference_plot_v</output> </if> <if equal="true"> <input clear="false">plotselect</input> <input type="value">1</input> <input clear="false">linear</input> <output clear="true">reference_plot</output> </if> <if equal="true"> <input clear="false">plotselect</input> <input type="value">1</input> <input clear="false">linear_v</input> <output clear="true">reference_plot_v</output> </if> <if equal="true"> <input clear="false">plotselect</input> <input type="value">1</input> <input clear="false">linear_time</input> <output clear="true">reference_plot_time</output> </if> <if equal="true"> <input clear="false">plotselect</input> <input type="value">2</input> <input clear="false">sin</input> <output clear="true">reference_plot</output> </if> <if equal="true"> <input clear="false">plotselect</input> <input type="value">2</input> <input clear="false">sin_v</input> <output clear="true">reference_plot_v</output> </if> <if equal="true"> <input clear="false">plotselect</input> <input type="value">2</input> <input clear="false">sin_time</input> <output clear="true">reference_plot_time</output> </if> <if equal="true"> <input clear="false">plotselect</input> <input type="value">3</input> <input clear="false">piece</input> <output clear="true">reference_plot</output> </if> <if equal="true"> <input clear="false">plotselect</input> <input type="value">3</input> <input clear="false">piece_v</input> <output clear="true">reference_plot_v</output> </if> <if equal="true"> <input clear="false">plotselect</input> <input type="value">3</input> <input clear="false">piece_time</input> <output clear="true">reference_plot_time</output> </if> <!-- MESSWERTE --> <!-- Ersten Wert auf Null setzen und Button berücksichtigen --> <first> <input clear="false">tin</input> <output>tinfirst</output> <!-- First timestamp of new data from Arduino. This is in units of the Arduino and will have an offset --> </first> <append> <input type="value">-3</input> <!-- Startzeit für den allerersten Datenpunkt --> <input clear="false">t</input> <output>tlast</output> <!-- Last timestamp already stored or start value. This is in units of the x axis --> </append> <formula formula="[1]-[2]-0.05"> <input clear="false">tinfirst</input> <input clear="false">tlast</input> <output clear="true">newoffset</output> <!-- Possible new offset to continue existing data if there is no valid offset --> </formula> <if less="true"> <input clear="false">offset</input> <input type="value">-100</input> <input clear="false">newoffset</input> <!-- Set offset to newoffset if it is no longer valid --> <output clear="false">offset</output> </if> <subtract> <input clear="true">tin</input> <input clear="false">offset</input> <output clear="true">tcorrected</output> <!-- Timestamps corresponding to xin data, aligned such that it continues any previous measurement. --> </subtract> <if equal="true"> <input clear="false">button</input> <input type="value">0</input> <input type="value">-1000</input> <output clear="false">offset</output> <!-- If the button is not pressed, reset the offset --> </if> <if equal="true"> <input clear="false">button</input> <input type="value">0</input> <input type="empty" /> <output clear="true">tcorrected</output> <!-- If the button is not pressed, clear incoming data --> </if> <if equal="true"> <input clear="false">button</input> <input type="value">0</input> <input type="empty" /> <output clear="true">xin</output> <!-- If the button is not pressed, clear incoming data --> </if> <append> <input clear="true">xin</input> <output clear="false">x</output> <!-- Append new data if it is still there... --> </append> <append> <input clear="true">tcorrected</input> <output clear="false">t</output> <!-- Append new data if it is still there... --> </append> <!-- Neue Stützstellen für Glättung suchen --> <append> <input type="value">0</input> <input clear="false">tout</input> <output>temp</output> <!-- Letzter schon berechneter Glättungswert --> </append> <add> <input>temp</input> <input clear="false">dt</input> <output>newsmoothstart</output> <!-- Erster zu berechnender Glättungswert --> </add> <append> <input type="value">0</input> <input clear="false">t</input> <output>temp</output> <!-- Letzter Rohdatenwert, der schon aufgenommen wurde --> </append> <subtract> <input>temp</input> <input clear="false">d</input> <output>tmaxsmooth</output> <!-- Maximale Zeit, bis zu der eine Glättung schon sinnvoll wäre --> </subtract> <formula formula="[1]+100*[2]"> <input clear="false">newsmoothstart</input> <input clear="false">dt</input> <output>newsmoothstop</output> <!-- Höchster der möglichen neuen Glättungswerte, der aber weit hinter den sinnvollen liegen kann --> </formula> <ramp> <input as="start">newsmoothstart</input> <input as="stop">newsmoothstop</input> <output>newsmoothti100</output> <!-- Mögliche neue Glättungswerte --> </ramp> <rangefilter> <input clear="false">newsmoothti100</input> <input as="max" clear="false">tmaxsmooth</input> <output>newsmoothti</output> <!-- Die Zeiten, zu denen wir nun wirklich glätten --> </rangefilter> <append> <input type="value">0</input> <input clear="false">t</input> <output>temp</output> <!-- Erneut letzter Rohdatenwert, der schon aufgenommen wurde --> </append> <rangefilter> <input>newsmoothti100</input> <input as="min" clear="false">tmaxsmooth</input> <input as="max">temp</input> <output>incompletesmoothti</output> <!-- Die Zeiten für neuere Datenpunkt, die wir nur als Vorschau glätten --> </rangefilter> <!-- Glätten --> <loess> <input as="x" clear="false">t</input> <input as="y" clear="false">x</input> <input as="xi" clear="false">newsmoothti</input> <input as="d" clear="false">d</input> <output as="yi0">newsmoothxi</output> <output as="yi1">newsmoothvi</output> <output as="yi2">newsmoothai</output> </loess> <loess> <input as="x" clear="false">t</input> <input as="y" clear="false">x</input> <input as="xi" clear="false">incompletesmoothti</input> <input as="d" clear="false">d</input> <output as="yi0">incompletesmoothxi</output> <output as="yi1">incompletesmoothvi</output> <output as="yi2">incompletesmoothai</output> </loess> <!-- Ergebnisse anhängen --> <append> <input>newsmoothti</input> <output clear="false">tout</output> </append> <append> <input>newsmoothxi</input> <output clear="false">xout</output> </append> <append> <input>newsmoothvi</input> <output clear="false">vout</output> </append> <append> <input>newsmoothai</input> <output clear="false">aout</output> </append> <!-- Puffer mit finalen Ergebnissen und Vorschau-Ergebnissen --> <append> <input clear="false">tout</input> <input clear="true">incompletesmoothti</input> <output clear="true">toutpreview</output> </append> <append> <input clear="false">xout</input> <input clear="true">incompletesmoothxi</input> <output clear="true">xoutpreview</output> </append> <append> <input clear="false">vout</input> <input clear="true">incompletesmoothvi</input> <output clear="true">voutpreview</output> </append> <append> <input clear="false">aout</input> <input clear="true">incompletesmoothai</input> <output clear="true">aoutpreview</output> </append> <!-- SCORE --> <rangefilter> <input clear="false">reference_plot_time</input> <!-- Limit the time datapoints for the score to the reference times within the range of already gathered data --> <input as="max" clear="true">tmaxsmooth</input> <input clear="false">reference_plot</input> <output>scorable_time</output> <output>scorable_ref</output> </rangefilter> <interpolate method="linear"> <input clear="false" as="x">tout</input> <input clear="false" as="y">xout</input> <input clear="false" as="xi">scorable_time</input> <!-- Interpolate data points from the user in the places of the reference curve --> <output>scorable_data</output> </interpolate> <formula formula="min(max((50-abs([1_]-[2_])+10)/50, 0),1)"> <!-- (50-...+10)/50 sorgt dafür, dass es ab 6 cm Abstand 0 Punkt gibt und bei 1 cm Abstand die volle Punktzahl von 1 Punkt. Min und max verhindern, dass der Wert kleiner 0 oder größer 1 wird. --> <input clear="false">scorable_data</input> <input clear="false">scorable_ref</input> <output>scores</output> <!-- Assign a score in the range of 0 to 1 to each compared point. --> </formula> <average> <input clear="false">scores</input> <!-- Final score is the average of individual scores --> <output as="average">score</output> </average> <append> <input clear="false">t</input> <output>tshow</output> </append> <append> <input clear="false">x</input> <output>xshow</output> </append> <!-- Fill some graphs with empty data to allow plotting if we do not yet have data --> <count> <input clear="false">toutpreview</input> <output>temp</output> </count> <if less="true"> <input clear="false">temp</input> <input type="value">1</input> <input type="value">0</input> <output clear="false">toutpreview</output> </if> <if less="true"> <input clear="false">temp</input> <input type="value">1</input> <input type="value">0</input> <output clear="false">xoutpreview</output> </if> <count> <input clear="false">tshow</input> <output>temp</output> </count> <if less="true"> <input clear="false">temp</input> <input type="value">1</input> <input type="value">0</input> <output clear="false">tshow</output> </if> <if less="true"> <input clear="false">temp</input> <input type="value">1</input> <input type="value">0</input> <output clear="false">xshow</output> </if> </analysis> <views> <view label="Walk the Graph"> <value label="v-t-Score" size="2" precision="0" unit="%" factor="100"> <input>score</input> </value> <button label="(Re)Start"> <input type="value">-1000</input> <output>offset</output> <input type="empty" /> <output>t</output> <input type="empty" /> <output>x</output> <input type="empty" /> <output>tout</output> <input type="empty" /> <output>xout</output> <input type="empty" /> <output>vout</output> <input type="empty" /> <output>aout</output> </button> <graph label="Velocity-Time-Diagram" partialUpdate="true" labelX="Time" labelY="Velocity" unitX="s" precisionX="0" unitY="cm/s" scaleMinX="fixed" minX="-3" scaleMaxX="fixed" maxX="17" scaleMinY="fixed" minY="-100" scaleMaxY="fixed" maxY="100" aspectRatio="1.6"> <input axis="x" lineWidth="2">toutpreview</input> <input axis="y">voutpreview</input> <input axis="x" color="green">reference_plot_time</input> <input axis="y">reference_plot_v</input> </graph> <graph label="Distance-Time-Diagram" partialUpdate="false" labelX="Time" labelY="Distance" unitX="s" precisionX="0" unitY="cm" scaleMinX="fixed" minX="-3" scaleMaxX="fixed" maxX="17" scaleMinY="fixed" minY="0" scaleMaxY="fixed" maxY="700" aspectRatio="1.6"> <input axis="x" lineWidth="2">toutpreview</input> <input axis="y">xoutpreview</input> <input axis="x" style="dots" color="white">tshow</input> <input axis="y">xshow</input> <input axis="x" color="yellow">tpreview</input> <input axis="y">preview</input> </graph> <separator height="1" /> <depth-gui label="Control" /> </view> <view label="Select Graph"> <button label="Off"> <input type="value">0</input> <output>plotselect</output> </button> <button label="Graph 1"> <input type="value">1</input> <output>plotselect</output> </button> <button label="Graph 2"> <input type="value">2</input> <output>plotselect</output> </button> <button label="Graph 3"> <input type="value">3</input> <output>plotselect</output> </button> </view> </views> <export> <set name="Data"> <data name="t">tout</data> <data name="s">xout</data> <data name="v">vout</data> <data name="a">aout</data> </set> </export> </phyphox>