From d97b4a07f2a581f4c584f8f01e1703e49c1f6f57 Mon Sep 17 00:00:00 2001 From: avardy Date: Sun, 11 Jun 2023 09:19:27 -0230 Subject: [PATCH 1/5] Attempt to use constraints on tail --- src/common/robot/robot.js | 58 ++-- .../randomPositionsGenerator.js | 4 + .../benchmarking/puckFieldValueTracker.js | 29 ++ src/scenes/Labyrinth/index.js | 214 +++++++++++++ src/scenes/Labyrinth/labyrinth.png | Bin 0 -> 56623 bytes .../Labyrinth/robot/controllers/controller.js | 43 +++ src/scenes/Labyrinth/robot/renderables.js | 280 ++++++++++++++++++ src/scenes/index.js | 2 + 8 files changed, 613 insertions(+), 17 deletions(-) create mode 100644 src/scenes/Labyrinth/benchmarking/puckFieldValueTracker.js create mode 100644 src/scenes/Labyrinth/index.js create mode 100644 src/scenes/Labyrinth/labyrinth.png create mode 100644 src/scenes/Labyrinth/robot/controllers/controller.js create mode 100644 src/scenes/Labyrinth/robot/renderables.js diff --git a/src/common/robot/robot.js b/src/common/robot/robot.js index a7f4b36..96c8f16 100644 --- a/src/common/robot/robot.js +++ b/src/common/robot/robot.js @@ -1,4 +1,4 @@ -import { Body, World, Bodies } from 'matter-js'; +import { Body, World, Bodies, Composite, Constraint } from 'matter-js'; import { getDistance } from '../utils/geometry'; @@ -78,32 +78,56 @@ export default class Robot { // Add scene specific misc values to robots if (misc && typeof misc === 'object' && Object.keys(misc).length > 0) { - Object.entries(misc).forEach(([miscKey, miscVal]) => { this[miscKey] = miscVal; }); + Object.entries(misc).forEach(([miscKey, miscVal]) => { + this[miscKey] = miscVal; + }); } // Create Matter.js body and attach it to world + let parts = [ Bodies.circle(position.x, position.y, this.radius) ] const compoundBody = Body.create({ - parts: [ - Bodies.circle(position.x, position.y, this.radius) - // If you want to add more parts to the robot body, add them here. - // Make sure to also change renderabes to render all parts of the robot. - // Example of compound body: - // , - // Bodies.polygon( - // position.x + this.radius / 10 + this.radius / 2, - // position.y - (2 * this.radius) / 5, - // 3, - // this.radius * 1.2, - // { angle: (1.6 * Math.PI) / 2 } - // ) - ] + parts: parts }); this.body = compoundBody; + + if (this.tail) { + + this.tailBody = Bodies.rectangle( + position.x - 2 * this.radius, + position.y, + this.radius * 2, + this.radius / 5 + ); + + var revoluteConstraint = Constraint.create({ + bodyA: this.body, + bodyB: this.tailBody, + length: 2, + stiffness: 0.9, + damping: 0, + pointA: {x:-(this.radius + 5), y:0}, + pointB: {x:this.radius, y:0} + }); + + var straighteningConstraint = Constraint.create({ + bodyA: this.body, + bodyB: this.tailBody, + length: 0, + stiffness: 0.1, + damping: 0, + pointA: {x:-3 * this.radius - 5, y:0}, + pointB: {x:- this.radius, y:0} + }); + + Composite.add(this.world, [this.body, this.tailBody, revoluteConstraint]); + Composite.add(this.world, [this.body, this.tailBody, straighteningConstraint]); + } + this.body.friction = 0; this.body.frictionAir = 0; this.body.frictionStatic = 0; this.body.restitution = 0; - this.body.angle = Math.random() * 2 * Math.PI; // Randomize orientations + Body.setAngle(this.body, Math.random() * 2 * Math.PI); // Randomize orientations World.add(this.world, this.body); Body.setAngularVelocity(this.body, 1); this.engine.velocityIterations = 10; diff --git a/src/common/utils/positionsGenerators/randomPositionsGenerator.js b/src/common/utils/positionsGenerators/randomPositionsGenerator.js index 9be8095..896bc3d 100644 --- a/src/common/utils/positionsGenerators/randomPositionsGenerator.js +++ b/src/common/utils/positionsGenerators/randomPositionsGenerator.js @@ -20,9 +20,11 @@ export default function getRandCollFreePosGenerator( const yCount = envHeight / resolution; const positionsCount = parseInt(numOfPos, 10); + /* if (xCount * yCount < positionsCount * 4) { throw new Error('Invalid inputs, number and size of robots and pucks are too high for this environment size!'); } + */ let i = 0; while (positions.length < positionsCount * 3 && i < positionsCount * 100) { @@ -47,9 +49,11 @@ export default function getRandCollFreePosGenerator( i += 1; } + /* if (positions.length < positionsCount * 2) { throw new Error('Invalid inputs, number and size of robots are too high for this environment!'); } + */ return getPos; } diff --git a/src/scenes/Labyrinth/benchmarking/puckFieldValueTracker.js b/src/scenes/Labyrinth/benchmarking/puckFieldValueTracker.js new file mode 100644 index 0000000..c4da924 --- /dev/null +++ b/src/scenes/Labyrinth/benchmarking/puckFieldValueTracker.js @@ -0,0 +1,29 @@ +import Tracker from '@common/benchmarking/performanceTrackers/tracker'; +import { sampleFieldAtPoint } from '@common/robot/sensors/sensorUtils'; + +class PuckFieldValueTracker extends Tracker { + constructor(ideal_tau) { + super( + 'PuckFieldValue', + 'Sum of Squared Differences', + 'average', + 'average', + { xTitle: 'Time (ms)', yTitle: 'SSD' } + ); + + this.getValue = (scene) => { + let ssd = 0; + + scene.pucks.forEach((p) => { + let point = {x: Math.round(p.position.x), y: Math.round(p.position.y)}; + const fieldValue = sampleFieldAtPoint(scene.fields.heatMap.src, point)[0] / 255.0; + ssd += (fieldValue - ideal_tau) ** 2; + }); + + return 100 * ssd / scene.pucks.length; + }; + } +} + +//export default new PuckFieldValueTracker(); +export default PuckFieldValueTracker; diff --git a/src/scenes/Labyrinth/index.js b/src/scenes/Labyrinth/index.js new file mode 100644 index 0000000..31cc9b2 --- /dev/null +++ b/src/scenes/Labyrinth/index.js @@ -0,0 +1,214 @@ +import { + CoreSensors, + ExtraSensors, + CorePositionsGenerators +} from '@common'; + +import SceneRenderables from '@common/scene/renderables'; +import PuckRenderables from '@common/puck/renderables'; +import LocalRenderables from './robot/renderables'; + +import controller from './robot/controllers/controller'; + +import PuckFieldValueTracker from './benchmarking/puckFieldValueTracker'; + +import mapUrl from './labyrinth.png'; + +// This constant defines the contour line of the scalar field around which the +// robots will build. +const tau = 0.6; + +const renderables = [ + { module: 'Scene', elements: SceneRenderables }, + { module: 'Puck', elements: PuckRenderables }, + { module: 'Local', elements: [...LocalRenderables] } +]; + +const usedSensors = { + ...CoreSensors, + circles: { + ...ExtraSensors.circles, + params: { + regions: [ + { + name: 'leftObstacle', + centre: { type: 'Polar', name: '0', coords: { distance: 6, angle: (- Math.PI / 4.0) } }, + radius: 2, + sensedTypes: ['walls', 'robots'] + } + ] + } + }, + fields: { + ...ExtraSensors.fields, + params: { + // See the comments in FieldSensorExample for how to define points. + points: [ + { + type: 'Cartesian', + name: 'left', + coords: { + x: 20, + y: 6 + } + }, + { + type: 'Cartesian', + name: 'centreLeft', + coords: { + x: 20, + y: 2 + } + }, + { + type: 'Cartesian', + name: 'centreRight', + coords: { + x: 20, + y: -2 + } + }, + { + type: 'Cartesian', + name: 'right', + coords: { + x: 20, + y: -6 + } + } + ] + } + }, + polygons: { + ...ExtraSensors.polygons, + params: { + // See the comments in FieldSensorExample for how to define points. + regions: + [ + { + name: 'left', + vertices: [ + { type: 'Polar', name: '0', coords: { distance: 100, angle: (-1.0 * Math.PI) / 2 } }, + { type: 'Polar', name: '1', coords: { distance: 100, angle: (-0.75 * Math.PI) / 2 } }, + { type: 'Polar', name: '2', coords: { distance: 100, angle: (-0.5 * Math.PI) / 2 } }, + { type: 'Polar', name: '3', coords: { distance: 100, angle: (-0.25 * Math.PI) / 2 } }, + { type: 'Polar', name: '4', coords: { distance: 100, angle: (0.0 * Math.PI) / 2 } }, + { type: 'Cartesian', name: 'bottomRight', coords: { x: 0, y: 5 } } + ], + sensedTypes: ['pucks'] + }, + { + name: 'right', + vertices: [ + { type: 'Polar', name: '0', coords: { distance: 50, angle: (1.0 * Math.PI) / 2 } }, + { type: 'Polar', name: '1', coords: { distance: 50, angle: (0.75 * Math.PI) / 2 } }, + { type: 'Polar', name: '2', coords: { distance: 50, angle: (0.5 * Math.PI) / 2 } }, + { type: 'Polar', name: '3', coords: { distance: 50, angle: (0.25 * Math.PI) / 2 } }, + { type: 'Cartesian', name: 'bottomRight', coords: { x: 0, y: -5 } } + ], + sensedTypes: ['pucks'] + } + ] + } + } +}; + +const simConfig = { + env: { + width: 1024, + height: 540, + speed: 15, + renderSkip: 1, + fields: { + heatMap: { + url: mapUrl, + defaultBackground: true + } + } + }, + robots: { + count: 1, + radius: 18, + controllers: { + velocity: { + controller + /*, + + WOULD LIKE TO PASS ALONG TAU AS A PARAMETER HERE BUT PASSING PARAMETERS + TO A VELOCITY CONTROLLER SEEMS TO HAVE BROKEN. + + params: { tau: tau } + */ + } + }, + sensors: [...Object.values(usedSensors)], + actuators: [], + useVoronoiDiagram: false, + misc: { + tail: true + } + }, + pucks: { + groups: [ + { + id: 0, + count: 100, + radius: 8, + color: 'red' + } + ], + useGlobalPuckMaps: false + }, + objects: [], + positionsGenerator: CorePositionsGenerators.randomCollisionFree, + renderables +}; + +const benchmarkConfig = { + simConfigs: [ + { + name: '5 Robots', + simConfig: { + robots: { + count: 5 + } + } + }, + { + name: '30 Robots', + simConfig: { + robots: { + count: 30 + } + } + } + ], + trackers: [ new PuckFieldValueTracker(tau) ], + maxTimeStep: 20000, + timeStep: 100 +}; + +const description = { + html: `

An implementation of the Orbital Construction algorithm which uses a scalar field to guide the construction of an enclosure.

+ +

The scalar field is just a grayscale image. A parameter tau defines a contour line of the scalar field. In this case, the contour line is a circle and tau = 0.6 defines that circle's radius.

+ +

The cyan robots orbit the periphery, always trying to align themselves so that scalar field increases to their right. They also try to reach the desired circle. However, if they see a puck in their left sensor area, they will deviate to nudge it inwards.

+ +

The yellow robots operate similarly, except they react to pucks in their right sensor area and deviate to nudge them outwards.

+ +

+ + Vardy, Andrew. "Orbital construction: Swarms of simple robots building enclosures." 2018 IEEE 3rd International Workshops on Foundations and Applications of Self* Systems (FAS* W). IEEE, 2018. + +

+ ` +}; + +export default { + title: 'Labyrinth', + name: 'labyrinth', + simConfig, + benchmarkConfig, + description +}; diff --git a/src/scenes/Labyrinth/labyrinth.png b/src/scenes/Labyrinth/labyrinth.png new file mode 100644 index 0000000000000000000000000000000000000000..143db705e67f4c90733fb132a23bbc451c90b8bc GIT binary patch literal 56623 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%0D7y*MVGiXJ3cxYY+O+4nSa*D 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 literal 0 HcmV?d00001 diff --git a/src/scenes/Labyrinth/robot/controllers/controller.js b/src/scenes/Labyrinth/robot/controllers/controller.js new file mode 100644 index 0000000..dc2f1a2 --- /dev/null +++ b/src/scenes/Labyrinth/robot/controllers/controller.js @@ -0,0 +1,43 @@ +/* eslint-disable no-eval */ +export default function controller(robot, params, onLoop) { + // PARAMETERS: + const maxAngularSpeed = 0.015; + const maxForwardSpeed = 0.2; + + if (onLoop) { + const func = eval(onLoop); + + if (func && typeof func === 'function') { + return func; + } + } + + return (sensors) => { + + let command = { linearVel: 0, angularVel: 0, type: robot.SPEED_TYPES.RELATIVE }; + + if (!sensors.fields.readings.heatMap.left + || !sensors.fields.readings.heatMap.centreLeft + || !sensors.fields.readings.heatMap.centreRight + || !sensors.fields.readings.heatMap.right) { + return command; + } + + const l = (sensors.fields.readings.heatMap.left)[0] / 255; + const cl = (sensors.fields.readings.heatMap.centreLeft)[0] / 255; + const cr = (sensors.fields.readings.heatMap.centreRight)[0] / 255; + const r = (sensors.fields.readings.heatMap.right)[0] / 255; + + //console.log("l, cl, cr, r: %g, %g, %g, %g", l, cl, cr, r); + + let angularSpeed = maxAngularSpeed * (r + cr - l - cl); + //console.log("angularSpeed: %g", angularSpeed); + + command.linearVel = maxForwardSpeed * robot.velocityScale; + command.angularVel = angularSpeed * robot.velocityScale; + + command.linearVel = 0; + command.angularVel = 0; + return command; + }; +} \ No newline at end of file diff --git a/src/scenes/Labyrinth/robot/renderables.js b/src/scenes/Labyrinth/robot/renderables.js new file mode 100644 index 0000000..9369ca1 --- /dev/null +++ b/src/scenes/Labyrinth/robot/renderables.js @@ -0,0 +1,280 @@ +const bodyRenderables = [ + { + type: 'Body', + svgClass: 'robot-body', + dataPoints: { sceneProp: 'robots' }, + shape: 'circle', + staticAttrs: { + r: { prop: 'radius' }, + id: { prop: 'id' } + }, + dynamicAttrs: { + cx: { prop: 'sensors.position.x' }, + cy: { prop: 'sensors.position.y' } + }, + styles: { + fill: { prop: 'color' }, + stroke: 'black', + 'stroke-width': 1, + 'stroke-opacity': 1, + 'fill-opacity': 1 + }, + drag: { + prop: 'position', + pause: false, + onStart: { + styles: { + stroke: 'green' + }, + log: [ + { prop: 'sensors' } + ] + }, + onEnd: { + styles: { + stroke: 'black' + } + } + } + }, + { + type: 'Body', + svgClass: 'robot-orientation', + desc: 'Line segments between robots and headings', + dataPoints: { sceneProp: 'robots' }, + shape: 'path', + staticAttrs: { + id: { prop: 'id' } + }, + dynamicAttrs: { + points: [ + { prop: 'sensors.position' }, + { prop: 'sensors.heading' } + ] + }, + styles: { + fill: 'none', + stroke: 'black', + 'stroke-width': 2, + 'stroke-opacity': 1, + 'fill-opacity': 1 + } + }, + { + type: 'Body', + svgClass: 'robot-tail', + desc: 'Tail', + shape: 'polygon', + dataPoints: { sceneProp: 'robots' }, + staticAttrs: { + stroke: 'none' + }, + dynamicAttrs: { + fill: 'rgb(0, 255, 0, 1.0)', + points: { prop: 'tailBody.vertices', + modifier: (vertices) => { + console.log(vertices); + var outputArray = []; + for (const [key, point] of Object.entries(vertices)) { + outputArray.push([point.x, point.y]) + } + return outputArray; + } + } + }, + styles: { + fill: 'none', + stroke: 'black', + 'fill-opacity': 0, + 'stroke-width': 1, + 'stroke-opacity': 1 + } + } +]; + +const sensorsRenderables = [ + { + type: 'Sensor', + svgClass: '', + desc: 'Left Obstacle Sensor', + shape: 'circle', + dataPoints: { sceneProp: 'robots' }, + staticAttrs: { + r: { + prop: 'sensors.circles.leftObstacle.radius' + }, + id: { prop: 'id' }, + stroke: 'black' + }, + dynamicAttrs: { + fill: { + prop: 'sensors.circles.leftObstacle.reading', + modifier: (val) => ((val.walls || val.robots) ? 'rgba(255,0,0,0.5)' : 'rgba(0,255,0,0.2)') + }, + cx: { prop: 'sensors.circles.leftObstacle.centre.x' }, + cy: { prop: 'sensors.circles.leftObstacle.centre.y' } + }, + styles: { + fill: 'none', + stroke: 'black', + 'fill-opacity': 0, + 'stroke-width': 1, + 'stroke-opacity': 1 + } + }, + { + type: 'Sensor', + svgClass: '', + desc: 'Left Field Sensor', + shape: 'circle', + dataPoints: { sceneProp: 'robots' }, + staticAttrs: { + r: 2, + id: { prop: 'id' } + }, + dynamicAttrs: { + stroke: 'none', + fill: 'purple', + cx: { prop: 'sensors.fields.sensingPoints.left.x' }, + cy: { prop: 'sensors.fields.sensingPoints.left.y' } + }, + styles: { + fill: 'none', + stroke: 'black', + 'fill-opacity': 0, + 'stroke-width': 1, + 'stroke-opacity': 1 + } + }, + { + type: 'Sensor', + svgClass: '', + desc: 'Centre Left Field Sensor', + shape: 'circle', + dataPoints: { sceneProp: 'robots' }, + staticAttrs: { + r: 2, + id: { prop: 'id' } + }, + dynamicAttrs: { + stroke: 'none', + fill: 'purple', + cx: { prop: 'sensors.fields.sensingPoints.centreLeft.x' }, + cy: { prop: 'sensors.fields.sensingPoints.centreLeft.y' } + }, + styles: { + fill: 'none', + stroke: 'black', + 'fill-opacity': 0, + 'stroke-width': 1, + 'stroke-opacity': 1 + } + }, + { + type: 'Sensor', + svgClass: '', + desc: 'Centre Right Field Sensor', + shape: 'circle', + dataPoints: { sceneProp: 'robots' }, + staticAttrs: { + r: 2, + id: { prop: 'id' } + }, + dynamicAttrs: { + stroke: 'none', + fill: 'purple', + cx: { prop: 'sensors.fields.sensingPoints.centreRight.x' }, + cy: { prop: 'sensors.fields.sensingPoints.centreRight.y' } + }, + styles: { + fill: 'none', + stroke: 'black', + 'fill-opacity': 0, + 'stroke-width': 1, + 'stroke-opacity': 1 + } + }, + { + type: 'Sensor', + svgClass: '', + desc: 'Right Field Sensor', + shape: 'circle', + dataPoints: { sceneProp: 'robots' }, + staticAttrs: { + r: 2, + id: { prop: 'id' } + }, + dynamicAttrs: { + stroke: 'none', + fill: 'purple', + cx: { prop: 'sensors.fields.sensingPoints.right.x' }, + cy: { prop: 'sensors.fields.sensingPoints.right.y' } + }, + styles: { + fill: 'none', + stroke: 'black', + 'fill-opacity': 0, + 'stroke-width': 1, + 'stroke-opacity': 1 + } + }, + { + type: 'Sensor', + svgClass: '', + desc: 'Left Polygon Puck Sensor', + shape: 'polygon', + dataPoints: { sceneProp: 'robots' }, + staticAttrs: { + stroke: 'none', + }, + dynamicAttrs: { + /* + stroke: { + prop: 'sensors.polygons.left.reading.pucks', + modifier: (val) => val ? `rgb(255, 0, 0, ${0.2*val}` : 'rgb(0, 0, 0, 0.1)' + }, + */ + fill: 'rgb(255, 255, 255, 0.05)', + points: { prop: 'sensors.polygons.left.vertices' } + }, + styles: { + fill: 'none', + stroke: 'black', + 'fill-opacity': 0, + 'stroke-width': 1, + 'stroke-opacity': 1 + } + }, + { + type: 'Sensor', + svgClass: '', + desc: 'Right Polygon Puck Sensor', + shape: 'polygon', + dataPoints: { sceneProp: 'robots' }, + staticAttrs: { + stroke: 'none' + }, + dynamicAttrs: { + /* + fill: { + prop: 'sensors.polygons.right.reading.pucks', + modifier: (val) => val ? `rgb(255, 0, 0, ${0.2*val}` : 'rgb(0, 0, 0, 0.1)' + }, + */ + fill: 'rgb(255, 255, 255, 0.05)', + points: { prop: 'sensors.polygons.right.vertices' } + }, + styles: { + fill: 'none', + stroke: 'black', + 'fill-opacity': 0, + 'stroke-width': 1, + 'stroke-opacity': 1 + } + } +]; + +export default [ + ...bodyRenderables, + ...sensorsRenderables +]; \ No newline at end of file diff --git a/src/scenes/index.js b/src/scenes/index.js index afc2f13..7425821 100644 --- a/src/scenes/index.js +++ b/src/scenes/index.js @@ -5,8 +5,10 @@ import beeClust from './BeeClust'; import voronoiSorting from './VoronoiSorting'; import simpleSorting from './Sorting'; import demo from './Demo'; +import labyrinth from './Labyrinth'; export default { + labyrinth, demo, orbitalConstruction, beeClust, From 26c20b76b39ee4c787231c45d3052f38356ec3f7 Mon Sep 17 00:00:00 2001 From: avardy Date: Sun, 11 Jun 2023 21:03:52 -0230 Subject: [PATCH 2/5] Mid-attempt to incorporate constraint on tail --- src/common/puck/index.js | 11 ++-- src/common/robot/robot.js | 59 ++++++++++++++------- src/common/scene/renderables.js | 4 +- src/common/staticObjects/staticCircle.js | 10 ++-- src/common/staticObjects/staticRectangle.js | 10 ++-- src/scenes/Labyrinth/index.js | 14 ++++- 6 files changed, 70 insertions(+), 38 deletions(-) diff --git a/src/common/puck/index.js b/src/common/puck/index.js index fa55164..5b2b913 100644 --- a/src/common/puck/index.js +++ b/src/common/puck/index.js @@ -24,11 +24,12 @@ export default class Puck { this.body.frictionAir = 1; // this.body.frictionStatic = 0; // this.body.restitution = 0; - // this.body.collisionFilter = { - // group: -1, - // category: 1, - // mask: 1, - // }; + + this.body.collisionFilter = { + group: 0, + category: 0x0002, + mask: 0x0001 | 0x0002, + }; World.add(this.world, this.body); // Initialize velocity according to movement goal diff --git a/src/common/robot/robot.js b/src/common/robot/robot.js index 96c8f16..4fdeff0 100644 --- a/src/common/robot/robot.js +++ b/src/common/robot/robot.js @@ -88,46 +88,65 @@ export default class Robot { const compoundBody = Body.create({ parts: parts }); + + // We'll set the main body to category 1. + parts[0].collisionFilter.group = 0; + parts[0].collisionFilter.category = 0x0001; + parts[0].collisionFilter.mask = 0x0001 | 0x0002; + this.body = compoundBody; if (this.tail) { + let tailLength = 2.7*this.radius; - this.tailBody = Bodies.rectangle( - position.x - 2 * this.radius, + this.tailBody = Bodies.trapezoid( + position.x - this.radius - tailLength/2.0, position.y, - this.radius * 2, - this.radius / 5 + tailLength, + this.radius / 5, + 0 ); + //Body.setAngle(this.tailBody, 0); var revoluteConstraint = Constraint.create({ - bodyA: this.body, - bodyB: this.tailBody, - length: 2, - stiffness: 0.9, - damping: 0, - pointA: {x:-(this.radius + 5), y:0}, - pointB: {x:this.radius, y:0} + bodyA: this.body, + bodyB: this.tailBody, + length: 0, + stiffness: 0.9, + damping: 1.0, + pointA: {x:-this.radius, y:0}, + pointB: {x:tailLength/2.0, y:0} }); var straighteningConstraint = Constraint.create({ - bodyA: this.body, - bodyB: this.tailBody, - length: 0, - stiffness: 0.1, - damping: 0, - pointA: {x:-3 * this.radius - 5, y:0}, - pointB: {x:- this.radius, y:0} + bodyA: this.body, + bodyB: this.tailBody, + length: 0, + stiffness: 0.9, + damping: 1.0, + pointA: {x:-this.radius-tailLength, y:0}, + pointB: {x:-tailLength/2.0, y:0} }); Composite.add(this.world, [this.body, this.tailBody, revoluteConstraint]); - Composite.add(this.world, [this.body, this.tailBody, straighteningConstraint]); + //Composite.add(this.world, [this.body, this.tailBody, straighteningConstraint]); + + // Tails belong to category 4, which should only collide with pucks, + // category 2. Everything else is in category 1, which collides with each + // other and with pucks. + this.tailBody.collisionFilter.group = 0; // Group is set to 0 so that we use category/mask for collision filtering. + this.tailBody.collisionFilter.category = 0x0004; + this.tailBody.collisionFilter.mask = 0x0002; } this.body.friction = 0; this.body.frictionAir = 0; this.body.frictionStatic = 0; this.body.restitution = 0; - Body.setAngle(this.body, Math.random() * 2 * Math.PI); // Randomize orientations + + //Body.setAngle(this.body, Math.random() * 2 * Math.PI); // Randomize orientations + Body.setAngle(this.body, 0); + World.add(this.world, this.body); Body.setAngularVelocity(this.body, 1); this.engine.velocityIterations = 10; diff --git a/src/common/scene/renderables.js b/src/common/scene/renderables.js index d482bfa..b9c137f 100644 --- a/src/common/scene/renderables.js +++ b/src/common/scene/renderables.js @@ -14,7 +14,7 @@ export default [ height: { prop: 'height' } }, styles: { - fill: '#000000' + fill: '#444444' } }, { @@ -31,7 +31,7 @@ export default [ r: { prop: 'radius' } }, styles: { - fill: '#000000' + fill: '#444444' } } ]; diff --git a/src/common/staticObjects/staticCircle.js b/src/common/staticObjects/staticCircle.js index 3b73564..7cb2c66 100644 --- a/src/common/staticObjects/staticCircle.js +++ b/src/common/staticObjects/staticCircle.js @@ -28,11 +28,11 @@ export default class StaticCircle { } this.body = Bodies.circle(this.center.x, this.center.y, this.radius, { isStatic: true }); - // this.body.collisionFilter = { - // group: 1, - // category: 1, - // mask: 1, - // }; + this.body.collisionFilter = { + group: 0, + category: 0x0001, + mask: 0x0001 | 0x0002, + }; if (shouldAddToWorld) { this.addToWorld(); diff --git a/src/common/staticObjects/staticRectangle.js b/src/common/staticObjects/staticRectangle.js index deb436a..a1c9393 100644 --- a/src/common/staticObjects/staticRectangle.js +++ b/src/common/staticObjects/staticRectangle.js @@ -41,11 +41,11 @@ export default class StaticRectangle { { isStatic: true } ); - // this.body.collisionFilter = { - // group: 1, - // category: 1, - // mask: 1, - // }; + this.body.collisionFilter = { + group: 0, + category: 0x0001, + mask: 0x0001 | 0x0002, + }; if (shouldAddToWorld) { this.addToWorld(); diff --git a/src/scenes/Labyrinth/index.js b/src/scenes/Labyrinth/index.js index 31cc9b2..198aff4 100644 --- a/src/scenes/Labyrinth/index.js +++ b/src/scenes/Labyrinth/index.js @@ -159,7 +159,19 @@ const simConfig = { ], useGlobalPuckMaps: false }, - objects: [], + objects: [ + { + type: 'rectangle', + center: { x: 512, y: 203 }, + width: 30, + height: 405 + }, + { + type: 'circle', + center: { x: 512, y: 405 }, + radius: 15 + } + ], positionsGenerator: CorePositionsGenerators.randomCollisionFree, renderables }; From 28664a4bdf7fe120413765f7f7aac0e347a2e3a3 Mon Sep 17 00:00:00 2001 From: avardy Date: Mon, 12 Jun 2023 07:01:50 -0230 Subject: [PATCH 3/5] Failed two-constraint attempt --- src/common/robot/robot.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/robot/robot.js b/src/common/robot/robot.js index 4fdeff0..c7dea2e 100644 --- a/src/common/robot/robot.js +++ b/src/common/robot/robot.js @@ -122,14 +122,14 @@ export default class Robot { bodyA: this.body, bodyB: this.tailBody, length: 0, - stiffness: 0.9, + stiffness: 0.05, damping: 1.0, pointA: {x:-this.radius-tailLength, y:0}, pointB: {x:-tailLength/2.0, y:0} }); Composite.add(this.world, [this.body, this.tailBody, revoluteConstraint]); - //Composite.add(this.world, [this.body, this.tailBody, straighteningConstraint]); + Composite.add(this.world, [this.body, this.tailBody, straighteningConstraint]); // Tails belong to category 4, which should only collide with pucks, // category 2. Everything else is in category 1, which collides with each From 341f35a5ec13924e49d91d97da0309e52857cd74 Mon Sep 17 00:00:00 2001 From: avardy Date: Mon, 12 Jun 2023 09:52:46 -0230 Subject: [PATCH 4/5] Active tail straightening attempt --- src/common/puck/index.js | 2 +- src/common/robot/robot.js | 59 ++++++++++++------- src/common/utils/geometry.js | 7 +++ .../Labyrinth/robot/controllers/controller.js | 4 +- 4 files changed, 48 insertions(+), 24 deletions(-) diff --git a/src/common/puck/index.js b/src/common/puck/index.js index 5b2b913..489bbb1 100644 --- a/src/common/puck/index.js +++ b/src/common/puck/index.js @@ -28,7 +28,7 @@ export default class Puck { this.body.collisionFilter = { group: 0, category: 0x0002, - mask: 0x0001 | 0x0002, + mask: 0x0001 | 0x0002 | 0x0004, }; World.add(this.world, this.body); diff --git a/src/common/robot/robot.js b/src/common/robot/robot.js index c7dea2e..049a5e5 100644 --- a/src/common/robot/robot.js +++ b/src/common/robot/robot.js @@ -1,6 +1,6 @@ import { Body, World, Bodies, Composite, Constraint } from 'matter-js'; -import { getDistance } from '../utils/geometry'; +import { getDistance, getSmallestSignedAngularDifference } from '../utils/geometry'; import SensorManager from './sensors/sensorManager'; import ActuatorManager from './actuators/actuatorsManager'; @@ -89,20 +89,20 @@ export default class Robot { parts: parts }); - // We'll set the main body to category 1. - parts[0].collisionFilter.group = 0; - parts[0].collisionFilter.category = 0x0001; - parts[0].collisionFilter.mask = 0x0001 | 0x0002; - this.body = compoundBody; + // We'll set the main body to category 1. + this.body.collisionFilter.group = 0; + this.body.collisionFilter.category = 0x0001; + this.body.collisionFilter.mask = 0x0001 | 0x0002; + if (this.tail) { - let tailLength = 2.7*this.radius; + this.tailLength = 2.7*this.radius; this.tailBody = Bodies.trapezoid( - position.x - this.radius - tailLength/2.0, + position.x - this.radius - this.tailLength/2.0, position.y, - tailLength, + this.tailLength, this.radius / 5, 0 ); @@ -115,21 +115,10 @@ export default class Robot { stiffness: 0.9, damping: 1.0, pointA: {x:-this.radius, y:0}, - pointB: {x:tailLength/2.0, y:0} - }); - - var straighteningConstraint = Constraint.create({ - bodyA: this.body, - bodyB: this.tailBody, - length: 0, - stiffness: 0.05, - damping: 1.0, - pointA: {x:-this.radius-tailLength, y:0}, - pointB: {x:-tailLength/2.0, y:0} + pointB: {x:this.tailLength/2.0, y:0} }); Composite.add(this.world, [this.body, this.tailBody, revoluteConstraint]); - Composite.add(this.world, [this.body, this.tailBody, straighteningConstraint]); // Tails belong to category 4, which should only collide with pucks, // category 2. Everything else is in category 1, which collides with each @@ -264,6 +253,34 @@ export default class Robot { if (this.actuate && typeof this.actuate === 'function') { this.actuate(this.sensors, this.actuators, this.goal, newWaypoint); } + + /* AN ACTIVE TAIL STRAIGHTENING FORCE. THIS WORKS BUT SEEMS TO YIELD + UNSTABLE BEHAVIOUR. FALLING OUT OF LOVE WITH Matter.js. + if (this.tailBody) { + // Parameters: + const TAIL_CORRECTION_FACTOR = 0.001; + const MAX_TAIL_CORRECTION_FORCE = 0.01; + + let deltaAngle = getSmallestSignedAngularDifference(this.body.angle, this.tailBody.angle); + let magnitude = TAIL_CORRECTION_FACTOR * deltaAngle; + if (magnitude > MAX_TAIL_CORRECTION_FORCE) { + magnitude = MAX_TAIL_CORRECTION_FORCE; + } else if (magnitude < -MAX_TAIL_CORRECTION_FORCE) { + magnitude = -MAX_TAIL_CORRECTION_FORCE; + } + let forceVector = { + x: magnitude * Math.cos(this.tailBody.angle + Math.PI/2), + y: magnitude * Math.sin(this.tailBody.angle + Math.PI/2) + }; + + let position = { + x: this.tailBody.position.x + 0.5 * this.tailLength * Math.cos(this.tailBody.angle), + y: this.tailBody.position.y + 0.5 * this.tailLength * Math.sin(this.tailBody.angle) + }; + + Body.applyForce(this.tailBody, position, forceVector); + } + */ } setVelocities({ linearVel, angularVel }) { diff --git a/src/common/utils/geometry.js b/src/common/utils/geometry.js index 141b090..98bf4bb 100644 --- a/src/common/utils/geometry.js +++ b/src/common/utils/geometry.js @@ -12,6 +12,13 @@ export function normalizeAngle(angle) { return angle % (2 * Math.PI); } +export function getSmallestSignedAngularDifference(a, b) { + /* Return angle between the two given angles with the smallest absolute + value. Meanwhile, the value returned will have a sign. */ + // From: https://stackoverflow.com/questions/1878907/the-smallest-difference-between-2-angles + return Math.atan2(Math.sin(a-b), Math.cos(a-b)) +} + /* * Calculates the angle ABC (in radians) * diff --git a/src/scenes/Labyrinth/robot/controllers/controller.js b/src/scenes/Labyrinth/robot/controllers/controller.js index dc2f1a2..87e4508 100644 --- a/src/scenes/Labyrinth/robot/controllers/controller.js +++ b/src/scenes/Labyrinth/robot/controllers/controller.js @@ -36,8 +36,8 @@ export default function controller(robot, params, onLoop) { command.linearVel = maxForwardSpeed * robot.velocityScale; command.angularVel = angularSpeed * robot.velocityScale; - command.linearVel = 0; - command.angularVel = 0; + //command.linearVel = 0; + //command.angularVel = 0; return command; }; } \ No newline at end of file From b809aa740207d3d331a48100cf3eab8435bb6870 Mon Sep 17 00:00:00 2001 From: avardy Date: Wed, 14 Jun 2023 16:02:34 -0230 Subject: [PATCH 5/5] Scene is working! --- python_scripts/paint_scalar_field.py | 6 +- python_scripts/scalar_field.png | Bin 47820 -> 0 bytes src/client/dist/scalar_field.png | Bin 47820 -> 0 bytes src/common/puck/index.js | 13 +- src/common/robot/robot.js | 79 +---- src/common/staticObjects/staticCircle.js | 10 +- src/common/staticObjects/staticRectangle.js | 10 +- src/common/utils/geometry.js | 22 ++ .../benchmarking/puckFieldValueTracker.js | 2 +- src/scenes/Labyrinth/black.png | Bin 0 -> 1495 bytes src/scenes/Labyrinth/index.js | 146 ++++---- src/scenes/Labyrinth/labyrinth.png | Bin 56623 -> 62942 bytes .../Labyrinth/robot/controllers/controller.js | 324 +++++++++++++++++- src/scenes/Labyrinth/robot/renderables.js | 197 ++++++----- src/scenes/Labyrinth/scalar_field.png | Bin 0 -> 1495 bytes src/scenes/Labyrinth/travel_time_0.png | Bin 0 -> 84927 bytes 16 files changed, 556 insertions(+), 253 deletions(-) delete mode 100644 python_scripts/scalar_field.png delete mode 100644 src/client/dist/scalar_field.png create mode 100644 src/scenes/Labyrinth/black.png create mode 100644 src/scenes/Labyrinth/scalar_field.png create mode 100644 src/scenes/Labyrinth/travel_time_0.png diff --git a/python_scripts/paint_scalar_field.py b/python_scripts/paint_scalar_field.py index 3171bc7..8d76e35 100755 --- a/python_scripts/paint_scalar_field.py +++ b/python_scripts/paint_scalar_field.py @@ -26,8 +26,8 @@ #width = 800 #height = 600 -width = 600 -height = 400 +width = 1024 +height = 540 cell_radius = 0#1#10 cell_width = cell_radius * 2 + 1 @@ -103,7 +103,7 @@ def application_function_probability(value_0_to_1): #paint(image, value_function_top, application_function_direct) #paint(image, value_function_top, application_function_probability) #paint(image, value_function_centre, application_function_probability) -paint(image, value_function_centre, application_function_direct) +#paint(image, value_function_centre, application_function_direct) #paint(image, value_function_segment, application_function_direct) print("Writing {}".format(filename)) diff --git a/python_scripts/scalar_field.png b/python_scripts/scalar_field.png deleted file mode 100644 index eade3919454f1710a65363def009bb3e66f5e601..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47820 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

xOf!a*0VC%$kaAlTS9L6_Alv`^MHS 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 diff --git a/src/client/dist/scalar_field.png b/src/client/dist/scalar_field.png deleted file mode 100644 index eade3919454f1710a65363def009bb3e66f5e601..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47820 zcmcJ&4Rn^}nJx;Jy@)+(5|sK=Ab%i#Z9@c66cc`efjE^P>2_x8K$S}EQ5P0%HEjkM zWRXCb{1Hna76h@ry6*dV z-uFvl_pE8pOMoEqJ4*^{ zTk`N9M%=w>e)WhE#Uqwf&tLiE$iIH=()&Mq`z50)esQtrA8%c_qV;><81v`zHmq1O z)vhJAZEX{m)Q(xwHnFX`v~_VcuDsT=-mcc^`E{p?W^J5N-aq44;~u;0u^snavt~!d ziH?djCwA<P)c5os-dkKED zE}mFgSXi=POG{Zz)4g?Fo%LNub~n7**RiJQzH5$ObK;sc`ta@!`}CPJ5AW7T<5Pdb z0r1Prs_UyJKYy@Y*TIRCmhhwb>Dwlb*~Ymy7A$CLnSS?#%=JYx*7e=@(yLqNY~_bz z=4-k;Dlp~la6OFaAI1PSb$bT3oZ;EHsEs9p6<=teP|_J$HOQ=H7~rpE#zq zv9X{8Q`g7;`GvQSbiVLv-<~xcYjO=!L4)J!+`YS}8}m;L)0w?CJN5bYwiR}@wR7(L z{B3S`7(Q>#`rgw|?;0rGIOAByE`B}?e_{rv-+j%@wXl2m_@Pdn-P!ZguKcN-ew!|S z{t65*20t7&wEehO*Poko?9KANC;D&r)xD2(S6n8??x?`WSIk`F=7;G4olZjx-3r*u z?ksBEx4gD?sykpRe5(a4DJ68OCzdX#&MR?Tj_!GLZugBR#~q(>*_z8}{9NDS^JnLN z{My-_`&x=xR{)r4|1QCYw=EvCts1~2GRM(E3s+@I`ftd8tfvA4xP6HF?j5^#!$hz> zt^aU@{BIrxcpjeJ|EbKC`uyh)9&A4da8C6F5I_^hV1UBXE#pdnpWZKC__>gOT_4bc zn1TZ^0HDbc^y&O~dKVwPy9bk}eX>UfHnq2L2-pZeEp+9BQmg9L_=XAG1j_T5o}; zSu&k_1MUXX!QGRJZg3JkK0|Clo+A;#SfV(FGFHGq&=R_}jQ-oQ--k1nDC!V)?Tk4K zYLZ5EX=#ZZPAGc^PsN>hrUhs&ApM0YD7B_i(!!>k!@2y%2!4*b9kbrC#w^d^t5=rTn0ut>D z1J@theWqIgMi_E2Gl487A!Q*Y3WKjAFlDist9SkG5PUy%l2LjsL&YNnjB9*VxS&_D zct_=ftNQjl)O24{1-LL|=n(2k6^T;_ErVC*BS*h*W|^E1gORkvT8=QJRFGmTvl1g^ zLZ&UhV^>|rLrq9|@ctUCB`0GX9wtf{i=91vZ)UzhQVITNJktLR`)wg{Z;8~taZeaV zX&ZT!CR18vUZuT^dJ%-dGd+x#qtjM@*IbjcoFvO4U`pkhF2L;6u{}4LupvR3_DHD% zV-`dt27$T2!L}G$@9J}JP8+(Q_MoB^HF<@lNL94k7cPGJ-Jau2g(m?4BtkHlA?;c$ zCMX=|uiT+}u0Ho7%w{kMp+mi<)GpIO^1yU8T~AM6TDPmJ;|X$pjGP>@eaoq77z zP&SMkaCZNs?4I@&WcHE~t&w)bt82gKsEe8iD z!Ckw5)b*=&M>m7WhzH1vdK6&<>lMrqB@o`GxIhS0i(C?i;sxAEtVn~xUW9c7L{H!J z48n8;SyTZVmK3cAU2WEbJj%4}8fd69*=yQDc(7E!bfBzBM|oP7k2u)N{I0y~?t^p` zesWBvYJ^k3MC-&>1nsuQ0y>J|yZ+++?{*7(qB#j{7|(dF2eO?a215}FS`ZERj+WQi zQ@`ryffcnsu+R;x3RNTBCt)ek;kt6+yXTtw{?Sz#d?m?&v6SNmtqX$$Px*L{RFU4$kF7k>PDrB7ocHh9_xTchJ=#(h*4z%O(c=BqPt99!_bwV-?s}6 z3v>ZfBEM=l(H|tO1XYO(wsTL^?LI>#ayj%AX~`3~tqqwKjHJN^QPS+rNBGtMXW1jQ zQ=eW@D}U+L40rf9^(!i; zKhLo|&S*y(5^l3JB56Ga%37JKgmsgIHS}Dh!hjILk=nsDFH&L%F@D#x7J$67@5HV>lEEf z5OfC<6i$-y+S`9|amrJl zdVSW8QQPnT)_<@1=*+c$+j;Pv5#MEnVc8AJgVnDUV43zaz4`r}(B{n5L8m1U`Xqv( zwe^KkwRImblmjEG9fZCW1jLcVdS1!;E!0!ZR5_P>i$J9wSn~w&gTTOoxol&!;L|wR z;hw(9nKBTX{OX2A24|Uu0p(f9c2MYIBp?kpXi2L+@ae<_)s5p&G0yG1=feF*sZ!YH*>PWPJAkDk2+nXDsatg5fr-WTt;zmn z?GJLp#jKjNX`I6w!E%Vsfwqe?k9l&Eh;XH+q6@UcK|!k0D}zx3FMu+}t{o4}N1m3+^fyQ%*tE@KnnB0T{|nw~JMIv-eIVla-^`3L}1`E>L1D}kN> zAdgf6Hs;1w1Y~118b<6_EY1G?T&pipiL+H934_rv9_jV>2FF_FkNx$3?IU854k4=w z!L-oP?I_TZ`GFu0NJA_l7^Bu*^hS(c1pqk~1V zI}i7_)_(S~g*rE+%-@r7g-laAAg;VQM6Kr%mV;w-3dVnc09O8_(`s z+FJ$-=lGWCnOrHrnH7^74JkCipYo{;98##o=wZfc->0&R zf3Py;+?d5Zxp?wKcNf=!JocQ{DUpSe&^o%Ie=-amiT|Wc3{UWFQP<=Z3K(&z1MR!|s}Joa%bP#uN!NhmbGOY)Z^mizqs>EB_$YI|Nh` zp7br!n+kpP_Sk-@>w0CNAv>Fpvh)VMAlJgq8abqzSY}xa`PjDH+3$4UlbvVl9m*I> za6w*!r6kedU$){<58ZKLhEk5TV^HNGf|$ysb%TVD;{wRxi^MNb0nnYVWL8Z>_y%Kx zkzF80t|FXuKZQlJvR(a`8M{sBog}?*1W~9gLj#DhgXM-VSX+RGmof0Wr@kGAW%ii{ zH>-vLzGBX!wY^$b{GR?SS^~IzbDY^OW$BQ3T-aO8%D;(=nPfR`=M$O#Y=PvAWg{!y znjoGkH=Bw6ZeOKSt)Q@zb?_FC@2Brur7#IWMTeo)4 zLv=4`WM8&)Tu?W<_vPi4T6E&e>G|233lChVP*5o=p~qx}l}TbNtCGW^s{NgxN}PHCB#GC3!@dMfAE%b5^Zk89nF?F5DYI!Z!vbbKy6A!Q%L11R0Um zzvA6Pk00XrvOJug6d`7I7O}h`L4mb}1rPY-9yapG+1;Q|teR{R+Ma{jcRn@;mc2Ov z82|mh?YX1wZ^F8<=(HZtodoF~Vas%`iLxT&VjHM&vC3rA+41*fi}nz2bq5(W<-PbUoNkLc{#w?5oo>ttrD zr~0A*3qq(?T*@d@-x(DHL{RVPT?22_?^c27)q?eutcDNz$6*e@8_aXa%nZ=;zt#QV zXZwesox+dl%OcGhX+S&FCR!xaeMlf7#Gyz`Xb#FAA<#YvYn|g?t}FQwRmpFcIlJL| zQk%EDKry(u^jfSQx)V~DH?zk|$ zynl874b5{P`Dd(kb@+dL@#gP`X90YIWP(IaB-tiVU<#QhXTMYb-D8VuU?IgM^;=R_ z!a+IMv|dQ*mS^T>+AgkH)mQOVb>_U;&6bNAF2e<+GeIgUe$1fkXwF>ybS;LbdlVj2 zHZ%_NZEV_+5EdipLBy4C^hp~lR&#W_)njsG;_)7Q^p1wVL$dqG!O^T2nD`d+E)UgPEm zEAgoU(Q!2Y+L^g&U{DIu@F!>Y&#%PzaKO)&8vuX;BPVeKDnoLU*&o7|a=IYXRd(_8 z#_nT%70r6IffCOxFw_7!X=pI`e!cc&-&6I!SPtml;^^aV!e7+%&W;l&p@W0Ydtu4? z1rzE{U92eYzow7PTeZS)7eUfCxPY*@GB6?E=@?CI)io5juqU z@9k~fHSo(L-E00qceSDl@O$y#r6KZTP)6X$o#Xjy|EkI#JZ=-P7)TT^OB%1<9D&Hk zs2K~uM7!$I2(aKcfi3(EvA!ilWkU*|kcct(BZ$2o=usW#b_DrSKmo5YzE^WJeDFe#a}B`Op9C?d32+oI$#* zBS)hftPYG7bk$od0{==8Xx;lX0oW5#p_2~p2LPn`$Hsr;oAd)Kjq!?sNJ1{lK!Om$ zWI;8g^;iI(GAUVb=baO>pFh*RjvSE=-M7~L z=y9T8FcYSQnN%VAP%L=@4NSk-v9V{(1eMafxvnUb9#n=56i5@86>{c40`e$m>cJGA zgC9H+#YeycWeTW>Ktx}j7xI8Q)4a{wQnM<9n+;?EC27Bt2PU#GBoQJ>Cn%)<-2h@g zhXKC-@XmL!`X&(Jb1@MHajfB!R86J8TM%2iF0JcD9tu3b*5>YOnS_$AX0U*gz~CSx z1U(KggCni47z{WC!qF2#P^n2Qvf3sUfeV?3oBNOo?5P%j!1VYa3nZ!(7Kjia_(B}M z|LY(3e70^fU^v(Y)8vJ~My!fLIi_p?Ahx}NPIjNSu_=^zB{In~krQ#M29i3Ck%$R2 zWvBkGy~$>PeBd@1_)Ls$6y%mfrc#IX0<9n_JURPT z#N$Bw6Sshm8ILJP#H@tW2u&g@fRXgn7jm+~abw3BP~txji}pB!wK}ZFqGD7D(R9#I zBw`+%0YGtbDax~3I15c8WJar3EH$%#N!`j$0HH9ZRFu$sqa?Z!Tp_GA05wDN%wQj2K`CG6ODxLHZo& z0YQ0_f)afKdu)<8h^#cN%8iBt7^8kyk-6dgp_n9sBczouery{M zj+BW^(yKE)16He8$qp~gz0swRQLoH z%h<(0d4!gCZiT^jtF}8JhIWIlTYz^=A;3x|A)4$QJLMF)S1n zoI`0Zym74Kn#KnoYc%yJYrgrHp;W(8S z?_Hy;ZAHHjnt8Nx^>IG7sJ@jqphK+^=vfhI)RefvScwdc$iNgB6TB1`Ly`rRQ|un9 zkHxwX$?_E>OUV`8v{%t$f-MyDij1fdq?H&IfMSSA&fsKI)w#}(-V!^VKaar3(eU0` zLTI*mXil8eh8r%8d96EZj`lWW5f$FRTYCa<%)z5GWatWN2WjP>)0O05l*p8z^6?8q`e_OWQOoRXR!MH12Z5g3zeBZ0x$pLeqmI zM?-RjUj}BmX zd>%gPz=8etbN~JW`r5B+VSU@amE)2N->)3El3#vZHFoTxMax%SwP^WOiwgN;dG%G0 z)rE!C1@lMEpV!jbT6XcO$=6?>M>B8|rKJaG2>wXyfR*_5;Gshg9(s^p@jCSJ#Hu+r zKl!L#%f9}ozLqUt{&oE1wQ}WEoWxa&F#htZmS0u4$fi&@e^lY9`2__nW%-#GpKQFc zpa6fuf77+Rx{&`b{)zsjeacu~m+R-{mygxg<-EpUcU|SF{Ijnm*ZenLoBziAMfi#r zJ_1v~N8(GfkR_^N2#h;#UenyJ^0Os(&YP!MRC5}O@PA+e`WN<(v6gVnTDfx8%31u1 z*W-=(8KU5+r$+M{Yd^=19?LJgFo7_QTz8D3J2;C|MQ5jC7V`?K3p5E%L#E)&wF3Ma zJ`T1Bc7Qo#i0iJKR@s$*#T63he~*v;%WmaCv!ak)EE-f)L>P5$}^@9~0H;12$h>k>l4JyN|KKQIDryo|yu z;E|En&dFS#|KVp49~K_NM`%Q*0aLi-FX!LlwZG)(smX6dhqzPVjl?B@ho<4UfUP+R zPNN!=;4GGY{r*cXVT2k>AUd5RL=!PS4=_RzoH^mSaN)v+vz_(pAAQtJA$z>{-m_=* zgJEqKcqTB#l1c+Pecjj+rU;vx(ns$YL;1^u{xBMhyzXKpbSb-O20g~)$9i6>n?(3K4!5KCO zuqC|VY>9tHFo>{+W9wUH!4gy6?R{#y&%pwO?1``tZF*?Sq>2t>D*zK_4_vi0vvBSk zmx3?J*~%K2=XU}J!L3eN-%3nxJ2aur<1jNK9ptACsBI5{h_IwzL!9$8Cw+NP^|K-cyUbg)0 zx0b#AmVUlvi3@?T^@rgk{?)u!FJ_V*`-LyX1!Ty_^EfP+h>l zpcP0`F=>Rr7(&+c1NdS8LQH|li=L1n>=#cTmOqrkLh5j~1R_9FqeN3L-dr(q{yhB2 z6Bij(L@7I%C*TLVfnV`*M_hNb>!y6r^>6{2Siu|tPcS^`i9isWHtiUfU1U-Qcr4c6 zQN++|gd~3T%Ls}L6?{M^01LO&x8C$2*002siqC0RFg`6h8J~nhM1u%|q9N~+OTZ5s z!4H&E_z%D;CzwPg|Di5p>9l+xQNs-j8?N}Ublo&JgW^J-VB(nn27VCCy5J3f3kD|E zK!v=Jq~<|JEX|bcMO2K0CkTdAP%zJcCjEMQ8Gbk#Il9J|A*QYB?U5De5O^eBhi=vn zTZL2^&6`4`$a>SJadoY`p4=uWW0C2I6d)Lr=_zm$;Yv*ca{x~cf&`+%IKm+zf`ET9 ziO7_q2h1VcaPvr{Zl{JMaT^|G#lQ=WNI=nm0D?OI);}#eI^~K9#3LL5H;^3cg0$ri zzYGpSn$iW~w;A*dKz`|&j$)}Wj0U}Ibg4bpR8>4lgRF(@keS3{XeFpv-M3sFEA!VZXs#~(cO zWLr7W=r-W;DIa)AKSV`Gq6^7FnSyYHmb<-aU=p%6zBOKm$`4NJctw&56i2AbP|wahVpO> z(MTwqe{0!?#pMvx!h(?`Ia2z;<%3sTOuL|`6dWlVMvk15c~KELA888K2?>J#vt=mH zPbSpARJg$RnlBMAoB`?4$WbzOPUbtB0LQmHO|jrI z-u@-Wj=C|XN92d`z{2?tikBJ|g@q?~?*Dao7C;msc2H<|co@1#cgln+`4$0%NY#kV z)rd{yY^es%mL^;D4?QMOQ!pgbF(G?2mMz_Gs2s)~sS;Q!NHc&o0uh_4=LAf+Sel5+ zDas}z#~2hA5hR84ipwj;Z!cRq4RFxtX{NRk*eJ>fN=nEOVdOvyv_Q!gRJs&BC0Rl_0_5}}<${Df1T=#d)5QPk zm%1&I%_#sRqwhc7IvR>aGq~BzU||u%GLiH$tAf%ZLM|vfhK57r<|x=)Fd`B{I3&@? zSP&m@8WovmF{~zlB;i4zz_j9q(kYZR2Qo$XJi6(sZH1#Mmi^ns=gz(Km&Kp?hu!ju zb5$`rLd9hl8!u&DfdWe=AyG>AG2dP>cI^0DR)UQJcMj5+M$x7#N*?tsGaE_#gcs z7=@aW#7zsm#u-eThB*jhq6TTW>iH_Jnsy9~xpFf5P^DAY2V+IW1{!RD3o&Vf%K-9( zRZ}5E-g@hwy8bz=-o$)d{|Asxbd?Qm6F|6;r>(dH5}M{_%J$w&)dZff9D)DAqX7Xi zei~B4twD9O~Lw8Q>?>S{ER6v)t|3k8H=vU2W|%RaQ~PEJ)!VxPMn<@%%)6Z}o_JvvHUS6U=&=CbAnd7(Ase8y z--x;%-=dxd^oe^41iJ`1!@XOc15+)=YuU&fQr#}3MZhrVHV5DQH-J77o8=?}o|=Cx ztyTB4rNDLvcqjxNc?jdu?$PWLCbWC%x}rFRI^vHu5b~&?KX?x#WAV;vig}E|pd%3% zmmQNz1?D2;+~YPhUGA*!g-R?R@y(~YK28v?@50!Y9Dq9vt%wUsS(&)7a8x0(5K_=c ze8&tV0*tD#0c*q)IHaYzKwbJeU=HCC!peT?euszQZIig6X_ z5&rn01Zb}P2H|Y$1ax*={+Z}vY$un|i~w&Omm6kUH?RhVDZ3M0Wu|*eca-hABC)FK zK)X(=D@3ITY+oVk5EZ21B($-0CkVV*VBR)NJjMWqH)fzXV^1?+Mox z6pS8S1Webvth3)dtC{vucpFWr78j+lTUi!3#p%rZALp07ox>)>EqKoWZVS=`n7d}f zwkv~~fh@&RLYo*=RYNL0--e9&5mFYWGkPRrX;>de7ZYDjVB#;PjK;i6*7q)aW)mn> zEtO#9Xk_K(9Ks4V#+tu%zSvL&7Z0~!&sn5w7YSF5RaXVHb#1orO0gF5rdN#!UIVi{ z`-y`-_+SBDsz@5@-;{e3RFOGgWb(%6ug_y%Hb_ai#t0gs0%%zx`8JvPsbVbBO&lqRdG`1_4VfO+jN;tAtNe1A9v%(E+ZxsW!#R)h%U3XNjaBIHIs- z#PCj0ybv%RFZu8(zF&6fG`UnU>j9J_0;G7o)G&f#d4+|p@2z>JIN->d;b~2m7*}jW z(=u+j(r+Cam2W`$Uyf=~1J{9x*yw1g{|;k@yky38X<^(jjA=1A2ISCXPYOguWW)%k zbRJR?QVN2^lEk2tpFir_y8Br_S?MJGYVtKFr7NHN`fNO`^p?%cHf~>Ih(J(Sxh^-a z7cnT!WZO*MhXJ@s>z339IWyOna4RGAubAV0|CoT7$ln=BU9EzV*+~e`zzKm6QiW&= zIK~DXjkJ&#*OvpN993hQB8X20$b;k6vAYNZSl zvY=mV;!!1INR&fB=&07RGiOlhQFFqMNet$gv|(%Yhn7zU4;wf)>NG36(QQDfTR6X^Z1SB2 z#ydWqm9f^nNKuW$Q+Y(lnYbPKdRV(ME)u)StXAP;iFuprk-Pv?)qX6VQ!3MlCKoKh zqz%>N)}my2fdcejNV|R|Hbu%TE$wQ+oi|p_2z-|6DZGTV2>1XksRi=SlblwQP|S%A z(tuwkJf|UXH6mqIZ7$aBf0oIE7e^v(YX9%B71kNJh$qAeMJgNDX`5mHTYqG!QU9m{LX>$;M?dX)=Gh@K=w z(lN>hukBk89(vs=O+gqy6MmQK6PfZCk{jzF1YkkSmBgm1qO>iEiJZ~0&C_rG+pm8r zZ}Tr1z9 zr%cYdT{X-{D^xYkUkO-4t>xno)1igSlm<{QzY}pI&-*flOgte1{1vT<+qXhgVlW3Z z<0ahL)lm2!aZTGkclk=DM016r(LX9NPqGI2<@MZ;%K6;n4+6UescbBGn?gnbGRO}c z7K<~dB!3uWtKn9YtdnGr|LH|wvEl6#y!;ZQj*%!4etCsZ0mHDzzta_imht~nTnrio4o@4eAk7ryW&l}*Ffzt$&wj8B823v%dGNBoZwz9;S2tQ%~b}QXnPs6Q50*ks2 z4zQ1Ol&75K#P<>IsU|EC9dF{o(@tt)G0W4*wkppzC=_ZFVr2J4x|R1-jD0#RY&FTlc7tTHmjom82MOtY78XjtQa z@QZbW?j54n!ivO81gmoXeH#5~e1@So3>2;CH%fh7Sk~yVMXZ)_LlEVNRX>pFiNDwo zfH+D?gCxTe?6tVZokKbPM+>7EM`|<0b(Izujl@`b?1aTfM2C%rE=vmYsX!YuHkUyi zdP5%OW%(yyu+dS_J3Wu>u>g<6XRMaVhv^l$44L)#l;uIK+bCM4vqQ2hUl-sGyt9VP zl%eT}+aU_C^VT}`7Dr-67o8pn%#+*ju!5kFcr5ae(KtIttYt^TUo0ST!)ty^5gzkH z14mar^{$aTe`QYbl;YOZS}98wUll?&#diWcEEz6V%_ytHOllYv^tMjkTWn3ZfPU4g z>E#U?%5YP%JP7ANuEM)NFJf{Us0VAPHl?Q;+1x-^p6w0Z?i$9N2Fu|FY-vnLDXx${ zODyT8MA`U8(h#euJiD#fZvmX&&l)nJr@KU>nseI*rYY zv=6yL^I059dU}+_KzPK0>jDSo49D@{z-P~*yI>EWH5OlzshP){&vqO3?S+eoQ3gAu zn_m{}7>+>^5j!epfv~O*nJ|9{2GX+H;k*GnYR-bt^`91&Xe$iufTSf5qF)Pq@WD|< zApw{xwYnU@SQcPJkTQ9DV>zEDx&6*R;mt_i#o;Z%d~2uBk*R2OPl{7^2sVeX!Bcu)JxIz$D4y8IHnP+elNlMRx+uGfIJW&RCdVtdiYh!svh`8 zG}cPRorad0qZkzI<_$;m95p6>$;FU^$Rg9c`ZS(Tln)Ix#x)`1d528V@9{B>2ttdh zvAB7lakAcU;4Nm}QcnkF+Nm7QP$U>(#na}02yO|;Ay`xH3=2j3<3n*AA8D3HtMO>m zg}itZl9^s~7lS1|DhJIOwYI>xl}rlm;rPjg)uSOvhq7M<=FynC;lM%pC>YaXL{b7J z5PIy;K?J~^v~o<8o0Aks!iiDBZ>$AsDKTfIynBS_l<^o=DMBp zB+I2(`6ZBW@+ln}d7a+?TjJXkgu%K0*8GK=E1F(M-!|{#b+cC9_U4-Zd*K5H?Cp7_ zn>Xzkxc+)R`N=ohqU}?!(6NlMdwKp~Rz82LYscGV?kgPo(9{Tmb4j0C(orMIW- z#VL?8P{$`niks(t$XC`Zy7^w2+W!8)F>fkT?{e)qONXnkxDBRQn1`00Ts-{HArGhC z+LEioW2T>(%$G6z0g@2pd}GrtsYJE3(i7mo`!S&fC!R7`CGg@bLW|tU2Cs(bwGh~o zxt=CxYQ!U^*W&>+KIC9eIbhik{d|QP51Tucgl1Z5?Lr%1j^`|gaWxpnQ?-Ttv*Eo# zVO&7N7{MU|{0eXKGcObAgF;-f{nn-(cy4-7Omo0oB))PY%w7P(J4avXU3h&Z0-P@d z8m(E<1`9kG-~6)LZumg|^jB~*%~>pfo%2wOfsgn;x{SLGSb(z%@<*DN<7H56D^PP3 zkHYa4i}2}Jk<3O#(>wIS&k%Wiv@VpuTj{8}7W(^Vd6e7;T9T`Vwn>~nqRwQ4?4MvxZl4Q|6X=EcKy>~*JD>F3ykl3d z>_L1zi14=?(a^AT1D2lf{>mM5`JRp@5UI|(P0DZdzQ6G(D#xd@Hex-Gr+>jZ7YdQz z!8$C>41VGrr8{nmFgW3H5-F8+e{W$}KHQK>GPD3~{|0^-mQ-g;#OrBmgdPisr}P$y zA|G@l0gwYf=bjY#fCM!MBA}qGC{eAc?iWYLH9r|0QBUt<1d$#dYbWKm7QHcwkJn3F zad!DJ8>Z~KxdN}_`-|6j&NHDP zc!6))qNS|Yu31*8reYApG=vGz2THXO0sz18mji)-KmrYG6$5Yr&6t2Jz-v*u!iYmu$nYmWYbZ=Nqa`UZ6XWQdg< z;DS^(G$;y-0gP7P!vwCxOD1F~L#Q@Gzn^5lYkrc2q7{&6^+Fwh&un zL8;1OK7zFMOm^7e3Hupn8khP`i^L7=T6R z1L-0BZ_Jy45QN5r6hZ;&)%SIky;qO*G)xJi<=b8{wig6DytqJcMu<#0O#R4603$fD zWd@7_ch;F3i0(r8L$Z>Isl?ldtbJf7b{`Cb)D2EN{{84KX7A` zZ0YK=(kAc&>_E{1JDENqEtn&c-J6o?(Bcw_;)6v;e-QK#6QWXrZ*wL&{;&IVYc-C4eo76R1XfYkpR3N`x-E7!~_-t6?Wb@n^;SNelk zK^{{jxkQFa&J?YFbkjAX){mP1C;xh}=83hJkAC?t7jrL7Z0#DiRpnmK+*Y<_XMT2V zW%sqVf2KBV#0Jk{@62Qq)1kYUa?4C?QrJBH*8leFAD?Wx?Z0*G%iPo4G-3R0w|ooR zCVqsy8+i@d*pz!tV-noFaRqkK#0Hk!&-B#lZfv&AV>qyVC69sNcD9-X_VCm;rrIr% zzr>xjZLdg;zUJfvpTvcoXKump92^@+hHLq6xs9Z@;I<dHCvUv* zr_bDnlfUg85biVWd+K8EPHo@mJ6B@ANNiV$EkkX;$go*su*3L^r`A1RQ$s_*65-0- zg`C?i2hP^Fag-$ zoA1*f-+mZY_}O#MVH?qAZsUoGXrEhd=NWg|Z)rZBl@a)0-= zIMEx9;GrBm3k87SE~eT^R=b$StyH;prp-adfDQ0R?BIFZH{Y+gcxtjiAs|6uNNwh6 zhzz@luF&q4I8eA{a@DzA*{|)zIqW<9>>-{k#XV(hBT>f#5h+i^t%U<3;v9bb&%5eZ z{1zzSrmosoHD_a0On{!S{qUFIw8g2!15QGy&a2BTJlavz$FS(oBy|2ngoN#6n%>{o zb~e_&!q{aRK0#0rmT*Z=dG_E?L~38t)ZVUkXo`75`%W*|GB?{&)!k6%JBh}vzvJO3 zzMraZ@SAL^s{EVGlpXR9$zLzNX8lE#J+j6WU z|FJ$l+cpQ63=Hl74=*HpJ=)=m#A9gbwbBPdIQ( ze(Xn&a}g#lz3{cYJQ{{u@$15o9H}#X=>q^VAR_UFwwks{ASghTeXrDiS0O1+zze<~ zdW=kN>#DtFfd!qCWk<8D&-Cu9?^xZpd!}6Bo6*}OEHLb#9?iq|T6UJ;zUNL?Awmbf zTTY&gSJ>j#2to%{7(IZgxfS|U9#+ZY8Fuc=oEn(*(`R@p8IOiJjE$#xFidh*(oj_T z9`NET1Eodi(##@lxU9(3j>qwkf)JT@SPLdWJmB0aobp<*VDCW7x<14O7~+HdyHoe;2uaRHWM%0kXM)qo?M zI+(Ql03}!gh9FbfHosxZWo`hU>yI4PZW{mX?#bC7CXj?7?63wuG^5=&0%y9Q9RNwC zZjw~V#v21kg`?JSNQI~}o=-tg`uNOSb~H+E?f^RWoqN%Co{ls*{Kn6K0}?mqz|%5H zCtF}VhBL&GwiFm4Z$-9d0(XwGEROXH629-Y6V=Pv&#gw{^vkTEoydLvYf!ZxECm~2 z29tPd4i0JnCNHj0Y;r4fU^2BSergU0O>ubcL+>d(Vao~qe|Ge@)GT%lzw@+jey#Hn zc~qeGV?R}%{o01zU)7;8sok$7q(agPIwry)Ii4Yv#GA&i?(K}8pcU*07vBqAS=&Th zJhFpl)?;7#y#wv#eJ_9~vHi6ll0ZmuBlG}CZcLADrvpnxZw%Ri`w?u<$h?Voge`_Q z1SHJREx0FF;q2_=bBTv2A)p~J1!xE!QJ_89Z4MEXgU&~Ao@maNp819oRHUbvDk4i_ z61ap&o@s|8Y!I2hWMszN4Omi8#_VlLiy|gQrs#o(_9Xk_Gk1LWrK2xu3Yb7RGs4a= zapj;)0YmVTkSi_RR-h>y7dhx8F~vpdgaF%^o=MYvAxIFBX({8l?0d0(7gZdt!TYg0 zGXw=iMNMwtNuez}cTT=|axRatGNR@I0qGOGsHP$s5>JE^3Ml7dU>rSNBpoZsfLSCe zGLcURi(mw>^fnx({tVLgf$aTz=MW4`n=W9&0Rf*(lcK4xCp?t|_z7pSGeh7Cd-F>> zaROFSa9esm;!wiD9MOx&e83{}k8w!Bf9$k|Q%kdJH|#NXFf|E8QqvB~n~aWdhE9yl z$dp!Y)bFhN2Epj(sKoPZbbQD(>IOOzLnI?p2Lxbuekg|pI9jZC;f4DuyJzAs8#`Wa zEe^67VuqMCV~r7#w?k59=>PKz?IOwNhwx)KVU3Z=OEE!apm3<~s_HS}kQ}YW3dfGD za721st?Bbj06#fSDnx*#r@FYP!V z<3~6kl`A}JM`4{v%8<8;GFS5u7eB+r!+|n3)-(u8MWs%wz!7t;1%>OOBX`z!EQO9l zsmbFaIz$b_ogQLvOp(Koa;v8=Kie6JiKiUu1eMfj6*NL}$`_Bu=1C18r&Cw=@2l%$ zshOOjk~+DA#lLtm2?{4`9Hx^vgSq14yDoemB(2JF&~bwZ22YlL%vUXrK3$9h(0R~d zcIw8CeXs*hSCWooo)~(}U{I6kA}1cBV$r##|Am1sdPELl#~2U)&&D0EjlBP}+z;;; z7mNOJ_w(-`-r4wzkshinH2erg93fGj{jc@APd=jxm?wAZ@{_NSM+c?zp+HSezN)xb ze&&aXZGx_~K=p%u+&}6F$v=fW5A)qUyXv~H4SAd(N$Dy(YzU6Pm*uh4BtnD4&ia{s zrt1})0jW6kDvPHP#uH*$YQ;m?bj}aFqhkPdqzTV_LN5a2SKtu3!5J)Oa%9jPRg*-^ zn$Dh^GJj{eQ>l9pLc>v*ID^g4NyR~U;0m0nQu9YT|LlA9|FI+BS~qqV@xZ5$!+8)S zB^}ZRwUnPG@<}$ZMwu~p|M%+42Uj*CDvJ-DyA@>=k_Mu*pky+R`1$U|ieo)I^~(54 zDIC8bP?)_Kq)Fx=UF7I|7c{1+W}Z3qSsaF`@Cc`mnScqpJ~^NmDMJV0p}c4wXj|9q z=YdMe*kOD$gDcw*4xv*>zKX0##x_j@+Nhtt?%?mmVK|@}p+K5I(;C%9+3L&*i$;}t zb`D(5x#Qv~P&Zp43W!g@V#S%$w}ys?nIH)S(NxG6fep6dY@hTYaF9_cIxrYu+@#83 z6a**Wcj`)38KEEYyK~<|2&B$6QWy?B5R&;~F-08v!#D_#hkpGr4#fPsBfm^~Eq*4c zSGUxUNZ35z3E6T|&Uv8uJXnYw2d^>NAx;YiAppi_o$G|ugWn?|7zW;dvTU8KZvq~= zF&^~Anhr#qEkFLwq!Z1q$dpQ z1iE*-z72U0k3e+v#Uzn0cFSf7Ohzu5TXQEw8A(2MLl;(#%r-_B#5@y9t1`JQYsUGF7q6zsyDhF`J5x?HB( z?KIdsHq4;yhn`046>aFvTWLL5z9S3>{ztyqeNXma#Jz^r!T~zuza#;Zcy#7r3A?VD zwqxfWxG>wszYH2F9778JPnR#?A9jLSL0AOl)YaB&`8LktMZ6`4kFuE)&(Kobv$=*o zqp}ZLFKzB8#;?By} za1bq^fLJ%J3?YI6pn55$9rM2Fz?gi@`Z#EE;=a(i!npCo zGK;rB_Z%9xUD#K}Ehx(02YCYVGZhp*p_es8`iOJr`&crHc--$;df(20XHD?(*f!FA z6yvo?rX|&YYzi;6!_V7_dfw!Lt2hMSZ^Rkb4<)-Cwz1m8Ex)F-IrCIDx?bSxu&M3`-Z};oS2{8&6gBmD>sQNOi*-UH(?*#)nVr9`g;(U0>qIJ!{bk#ew0L zOvPnjQ;O$Fx61L&1I^i!mgmF4+tyOfDT!S8Q|frEW7wEzx&D3UCi~z4=_-Y}dW_EW z&M@C*=lrrwWP!Fvfu<8)Ss26UJ0NrwXkMKUEqpLqj@aw`Y34bkbqWi|IXET=D=z>Y z=QwN|><*FNyX(k}$GUmWvQ##kw-6V+a`H=##L|j$Mt*0YxQdncHxBpy>xdE8-MyrG z{z}RVE5%dMCZ<7xL5jz*t~gv4B7>8J>QWG;s#0B&F?tQ(h z(R6^j!D)(aj4fKNRbfpriMFiL`9z*?&&u{f*T&sdI@lSf$g=dO%TEYvOlvMGf~FzO zgfERBR^6N_KWN0l0E;pri80_DXrqu(LCGbr%bpmpe2Rfn<;-Am3(JPp&BuwXpZ!jE zb7md+%&9z-Pgr>E64;u3Ka89y`q_IUesbx1BMx+2_@DW={o^;Dx%$Ds{PhpoqYt`T zr{7(9uDtK(_deDGrZw-|aqm7IE3o2Y5K6RxZ0UJNKz;d-7N<@qr3a{KqN+ezJvh-y zIutaeHC<0nUy2*Ldmeh}zNQKs@_wyT{2GLuf-Y6xMv{-pHVVuBzdIsHVaZ&Wlka)k z6qi@?c(ejJ4HDOZ=UmeqDK1~4L}q

xOf!a*0VC%$kaAlTS9L6_Alv`^MHS z4|l~A3%9q4PM}t~SP~fyXU1{7O)X`2PsmKV_`p$)d)Z^~Egzr2T{%||8a8we0>)#2 zk=9(it!leEP`JobF)e_50-1zoW>}%4n}`~{b$Wiby=u?W{u#d-hZAU-zhvg2QO!Yp zU@lu<%wOWrRc&{FN#rSEN(@`ps#V%zP~l7RxR5D({khXG;7${8JcqZU#U$=p(+n=r z)2*7pTynVQq0A2@PK>^!h%qWntZIOo6aq!<5Tpvk?B2}M{#n0*eUJ0rvoWXH*O-&( z(x2H;%5>&7>Qw6L-*e=z+N5|YEV0{XM;?#kZ()PLVgbNWzr@4%fKV94+EhY`I6 zrZ^1<7Ee2jc3*w&8%cewN1fVJ2(mD(R+9r|c1_d0bzMKod?)+Mx!pIOB#5BEoR?e; zu-uLd1yk6_Bt?BG7ta3C>Cb|hkqxY>ABK>E(xo#kT-GRD7^Z3Ck_%PlgfWBk!e|a$ z6*@h$%isL0SF)r97g~6HWfGoeVoe1Ewb7ZVD_YBXyPj^SKfSv9g}RQ1n#jKu;$Q1( zMcG3J_Wqu+A;&}}3d!im=YBUuNiSJu8b5?Ac~>R$0-E-&3-|5qgFg`{0xkWCmaY=b zC$Ld!k5h5?occkb{g3TuP&G1Y!$Hwv2mq{kf@UI$n6SZx7F^XWuAALU1Dm zMk-9?O!+hFs_y?c^IiB*nT!^-N=bPI$RQ7uVu6dRCsuFCo3r4hd+ScW()YEOUfnu} z!x63&lBS=nRhZwSfAqEXd#p1xM_6zRKci>inTL; zcj_JMpLmW!But%(XlJ;?nv3lgyh@xV(RYujJhc#m$|r^6o(jXkx;Z%|25ClLb$7jc zH`5ZpLdU61mX5nI>RF(YD?p?pRb0(f0Y$0w#D-~To7hn4$O}LrN+hzMIQJLgPG43m zS8Mh37aqMr0fFue9{MRn_H7vW!qWbqWM};9-s50wJ!Js5MLT|C;Q3%ZN2XUT)3O-g zyiM8OZZQB8wgZur?x3*h#+I_)(@*DT7oi(Uizw(BRAqdg2}O!X`czTRE|N4klOX_%fHUbdUiJ*6CBZn9 zQUf@8_B%()t6G%`42pH$+Fs|;)0O*UKluDzbAyZRiGSmaapu~vXW<;gf!@n7rx8eIMrOFZ$ zf+7Wa>z+x8ZUH>tu@{bfd2inyr8yS&3^9N)-cB_QtTcy}$X7C;7PYVIr&tuMHv}2f zfZ%?RaUr^-a25ypiVcKpvlZHt^*e^~0OJk29P5QO5%n8NtAYZv9&lO_!A(eNvYq5+ z!@%{&I?j-XLt^txV=RSV=`GzKlm&y-rJvSzW?KhVTCW=`s|7nbV+0W|!3T!w%|rfN zc(gaa@6GxS7HNh*@5F`2U*RQ|F4753!8QzRnB6__r%Ia6^HVvJs#2s)V_r5swv1zP z!ARwOZwe8QK>`8lRx_|0P(gw+eUK^}ggfEloq=T=KIbC=cD^KM3#Djk5TLx*YJ`ne zBS1U5z*F7~*rWX*3lzZcQDi3!)t!ItUmSNiJVALi20tV{REkj3wXf?55LXT4j2pvA zt(9RHRQ2@5g#sN%X+tQHknFxRB)Rwq4B>k9u2nNw@@)JsPkrihH|`kKc>fRoN728n zyJ^ORTR%H_!^o*MO$DXZjnF7#P@$=I;YZOG@CQC#biU%k;kuKAhm#1GjbLB|A}h%J z@&h6Vl^j*^R#dVl!SHVm>^}nRm-RLlFmIywF@ho{beN zP|(_tu~T#$#bF2rhD ztF;wYTusg{hRXf-e!FYp-$;ab25mm$yh+?e10$cE`>GA+~Z z?kZfc1#3Ywj8sB3xdcn`L6~4UNK@UsJybz_hR zE-X6QTXJ{PxH$kyVc|9#rEM{x3Vq<7F@v4Hr|*j*K893W2qQZ&mqvktUVDw1>*T%t zXxxp?v^Cs2XFYnT)my63$ArK!h`})qF+HzbJGJi3BM%8+h$p#&-cY1*7+hdV^hBu9 z0k0Wb@9S98^lIOItNNOIC*{AozSsP|80-Xx&?RUegH39gJ<-M|yxyI;4q}=M8RTK_DtEa?Ago^L8Qo1cq+G#U8|Ddm!&Y&P zFomYLEh4`^KeI3i5AXh$Sn)Q}_u?O?tlfk^W2R1*;$NjiQgi#~{}lx|xW% z1h74%6v7<$npU5?W5W7#pPsXzk?*mSO%~(FFz!CGuJV53i8O*$Fwupec$jg=6;Mtq z@^;YG9S=?Dd*H(2RS3PBrg6wS6;c$f z<;Nqo@x!pxP`A6Peb?OH)2(G&3Q8A1$0bg-*tU;HY@eRo-C)6%`gq!gnT{Wh782}3 z5TQAG4Jt0U_<;>KR-O7$rfoXHx`a`UxUNP8N*{x7;{w{TfYUYIFAzjnLzq9pjqtI{ zKR-aoLt%3NO_`nIa}ezUz!WP$t5_c9=TFq*=3v406_sl$A5hvi<1?J$-Y@_=V5v}> zvz4K?x9^>S|9te^)Vp6AS5gCs0qunOhqOe7wa>@Lx7VMj$LA3~z5qujqZsbh9U6HT zsfhM@=%uvvbRl-HqaokK-#8s;F!PJ7$Z-T8Y6OrN`%U4E4qG{=hMkP^Bp$fT=5a|AxL uG5o67jmU2Y1)&4LtG4#k$$|V)f3xsU-}=ms^&@aCS#)RhOAEfd`Tqmp7R>$t diff --git a/src/common/puck/index.js b/src/common/puck/index.js index 489bbb1..cc917a4 100644 --- a/src/common/puck/index.js +++ b/src/common/puck/index.js @@ -21,15 +21,16 @@ export default class Puck { // Create Matter.js body and attach it to world this.body = Bodies.circle(position.x, position.y, this.radius); // this.body.friction = 0; - this.body.frictionAir = 1; + this.body.frictionAir = 0.5; // this.body.frictionStatic = 0; // this.body.restitution = 0; + //Body.setDensity(this.body, 0.001); - this.body.collisionFilter = { - group: 0, - category: 0x0002, - mask: 0x0001 | 0x0002 | 0x0004, - }; + // this.body.collisionFilter = { + // group: 0, + // category: 0x0002, + // mask: 0x0001 | 0x0002 | 0x0004, + // }; World.add(this.world, this.body); // Initialize velocity according to movement goal diff --git a/src/common/robot/robot.js b/src/common/robot/robot.js index 049a5e5..2f17c08 100644 --- a/src/common/robot/robot.js +++ b/src/common/robot/robot.js @@ -85,56 +85,33 @@ export default class Robot { // Create Matter.js body and attach it to world let parts = [ Bodies.circle(position.x, position.y, this.radius) ] - const compoundBody = Body.create({ - parts: parts - }); - - this.body = compoundBody; - - // We'll set the main body to category 1. - this.body.collisionFilter.group = 0; - this.body.collisionFilter.category = 0x0001; - this.body.collisionFilter.mask = 0x0001 | 0x0002; if (this.tail) { - this.tailLength = 2.7*this.radius; + this.tailLength = 1.0*this.radius; this.tailBody = Bodies.trapezoid( - position.x - this.radius - this.tailLength/2.0, - position.y, - this.tailLength, + position.x, + position.y - this.radius - this.tailLength/2.0, this.radius / 5, - 0 + this.tailLength, + -this.tailSlope ); - //Body.setAngle(this.tailBody, 0); - - var revoluteConstraint = Constraint.create({ - bodyA: this.body, - bodyB: this.tailBody, - length: 0, - stiffness: 0.9, - damping: 1.0, - pointA: {x:-this.radius, y:0}, - pointB: {x:this.tailLength/2.0, y:0} - }); - - Composite.add(this.world, [this.body, this.tailBody, revoluteConstraint]); - - // Tails belong to category 4, which should only collide with pucks, - // category 2. Everything else is in category 1, which collides with each - // other and with pucks. - this.tailBody.collisionFilter.group = 0; // Group is set to 0 so that we use category/mask for collision filtering. - this.tailBody.collisionFilter.category = 0x0004; - this.tailBody.collisionFilter.mask = 0x0002; + Body.rotate(this.tailBody, -Math.PI/2.0, {x: position.x, y: position.y} ); + Body.setDensity(this.tailBody, 0.00001); + parts.push(this.tailBody) } + const compoundBody = Body.create({ + parts: parts + }); + this.body = compoundBody; + this.body.friction = 0; this.body.frictionAir = 0; this.body.frictionStatic = 0; this.body.restitution = 0; - //Body.setAngle(this.body, Math.random() * 2 * Math.PI); // Randomize orientations - Body.setAngle(this.body, 0); + Body.setAngle(this.body, Math.random() * 2 * Math.PI); // Randomize orientations World.add(this.world, this.body); Body.setAngularVelocity(this.body, 1); @@ -253,34 +230,6 @@ export default class Robot { if (this.actuate && typeof this.actuate === 'function') { this.actuate(this.sensors, this.actuators, this.goal, newWaypoint); } - - /* AN ACTIVE TAIL STRAIGHTENING FORCE. THIS WORKS BUT SEEMS TO YIELD - UNSTABLE BEHAVIOUR. FALLING OUT OF LOVE WITH Matter.js. - if (this.tailBody) { - // Parameters: - const TAIL_CORRECTION_FACTOR = 0.001; - const MAX_TAIL_CORRECTION_FORCE = 0.01; - - let deltaAngle = getSmallestSignedAngularDifference(this.body.angle, this.tailBody.angle); - let magnitude = TAIL_CORRECTION_FACTOR * deltaAngle; - if (magnitude > MAX_TAIL_CORRECTION_FORCE) { - magnitude = MAX_TAIL_CORRECTION_FORCE; - } else if (magnitude < -MAX_TAIL_CORRECTION_FORCE) { - magnitude = -MAX_TAIL_CORRECTION_FORCE; - } - let forceVector = { - x: magnitude * Math.cos(this.tailBody.angle + Math.PI/2), - y: magnitude * Math.sin(this.tailBody.angle + Math.PI/2) - }; - - let position = { - x: this.tailBody.position.x + 0.5 * this.tailLength * Math.cos(this.tailBody.angle), - y: this.tailBody.position.y + 0.5 * this.tailLength * Math.sin(this.tailBody.angle) - }; - - Body.applyForce(this.tailBody, position, forceVector); - } - */ } setVelocities({ linearVel, angularVel }) { diff --git a/src/common/staticObjects/staticCircle.js b/src/common/staticObjects/staticCircle.js index 7cb2c66..2960607 100644 --- a/src/common/staticObjects/staticCircle.js +++ b/src/common/staticObjects/staticCircle.js @@ -28,11 +28,11 @@ export default class StaticCircle { } this.body = Bodies.circle(this.center.x, this.center.y, this.radius, { isStatic: true }); - this.body.collisionFilter = { - group: 0, - category: 0x0001, - mask: 0x0001 | 0x0002, - }; + // this.body.collisionFilter = { + // group: 0, + // category: 0x0001, + // mask: 0x0001 | 0x0002, + // }; if (shouldAddToWorld) { this.addToWorld(); diff --git a/src/common/staticObjects/staticRectangle.js b/src/common/staticObjects/staticRectangle.js index a1c9393..a7cc5cd 100644 --- a/src/common/staticObjects/staticRectangle.js +++ b/src/common/staticObjects/staticRectangle.js @@ -41,11 +41,11 @@ export default class StaticRectangle { { isStatic: true } ); - this.body.collisionFilter = { - group: 0, - category: 0x0001, - mask: 0x0001 | 0x0002, - }; + // this.body.collisionFilter = { + // group: 0, + // category: 0x0001, + // mask: 0x0001 | 0x0002, + // }; if (shouldAddToWorld) { this.addToWorld(); diff --git a/src/common/utils/geometry.js b/src/common/utils/geometry.js index 98bf4bb..dab2238 100644 --- a/src/common/utils/geometry.js +++ b/src/common/utils/geometry.js @@ -12,6 +12,28 @@ export function normalizeAngle(angle) { return angle % (2 * Math.PI); } +export function normalizeAnglePlusMinusPi(a) { + // BAD: These loops should be replaced. + while (a > Math.PI) { + a -= 2 * Math.PI; + } + while (a <= -Math.PI) { + a += 2 * Math.PI; + } + return a; +} + +export function getAngularDifference(angleA, angleB) { + angleA = normalizeAnglePlusMinusPi(angleA); + angleB = normalizeAnglePlusMinusPi(angleB); + let error = Math.abs(angleA - angleB); + if (error > Math.PI) { + error -= Math.PI * 2; + error = Math.abs(error); + } + return error; +} + export function getSmallestSignedAngularDifference(a, b) { /* Return angle between the two given angles with the smallest absolute value. Meanwhile, the value returned will have a sign. */ diff --git a/src/scenes/Labyrinth/benchmarking/puckFieldValueTracker.js b/src/scenes/Labyrinth/benchmarking/puckFieldValueTracker.js index c4da924..942362d 100644 --- a/src/scenes/Labyrinth/benchmarking/puckFieldValueTracker.js +++ b/src/scenes/Labyrinth/benchmarking/puckFieldValueTracker.js @@ -16,7 +16,7 @@ class PuckFieldValueTracker extends Tracker { scene.pucks.forEach((p) => { let point = {x: Math.round(p.position.x), y: Math.round(p.position.y)}; - const fieldValue = sampleFieldAtPoint(scene.fields.heatMap.src, point)[0] / 255.0; + const fieldValue = sampleFieldAtPoint(scene.fields.travelTime.src, point)[0] / 255.0; ssd += (fieldValue - ideal_tau) ** 2; }); diff --git a/src/scenes/Labyrinth/black.png b/src/scenes/Labyrinth/black.png new file mode 100644 index 0000000000000000000000000000000000000000..03b8d8cb7d6f5de327e0008e5c4ef0ab2d9b3019 GIT binary patch literal 1495 zcmeAS@N?(olHy`uVBq!ia0y~yU;#3jWH^8%gYTy1Rt5&vd7dtgAr*{o4>B?W1sN6o z%{Ozo%CKGPK^XI$tcGabg4K+9rU%xt?HCmt4Uo~qFq#oYO9ncYip<@-OtN~*DxE+j Nwx_F~%Q~loCIDC~ZZiM? literal 0 HcmV?d00001 diff --git a/src/scenes/Labyrinth/index.js b/src/scenes/Labyrinth/index.js index 198aff4..2181d9d 100644 --- a/src/scenes/Labyrinth/index.js +++ b/src/scenes/Labyrinth/index.js @@ -12,33 +12,33 @@ import controller from './robot/controllers/controller'; import PuckFieldValueTracker from './benchmarking/puckFieldValueTracker'; -import mapUrl from './labyrinth.png'; +import labyrinthUrl from './labyrinth.png'; +import travelTimeUrl from './travel_time_0.png'; +//import mapUrl from './black.png'; -// This constant defines the contour line of the scalar field around which the -// robots will build. -const tau = 0.6; +const nSensorRegions = 8; const renderables = [ { module: 'Scene', elements: SceneRenderables }, { module: 'Puck', elements: PuckRenderables }, - { module: 'Local', elements: [...LocalRenderables] } + { module: 'Robot', elements: [...LocalRenderables] } ]; +let circleSensorRegions = []; +let deltaAngle = 2*Math.PI / nSensorRegions; + +for (let i=0; iAn implementation of the Orbital Construction algorithm which uses a scalar field to guide the construction of an enclosure.

