Skip to content
Snippets Groups Projects
Commit 8faf4c50 authored by Jake Read's avatar Jake Read
Browse files

arrow

parent 2fd8e7a6
No related branches found
No related tags found
No related merge requests found
......@@ -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)
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment