From 8faf4c50b6fab48c96a820375a1ef0caaf5b76bf Mon Sep 17 00:00:00 2001 From: Jake Read <jake.read@cba.mit.edu> Date: Mon, 18 May 2020 22:40:40 -0400 Subject: [PATCH] arrow --- hunks/statemachines/pendulum-ukx-sg.js | 52 +++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/hunks/statemachines/pendulum-ukx-sg.js b/hunks/statemachines/pendulum-ukx-sg.js index d34a42f..35297b9 100644 --- a/hunks/statemachines/pendulum-ukx-sg.js +++ b/hunks/statemachines/pendulum-ukx-sg.js @@ -164,10 +164,37 @@ export default function Pendulum() { svg.appendChild(circle) dom.appendChild(svg) + // ---------------------------------------------------------------- KEYDOWNS + let keyAttack = 1 + // (override PID controlled xddot) + document.addEventListener('keydown', (evt) => { + if (evt.repeat) return + if (evt.keyCode === 37) { + // left down + odot += keyAttack + } else if (evt.keyCode === 39) { + // right down + odot -= keyAttack + } + // console.log('xdd', xddot) + }) + document.addEventListener('keyup', (evt) => { + if (evt.repeat) return + if (evt.keyCode === 37) { + // left up + odot -= keyAttack + } else if (evt.keyCode === 39) { + // right up + odot += keyAttack + } + // console.log('xdd', xddot) + }) + // ---------------------------------------------------------------- SIMULATION let odamp = 0.1 let length = 1 let xddotLimit = 9.8 * 3 + let xdotLimit = 10 // start time, increment, count, init, k[4] let runSimulation = (t, tstep, count, x, xdot, o, odot, k) => { @@ -181,12 +208,20 @@ export default function Pendulum() { t += tstep // use k-vals control law to generate new xddot xddot = x * k[0] + xdot * k[1] + o * k[2] + odot * k[3] - if (xddot > xddotLimit) xddot = xddotLimit - if (xddot < -xddotLimit) xddot = -xddotLimit + if (xddot > xddotLimit) { + xddot = xddotLimit + } else if (xddot < -xddotLimit) { + xddot = -xddotLimit + } // angular acceleration, given effect of gravity and cart accel oddot = (xddot * Math.cos(o) + 9.8 * Math.sin(o)) / length // integrations, xdot += xddot * tstep + if(xdot > xdotLimit){ + xdot = xdotLimit + } else if (xdot < -xdotLimit){ + xdot = -xdotLimit + } odot = odot + oddot * tstep - odot * odamp * tstep x += xdot * tstep o += odot * tstep @@ -222,6 +257,8 @@ export default function Pendulum() { let rt = 0 let rerr = 0 + let ru = 0 + let odot = 0 // global, for keystrokes let timer // start and run render w/ let startRender = () => { @@ -230,7 +267,7 @@ export default function Pendulum() { let x = Math.random() * 1 - 0.5 // [-10, 10] let xdot = Math.random() * 2 - 1 // [-1, 1] let o = Math.random() - 0.5 // [-0.5, 0.5] - let odot = Math.random() - 0.5 // [-0.5, 0.5] + odot = Math.random() - 0.5 // [-0.5, 0.5] // k! let kvals = [ randGaussian() * 10 - 5, @@ -243,7 +280,7 @@ export default function Pendulum() { let iters = 0 let update = () => { let result - for (let s = 0; s < 40; s++) { + for (let s = 0; s < 60; s++) { kvals = moveGenerator(t, 0.001, mgForecast, x, xdot, o, odot, kvals) //console.log('kv', kvals) //let kvals = [k0.value, k1.value, k2.value, k3.value] @@ -258,6 +295,7 @@ export default function Pendulum() { // render output vars rt = t rerr = result.err + ru = result.xddot drawLine(x, o) // and watch k-vals, k0.set(parseFloat(kvals[0].toFixed(6))) @@ -302,6 +340,10 @@ export default function Pendulum() { startRender() this.loop = () => { - + if (!rtOut.io() && !rerrOut.io() && !ruOut.io()) { + rtOut.put(rt) + rerrOut.put(rerr) + ruOut.put(ru) + } } } -- GitLab