- -

The scalar field is just a grayscale image. A parameter tau defines a contour line of the scalar field. In this case, the contour line is a circle and tau = 0.6 defines that circle's radius.

- -

The cyan robots orbit the periphery, always trying to align themselves so that scalar field increases to their right. They also try to reach the desired circle. However, if they see a puck in their left sensor area, they will deviate to nudge it inwards.

- -

The yellow robots operate similarly, except they react to pucks in their right sensor area and deviate to nudge them outwards.

+ html: `

A planar construction algorithm where the robots are constrained to operate within a labyrinth. The labyrinth encodes the direction in which objects should be pushed so that they are moved around the grey obstacle and join in the formation of the L shape on the left.

- - Vardy, Andrew. "Orbital construction: Swarms of simple robots building enclosures." 2018 IEEE 3rd International Workshops on Foundations and Applications of Self* Systems (FAS* W). IEEE, 2018. + + Vardy, Andrew. "The swarm within the labyrinth: planar construction by a robot swarm." Artificial Life and Robotics 28, (2023): 117-126.

` diff --git a/src/scenes/Labyrinth/labyrinth.png b/src/scenes/Labyrinth/labyrinth.png index 143db705e67f4c90733fb132a23bbc451c90b8bc..5142c8b3e7857b4c8d24addcef17494fe02868b7 100644 GIT binary patch literal 62942 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�yjyT&W#8Pn+0D3a~O2|8Yfz5qI= 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%0D7y*MVGiXJ3cxYY+O+4nSa*D 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 diff --git a/src/scenes/Labyrinth/robot/controllers/controller.js b/src/scenes/Labyrinth/robot/controllers/controller.js index 87e4508..cd0b200 100644 --- a/src/scenes/Labyrinth/robot/controllers/controller.js +++ b/src/scenes/Labyrinth/robot/controllers/controller.js @@ -1,8 +1,49 @@ +import { normalizeAnglePlusMinusPi, getAngularDifference } from '@common/utils/geometry'; + /* eslint-disable no-eval */ export default function controller(robot, params, onLoop) { // PARAMETERS: - const maxAngularSpeed = 0.015; - const maxForwardSpeed = 0.2; + const maxAngularSpeed = 0.01; + const maxForwardSpeed = 0.1; + const searchSpinDistMin = 1; + const searchSpinDistMax = 20; + const searchStraightDistMin = 10; + const searchStraightDistMax = 50; + const minTurnSteps = 4; + const minCurveIntensity = 51; + const onCurveThreshold = minCurveIntensity / 255; + const angleThreshold = 0.5; + const angleDiffThreshold = 0.15; + const pucksAsRobots = false; + + const puckSensorRadius = 4; + const puckSensorDistance = 20; + const puckSensorAngularWidth = 2 * Math.atan(puckSensorRadius / puckSensorDistance); + + const ROBOT_STATE = { + SEARCH_SPIN: 'SEARCH_SPIN', + SEARCH_STRAIGHT: 'SEARCH_STRAIGHT', + FOLLOW_CURVE: 'FOLLOW_CURVE', + ABOUT_FACE: 'ABOUT_FACE', + TURN_TO_STRIKE: 'TURN_TO_STRIKE', + RECOVERY_TURN: 'RECOVERY_TURN', + DEBUG_STOP: 'DEBUG_STOP' + }; + + const CHIRALITY_STATE = { + UNKNOWN: 'UNKNOWN', + CW: 'CW', + CCW: 'CCW' + }; + + let state = ROBOT_STATE.FOLLOW_CURVE; + let chirality = CHIRALITY_STATE.UNKNOWN; + let stepsInState = 0; + let stepsInChirality = 0; + let dwellSteps = 0; + let turnDirection = 1; + let desiredAngle = 0; + let relativeGoalAngle = 0; if (onLoop) { const func = eval(onLoop); @@ -14,27 +55,290 @@ export default function controller(robot, params, onLoop) { return (sensors) => { + // Scale the given value from the scale of src to the scale of dst. + function scale(val, srcMin, srcMax, dstMin, dstMax) { + return ((val - srcMin) / (srcMax - srcMin)) * (dstMax - dstMin) + dstMin; + } + + function sign(x) { + if (x > 0) + return 1; + else if (x < 0) + return -1; + else + return 0; + } + + function setNewState(new_state) { + state = new_state; + stepsInState = 0; + //console.log("STATE: " + state); + } + + function updateChirality(sensors) { + let sensedChiralityMarker = (sensors.fields.readings.heatMap.edge)[2] / 255; + let newChirality = chirality; + if (Math.abs(sensedChiralityMarker - 1) < 0.1) { + newChirality = CHIRALITY_STATE.CCW; + } else if (Math.abs(sensedChiralityMarker - 0.498) < 0.1) { + newChirality = CHIRALITY_STATE.CW; + } + + // Did we actually change chirality? + if (newChirality != chirality) { + chirality = newChirality; + stepsInChirality = 0; + //console.log("CHIRALITY: " + chirality); + } + } + + function forceToggleChirality() { + // Now allowing this to be called when the chirality is unknown. We + // just allow it to stay unknown. + // assert(chirality != CHIRALITY_STATE.UNKNOWN); + + if (chirality == CHIRALITY_STATE.CW) + chirality = CHIRALITY_STATE.CCW; + else if (chirality == CHIRALITY_STATE.CCW) + chirality = CHIRALITY_STATE.CW; + + stepsInChirality = 0; + } + + function pucksInSwath(sensors, lowAngle, highAngle, SIDE) { + let total = 0; + let nSensorRegions = Object.keys(sensors.circles).length; + let deltaAngle = 2 * Math.PI / nSensorRegions; + + for (let i = 0; i < nSensorRegions; ++i) { + let angle = normalizeAnglePlusMinusPi(i * deltaAngle); + //console.log("i: " + i + ", pucks: " + sensors.circles[`index${i}`].reading.pucks + ", " + + // (angle - 0.5 * puckSensorAngularWidth >= lowAngle && angle + 0.5 * puckSensorAngularWidth <= highAngle)); + + if (angle - 0.5 * puckSensorAngularWidth >= lowAngle && angle + 0.5 * puckSensorAngularWidth <= highAngle) { + total += sensors.circles[`index${i}`].reading.pucks; + if (SIDE == "left") { + sensors.circles[`index${i}`].reading.robots = 100; + } else if (SIDE == "right") { + sensors.circles[`index${i}`].reading.walls = 100; + } + } + } + + return total; + } + + sensors.goalVis = sensors.position; + let command = { linearVel: 0, angularVel: 0, type: robot.SPEED_TYPES.RELATIVE }; if (!sensors.fields.readings.heatMap.left - || !sensors.fields.readings.heatMap.centreLeft - || !sensors.fields.readings.heatMap.centreRight + || !sensors.fields.readings.heatMap.centre || !sensors.fields.readings.heatMap.right) { return command; } const l = (sensors.fields.readings.heatMap.left)[0] / 255; - const cl = (sensors.fields.readings.heatMap.centreLeft)[0] / 255; - const cr = (sensors.fields.readings.heatMap.centreRight)[0] / 255; + const c = (sensors.fields.readings.heatMap.centre)[0] / 255; const r = (sensors.fields.readings.heatMap.right)[0] / 255; + //console.log("l, c, r: %g, %g, %g", l, c, r); + + let L = l > onCurveThreshold; + let C = c > onCurveThreshold; + let R = r > onCurveThreshold; + let onCurve = C && (!R || !L); + let offCurve = !C && !R && !L; + + // + // Handle state transitions... + // + + // This is reset whenever a new state is set, which should only be done by + // calling setNewState. + ++stepsInState; + + // This is reset whenever the chirality changes. + ++stepsInChirality; - //console.log("l, cl, cr, r: %g, %g, %g, %g", l, cl, cr, r); + if (state == ROBOT_STATE.SEARCH_SPIN) { + if (onCurve) { + setNewState(ROBOT_STATE.FOLLOW_CURVE); + } else if (stepsInState > dwellSteps) { + setNewState(ROBOT_STATE.SEARCH_STRAIGHT); + dwellSteps = Math.ceil(searchStraightDistMin + (searchStraightDistMax - searchStraightDistMin) * Math.random()); + } - let angularSpeed = maxAngularSpeed * (r + cr - l - cl); + } else if (state == ROBOT_STATE.SEARCH_STRAIGHT) { + if (onCurve) { + setNewState(ROBOT_STATE.FOLLOW_CURVE); + } else if (sensors.polygons.ahead.reading.robots > 0 || stepsInState > dwellSteps) { + setNewState(ROBOT_STATE.SEARCH_SPIN); + dwellSteps = Math.ceil(searchSpinDistMin + (searchSpinDistMax - searchSpinDistMin) * Math.random()); + } + + } else if (state == ROBOT_STATE.FOLLOW_CURVE) { + + updateChirality(sensors); + + if (offCurve) { + setNewState(ROBOT_STATE.SEARCH_SPIN); + dwellSteps = Math.ceil(searchSpinDistMin + (searchSpinDistMax - searchSpinDistMin) * Math.random()); + + } else if (onCurve && sensors.polygons.ahead.reading.robots > 0 && stepsInChirality > 10) { + forceToggleChirality(); + setNewState(ROBOT_STATE.ABOUT_FACE); + turnDirection = 1; // This is arbitrary. Could be -1. + + } else if (onCurve && chirality != CHIRALITY_STATE.UNKNOWN && stepsInState > 10) { + + // Fill this with the info from the swath with the most pucks. + let bestSwath = null; + + // Decode the value in reading.floorCentre. + let rawValue = (sensors.fields.readings.heatMap.centre)[0]; + let relativeGoalAngle = scale(rawValue, minCurveIntensity, 255, -Math.PI, Math.PI); + //console.log("raw: " + rawValue + ", scaled: " + relativeGoalAngle); + if (chirality == CHIRALITY_STATE.CCW) + relativeGoalAngle = normalizeAnglePlusMinusPi(relativeGoalAngle + Math.PI); + + // For visualization + let vecLength = 100; + sensors.goalVis = {x: sensors.position.x + vecLength * Math.cos(sensors.orientation + relativeGoalAngle), + y: sensors.position.y + vecLength * Math.sin(sensors.orientation + relativeGoalAngle)}; + + let leftSwath = pucksInSwath(sensors, -Math.PI, relativeGoalAngle - angleThreshold, "left"); + let rightSwath = pucksInSwath(sensors, relativeGoalAngle + angleThreshold, Math.PI, "right"); + //console.log('leftSwath, rightSwath: ' + leftSwath + ", " + rightSwath); + if (leftSwath > 0 && leftSwath >= rightSwath) { + bestSwath = "left"; + relativeGoalAngle -= angleThreshold; + } else if (rightSwath > 0) { + bestSwath = "right"; + relativeGoalAngle += angleThreshold; + } + + if (bestSwath != null) { + // Prepare to strike! + setNewState(ROBOT_STATE.TURN_TO_STRIKE); + if (bestSwath == "left") { + turnDirection = 1; + desiredAngle = sensors.orientation + turnDirection * (relativeGoalAngle + Math.PI); + } else { + turnDirection = -1; + desiredAngle = sensors.orientation + turnDirection * (Math.PI - relativeGoalAngle); + } + } + } + + } else if (state == ROBOT_STATE.ABOUT_FACE) { + if (stepsInState > minTurnSteps && C) { + setNewState(ROBOT_STATE.FOLLOW_CURVE); + } else if (stepsInState > 100) { + // We've perhaps been bumped off the curve. Give up and search. + setNewState(ROBOT_STATE.SEARCH_SPIN); + dwellSteps = Math.ceil(searchSpinDistMin + (searchSpinDistMax - searchSpinDistMin) * Math.random()); + } + + } + + else if (state == ROBOT_STATE.TURN_TO_STRIKE) { + if (getAngularDifference(desiredAngle, sensors.orientation) < angleDiffThreshold) { + setNewState(ROBOT_STATE.RECOVERY_TURN); + if (turnDirection == 1) + desiredAngle = sensors.orientation - (relativeGoalAngle + Math.PI); + else + desiredAngle = sensors.orientation + (Math.PI - relativeGoalAngle); + + if (pucksAsRobots) { + // This is to test the idea of being unable to sense the difference between + // pucks and robots. So whenever we recover from the strike, we set the + // desired angle as above, but without the addition of pi, leading to this + // single expression. + desiredAngle = sensors.orientation - relativeGoalAngle; + forceToggleChirality(); + } + turnDirection *= -1; + } +else { +//console.log("diff: " + getAngularDifference(desiredAngle, sensors.orientation)); +} + + } else if (state == ROBOT_STATE.RECOVERY_TURN) { + if (getAngularDifference(desiredAngle, sensors.orientation) < angleDiffThreshold) { + setNewState(ROBOT_STATE.FOLLOW_CURVE); + } +else { +//console.log("diff: " + getAngularDifference(desiredAngle, sensors.orientation)); +} + } + + // + // Knowing what state we are in, act. + // + + // Forward speed v and angular speed w. Will get further modified below. + let v = 0; + let w = 0; + + if (state == ROBOT_STATE.SEARCH_SPIN) { + v = 0; + w = 1; + + } else if (state == ROBOT_STATE.SEARCH_STRAIGHT) { + v = 1; + w = 0; + + } else if (state == ROBOT_STATE.ABOUT_FACE || state == ROBOT_STATE.TURN_TO_STRIKE || state == ROBOT_STATE.RECOVERY_TURN) { + // We're in one of the TURN states. + v = 0; + w = turnDirection; // Technically, we could do without turnDirection + // and just use w, but I think it adds clarity. + + } else if (state == ROBOT_STATE.DEBUG_STOP) { + v = 0; + w = 0; + + } else if (state == ROBOT_STATE.FOLLOW_CURVE) { + let arbitraryTurn = -1; + v = 1; + if ( !L && !R && !C ) { + // We're off track. + w = 0; + } else if (!L && !R && C) { + // On track, go straight. + w = 0; + } else if (!L && R && !C) { + // Track is on the right, go right. + w = 1; + } else if (!L && R && C) { + // Track is on the right, go right. + w = 1; + } else if (L && !R && !C) { + // Track is on the left, go left. + w = -1; + } else if (L && !R && C) { + // Track is on the left, go left. + w = -1; + } else if (L && R && !C) { + // This is weird, go straight. + w = 0; + } else if (L && R && C) { + // We're facing the line perpendicularly. Choose the arbitrary turn to join it. + w = arbitraryTurn; + } + + } + + //console.log("STATE: %s, CHIRALITY: %s: ", state, chirality); //console.log("angularSpeed: %g", angularSpeed); - command.linearVel = maxForwardSpeed * robot.velocityScale; - command.angularVel = angularSpeed * robot.velocityScale; + //console.log("x, y: " + sensors.position.x + ", " + sensors.position.y); + //console.log("theta: " + sensors.orientation); + + command.linearVel = v * maxForwardSpeed * robot.velocityScale; + command.angularVel = w * maxAngularSpeed * robot.velocityScale; + + sensors.state = state; //command.linearVel = 0; //command.angularVel = 0; diff --git a/src/scenes/Labyrinth/robot/renderables.js b/src/scenes/Labyrinth/robot/renderables.js index 9369ca1..9ac6ab9 100644 --- a/src/scenes/Labyrinth/robot/renderables.js +++ b/src/scenes/Labyrinth/robot/renderables.js @@ -70,10 +70,8 @@ const bodyRenderables = [ stroke: 'none' }, dynamicAttrs: { - fill: 'rgb(0, 255, 0, 1.0)', points: { prop: 'tailBody.vertices', modifier: (vertices) => { - console.log(vertices); var outputArray = []; for (const [key, point] of Object.entries(vertices)) { outputArray.push([point.x, point.y]) @@ -83,47 +81,42 @@ const bodyRenderables = [ } }, styles: { - fill: 'none', + fill: { prop: 'color' }, stroke: 'black', 'fill-opacity': 0, 'stroke-width': 1, 'stroke-opacity': 1 } - } + }, + { + type: 'Push Direction', + svgClass: '', + desc: 'Relative Goal Heading', + dataPoints: { sceneProp: 'robots' }, + shape: 'path', + staticAttrs: { + id: { prop: 'id' } + }, + dynamicAttrs: { + points: [ + { prop: 'sensors.position' }, + { prop: 'sensors.goalVis', + modifier: (goal) => (goal ? goal : sensors.position) } + ] + }, + styles: { + fill: 'none', + stroke: 'pink', + 'stroke-width': 4, + 'stroke-opacity': 1, + 'fill-opacity': 1 + } + }, ]; const sensorsRenderables = [ { - type: 'Sensor', - svgClass: '', - desc: 'Left Obstacle Sensor', - shape: 'circle', - dataPoints: { sceneProp: 'robots' }, - staticAttrs: { - r: { - prop: 'sensors.circles.leftObstacle.radius' - }, - id: { prop: 'id' }, - stroke: 'black' - }, - dynamicAttrs: { - fill: { - prop: 'sensors.circles.leftObstacle.reading', - modifier: (val) => ((val.walls || val.robots) ? 'rgba(255,0,0,0.5)' : 'rgba(0,255,0,0.2)') - }, - cx: { prop: 'sensors.circles.leftObstacle.centre.x' }, - cy: { prop: 'sensors.circles.leftObstacle.centre.y' } - }, - styles: { - fill: 'none', - stroke: 'black', - 'fill-opacity': 0, - 'stroke-width': 1, - 'stroke-opacity': 1 - } - }, - { - type: 'Sensor', + type: 'Field Sensors', svgClass: '', desc: 'Left Field Sensor', shape: 'circle', @@ -147,9 +140,9 @@ const sensorsRenderables = [ } }, { - type: 'Sensor', + type: 'Field Sensors', svgClass: '', - desc: 'Centre Left Field Sensor', + desc: 'Centre Field Sensor', shape: 'circle', dataPoints: { sceneProp: 'robots' }, staticAttrs: { @@ -159,8 +152,8 @@ const sensorsRenderables = [ dynamicAttrs: { stroke: 'none', fill: 'purple', - cx: { prop: 'sensors.fields.sensingPoints.centreLeft.x' }, - cy: { prop: 'sensors.fields.sensingPoints.centreLeft.y' } + cx: { prop: 'sensors.fields.sensingPoints.centre.x' }, + cy: { prop: 'sensors.fields.sensingPoints.centre.y' } }, styles: { fill: 'none', @@ -171,9 +164,9 @@ const sensorsRenderables = [ } }, { - type: 'Sensor', + type: 'Field Sensors', svgClass: '', - desc: 'Centre Right Field Sensor', + desc: 'Right Field Sensor', shape: 'circle', dataPoints: { sceneProp: 'robots' }, staticAttrs: { @@ -183,8 +176,8 @@ const sensorsRenderables = [ dynamicAttrs: { stroke: 'none', fill: 'purple', - cx: { prop: 'sensors.fields.sensingPoints.centreRight.x' }, - cy: { prop: 'sensors.fields.sensingPoints.centreRight.y' } + cx: { prop: 'sensors.fields.sensingPoints.right.x' }, + cy: { prop: 'sensors.fields.sensingPoints.right.y' } }, styles: { fill: 'none', @@ -195,9 +188,9 @@ const sensorsRenderables = [ } }, { - type: 'Sensor', + type: 'Field Sensors', svgClass: '', - desc: 'Right Field Sensor', + desc: 'Edge Field Sensor', shape: 'circle', dataPoints: { sceneProp: 'robots' }, staticAttrs: { @@ -206,9 +199,9 @@ const sensorsRenderables = [ }, dynamicAttrs: { stroke: 'none', - fill: 'purple', - cx: { prop: 'sensors.fields.sensingPoints.right.x' }, - cy: { prop: 'sensors.fields.sensingPoints.right.y' } + fill: 'pink', + cx: { prop: 'sensors.fields.sensingPoints.edge.x' }, + cy: { prop: 'sensors.fields.sensingPoints.edge.y' } }, styles: { fill: 'none', @@ -219,62 +212,106 @@ const sensorsRenderables = [ } }, { - type: 'Sensor', + type: 'Other Robots Sensor', svgClass: '', - desc: 'Left Polygon Puck Sensor', + desc: 'Robot Ahead Sensor', shape: 'polygon', dataPoints: { sceneProp: 'robots' }, staticAttrs: { stroke: 'none', }, dynamicAttrs: { - /* stroke: { - prop: 'sensors.polygons.left.reading.pucks', - modifier: (val) => val ? `rgb(255, 0, 0, ${0.2*val}` : 'rgb(0, 0, 0, 0.1)' + prop: 'sensors.polygons.ahead.reading.robots', + modifier: (val) => val ? `white` : 'none' }, - */ - fill: 'rgb(255, 255, 255, 0.05)', - points: { prop: 'sensors.polygons.left.vertices' } + fill: 'rgb(255, 255, 0, 0.25)', + points: { prop: 'sensors.polygons.ahead.vertices' } }, styles: { fill: 'none', stroke: 'black', 'fill-opacity': 0, - 'stroke-width': 1, + 'stroke-width': 2, 'stroke-opacity': 1 } }, { - type: 'Sensor', - svgClass: '', - desc: 'Right Polygon Puck Sensor', - shape: 'polygon', - dataPoints: { sceneProp: 'robots' }, - staticAttrs: { - stroke: 'none' - }, - dynamicAttrs: { - /* - fill: { - prop: 'sensors.polygons.right.reading.pucks', - modifier: (val) => val ? `rgb(255, 0, 0, ${0.2*val}` : 'rgb(0, 0, 0, 0.1)' - }, - */ - fill: 'rgb(255, 255, 255, 0.05)', - points: { prop: 'sensors.polygons.right.vertices' } + type: 'State', + svgClass: 'robot-number-text', + desc: 'State', + shape: 'text', + dataPoints: { sceneProp: 'robots' }, + staticAttrs: { + text: { + prop: 'id' }, - styles: { - fill: 'none', - stroke: 'black', - 'fill-opacity': 0, - 'stroke-width': 1, - 'stroke-opacity': 1 + id: { prop: 'id' } + }, + dynamicAttrs: { + x: { prop: 'sensors.position.x' }, + y: { prop: 'sensors.position.y', modifier: val => val + 30 }, + text: { + prop: 'sensors.state', + modifier: (val) => { + return val; + } } + }, + styles: { + 'text-anchor': 'middle', + 'font-size': 12, + fill: 'white', + stroke: 'none', + 'stroke-width': 1 + } } ]; +const nSensorRegions = 8; +let circleSensors = []; + +for (let i=0; i 0) { + return 'white'; + } else { + return 'none'; + } + } + }, + cx: { prop: `sensors.circles.index${i}.centre.x` }, + cy: { prop: `sensors.circles.index${i}.centre.y` } + }, + styles: { + fill: 'none', + stroke: 'none', + 'fill-opacity': 0, + 'stroke-width': 2, + 'stroke-opacity': 1 + } + }); +} + export default [ ...bodyRenderables, - ...sensorsRenderables + ...sensorsRenderables, + ...circleSensors ]; \ No newline at end of file diff --git a/src/scenes/Labyrinth/scalar_field.png b/src/scenes/Labyrinth/scalar_field.png new file mode 100644 index 0000000000000000000000000000000000000000..03b8d8cb7d6f5de327e0008e5c4ef0ab2d9b3019 GIT binary patch literal 1495 zcmeAS@N?(olHy`uVBq!ia0y~yU;#3jWH^8%gYTy1Rt5&vd7dtgAr*{o4>B?W1sN6o z%{Ozo%CKGPK^XI$tcGabg4K+9rU%xt?HCmt4Uo~qFq#oYO9ncYip<@-OtN~*DxE+j Nwx_F~%Q~loCIDC~ZZiM? literal 0 HcmV?d00001 diff --git a/src/scenes/Labyrinth/travel_time_0.png b/src/scenes/Labyrinth/travel_time_0.png new file mode 100644 index 0000000000000000000000000000000000000000..578d775a062b502631449e473164136b596165d4 GIT binary patch literal 84927 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�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 literal 0 HcmV?d00001