From d6dab2ac6f087eadaaa2098d11b8ab070f6c32be Mon Sep 17 00:00:00 2001 From: Jake <jake.read@cba.mit.edu> Date: Sun, 9 Dec 2018 17:27:46 -0500 Subject: [PATCH] new basic for soma --- README.md | 2 + client/client.js | 7 +- client/ui/threeCanvas.js | 6 +- modules/hardware/atkmrobot.js | 7 ++ modules/robot/forwardTransform.js | 94 ++++---------------- modules/ui/threeCanvas.js | 2 +- programs/temp.json | 140 +++++++++++++++++++++++++++--- src/jsunit.js | 4 +- 8 files changed, 162 insertions(+), 100 deletions(-) diff --git a/README.md b/README.md index d2f4db3..f0b96be 100644 --- a/README.md +++ b/README.md @@ -267,6 +267,8 @@ View.assignProgram(program) ## Immediately +- saved program doesn't save state booleans + - ui objects ... refresh ... use state model ? - ui objects client drop below inputs / outputs diff --git a/client/client.js b/client/client.js index 4ca0cd2..445c6a8 100644 --- a/client/client.js +++ b/client/client.js @@ -32,6 +32,7 @@ var wrapper = {} var nav = {} var verbose = false +var verboseComs = false /* @@ -97,7 +98,7 @@ function socketSend(type, data) { type: type, data: data } - console.log('SEND', msg) + if(verboseComs) console.log('SEND', msg) sckt.send(JSON.stringify(msg)) } @@ -105,7 +106,7 @@ function socketRecv(evt) { var recv = JSON.parse(evt.data) var type = recv.type var data = recv.data - console.log('RECV', recv) + if(verboseComs) console.log('RECV', recv) // tree banger switch (type) { case 'console': @@ -233,7 +234,7 @@ function heapSendsStateChange(data) { } function heapSendsUiChange(data) { - if (true) console.log('HEAP SENDS MSG TO UI ELEMENT IN MDL', data) + if (verbose) console.log('HEAP SENDS MSG TO UI ELEMENT IN MDL', data) program.modules[data.id].ui[data.key].lump.onMessage(data.msg) } diff --git a/client/ui/threeCanvas.js b/client/ui/threeCanvas.js index 06ce3fd..eed388c 100644 --- a/client/ui/threeCanvas.js +++ b/client/ui/threeCanvas.js @@ -8,21 +8,23 @@ var container = document.createElement('div') var scene = new THREE.Scene() scene.background = new THREE.Color(0xd6d6d6) - var camera = new THREE.PerspectiveCamera(75, 1, 1, 1000) + var camera = new THREE.PerspectiveCamera(75, 1, 0.1, 1000) camera.up.set(0, 0, 1) var renderer = new THREE.WebGLRenderer() renderer.setSize(396, 396) container.appendChild(renderer.domElement) // axes - var axesHelper = new THREE.AxesHelper(1) + var axesHelper = new THREE.AxesHelper(0.1) scene.add(axesHelper) // grid + /* var gridHelper = new THREE.GridHelper(10, 100) gridHelper.translateOnAxis(new THREE.Vector3(0, 0, 1), -0.01) gridHelper.rotateX(-Math.PI / 2) scene.add(gridHelper) + */ // one line var material = new THREE.LineBasicMaterial({ color: 0x00ffff }) diff --git a/modules/hardware/atkmrobot.js b/modules/hardware/atkmrobot.js index e9fc749..eae2766 100644 --- a/modules/hardware/atkmrobot.js +++ b/modules/hardware/atkmrobot.js @@ -47,6 +47,8 @@ function ATKMathRobot() { state.message = 'no packet yet' state.enc_cnt = 16384 + state.enc_offset = 0 + state.enc_reverse = false state.pc_t = 2048 state.onUiChange('pc_t', onPositionTargetUserChange) @@ -92,6 +94,11 @@ function ATKMathRobot() { atkmr.route.subscribe(145, function(msg){ var pos = PCKT.unPack32(msg.slice(1)) + if(state.enc_reverse){ + pos = state.enc_cnt - pos + } + pos += state.enc_offset + pos %= state.enc_cnt var rads = 2*Math.PI * (pos / state.enc_cnt) atkmr.outputs.pos.emit(rads) }) diff --git a/modules/robot/forwardTransform.js b/modules/robot/forwardTransform.js index 0c6539f..22280b4 100644 --- a/modules/robot/forwardTransform.js +++ b/modules/robot/forwardTransform.js @@ -9,8 +9,6 @@ let State = JSUnit.State function forwardTransform() { var theta1 = 0 var theta2 = 0 - var l1 = 0 - var l2 = 0 var forwardTransform = { description: { @@ -25,9 +23,9 @@ function forwardTransform() { // one caveat here is that we can't dynamically add objects to this, // or they don't get getter / settered when we do forwardTransform.state = State() - // forwardTransform.state.mode = 'G0' - // forwardTransform.state.G0 = 1200 - // forwardTransform.state.G1 = 400 + var state = forwardTransform.state + state.l1 = 0.4 + state.l2 = 0.2 forwardTransform.inputs = { theta1: Input('any', intakeTheta1), @@ -37,11 +35,9 @@ function forwardTransform() { } forwardTransform.outputs = { - originpt: Output('tuple?'), - jointpt: Output('tuple?'), - touchpt: Output('tuple?') - // instructionOut: Output('move instruction'), - // modeChange: Output('string') + originpt: Output('array'), + jointpt: Output('array'), + touchpt: Output('array') } function intakeTheta1(num){ @@ -63,97 +59,37 @@ function forwardTransform() { } function intakeL1(num){ - l1 = num + state.l1 = num var points = parseforwardTransform() forwardTransform.outputs.originpt.emit(points.originpt) forwardTransform.outputs.jointpt.emit(points.jointpt) forwardTransform.outputs.touchpt.emit(points.touchpt) - //console.log('l1 input') + //console.log('state.l1 input') } function intakeL2(num){ - l2 = num + state.l2 = num var points = parseforwardTransform() forwardTransform.outputs.originpt.emit(points.originpt) forwardTransform.outputs.jointpt.emit(points.jointpt) forwardTransform.outputs.touchpt.emit(points.touchpt) - //console.log('l2 input') + //console.log('state.l2 input') } - // input functions - /* - function onLineIn(str){ - var instruction = parseforwardTransform(str) - if (instruction.hasMove) { - if(verbose) console.log('forwardTransform:', instruction) - forwardTransform.outputs.instructionOut.emit(instruction) - } else { - if(verbose) console.log('forwardTransform:', forwardTransform.state.mode) - forwardTransform.outputs.modeChange.emit(forwardTransform.state.mode) - } - } - */ - - /* - // local functions - function getKeyValues(str) { - var kv = {} - for (var i = 0; i < str.length; i++) { - if (str[i].match('[A-Za-z]')) { // regex to match upper case letters - var lastIndex = str.indexOf(' ', i) - if (lastIndex < 0) { - lastIndex = str.length - } - var key = str[i].toUpperCase() - kv[key] = parseFloat(str.slice(i + 1, lastIndex)) - } - } - return kv - } - */ - // TODO: test, can we link global vars to ui objects ... // forwardTransform.ui.mode.value = var ? no bc set / get etc // more like var = forwardTransform.ui.mode.value ? is this referential? function parseforwardTransform() { var points = { - originpt: (0,0), - jointpt: (0,0), - touchpt: (0,0) + originpt: [0,0], + jointpt: [0,0], + touchpt: [0,0] } - points.jointpt = (l1*Math.cos(theta1), l1*Math.sin(theta1)) - points.touchpt = (l1*Math.cos(theta1)+l2*Math.cos(theta2), l1*Math.sin(theta1)+l2*Math.sin(theta2)) - /* var instruction = { - position: {}, - hasMove: false, - speed: 0 - } - - kv = getKeyValues(str) - // track modality - if (kv.G == 0 | kv.G == 1) { - forwardTransform.state.mode = 'G' + kv.G.toString() - } else if (kv.G != null) { - // no arcs pls - console.log('unfriendly forwardTransform mode!', kv) - } - - for (key in kv) { - if (key.match('[A-EX-Z]')) { - instruction.position[key] = kv[key] - instruction.hasMove = true - } else if (key.match('[F]')) { - // tricky / ugly: sets using the mode state string as object key - forwardTransform.state[forwardTransform.state.mode] = kv.F - } - } + points.jointpt = [state.l1*Math.cos(theta1), state.l1*Math.sin(theta1)] + points.touchpt = [state.l1*Math.cos(theta1)+state.l2*Math.cos(theta2), state.l1*Math.sin(theta1)+state.l2*Math.sin(theta2)] - instruction.speed = forwardTransform.state[forwardTransform.state.mode] - // and this for help later? - instruction.kv = kv - */ return points } diff --git a/modules/ui/threeCanvas.js b/modules/ui/threeCanvas.js index f898599..2ddd432 100644 --- a/modules/ui/threeCanvas.js +++ b/modules/ui/threeCanvas.js @@ -45,7 +45,7 @@ function PointOnCanvas() { } function onNewXY2(array){ - ui.threeCanvas.updateXY2f([array[0], 0, array[1]]) + ui.threeCanvas.updateXY2([array[0], 0, array[1]]) } function onUICallback(msg) { diff --git a/programs/temp.json b/programs/temp.json index 904ccd3..8305737 100644 --- a/programs/temp.json +++ b/programs/temp.json @@ -1,7 +1,7 @@ { "description": { "name": "new program", - "counter": 14 + "counter": 16 }, "modules": { "SerialportATKLink-0": { @@ -20,9 +20,9 @@ "inputs": {}, "outputs": {}, "state": { - "portName": "---", - "portStatus": "closed", - "log": true + "portName": "COM18", + "portStatus": "open", + "log": false }, "ui": { "kickButton": { @@ -69,6 +69,10 @@ { "parentId": "gateCounter-9", "key": "thru" + }, + { + "parentId": "forwardTransform Parser-15", + "key": "theta1" } ] } @@ -77,6 +81,8 @@ "message": "no packet yet", "route": "0,0", "enc_cnt": 16384, + "enc_offset": -6000, + "enc_reverse": false, "pc_t": 2048, "pKp": 4.5, "pKi": 0, @@ -100,8 +106,8 @@ "id": "atk-math-robot-joint-2", "path": "./modules/hardware/atkmrobot.js", "position": { - "left": 600, - "top": 450 + "left": 604, + "top": 492 } }, "inputs": { @@ -130,6 +136,10 @@ { "parentId": "logger-14", "key": "thru" + }, + { + "parentId": "forwardTransform Parser-15", + "key": "theta2" } ] } @@ -138,6 +148,8 @@ "message": "no packet yet", "route": "0,1", "enc_cnt": 16384, + "enc_offset": 550, + "enc_reverse": true, "pc_t": 2048, "pKp": 4.5, "pKi": 0, @@ -289,7 +301,7 @@ }, "state": { "prefix": "JTN1:", - "message": "---" + "message": "2.9398741799828314" }, "ui": {} }, @@ -300,8 +312,8 @@ "id": "ThreeJS-Canvas-7", "path": "./modules/ui/threeCanvas.js", "position": { - "left": 2263, - "top": 326 + "left": 1312, + "top": 133 } }, "inputs": { @@ -329,8 +341,8 @@ "id": "collector-8", "path": "./modules/util/collector.js", "position": { - "left": 1728, - "top": 1057 + "left": 1649, + "top": 1157 } }, "inputs": { @@ -408,8 +420,8 @@ "id": "parallelContencator-11", "path": "./modules/util/parallelContencator.js", "position": { - "left": 1232, - "top": 1053 + "left": 1193, + "top": 1147 } }, "inputs": { @@ -556,7 +568,107 @@ }, "state": { "prefix": "JTN2:", - "message": "---" + "message": "5.845233792238235" + }, + "ui": {} + }, + "forwardTransform Parser-15": { + "description": { + "name": "forwardTransform Parser", + "alt": "line of forwardTransform -> points", + "id": "forwardTransform Parser-15", + "path": "./modules/robot/forwardTransform.js", + "position": { + "left": 1323, + "top": 718 + } + }, + "inputs": { + "theta1": { + "accepts": "any" + }, + "theta2": { + "accepts": "any" + }, + "l1": { + "accepts": "any" + }, + "l2": { + "accepts": "any" + } + }, + "outputs": { + "originpt": { + "emits": "array", + "calls": [] + }, + "jointpt": { + "emits": "array", + "calls": [ + { + "parentId": "ThreeJS-Canvas-7", + "key": "xy1" + } + ] + }, + "touchpt": { + "emits": "array", + "calls": [ + { + "parentId": "ThreeJS-Canvas-7", + "key": "xy2" + } + ] + } + }, + "state": { + "l1": 0.4, + "l2": 0.2 + }, + "ui": {} + }, + "leastSquares Parser-16": { + "description": { + "name": "leastSquares Parser", + "alt": "line of leastSquares -> l1 and l2 values", + "id": "leastSquares Parser-16", + "path": "./modules/robot/leastSquares.js", + "position": { + "left": 1823, + "top": 991 + } + }, + "inputs": { + "theta1s": { + "accepts": "any" + }, + "theta2s": { + "accepts": "any" + } + }, + "outputs": { + "l1": { + "emits": "num", + "calls": [ + { + "parentId": "forwardTransform Parser-15", + "key": "l1" + } + ] + }, + "l2": { + "emits": "num", + "calls": [ + { + "parentId": "forwardTransform Parser-15", + "key": "l2" + } + ] + } + }, + "state": { + "c": 1, + "d": -2 }, "ui": {} } diff --git a/src/jsunit.js b/src/jsunit.js index 19fa14b..b24a02f 100644 --- a/src/jsunit.js +++ b/src/jsunit.js @@ -1,6 +1,8 @@ // event system to include type-checking etc // dataflow types for javascript objects ... +var verbose = false + function Input(type, fn) { var input = { accepts: type, @@ -58,7 +60,7 @@ function Output(type) { output.emit = function(data) { if (this.calls.length == 0) { - console.log('no inputs bound to this output') + if(verbose) console.log('no inputs bound to this output') } else { for (index in this.calls) { this.calls[index].fn(JSON.parse(JSON.stringify(data))) -- GitLab