diff --git a/hunks/statemachines/pendulum-ukx-sg.js b/hunks/statemachines/pendulum-ukx-sg.js
index d34a42fa0961ea63d0268f8bf34c95246889759a..35297b980737a854360ff97ca0ae0f13c8e0ffff 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)
+ }
}
}