Remove tuning web files
This commit is contained in:
2
TeamCode/src/main/assets/tuning/.gitignore
vendored
2
TeamCode/src/main/assets/tuning/.gitignore
vendored
@ -1,2 +0,0 @@
|
|||||||
latest.json
|
|
||||||
*.py
|
|
@ -1,264 +0,0 @@
|
|||||||
// TODO: time-interpolate data
|
|
||||||
|
|
||||||
// https://en.wikipedia.org/wiki/Kahan_summation_algorithm#The_algorithm
|
|
||||||
function kahanSum(xs) {
|
|
||||||
let sum = 0;
|
|
||||||
let c = 0;
|
|
||||||
|
|
||||||
for (let i = 0; i < xs.length; i++) {
|
|
||||||
const y = xs[i] - c;
|
|
||||||
const t = sum + y;
|
|
||||||
c = (t - sum) - y;
|
|
||||||
sum = t;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://en.wikipedia.org/wiki/Simple_linear_regression#Simple_linear_regression_without_the_intercept_term_(single_regressor)
|
|
||||||
function fitLinearNoIntercept(xs, ys) {
|
|
||||||
return kahanSum(
|
|
||||||
xs.map((x, i) => x * ys[i])
|
|
||||||
) / kahanSum(
|
|
||||||
xs.map(x => x * x)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function fitLinearWithScaling(xs, ys) {
|
|
||||||
const xOffset = xs.reduce((a, b) => a + b, 0) / xs.length;
|
|
||||||
const yOffset = ys.reduce((a, b) => a + b, 0) / ys.length;
|
|
||||||
|
|
||||||
const xScale = xs.reduce((acc, x) => Math.max(acc, Math.abs(x - xOffset)), 0);
|
|
||||||
const yScale = ys.reduce((acc, y) => Math.max(acc, Math.abs(y - yOffset)), 0);
|
|
||||||
|
|
||||||
const data = xs.map((x, i) => [(x - xOffset) / xScale, (ys[i] - yOffset) / yScale]);
|
|
||||||
|
|
||||||
const result = regression.linear(data);
|
|
||||||
const [m, b] = result.equation;
|
|
||||||
|
|
||||||
return [m * yScale / xScale, b * yScale - m * xOffset * yScale / xScale + yOffset];
|
|
||||||
}
|
|
||||||
|
|
||||||
// no output for first pair
|
|
||||||
function numDerivOnline(xs, ys) {
|
|
||||||
if (xs.length !== ys.length) {
|
|
||||||
throw new Error(`${xs.length} !== ${ys.length}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ys
|
|
||||||
.slice(1)
|
|
||||||
.map((y, i) => (y - ys[i]) / (xs[i + 1] - xs[i]));
|
|
||||||
}
|
|
||||||
|
|
||||||
// no output for first or last pair
|
|
||||||
function numDerivOffline(xs, ys) {
|
|
||||||
return ys
|
|
||||||
.slice(2)
|
|
||||||
.map((y, i) => (y - ys[i]) / (xs[i + 2] - xs[i]));
|
|
||||||
}
|
|
||||||
|
|
||||||
const CPS_STEP = 0x10000;
|
|
||||||
|
|
||||||
function inverseOverflow(input, estimate) {
|
|
||||||
// convert to uint16
|
|
||||||
let real = input & 0xffff;
|
|
||||||
// initial, modulo-based correction: it can recover the remainder of 5 of the upper 16 bits
|
|
||||||
// because the velocity is always a multiple of 20 cps due to Expansion Hub's 50ms measurement window
|
|
||||||
real += ((real % 20) / 4) * CPS_STEP;
|
|
||||||
// estimate-based correction: it finds the nearest multiple of 5 to correct the upper bits by
|
|
||||||
real += Math.round((estimate - real) / (5 * CPS_STEP)) * 5 * CPS_STEP;
|
|
||||||
return real;
|
|
||||||
}
|
|
||||||
|
|
||||||
// no output for first or last pair
|
|
||||||
function fixVels(ts, xs, vs) {
|
|
||||||
if (ts.length !== xs.length || ts.length !== vs.length) {
|
|
||||||
throw new Error();
|
|
||||||
}
|
|
||||||
|
|
||||||
return numDerivOffline(ts, xs).map((est, i) => inverseOverflow(vs[i + 1], est));
|
|
||||||
}
|
|
||||||
|
|
||||||
// see https://github.com/FIRST-Tech-Challenge/FtcRobotController/issues/617
|
|
||||||
function fixAngVels(vs) {
|
|
||||||
if (vs.length === 0) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
let offset = 0;
|
|
||||||
lastV = vs[0];
|
|
||||||
const vsFixed = [lastV];
|
|
||||||
for (let i = 1; i < vs.length; i++) {
|
|
||||||
if (Math.abs(vs[i] - lastV) > Math.PI) {
|
|
||||||
offset -= Math.sign(vs[i] - lastV) * 2 * Math.PI;
|
|
||||||
}
|
|
||||||
vsFixed.push(offset + vs[i]);
|
|
||||||
lastV = vs[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
return vsFixed;
|
|
||||||
}
|
|
||||||
|
|
||||||
// data comes in pairs
|
|
||||||
function newLinearRegressionChart(container, xs, ys, options, onChange) {
|
|
||||||
if (xs.length !== ys.length) {
|
|
||||||
throw new Error(`${xs.length} !== ${ys.length}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
// cribbed from https://plotly.com/javascript/plotlyjs-events/#select-event
|
|
||||||
const color = '#777';
|
|
||||||
const colorLight = '#bbb';
|
|
||||||
|
|
||||||
let mask = xs.map(() => true);
|
|
||||||
|
|
||||||
function fit(xs, ys) {
|
|
||||||
return options.noIntercept ? [fitLinearNoIntercept(xs, ys), 0] : fitLinearWithScaling(xs, ys);
|
|
||||||
}
|
|
||||||
|
|
||||||
const [m, b] = fit(xs, ys);
|
|
||||||
|
|
||||||
if (onChange) onChange(m, b);
|
|
||||||
|
|
||||||
const minX = xs.reduce((a, b) => Math.min(a, b), 0);
|
|
||||||
const maxX = xs.reduce((a, b) => Math.max(a, b), 0);
|
|
||||||
|
|
||||||
const chartDiv = document.createElement('div');
|
|
||||||
const width = Math.max(0, window.innerWidth - 50);
|
|
||||||
Plotly.newPlot(chartDiv, [{
|
|
||||||
type: 'scatter',
|
|
||||||
mode: 'markers',
|
|
||||||
x: xs,
|
|
||||||
y: ys,
|
|
||||||
name: 'Samples',
|
|
||||||
// markers seem to respond to selection
|
|
||||||
marker: {color: mask.map(b => b ? color : colorLight), size: 5},
|
|
||||||
}, {
|
|
||||||
type: 'scatter',
|
|
||||||
mode: 'lines',
|
|
||||||
x: [minX, maxX],
|
|
||||||
y: [m * minX + b, m * maxX + b],
|
|
||||||
name: 'Regression Line',
|
|
||||||
line: {color: 'red'}
|
|
||||||
}], {
|
|
||||||
title: options.title || '',
|
|
||||||
// sets the starting tool from the modebar
|
|
||||||
dragmode: 'select',
|
|
||||||
showlegend: false,
|
|
||||||
hovermode: false,
|
|
||||||
width,
|
|
||||||
height: width * 9 / 16,
|
|
||||||
}, {
|
|
||||||
// 'select2d', 'zoom2d', 'pan2d', 'lasso2d', 'zoomIn2d', 'zoomOut2d', 'autoScale2d', 'resetScale2d' left
|
|
||||||
modeBarButtonsToRemove: [],
|
|
||||||
});
|
|
||||||
|
|
||||||
const results = document.createElement('p');
|
|
||||||
|
|
||||||
function setResultText(m, b) {
|
|
||||||
results.innerText = `${options.slope || 'slope'}: ${m}, ${options.intercept || 'y-intercept'}: ${b}`;
|
|
||||||
}
|
|
||||||
setResultText(m, b);
|
|
||||||
|
|
||||||
function updatePlot() {
|
|
||||||
Plotly.restyle(chartDiv, 'marker.color', [
|
|
||||||
mask.map(b => b ? color : colorLight)
|
|
||||||
], [0]);
|
|
||||||
|
|
||||||
const [m, b] = fit(
|
|
||||||
xs.filter((_, i) => mask[i]),
|
|
||||||
ys.filter((_, i) => mask[i]),
|
|
||||||
);
|
|
||||||
setResultText(m, b);
|
|
||||||
if (onChange) onChange(m, b);
|
|
||||||
|
|
||||||
const minX = xs.reduce((a, b) => Math.min(a, b));
|
|
||||||
const maxX = xs.reduce((a, b) => Math.max(a, b));
|
|
||||||
|
|
||||||
Plotly.restyle(chartDiv, {
|
|
||||||
x: [[minX, maxX]],
|
|
||||||
y: [[m * minX + b, m * maxX + b]],
|
|
||||||
}, [1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
let pendingSelection = null;
|
|
||||||
|
|
||||||
chartDiv.on('plotly_selected', function(eventData) {
|
|
||||||
if (eventData === undefined) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
pendingSelection = eventData;
|
|
||||||
});
|
|
||||||
|
|
||||||
function applyPendingSelection(b) {
|
|
||||||
if (pendingSelection === null) return false;
|
|
||||||
|
|
||||||
for (const pt of pendingSelection.points) {
|
|
||||||
mask[pt.pointIndex] = b;
|
|
||||||
}
|
|
||||||
|
|
||||||
Plotly.restyle(chartDiv, 'selectedpoints', [null], [0]);
|
|
||||||
|
|
||||||
pendingSelection = null;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
const includeButton = document.createElement('button');
|
|
||||||
includeButton.innerText = '[i]nclude';
|
|
||||||
includeButton.addEventListener('click', () => {
|
|
||||||
if (!applyPendingSelection(true)) return;
|
|
||||||
updatePlot();
|
|
||||||
});
|
|
||||||
|
|
||||||
const excludeButton = document.createElement('button');
|
|
||||||
excludeButton.innerText = '[e]xclude';
|
|
||||||
excludeButton.addEventListener('click', () => {
|
|
||||||
if (!applyPendingSelection(false)) return;
|
|
||||||
updatePlot();
|
|
||||||
});
|
|
||||||
|
|
||||||
document.addEventListener('keydown', e => {
|
|
||||||
if (e.key === 'i') {
|
|
||||||
if (!applyPendingSelection(true)) return;
|
|
||||||
updatePlot();
|
|
||||||
} else if (e.key === 'e') {
|
|
||||||
if (!applyPendingSelection(false)) return;
|
|
||||||
updatePlot();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
while (container.firstChild) {
|
|
||||||
container.removeChild(container.firstChild);
|
|
||||||
}
|
|
||||||
|
|
||||||
const buttons = document.createElement('div');
|
|
||||||
buttons.appendChild(includeButton);
|
|
||||||
buttons.appendChild(excludeButton);
|
|
||||||
|
|
||||||
const bar = document.createElement('div');
|
|
||||||
bar.setAttribute('class', 'bar');
|
|
||||||
bar.appendChild(buttons);
|
|
||||||
|
|
||||||
bar.appendChild(results);
|
|
||||||
|
|
||||||
container.appendChild(bar);
|
|
||||||
container.appendChild(chartDiv);
|
|
||||||
|
|
||||||
return function(xsNew, ysNew) {
|
|
||||||
if (xsNew.length !== ysNew.length) {
|
|
||||||
throw new Error(`${xsNew.length} !== ${ysNew.length}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
xs = xsNew;
|
|
||||||
ys = ysNew;
|
|
||||||
mask = xs.map(() => true);
|
|
||||||
|
|
||||||
Plotly.restyle(chartDiv, {
|
|
||||||
x: [xs],
|
|
||||||
y: [ys],
|
|
||||||
}, [0]);
|
|
||||||
|
|
||||||
updatePlot();
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,183 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>RR Dead Wheel Angular Ramp Regression</title>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.content {
|
|
||||||
margin: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
header {
|
|
||||||
max-width: 600px;
|
|
||||||
margin: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bar {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
fieldset {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
details, a {
|
|
||||||
display: block;
|
|
||||||
margin: 1rem 0 1rem 0;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<script src="/tuning/plotly-2.12.1.min.js"></script>
|
|
||||||
|
|
||||||
<!-- https://tom-alexander.github.io/regression-js/ -->
|
|
||||||
<script src="/tuning/regression-2.0.1.min.js"></script>
|
|
||||||
|
|
||||||
<!-- <script src="/tuning/common.js"></script> -->
|
|
||||||
<script src="common.js"></script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="content">
|
|
||||||
<header>
|
|
||||||
<h1>RR Dead Wheel Angular Ramp Regression</h1>
|
|
||||||
<details></details>
|
|
||||||
|
|
||||||
<div id="download"></div>
|
|
||||||
|
|
||||||
<fieldset>
|
|
||||||
<legend>Feedforward Parameters</legend>
|
|
||||||
<div>
|
|
||||||
kV: <input id="kv" type="text" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
kS: <input id="ks" type="text" />
|
|
||||||
</div>
|
|
||||||
<input id="update" type="button" value="update" />
|
|
||||||
</fieldset>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<button id="latest">Latest</button>
|
|
||||||
<input id="browse" type="file" accept="application/json">
|
|
||||||
</p>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<div id="trackWidthChart"></div>
|
|
||||||
|
|
||||||
<div id="deadWheelCharts"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
function loadRegression(data) {
|
|
||||||
const [_, angVels] = data.angVels.reduce((acc, vsArg) => {
|
|
||||||
const vs = fixAngVels(vsArg.values.slice(0, -1)).map(v => Math.abs(v));
|
|
||||||
const maxV = vs.reduce((acc, v) => Math.max(acc, v), 0);
|
|
||||||
const [accMaxV, _] = acc;
|
|
||||||
if (maxV >= accMaxV) {
|
|
||||||
return [maxV, vs];
|
|
||||||
}
|
|
||||||
return acc;
|
|
||||||
}, [0, []]);
|
|
||||||
|
|
||||||
const deadWheelCharts = document.getElementById('deadWheelCharts');
|
|
||||||
data.parEncVels.forEach((vs, i) => {
|
|
||||||
const div = document.createElement('div');
|
|
||||||
newLinearRegressionChart(div,
|
|
||||||
angVels.slice(1, -1),
|
|
||||||
fixVels(
|
|
||||||
vs.times.slice(0, -1),
|
|
||||||
data.parEncPositions[i].values.slice(0, -1),
|
|
||||||
vs.values.slice(0, -1)
|
|
||||||
),
|
|
||||||
{title: `Parallel Wheel ${i} Regression`, slope: 'y-position', noIntercept: true});
|
|
||||||
deadWheelCharts.appendChild(div);
|
|
||||||
});
|
|
||||||
data.perpEncVels.forEach((vs, i) => {
|
|
||||||
const div = document.createElement('div');
|
|
||||||
newLinearRegressionChart(div,
|
|
||||||
angVels.slice(1, -1),
|
|
||||||
fixVels(
|
|
||||||
vs.times.slice(0, -1),
|
|
||||||
data.perpEncPositions[i].values.slice(0, -1),
|
|
||||||
vs.values.slice(0, -1)
|
|
||||||
),
|
|
||||||
{title: `Perpendicular Wheel ${i} Regression`, slope: 'x-position', noIntercept: true});
|
|
||||||
deadWheelCharts.appendChild(div);
|
|
||||||
});
|
|
||||||
|
|
||||||
const setParams = (() => {
|
|
||||||
const allPowers = [...data.leftPowers, ...data.rightPowers];
|
|
||||||
const appliedVoltages = data.voltages.values.slice(0, -1).map((v, i) =>
|
|
||||||
allPowers.reduce((acc, ps) => Math.max(acc, ps.values[i]), 0) * v);
|
|
||||||
|
|
||||||
const setTrackWidthData = newLinearRegressionChart(
|
|
||||||
document.getElementById('trackWidthChart'),
|
|
||||||
[], [],
|
|
||||||
{title: 'Track Width Regression', slope: 'track width', noIntercept: true}
|
|
||||||
);
|
|
||||||
|
|
||||||
return (kV, kS) => setTrackWidthData(angVels, appliedVoltages.map((v, i) =>
|
|
||||||
(v - kS) / kV * (data.type === 'mecanum' ? 2 : 1)));
|
|
||||||
})();
|
|
||||||
|
|
||||||
const kvInput = document.getElementById('kv');
|
|
||||||
const ksInput = document.getElementById('ks');
|
|
||||||
document.getElementById('update').addEventListener('click', () => {
|
|
||||||
setParams(parseFloat(kvInput.value), parseFloat(ksInput.value));
|
|
||||||
});
|
|
||||||
|
|
||||||
setParams(parseFloat(kvInput.value), parseFloat(ksInput.value));
|
|
||||||
}
|
|
||||||
|
|
||||||
const latestButton = document.getElementById('latest');
|
|
||||||
latestButton.addEventListener('click', function() {
|
|
||||||
fetch('/tuning/angular-ramp/latest.json')
|
|
||||||
.then(res => {
|
|
||||||
if (res.ok) {
|
|
||||||
const filename = res.headers.get('X-Filename');
|
|
||||||
|
|
||||||
const a = document.createElement('a');
|
|
||||||
a.innerText = 'Download';
|
|
||||||
a.href = `/tuning/angular-ramp/${filename}`;
|
|
||||||
a.download = `angular-ramp-${filename}`;
|
|
||||||
|
|
||||||
const download = document.getElementById('download');
|
|
||||||
download.innerHTML = '';
|
|
||||||
download.appendChild(a);
|
|
||||||
|
|
||||||
return res.json();
|
|
||||||
} else {
|
|
||||||
document.getElementById('trackWidthChart').innerText = 'No data files found';
|
|
||||||
throw new Error();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.then(loadRegression)
|
|
||||||
.catch((e) => {
|
|
||||||
const deadWheelCharts = document.getElementById('deadWheelCharts');
|
|
||||||
deadWheelCharts.innerHTML = '';
|
|
||||||
|
|
||||||
console.log(e);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const browseInput = document.getElementById('browse');
|
|
||||||
browseInput.addEventListener('change', function(evt) {
|
|
||||||
const reader = new FileReader();
|
|
||||||
reader.onload = function() {
|
|
||||||
loadRegression(JSON.parse(reader.result.trim()));
|
|
||||||
};
|
|
||||||
|
|
||||||
reader.readAsText(browseInput.files[0]);
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,148 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>RR Drive Encoder Angular Ramp Regression</title>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.content {
|
|
||||||
margin: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
header {
|
|
||||||
max-width: 600px;
|
|
||||||
margin: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bar {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
details, a {
|
|
||||||
display: block;
|
|
||||||
margin: 1rem 0 1rem 0;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<script src="/tuning/plotly-2.12.1.min.js"></script>
|
|
||||||
|
|
||||||
<!-- https://tom-alexander.github.io/regression-js/ -->
|
|
||||||
<script src="/tuning/regression-2.0.1.min.js"></script>
|
|
||||||
|
|
||||||
<!-- <script src="/tuning/common.js"></script> -->
|
|
||||||
<script src="common.js"></script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="content">
|
|
||||||
<header>
|
|
||||||
<h1>RR Drive Encoder Angular Ramp Regression</h1>
|
|
||||||
<details></details>
|
|
||||||
|
|
||||||
<div id="download"></div>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<button id="latest">Latest</button>
|
|
||||||
<input id="browse" type="file" accept="application/json">
|
|
||||||
</p>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<div id="rampChart"></div>
|
|
||||||
<div id="trackWidthChart"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
function loadRegression(data) {
|
|
||||||
const leftEncVels = data.leftEncVels.map((vs, i) =>
|
|
||||||
fixVels(vs.times.slice(0, -1), data.leftEncPositions[i].values.slice(0, -1), vs.values.slice(0, -1)));
|
|
||||||
const rightEncVels = data.rightEncVels.map((vs, i) =>
|
|
||||||
fixVels(vs.times.slice(0, -1), data.rightEncPositions[i].values.slice(0, -1), vs.values.slice(0, -1)));
|
|
||||||
|
|
||||||
newLinearRegressionChart(
|
|
||||||
document.getElementById('rampChart'),
|
|
||||||
[
|
|
||||||
...leftEncVels.flatMap(vs => vs.values.slice(0, -1).map(v => -v)),
|
|
||||||
...rightEncVels.flatMap(vs => vs.values.slice(0, -1)),
|
|
||||||
],
|
|
||||||
[
|
|
||||||
...data.leftPowers.flatMap(ps => {
|
|
||||||
const psNew = ps.values.slice(0, -1).map((p, i) => -p * data.voltages.values[i]);
|
|
||||||
return psNew.slice(1, -1);
|
|
||||||
}),
|
|
||||||
...data.rightPowers.flatMap(ps => {
|
|
||||||
const psNew = ps.values.slice(0, -1).map((p, i) => p * data.voltages.values[i]);
|
|
||||||
return psNew.slice(1, -1);
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
{title: 'Ramp Regression', slope: 'kV', intercept: 'kS'}
|
|
||||||
);
|
|
||||||
|
|
||||||
const p = data.angVels.reduce((acc, vsArg) => {
|
|
||||||
const vs = fixAngVels(vsArg.values).map(v => Math.abs(v));
|
|
||||||
const maxV = vs.reduce((acc, v) => Math.max(acc, v), 0);
|
|
||||||
const [accMaxV, _] = acc;
|
|
||||||
if (maxV >= accMaxV) {
|
|
||||||
return [maxV, vs];
|
|
||||||
}
|
|
||||||
return acc;
|
|
||||||
}, [0, []]);
|
|
||||||
const angVels = p[1].slice(1, -1);
|
|
||||||
|
|
||||||
newLinearRegressionChart(
|
|
||||||
document.getElementById('trackWidthChart'),
|
|
||||||
angVels,
|
|
||||||
angVels.map((_, i) =>
|
|
||||||
(leftEncVels.reduce((acc, vs) => acc - vs[i], 0) / data.leftEncVels.length
|
|
||||||
+ rightEncVels.reduce((acc, vs) => acc + vs[i], 0) / data.rightEncVels.length)
|
|
||||||
* (data.type === 'mecanum' ? 0.5 : 1)
|
|
||||||
),
|
|
||||||
{title: 'Track Width Regression', slope: 'track width', noIntercept: true}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const latestButton = document.getElementById('latest');
|
|
||||||
latestButton.addEventListener('click', function() {
|
|
||||||
fetch('/tuning/angular-ramp/latest.json')
|
|
||||||
.then(res => {
|
|
||||||
if (res.ok) {
|
|
||||||
const filename = res.headers.get('X-Filename');
|
|
||||||
|
|
||||||
const a = document.createElement('a');
|
|
||||||
a.innerText = 'Download';
|
|
||||||
a.href = `/tuning/angular-ramp/${filename}`;
|
|
||||||
a.download = `angular-ramp-${filename}`;
|
|
||||||
|
|
||||||
const download = document.getElementById('download');
|
|
||||||
download.innerHTML = '';
|
|
||||||
download.appendChild(a);
|
|
||||||
|
|
||||||
return res.json();
|
|
||||||
} else {
|
|
||||||
document.getElementById('trackWidthChart').innerText = 'No data files found';
|
|
||||||
throw new Error();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.then(loadRegression)
|
|
||||||
.catch(console.log.bind(console));
|
|
||||||
});
|
|
||||||
|
|
||||||
const browseInput = document.getElementById('browse');
|
|
||||||
browseInput.addEventListener('change', function(evt) {
|
|
||||||
const reader = new FileReader();
|
|
||||||
reader.onload = function() {
|
|
||||||
loadRegression(JSON.parse(reader.result.trim()));
|
|
||||||
};
|
|
||||||
|
|
||||||
reader.readAsText(browseInput.files[0]);
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,116 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>RR Forward Ramp Regression</title>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.content {
|
|
||||||
margin: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
header {
|
|
||||||
max-width: 600px;
|
|
||||||
margin: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bar {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
details, a {
|
|
||||||
display: block;
|
|
||||||
margin: 1rem 0 1rem 0;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<script src="/tuning/plotly-2.12.1.min.js"></script>
|
|
||||||
|
|
||||||
<!-- https://tom-alexander.github.io/regression-js/ -->
|
|
||||||
<script src="/tuning/regression-2.0.1.min.js"></script>
|
|
||||||
|
|
||||||
<!-- <script src="/tuning/common.js"></script> -->
|
|
||||||
<script src="common.js"></script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="content">
|
|
||||||
<header>
|
|
||||||
<h1>RR Forward Ramp Regression</h1>
|
|
||||||
<details></details>
|
|
||||||
|
|
||||||
<div id="download"></div>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<button id="latest">Latest</button>
|
|
||||||
<input id="browse" type="file" accept="application/json">
|
|
||||||
</p>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<div id="rampChart"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
function loadRegression(data) {
|
|
||||||
const forwardEncVels = data.forwardEncVels.flatMap((vs, i) =>
|
|
||||||
fixVels(vs.times.slice(0, -1), data.forwardEncPositions[i].values.slice(0, -1), vs.values.slice(0, -1)));
|
|
||||||
const appliedVoltages = data.forwardEncVels.flatMap(() => {
|
|
||||||
const voltages = data.voltages.values.slice(0, -1).map((v, i) =>
|
|
||||||
data.powers.reduce((acc, ps) => Math.max(acc, ps.values[i]), 0) * v);
|
|
||||||
|
|
||||||
return voltages.slice(1, voltages.length - 1);
|
|
||||||
});
|
|
||||||
|
|
||||||
newLinearRegressionChart(
|
|
||||||
document.getElementById('rampChart'),
|
|
||||||
forwardEncVels, appliedVoltages,
|
|
||||||
{title: 'Ramp Regression', slope: 'kV', intercept: 'kS', noIntercept: false}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const latestButton = document.getElementById('latest');
|
|
||||||
latestButton.addEventListener('click', function() {
|
|
||||||
fetch('/tuning/forward-ramp/latest.json')
|
|
||||||
.then(res => {
|
|
||||||
if (res.ok) {
|
|
||||||
const filename = res.headers.get('X-Filename');
|
|
||||||
|
|
||||||
const a = document.createElement('a');
|
|
||||||
a.innerText = 'Download';
|
|
||||||
a.href = `/tuning/forward-ramp/${filename}`;
|
|
||||||
a.download = `forward-ramp-${filename}`;
|
|
||||||
|
|
||||||
const download = document.getElementById('download');
|
|
||||||
download.innerHTML = '';
|
|
||||||
download.appendChild(a);
|
|
||||||
|
|
||||||
return res.json();
|
|
||||||
} else {
|
|
||||||
document.getElementById('rampChart').innerText = 'No data files found';
|
|
||||||
throw new Error();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.then(loadRegression)
|
|
||||||
.catch(console.log.bind(console));
|
|
||||||
});
|
|
||||||
|
|
||||||
const browseInput = document.getElementById('browse');
|
|
||||||
browseInput.addEventListener('change', function(evt) {
|
|
||||||
const reader = new FileReader();
|
|
||||||
reader.onload = function() {
|
|
||||||
loadRegression(JSON.parse(reader.result.trim()));
|
|
||||||
};
|
|
||||||
|
|
||||||
reader.readAsText(browseInput.files[0]);
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,118 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>RR Tests</title>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
#content {
|
|
||||||
max-width: 600px;
|
|
||||||
margin: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bar {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
fieldset {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<script src="/tuning/plotly-2.12.1.min.js"></script>
|
|
||||||
|
|
||||||
<!-- https://tom-alexander.github.io/regression-js/ -->
|
|
||||||
<script src="/tuning/regression-2.0.1.min.js"></script>
|
|
||||||
|
|
||||||
<!-- <script src="/tuning/common.js"></script> -->
|
|
||||||
<script src="common.js"></script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="content">
|
|
||||||
<h1>RR Tests</h1>
|
|
||||||
<p></p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
function newChart(container, xs, ys, options) {
|
|
||||||
if (xs.length !== ys.length) {
|
|
||||||
throw new Error();
|
|
||||||
}
|
|
||||||
|
|
||||||
// cribbed from https://plotly.com/javascript/plotlyjs-events/#select-event
|
|
||||||
const color = '#777';
|
|
||||||
const colorLight = '#bbb';
|
|
||||||
|
|
||||||
const chartDiv = document.createElement('div');
|
|
||||||
Plotly.newPlot(chartDiv, [{
|
|
||||||
type: 'scatter',
|
|
||||||
mode: 'markers',
|
|
||||||
x: xs,
|
|
||||||
y: ys,
|
|
||||||
name: 'Samples',
|
|
||||||
}], {
|
|
||||||
title: options.title || '',
|
|
||||||
// sets the starting tool from the modebar
|
|
||||||
dragmode: 'zoom',
|
|
||||||
showlegend: false,
|
|
||||||
hovermode: false,
|
|
||||||
width: 600,
|
|
||||||
}, {
|
|
||||||
// 'zoom2d', 'select2d', 'resetScale2d' left
|
|
||||||
modeBarButtonsToRemove: ['pan2d', 'lasso2d', 'zoomIn2d', 'zoomOut2d', 'autoScale2d'],
|
|
||||||
});
|
|
||||||
|
|
||||||
container.appendChild(chartDiv);
|
|
||||||
}
|
|
||||||
|
|
||||||
function numDeriv(xs, ys) {
|
|
||||||
const ret = ys.slice(1).map((y, i) => (y - ys[i]) / (xs[i + 1] - xs[i]));
|
|
||||||
ret.unshift(0);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
const params = new URLSearchParams(window.location.search);
|
|
||||||
const online = params.get('online') === 'true';
|
|
||||||
|
|
||||||
fetch(`/tuning/test/${params.get('file')}.csv`)
|
|
||||||
.then(res => res.text())
|
|
||||||
.then(text => {
|
|
||||||
const lines = text.split('\n');
|
|
||||||
const data = lines
|
|
||||||
.slice(1, lines.length - 1)
|
|
||||||
.map(line => line.split(',').map(x => parseFloat(x)))
|
|
||||||
|
|
||||||
const xs = data.map(xs => xs[0]);
|
|
||||||
const vs = data.map(xs => xs[1]);
|
|
||||||
const ts = data.map(xs => xs[2]);
|
|
||||||
|
|
||||||
const container = document.getElementById('content');
|
|
||||||
newChart(container, ts, vs, {title: 'Raw Velocity Over Time'});
|
|
||||||
|
|
||||||
const tsNew = (online ? ts.slice(1) : ts.slice(1, ts.length - 1));
|
|
||||||
const dxdts = (online ? numDerivOnline : numDerivOffline)(ts, xs);
|
|
||||||
newChart(
|
|
||||||
container,
|
|
||||||
tsNew,
|
|
||||||
dxdts,
|
|
||||||
{title: `${online ? 'Online' : 'Offline'} Position Derivative Over Time`}
|
|
||||||
);
|
|
||||||
|
|
||||||
const vsNew = dxdts.map((est, i) => inverseOverflow(vs[i + 1], est));
|
|
||||||
newChart(
|
|
||||||
container,
|
|
||||||
tsNew,
|
|
||||||
vsNew,
|
|
||||||
{title: 'Corrected Velocity Over Time'}
|
|
||||||
);
|
|
||||||
})
|
|
||||||
.catch(console.log.bind(console));
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,219 +0,0 @@
|
|||||||
pos,vel,time
|
|
||||||
248474,-23244.000000,2250.761012
|
|
||||||
256050,-23244.000000,2250.792090
|
|
||||||
261029,-23044.000000,2250.812276
|
|
||||||
265827,-23104.000000,2250.832364
|
|
||||||
270750,-23404.000000,2250.853347
|
|
||||||
275564,-23584.000000,2250.872950
|
|
||||||
280730,-23244.000000,2250.895051
|
|
||||||
285076,-23464.000000,2250.912948
|
|
||||||
289471,-23244.000000,2250.931340
|
|
||||||
295065,-23284.000000,2250.954710
|
|
||||||
299341,-25184.000000,2250.972536
|
|
||||||
304300,-23244.000000,2250.993309
|
|
||||||
308457,-23284.000000,2251.011054
|
|
||||||
313913,-19684.000000,2251.033582
|
|
||||||
318075,-23244.000000,2251.051005
|
|
||||||
323228,-23244.000000,2251.072429
|
|
||||||
327140,-23264.000000,2251.089102
|
|
||||||
333217,-23224.000000,2251.114403
|
|
||||||
337719,-23904.000000,2251.133205
|
|
||||||
342702,-23244.000000,2251.154108
|
|
||||||
347838,-25104.000000,2251.176498
|
|
||||||
352899,-23244.000000,2251.196812
|
|
||||||
356826,-23224.000000,2251.213216
|
|
||||||
361581,-23704.000000,2251.233083
|
|
||||||
368943,-24464.000000,2251.263826
|
|
||||||
373285,-26404.000000,2251.282037
|
|
||||||
379505,-22004.000000,2251.309094
|
|
||||||
383474,-23244.000000,2251.324622
|
|
||||||
387117,-23244.000000,2251.340667
|
|
||||||
391575,-23244.000000,2251.358790
|
|
||||||
396711,-23264.000000,2251.380079
|
|
||||||
401699,-23264.000000,2251.400926
|
|
||||||
406717,-23244.000000,2251.421884
|
|
||||||
409944,-23204.000000,2251.435380
|
|
||||||
413772,-23224.000000,2251.451349
|
|
||||||
417264,-23204.000000,2251.466198
|
|
||||||
421303,-26524.000000,2251.482893
|
|
||||||
426176,-23244.000000,2251.503336
|
|
||||||
430443,-23264.000000,2251.521113
|
|
||||||
434626,-23244.000000,2251.538644
|
|
||||||
438799,-23244.000000,2251.556161
|
|
||||||
442742,-23224.000000,2251.572622
|
|
||||||
447089,-23244.000000,2251.590881
|
|
||||||
453249,-23244.000000,2251.617309
|
|
||||||
458068,-23184.000000,2251.637047
|
|
||||||
462471,-23244.000000,2251.655411
|
|
||||||
466317,-23144.000000,2251.671379
|
|
||||||
470697,-23264.000000,2251.689707
|
|
||||||
474177,-23244.000000,2251.704229
|
|
||||||
479150,-23324.000000,2251.725121
|
|
||||||
483939,-25004.000000,2251.745112
|
|
||||||
491062,-23164.000000,2251.774896
|
|
||||||
494543,-21484.000000,2251.789724
|
|
||||||
500688,-23224.000000,2251.815150
|
|
||||||
504903,-23244.000000,2251.832885
|
|
||||||
511649,-23004.000000,2251.861069
|
|
||||||
515151,-23204.000000,2251.875656
|
|
||||||
518685,-19624.000000,2251.890619
|
|
||||||
523224,-23464.000000,2251.909380
|
|
||||||
526924,-23044.000000,2251.924890
|
|
||||||
530833,-23244.000000,2251.941235
|
|
||||||
535098,-23204.000000,2251.960571
|
|
||||||
539936,-23264.000000,2251.979646
|
|
||||||
543748,-23224.000000,2251.995638
|
|
||||||
548572,-23244.000000,2252.015653
|
|
||||||
552433,-24164.000000,2252.031729
|
|
||||||
557705,-23784.000000,2252.053808
|
|
||||||
561934,-26824.000000,2252.071556
|
|
||||||
567329,-23204.000000,2252.095088
|
|
||||||
572295,-26624.000000,2252.115297
|
|
||||||
576805,-23224.000000,2252.133881
|
|
||||||
581977,-23224.000000,2252.155739
|
|
||||||
586408,-26444.000000,2252.173936
|
|
||||||
590398,-23244.000000,2252.190626
|
|
||||||
595590,-23924.000000,2252.212343
|
|
||||||
599207,-23244.000000,2252.227654
|
|
||||||
603242,-23244.000000,2252.244466
|
|
||||||
607609,-23244.000000,2252.262794
|
|
||||||
614652,-23204.000000,2252.292170
|
|
||||||
619146,-23244.000000,2252.311059
|
|
||||||
622979,-22664.000000,2252.327068
|
|
||||||
627846,-23224.000000,2252.347457
|
|
||||||
633154,-23184.000000,2252.369717
|
|
||||||
637078,-22184.000000,2252.386073
|
|
||||||
640701,-25544.000000,2252.401287
|
|
||||||
645375,-23284.000000,2252.420821
|
|
||||||
648981,-23244.000000,2252.435949
|
|
||||||
654161,-23244.000000,2252.457477
|
|
||||||
658606,-23244.000000,2252.476239
|
|
||||||
662804,-25584.000000,2252.493831
|
|
||||||
668316,-23524.000000,2252.517067
|
|
||||||
673628,-24444.000000,2252.539001
|
|
||||||
678030,-21984.000000,2252.557527
|
|
||||||
682885,-23224.000000,2252.577781
|
|
||||||
687296,-23244.000000,2252.596224
|
|
||||||
692505,-23224.000000,2252.618159
|
|
||||||
697508,-23224.000000,2252.639068
|
|
||||||
702048,-23224.000000,2252.657998
|
|
||||||
706651,-19884.000000,2252.677227
|
|
||||||
711625,-23224.000000,2252.698037
|
|
||||||
715826,-22884.000000,2252.715718
|
|
||||||
719878,-26664.000000,2252.732631
|
|
||||||
724862,-23224.000000,2252.753627
|
|
||||||
729844,-23244.000000,2252.774331
|
|
||||||
736614,-23244.000000,2252.802776
|
|
||||||
742164,-23244.000000,2252.826129
|
|
||||||
746464,-20804.000000,2252.843850
|
|
||||||
750788,-24924.000000,2252.862006
|
|
||||||
756810,-23444.000000,2252.887314
|
|
||||||
760924,-26104.000000,2252.904438
|
|
||||||
764524,-19844.000000,2252.921106
|
|
||||||
768979,-23304.000000,2252.938150
|
|
||||||
773681,-19264.000000,2252.957928
|
|
||||||
777718,-23244.000000,2252.974788
|
|
||||||
781049,-22944.000000,2252.988631
|
|
||||||
785994,-23244.000000,2253.009379
|
|
||||||
789758,-23244.000000,2253.025102
|
|
||||||
793909,-23524.000000,2253.043339
|
|
||||||
798770,-23244.000000,2253.062814
|
|
||||||
802715,-23244.000000,2253.079364
|
|
||||||
807435,-23264.000000,2253.099066
|
|
||||||
812425,-23244.000000,2253.120624
|
|
||||||
818405,-23244.000000,2253.145323
|
|
||||||
823488,-23224.000000,2253.166277
|
|
||||||
829127,-23164.000000,2253.190012
|
|
||||||
832976,-19544.000000,2253.206141
|
|
||||||
837650,-23464.000000,2253.225559
|
|
||||||
842266,-23304.000000,2253.244854
|
|
||||||
846607,-24584.000000,2253.263160
|
|
||||||
851639,-23244.000000,2253.284145
|
|
||||||
858413,-21904.000000,2253.312487
|
|
||||||
863782,-23084.000000,2253.335002
|
|
||||||
868416,-22604.000000,2253.354487
|
|
||||||
872070,-23244.000000,2253.370572
|
|
||||||
878893,-19844.000000,2253.398231
|
|
||||||
883737,-23244.000000,2253.418440
|
|
||||||
888833,-23224.000000,2253.439822
|
|
||||||
893419,-19284.000000,2253.458970
|
|
||||||
897196,-23084.000000,2253.474870
|
|
||||||
902037,-22944.000000,2253.495095
|
|
||||||
907126,-23384.000000,2253.516501
|
|
||||||
911457,-23304.000000,2253.534620
|
|
||||||
915036,-23244.000000,2253.549473
|
|
||||||
918703,-23464.000000,2253.564725
|
|
||||||
922150,-23264.000000,2253.579166
|
|
||||||
926206,-23224.000000,2253.596137
|
|
||||||
929921,-25544.000000,2253.612078
|
|
||||||
935607,-21524.000000,2253.635612
|
|
||||||
939298,-23224.000000,2253.650993
|
|
||||||
943992,-19384.000000,2253.670674
|
|
||||||
947577,-23224.000000,2253.685643
|
|
||||||
951071,-23244.000000,2253.700454
|
|
||||||
954379,-23244.000000,2253.714179
|
|
||||||
958191,-23244.000000,2253.730135
|
|
||||||
961467,-23244.000000,2253.743823
|
|
||||||
965640,-23244.000000,2253.761255
|
|
||||||
971113,-23144.000000,2253.784276
|
|
||||||
975102,-23264.000000,2253.800994
|
|
||||||
982332,-26884.000000,2253.831418
|
|
||||||
987134,-23204.000000,2253.851282
|
|
||||||
991476,-23224.000000,2253.869580
|
|
||||||
998376,-23244.000000,2253.898533
|
|
||||||
1003029,-23264.000000,2253.917688
|
|
||||||
1006182,-24384.000000,2253.930955
|
|
||||||
1009529,-23264.000000,2253.944858
|
|
||||||
1013493,-23484.000000,2253.961474
|
|
||||||
1017676,-21784.000000,2253.978978
|
|
||||||
1022450,-22944.000000,2253.999023
|
|
||||||
1026989,-23244.000000,2254.018213
|
|
||||||
1031401,-19784.000000,2254.036665
|
|
||||||
1034652,-23504.000000,2254.050116
|
|
||||||
1038581,-23244.000000,2254.066574
|
|
||||||
1041878,-27044.000000,2254.080600
|
|
||||||
1045956,-23244.000000,2254.097374
|
|
||||||
1049433,-26864.000000,2254.111969
|
|
||||||
1053669,-19444.000000,2254.130439
|
|
||||||
1057749,-23244.000000,2254.146902
|
|
||||||
1062475,-23244.000000,2254.166818
|
|
||||||
1066081,-26944.000000,2254.181746
|
|
||||||
1070140,-23244.000000,2254.198629
|
|
||||||
1075407,-23204.000000,2254.220697
|
|
||||||
1079072,-23244.000000,2254.236007
|
|
||||||
1084601,-20144.000000,2254.259302
|
|
||||||
1087932,-23244.000000,2254.273096
|
|
||||||
1091886,-23244.000000,2254.289636
|
|
||||||
1095864,-23244.000000,2254.306367
|
|
||||||
1101299,-23124.000000,2254.329030
|
|
||||||
1104096,-24024.000000,2254.340732
|
|
||||||
1108368,-23244.000000,2254.358593
|
|
||||||
1113178,-23324.000000,2254.378866
|
|
||||||
1118365,-23264.000000,2254.400462
|
|
||||||
1122387,-22104.000000,2254.417421
|
|
||||||
1127728,-23224.000000,2254.439639
|
|
||||||
1130869,-23224.000000,2254.452799
|
|
||||||
1135472,-23224.000000,2254.472088
|
|
||||||
1139371,-23264.000000,2254.488465
|
|
||||||
1144081,-23364.000000,2254.508248
|
|
||||||
1147467,-23264.000000,2254.522271
|
|
||||||
1151382,-23224.000000,2254.538681
|
|
||||||
1155340,-26244.000000,2254.555306
|
|
||||||
1158704,-26624.000000,2254.569437
|
|
||||||
1163265,-23224.000000,2254.588579
|
|
||||||
1168164,-23664.000000,2254.609042
|
|
||||||
1171458,-21764.000000,2254.622896
|
|
||||||
1175749,-23184.000000,2254.640765
|
|
||||||
1180715,-24984.000000,2254.661701
|
|
||||||
1185782,-23504.000000,2254.682607
|
|
||||||
1189757,-23244.000000,2254.699292
|
|
||||||
1192891,-21484.000000,2254.712542
|
|
||||||
1197589,-23244.000000,2254.732060
|
|
||||||
1200873,-23204.000000,2254.745806
|
|
||||||
1204655,-23244.000000,2254.761746
|
|
||||||
1209806,-23244.000000,2254.783387
|
|
||||||
1213506,-23244.000000,2254.798709
|
|
||||||
1218559,-23244.000000,2254.819937
|
|
||||||
1224138,-25024.000000,2254.844733
|
|
||||||
1229075,-23264.000000,2254.863865
|
|
||||||
1233410,-23264.000000,2254.882126
|
|
|
@ -1,308 +0,0 @@
|
|||||||
pos,vel,time
|
|
||||||
21311553,-22004.000000,2630.100978
|
|
||||||
21314576,-21444.000000,2630.113690
|
|
||||||
21317933,-21124.000000,2630.127594
|
|
||||||
21322869,-20764.000000,2630.147987
|
|
||||||
21326584,-22364.000000,2630.163649
|
|
||||||
21330750,-21704.000000,2630.181378
|
|
||||||
21334526,-22064.000000,2630.196542
|
|
||||||
21337667,-20504.000000,2630.209557
|
|
||||||
21341251,-21424.000000,2630.224387
|
|
||||||
21345317,-22544.000000,2630.241257
|
|
||||||
21347976,-20224.000000,2630.252348
|
|
||||||
21351819,-21184.000000,2630.268339
|
|
||||||
21356687,-21424.000000,2630.289332
|
|
||||||
21361749,-21404.000000,2630.309873
|
|
||||||
21365248,-21424.000000,2630.324209
|
|
||||||
21369737,-21444.000000,2630.342763
|
|
||||||
21373504,-20864.000000,2630.358452
|
|
||||||
21377887,-21444.000000,2630.376642
|
|
||||||
21382615,-21984.000000,2630.396245
|
|
||||||
21386548,-22004.000000,2630.412612
|
|
||||||
21390627,-21104.000000,2630.429547
|
|
||||||
21393808,-21424.000000,2630.442766
|
|
||||||
21398987,-21404.000000,2630.464427
|
|
||||||
21404106,-21424.000000,2630.485542
|
|
||||||
21407651,-23324.000000,2630.500307
|
|
||||||
21410763,-21364.000000,2630.513357
|
|
||||||
21414388,-21444.000000,2630.528793
|
|
||||||
21418221,-19484.000000,2630.544281
|
|
||||||
21422088,-21464.000000,2630.560155
|
|
||||||
21425408,-21424.000000,2630.573959
|
|
||||||
21428522,-21364.000000,2630.586916
|
|
||||||
21434566,-21424.000000,2630.612020
|
|
||||||
21437886,-21404.000000,2630.625799
|
|
||||||
21441512,-21344.000000,2630.640912
|
|
||||||
21446809,-21444.000000,2630.662977
|
|
||||||
21453007,-21544.000000,2630.689078
|
|
||||||
21456588,-22304.000000,2630.703880
|
|
||||||
21460250,-21404.000000,2630.718762
|
|
||||||
21463642,-21424.000000,2630.732934
|
|
||||||
21468257,-20884.000000,2630.752030
|
|
||||||
21472711,-21424.000000,2630.770521
|
|
||||||
21475891,-21444.000000,2630.784033
|
|
||||||
21480805,-21444.000000,2630.804094
|
|
||||||
21484942,-21444.000000,2630.821242
|
|
||||||
21489067,-21404.000000,2630.838375
|
|
||||||
21493147,-21424.000000,2630.855406
|
|
||||||
21496826,-21424.000000,2630.870663
|
|
||||||
21500154,-21424.000000,2630.884467
|
|
||||||
21504252,-19924.000000,2630.901564
|
|
||||||
21507980,-21424.000000,2630.918144
|
|
||||||
21511429,-21204.000000,2630.931418
|
|
||||||
21514299,-20484.000000,2630.943274
|
|
||||||
21517171,-21404.000000,2630.955257
|
|
||||||
21521422,-22524.000000,2630.972930
|
|
||||||
21524430,-22304.000000,2630.985401
|
|
||||||
21527847,-21964.000000,2630.999520
|
|
||||||
21530891,-21684.000000,2631.012158
|
|
||||||
21534726,-21424.000000,2631.028229
|
|
||||||
21538908,-20824.000000,2631.045573
|
|
||||||
21542549,-21444.000000,2631.060689
|
|
||||||
21546094,-21424.000000,2631.075328
|
|
||||||
21549985,-21284.000000,2631.091479
|
|
||||||
21555480,-21504.000000,2631.114398
|
|
||||||
21558556,-21424.000000,2631.127334
|
|
||||||
21563090,-21004.000000,2631.145955
|
|
||||||
21567609,-21404.000000,2631.164746
|
|
||||||
21571072,-21384.000000,2631.179143
|
|
||||||
21575066,-21964.000000,2631.195837
|
|
||||||
21578997,-20264.000000,2631.212074
|
|
||||||
21582521,-21484.000000,2631.226756
|
|
||||||
21587136,-20804.000000,2631.245971
|
|
||||||
21590550,-21444.000000,2631.260113
|
|
||||||
21593535,-21424.000000,2631.272443
|
|
||||||
21597455,-21324.000000,2631.288825
|
|
||||||
21601479,-21424.000000,2631.305501
|
|
||||||
21605825,-20944.000000,2631.323623
|
|
||||||
21609882,-21584.000000,2631.340317
|
|
||||||
21613809,-21444.000000,2631.356649
|
|
||||||
21616878,-21884.000000,2631.369369
|
|
||||||
21619944,-22004.000000,2631.382072
|
|
||||||
21622933,-22084.000000,2631.395674
|
|
||||||
21626676,-21024.000000,2631.410088
|
|
||||||
21629868,-21364.000000,2631.423533
|
|
||||||
21633982,-21424.000000,2631.440434
|
|
||||||
21637160,-20824.000000,2631.453688
|
|
||||||
21640196,-21444.000000,2631.466217
|
|
||||||
21643840,-21484.000000,2631.481344
|
|
||||||
21647479,-21904.000000,2631.496618
|
|
||||||
21651524,-22244.000000,2631.513514
|
|
||||||
21654942,-21264.000000,2631.527464
|
|
||||||
21657684,-21964.000000,2631.538900
|
|
||||||
21660629,-20724.000000,2631.551281
|
|
||||||
21664299,-21384.000000,2631.566610
|
|
||||||
21667796,-21324.000000,2631.580934
|
|
||||||
21670664,-21624.000000,2631.592743
|
|
||||||
21674556,-22104.000000,2631.608996
|
|
||||||
21679365,-21664.000000,2631.628943
|
|
||||||
21682841,-21444.000000,2631.643661
|
|
||||||
21686481,-21404.000000,2631.658446
|
|
||||||
21691187,-21444.000000,2631.678137
|
|
||||||
21694388,-21384.000000,2631.691603
|
|
||||||
21697907,-21424.000000,2631.705977
|
|
||||||
21701038,-21204.000000,2631.718976
|
|
||||||
21704519,-21444.000000,2631.733885
|
|
||||||
21708990,-20784.000000,2631.752013
|
|
||||||
21713031,-21704.000000,2631.768808
|
|
||||||
21716167,-21384.000000,2631.781820
|
|
||||||
21720672,-22084.000000,2631.800576
|
|
||||||
21724269,-21404.000000,2631.815498
|
|
||||||
21727539,-21444.000000,2631.829054
|
|
||||||
21731424,-20604.000000,2631.845186
|
|
||||||
21735030,-21404.000000,2631.860173
|
|
||||||
21738592,-21424.000000,2631.875038
|
|
||||||
21742793,-21224.000000,2631.892460
|
|
||||||
21745814,-21064.000000,2631.905028
|
|
||||||
21748613,-21124.000000,2631.916671
|
|
||||||
21751940,-21444.000000,2631.930456
|
|
||||||
21755194,-20824.000000,2631.943937
|
|
||||||
21759056,-21544.000000,2631.960035
|
|
||||||
21762734,-21424.000000,2631.975266
|
|
||||||
21765548,-21444.000000,2631.986996
|
|
||||||
21768654,-21904.000000,2631.999915
|
|
||||||
21772692,-21164.000000,2632.016768
|
|
||||||
21777187,-21204.000000,2632.035422
|
|
||||||
21782053,-21444.000000,2632.056841
|
|
||||||
21785724,-21684.000000,2632.070879
|
|
||||||
21790542,-21664.000000,2632.090936
|
|
||||||
21794824,-21404.000000,2632.108640
|
|
||||||
21798126,-21244.000000,2632.122369
|
|
||||||
21802902,-21164.000000,2632.142112
|
|
||||||
21806829,-21424.000000,2632.158435
|
|
||||||
21810941,-21424.000000,2632.175803
|
|
||||||
21815650,-21864.000000,2632.195132
|
|
||||||
21818828,-21444.000000,2632.208379
|
|
||||||
21822006,-21204.000000,2632.221548
|
|
||||||
21825906,-20024.000000,2632.237691
|
|
||||||
21829297,-20964.000000,2632.251842
|
|
||||||
21833933,-21644.000000,2632.271071
|
|
||||||
21837141,-21424.000000,2632.284474
|
|
||||||
21840128,-21764.000000,2632.296917
|
|
||||||
21843518,-21404.000000,2632.312295
|
|
||||||
21849082,-21464.000000,2632.334011
|
|
||||||
21853510,-23044.000000,2632.352408
|
|
||||||
21856939,-21144.000000,2632.366674
|
|
||||||
21860215,-21164.000000,2632.380234
|
|
||||||
21864557,-20064.000000,2632.398330
|
|
||||||
21868115,-21184.000000,2632.413174
|
|
||||||
21872367,-21684.000000,2632.430737
|
|
||||||
21876174,-20764.000000,2632.446589
|
|
||||||
21880253,-21664.000000,2632.463672
|
|
||||||
21883421,-21284.000000,2632.477140
|
|
||||||
21886724,-21204.000000,2632.490382
|
|
||||||
21889862,-22104.000000,2632.503570
|
|
||||||
21894216,-21704.000000,2632.521493
|
|
||||||
21897544,-21504.000000,2632.535374
|
|
||||||
21902474,-21844.000000,2632.556015
|
|
||||||
21906875,-21604.000000,2632.574155
|
|
||||||
21911198,-21604.000000,2632.592024
|
|
||||||
21915400,-21484.000000,2632.609479
|
|
||||||
21919141,-21004.000000,2632.625022
|
|
||||||
21924786,-20824.000000,2632.648480
|
|
||||||
21928752,-21164.000000,2632.664931
|
|
||||||
21932739,-21364.000000,2632.681565
|
|
||||||
21935865,-22044.000000,2632.694497
|
|
||||||
21939202,-21684.000000,2632.708501
|
|
||||||
21943443,-21884.000000,2632.726085
|
|
||||||
21946321,-21424.000000,2632.737980
|
|
||||||
21949711,-20824.000000,2632.751987
|
|
||||||
21953529,-21324.000000,2632.768031
|
|
||||||
21958129,-21204.000000,2632.787078
|
|
||||||
21960658,-21924.000000,2632.797537
|
|
||||||
21964114,-21444.000000,2632.812134
|
|
||||||
21968092,-21424.000000,2632.828727
|
|
||||||
21971138,-21664.000000,2632.841064
|
|
||||||
21974525,-21364.000000,2632.855055
|
|
||||||
21977419,-21384.000000,2632.867124
|
|
||||||
21980717,-21444.000000,2632.880869
|
|
||||||
21983893,-22064.000000,2632.894036
|
|
||||||
21987570,-21504.000000,2632.909275
|
|
||||||
21991327,-21084.000000,2632.924862
|
|
||||||
21995241,-21444.000000,2632.941161
|
|
||||||
21998017,-20684.000000,2632.952652
|
|
||||||
22001364,-21144.000000,2632.966680
|
|
||||||
22004593,-21584.000000,2632.980014
|
|
||||||
22007741,-21444.000000,2632.993139
|
|
||||||
22011556,-21124.000000,2633.008952
|
|
||||||
22015682,-21604.000000,2633.026147
|
|
||||||
22019838,-21424.000000,2633.043646
|
|
||||||
22023539,-21724.000000,2633.058772
|
|
||||||
22028056,-21424.000000,2633.077522
|
|
||||||
22031628,-21404.000000,2633.092404
|
|
||||||
22035624,-21124.000000,2633.108948
|
|
||||||
22039499,-21264.000000,2633.125452
|
|
||||||
22043316,-21144.000000,2633.140956
|
|
||||||
22048918,-21404.000000,2633.164197
|
|
||||||
22052772,-21404.000000,2633.180203
|
|
||||||
22055739,-21724.000000,2633.192616
|
|
||||||
22059995,-21584.000000,2633.210125
|
|
||||||
22064276,-21564.000000,2633.227979
|
|
||||||
22067784,-21424.000000,2633.242490
|
|
||||||
22071476,-21484.000000,2633.257862
|
|
||||||
22074595,-21164.000000,2633.270794
|
|
||||||
22077416,-21484.000000,2633.282452
|
|
||||||
22080194,-22024.000000,2633.294006
|
|
||||||
22083018,-21424.000000,2633.305723
|
|
||||||
22087683,-21424.000000,2633.325186
|
|
||||||
22092295,-20804.000000,2633.344353
|
|
||||||
22096115,-21224.000000,2633.360416
|
|
||||||
22098666,-21924.000000,2633.370918
|
|
||||||
22102562,-21164.000000,2633.387139
|
|
||||||
22105805,-22064.000000,2633.400455
|
|
||||||
22109085,-21404.000000,2633.414107
|
|
||||||
22113237,-21444.000000,2633.431376
|
|
||||||
22117574,-20884.000000,2633.449377
|
|
||||||
22120773,-21404.000000,2633.462648
|
|
||||||
22123931,-21384.000000,2633.475785
|
|
||||||
22127471,-21364.000000,2633.490530
|
|
||||||
22130760,-21444.000000,2633.504302
|
|
||||||
22133891,-21424.000000,2633.517210
|
|
||||||
22137895,-21424.000000,2633.533946
|
|
||||||
22142004,-20624.000000,2633.550858
|
|
||||||
22146093,-21384.000000,2633.567935
|
|
||||||
22150700,-21684.000000,2633.587200
|
|
||||||
22154457,-22244.000000,2633.602548
|
|
||||||
22157319,-21464.000000,2633.614509
|
|
||||||
22161064,-21404.000000,2633.630123
|
|
||||||
22165386,-20624.000000,2633.648038
|
|
||||||
22170174,-20884.000000,2633.667936
|
|
||||||
22174795,-21224.000000,2633.687150
|
|
||||||
22178617,-22204.000000,2633.702921
|
|
||||||
22183530,-23084.000000,2633.723570
|
|
||||||
22187907,-21664.000000,2633.741529
|
|
||||||
22191909,-21344.000000,2633.758210
|
|
||||||
22196352,-21724.000000,2633.776750
|
|
||||||
22200117,-21424.000000,2633.792437
|
|
||||||
22204032,-21384.000000,2633.808574
|
|
||||||
22207376,-21424.000000,2633.822495
|
|
||||||
22211809,-22584.000000,2633.841043
|
|
||||||
22216936,-21584.000000,2633.862221
|
|
||||||
22220897,-21244.000000,2633.879035
|
|
||||||
22224184,-20284.000000,2633.892385
|
|
||||||
22227786,-20984.000000,2633.907323
|
|
||||||
22231563,-21444.000000,2633.923051
|
|
||||||
22236196,-22684.000000,2633.942172
|
|
||||||
22239737,-21804.000000,2633.956956
|
|
||||||
22244593,-21344.000000,2633.977134
|
|
||||||
22248330,-20144.000000,2633.992633
|
|
||||||
22252493,-21224.000000,2634.010091
|
|
||||||
22256302,-21564.000000,2634.025699
|
|
||||||
22260055,-21444.000000,2634.041301
|
|
||||||
22264259,-21684.000000,2634.058748
|
|
||||||
22269658,-21444.000000,2634.081234
|
|
||||||
22274308,-22804.000000,2634.100588
|
|
||||||
22278913,-21364.000000,2634.119664
|
|
||||||
22282401,-21444.000000,2634.134131
|
|
||||||
22285532,-20784.000000,2634.147557
|
|
||||||
22288878,-21464.000000,2634.160989
|
|
||||||
22294190,-21444.000000,2634.183208
|
|
||||||
22298392,-22064.000000,2634.200538
|
|
||||||
22301580,-21164.000000,2634.213721
|
|
||||||
22305571,-21164.000000,2634.230373
|
|
||||||
22310386,-20824.000000,2634.250315
|
|
||||||
22313956,-21704.000000,2634.265111
|
|
||||||
22317597,-21644.000000,2634.280333
|
|
||||||
22320816,-21964.000000,2634.293633
|
|
||||||
22324282,-21444.000000,2634.308154
|
|
||||||
22327153,-21124.000000,2634.320154
|
|
||||||
22330875,-21444.000000,2634.335554
|
|
||||||
22335035,-22384.000000,2634.352784
|
|
||||||
22339134,-21664.000000,2634.369883
|
|
||||||
22343278,-21424.000000,2634.387139
|
|
||||||
22347382,-21424.000000,2634.404049
|
|
||||||
22350788,-21464.000000,2634.418131
|
|
||||||
22355419,-21424.000000,2634.437422
|
|
||||||
22358311,-20984.000000,2634.449550
|
|
||||||
22361218,-21444.000000,2634.461525
|
|
||||||
22364953,-21404.000000,2634.477044
|
|
||||||
22367891,-21164.000000,2634.489223
|
|
||||||
22371928,-21404.000000,2634.505974
|
|
||||||
22375376,-21424.000000,2634.520331
|
|
||||||
22379065,-21684.000000,2634.535653
|
|
||||||
22382923,-20664.000000,2634.551741
|
|
||||||
22386187,-21144.000000,2634.565202
|
|
||||||
22389450,-21424.000000,2634.578852
|
|
||||||
22392865,-21444.000000,2634.593248
|
|
||||||
22396941,-21404.000000,2634.610261
|
|
||||||
22400182,-21704.000000,2634.623624
|
|
||||||
22404137,-21264.000000,2634.639918
|
|
||||||
22407683,-21424.000000,2634.654504
|
|
||||||
22410807,-21084.000000,2634.667511
|
|
||||||
22415781,-21564.000000,2634.688281
|
|
||||||
22419518,-21204.000000,2634.703767
|
|
||||||
22423611,-21724.000000,2634.720774
|
|
||||||
22426584,-21384.000000,2634.733206
|
|
||||||
22430757,-20604.000000,2634.750427
|
|
||||||
22435565,-21464.000000,2634.770852
|
|
||||||
22439137,-21164.000000,2634.785177
|
|
||||||
22442871,-22264.000000,2634.800789
|
|
||||||
22447211,-21424.000000,2634.818859
|
|
||||||
22450519,-21424.000000,2634.832555
|
|
||||||
22454045,-20304.000000,2634.847252
|
|
||||||
22458028,-21284.000000,2634.867426
|
|
||||||
22462813,-21444.000000,2634.883903
|
|
||||||
22467171,-22244.000000,2634.901685
|
|
||||||
22470413,-21584.000000,2634.915088
|
|
||||||
22473383,-21344.000000,2634.927426
|
|
||||||
22477314,-22124.000000,2634.944091
|
|
|
Reference in New Issue
Block a user