Created
December 27, 2017 17:03
-
-
Save wizardofrobots/c6f21992a131e90c33a33224da48827f to your computer and use it in GitHub Desktop.
Revisions
-
RobotWizard created this gist
Dec 27, 2017 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,92 @@ // import SDK and vector facilities to ease development import { vector, comm } from "bytearena-sdk"; const Vector2 = vector.Vector2; // Connecting our agent const agent = comm.connect(); // Watching perception stream agent.on("perception", perception => { const actions = []; // Get a steering vector based on perception let steering = navigate(perception); // Submitting our actions for this turn actions.push({ method: "steer", arguments: steering.toArray() }); agent.do(actions); }); // Returns a steering vector exploring the world, // or dodging an obstacle if there's any const navigate = perception => { // Obtain a vector steering away from obstacles // if there's any on our path, or null if not // This func is defined below let steering = avoidObstables(perception); if(!steering) { // no obstacle has to be avoided // we can just stroll around randomly const direction = Math.random() < 0.5 ? -1 : 1; // -1: left, 1: right const x = 0 const y = 3; // move forward 3 meters steering = new Vector2(x, y); } return steering; }; // Returns a vector steering away from // an obstacle if there's any in front of us const avoidObstables = perception => { // this is the resulting vector (null if no vector) let steering = null; // this remembers the distance to the obstacle we're currently // steering away in the algorithm below let curdistance = null; // for everything that stands in our field of view for (const perceived of perception.vision) { // build a vector to the closest point of the obstacle const point = Vector2.fromArray(perceived.nearedge); // determine the angle of this point relative to us // angle increases clockwise, and 0 is at 12:00 on the clock // so 0° => straight ahead, 90° => 90° to our right, 270° => 90° to our left const angle = point.angle(); // in radians // The magnitude of a vector is its length // This is the distance between us and the obstacle const distance = point.mag(); // in meters // If obstacle is 15m away or less, and our current steering // is not yet avoiding any closer obstacle, // we steer away from this one if (distance < 15 && (!curdistance || curdistance > distance)) { if (angle < degreesToRadians(180)) { // obstacle is on our right, moving left steering = new Vector2(-10, 0); } else { // obstacle is on our left, moving right steering = new Vector2(10, 0); } // updating distance to obstacle currently steered away curdistance = distance; } } // Done ! returning either a vector, or null return steering; } // In Byte Arena, angles are expressed in radians // This converts from radians to degrees const degreesToRadians = deg => deg * (2 * Math.PI) / 360.0;