From 68e33c9e2b6881802b432d080006dec522016fa5 Mon Sep 17 00:00:00 2001
From: Amira Abdel-Rahman <amira-rahman@aucegypt.edu>
Date: Sun, 24 Nov 2019 17:15:33 -0500
Subject: [PATCH] assembly robot working
---
.../assembly/main.js | 705 ++++++++----------
1 file changed, 329 insertions(+), 376 deletions(-)
diff --git a/01_Code/physical_computing_interface/assembly/main.js b/01_Code/physical_computing_interface/assembly/main.js
index c3cb715..3ba2c18 100644
--- a/01_Code/physical_computing_interface/assembly/main.js
+++ b/01_Code/physical_computing_interface/assembly/main.js
@@ -15,7 +15,7 @@ var RAD_TO_DEG = 180 / Math.PI;
///////////////////////////voxels///////////////////////////////
var voxel;
-var voxelSpacing=3.0;
+var voxelSpacing=1.0;
var voxelLocations=[];
var voxelSlices=[];
var voxelSlicesCount=[];
@@ -36,7 +36,7 @@ var grid=[];
///////////////////////////robot///////////////////////////////
var numberOfRobots=1; //change number of robots
-var speed=200; //change to speed up the simulation
+var speed=20; //change to speed up the simulation
var THREE1=[];
var robotBones = [];
var joints = [];
@@ -75,6 +75,8 @@ var path= [];
var totalNumberofSteps=[];
+var locations=[]
+
///////////////////////function calls///////////////////////////////
declareGlobals();
@@ -87,8 +89,8 @@ for( i=0;i<numberOfRobots;i++)
setupGUI(i);
THREERobotCall(i);
defaultRobot(i);
-
- // startMovement(i,false);
+ buildHelperMeshes(i);
+ assemble(i);
}
@@ -121,7 +123,7 @@ function declareGlobals(){
leg.push(1);
voxelNormal.push(180);
normalAdjustmentVector.push(new THREE.Vector3( 0, 0, 0));
- startLocations.push(new THREE.Vector3(0,0,0) );
+ startLocations.push(new THREE.Vector3(0*voxelSpacing,10*voxelSpacing,0) );
THREE1dir.push(new THREE.Vector3(1,0,0) );
THREE1Pos.push(new THREE.Vector3(0,0,0) );
@@ -142,8 +144,8 @@ function declareGlobals(){
number:20,
delay:1000/speed,
timeout:0,
- cHeight:1.4*voxelSpacing,
- showPath:false,
+ cHeight:5.0*voxelSpacing,
+ showPath:true,
normals:[],
changeLegs:[],
changeRotation:[],
@@ -214,7 +216,7 @@ function init() {
window.addEventListener('resize', onWindowResize, false);
- var size = 10;
+ var size = 20;
var step = 20;
var gridHelper = new THREE.GridHelper(size, step);
@@ -307,6 +309,31 @@ function THREERobotCall(robotIndex) {
joints[robotIndex].push(joint);
switch (jointNumber) {
+ // case 0:
+ // joint.rotation.x = Math.PI / 2
+ // break
+ // case 1:
+ // joint.rotation.z = Math.PI / 2 //changed
+ // // joint.rotation.y = Math.PI / 2 //changed
+ // break
+ // case 2:
+ // joint.rotation.z = Math.PI / 2 //changed
+ // // joint.rotation.y = Math.PI / 2 //changed
+ // // joint.rotation.x = Math.PI / 2
+ // break
+ // case 3:
+ // joint.rotation.z = Math.PI / 2 //changed
+ // // joint.rotation.y = Math.PI
+ // break
+ // case 4:
+ // joint.rotation.x = Math.PI / 2 //changed
+ // // joint.rotation.x = Math.PI / 2
+ // // joint.rotation.y = Math.PI / 2
+ // break
+ // case 5:
+ // joint.rotation.x = Math.PI / 2
+ // group.rotation.y = Math.PI / 2
+ // break;
case 0:
joint.rotation.x = Math.PI / 2
break
@@ -354,7 +381,7 @@ function THREERobotCall(robotIndex) {
{
carriedVoxel[robotIndex]=voxel.clone();
- carriedVoxel[robotIndex].position.x=x+voxelSpacing;
+ carriedVoxel[robotIndex].position.x=x+2.5*voxelSpacing;
carriedVoxel[robotIndex].position.y=y;
carriedVoxel[robotIndex].position.z=z ;
linkGeo.add( carriedVoxel[robotIndex] );
@@ -376,142 +403,20 @@ function THREERobotCall(robotIndex) {
// robotBones[robotIndex][3].rotation.y = angles[robotIndex][3];
// robotBones[robotIndex][4].rotation.z = angles[robotIndex][4];
// robotBones[robotIndex][5].rotation.y = angles[robotIndex][5];
+
robotBones[robotIndex][0].rotation.z = angles[robotIndex][0];
robotBones[robotIndex][1].rotation.y = angles[robotIndex][1];
robotBones[robotIndex][2].rotation.y = angles[robotIndex][2];
robotBones[robotIndex][3].rotation.x = angles[robotIndex][3];
robotBones[robotIndex][4].rotation.y = angles[robotIndex][4];
robotBones[robotIndex][5].rotation.z = angles[robotIndex][5];
- },
-
- setAngle(robotIndex,index, angle) {
- angles[robotIndex][index] = angle;
- this.setAngles(robotIndex,angles[robotIndex].slice());
- },
- };
-}
-
-function THREERobotCallOld(robotIndex) {
- THREERobot= function (robotIndex,V_initial, limits, scene) {
-
- THREE1[robotIndex] = new THREE.Group();
-
- var colors = [
- 0xaaaaaa,
- 0xbbbbbb,
- 0xbcbcbc,
- 0xcbcbcb,
- 0xcccccc,
- 0x0,
- ];
-
- let parentObject = THREE1[robotIndex];
- robotBones[robotIndex] = [];
- joints[robotIndex] = [];
-
- function createCube(x, y, z, w, h, d, min, max, jointNumber) {
- var thicken = 1;
-
- var w_thickened = Math.abs(w) + thicken;
- var h_thickened = Math.abs(h) + thicken;
- var d_thickened = Math.abs(d) + thicken;
-
- var material = new THREE.MeshLambertMaterial({ color: colors[jointNumber],});
- var geometry = new THREE.CubeGeometry(w_thickened, h_thickened, d_thickened);
- var mesh = new THREE.Mesh(geometry, material);
-
-
- mesh.position.set(w / 2, h / 2, d / 2);
- var group = new THREE.Object3D();
- group.position.set(x, y, z);
- group.add(mesh);
-
- // min = min / 180 * Math.PI
- // max = max / 180 * Math.PI
-
- var jointGeo1 = new THREE.CylinderGeometry(0.8, 0.8, 0.8 * 2, 32, 32, false, -min, 2 * Math.PI - max + min)
- var jointGeoMax = new THREE.CylinderGeometry(0.8, 0.8, 0.8 * 2, 32, 32, false, -max, max)
- var jointGeoMin = new THREE.CylinderGeometry(0.8, 0.8, 0.8 * 2, 32, 32, false, 0, -min)
- var jointMesh1 = new THREE.Mesh(jointGeo1, new THREE.MeshBasicMaterial({
- color: 0x000000,//0xffbb00,
- }));
- var jointMeshMax = new THREE.Mesh(jointGeoMax, new THREE.MeshBasicMaterial({
- color: 0x000000,//0x009900,
- }));
- var jointMeshMin = new THREE.Mesh(jointGeoMin, new THREE.MeshBasicMaterial({
- color: 0x000000,//0xdd2200,
- }));
-
- var joint = new THREE.Group();
- joint.add(jointMeshMax, jointMeshMin, jointMesh1);
-
- joints[robotIndex].push(joint);
-
- switch (jointNumber) {
- case 0:
- joint.rotation.x = Math.PI / 2;
- break;
- case 1:
- // joint.rotation.x = Math.PI / 2
- break;
- case 2:
- // joint.rotation.x = Math.PI / 2
- break;
- case 3:
- // joint.rotation.z = Math.PI / 2;
- break;
- case 4:
- joint.rotation.x = Math.PI / 2;
- break;
- }
-
- group.add(joint);
- return group;
- }
-
- let x = 0,
- y = 0,
- z = 0;
-
- // V_initial.push([0, 0, 0]) // add a 6th pseudo link for 6 axis
-
- for (let i = 0; i < V_initial.length; i++) {
- var link = V_initial[i];
-
-
-
- var linkGeo = createCube(x, y, z, link[0], link[1], link[2], limits[i][0], limits[i][1], i);
- x = link[0];
- y = link[1];
- z = link[2];
-
- if(i==5)
- {
-
- carriedVoxel[robotIndex]=voxel.clone();
- carriedVoxel[robotIndex].position.x=x-voxelSpacing/2-0.5;
- carriedVoxel[robotIndex].position.y=y;
- carriedVoxel[robotIndex].position.z=z-2;
- linkGeo.add( carriedVoxel[robotIndex] );
- }
-
- parentObject.add(linkGeo);
- parentObject = linkGeo;
- robotBones[robotIndex].push(linkGeo);
- }
-
- scene.add(THREE1[robotIndex]);
- };
-
- THREERobot.prototype = {
- setAngles(robotIndex,angles1) {
- robotBones[robotIndex][0].rotation.z = angles[robotIndex][0];
- robotBones[robotIndex][1].rotation.y = angles[robotIndex][1];
- robotBones[robotIndex][2].rotation.y = angles[robotIndex][2];
- robotBones[robotIndex][3].rotation.y = angles[robotIndex][3];
- robotBones[robotIndex][4].rotation.z = angles[robotIndex][4];
- // robotBones[robotIndex][5].rotation.z = angles[robotIndex][5];
+ // robotBones[robotIndex][0].rotation.z =angles[robotIndex][0];
+ // robotBones[robotIndex][1].rotation.x =angles[robotIndex][1];
+ // robotBones[robotIndex][2].rotation.x =angles[robotIndex][2];
+ // robotBones[robotIndex][3].rotation.x =angles[robotIndex][3];
+ // robotBones[robotIndex][4].rotation.z =angles[robotIndex][4];
+ // robotBones[robotIndex][5].rotation.z =angles[robotIndex][5];
},
setAngle(robotIndex,index, angle) {
@@ -546,19 +451,26 @@ function defaultRobot(robotIndex) {
wrist_2_length =scale* d5;
wrist_3_length =scale* d6;
geo = [
- [scale*200, 0, 0],
- [0, 0, scale*612.7],
+ // [scale*200, 0, scale*50],
+ // [-scale*100, 0, scale*600],
+ // [0, 0, scale*600],
+ // [scale*200, 0,0],
+ // [0, 0, scale*200],
+ // [scale*200, 0, 0],
+ [scale*200, 0, scale*100],
+ [0, 0, scale*800],
[0, 0,scale*200],
- [scale*1200.7, 0, 0],
- [scale*100, 0, 0],
- [scale*100, 0, 0],
+ [scale*800, 0, 0],
+ [scale*200, 0, 0],
+ [scale*200, 0, 0],
+
];
defaultRobotState[robotIndex] = {
target: {
position: {
- x: 10,
- y: 0,
- z: 10,
+ x: startLocations[robotIndex].x,
+ y: startLocations[robotIndex].y,
+ z: startLocations[robotIndex].z,
},
rotation: {
x: Math.PI,
@@ -643,6 +555,8 @@ function defaultRobot(robotIndex) {
VisualRobot[robotIndex].setAngle(robotIndex,1,restAngle*RAD_TO_DEG);
VisualRobot[robotIndex].setAngle(robotIndex,2,restAngle*RAD_TO_DEG);
VisualRobot[robotIndex].setAngle(robotIndex,3,restAngle*RAD_TO_DEG);
+ VisualRobot[robotIndex].setAngle(robotIndex,4,restAngle*RAD_TO_DEG);
+ VisualRobot[robotIndex].setAngle(robotIndex,5,restAngle*RAD_TO_DEG);
// var target= new THREE.Vector3(guiControls[robotIndex].x,guiControls[robotIndex].y,guiControls[robotIndex].z);
// updateGUI();
@@ -650,113 +564,7 @@ function defaultRobot(robotIndex) {
targetControl(robotIndex);
THREE1[robotIndex].position.x=0;
THREE1[robotIndex].position.y=0;
- THREE1[robotIndex].position.z=voxelSpacing/2;
- updateAngles(robotIndex);
-
-}
-
-function defaultRobotOld(robotIndex) {
- localState = {
- jointOutOfBound: [false, false, false, false, false, false],
- };
- var maxAngleVelocity = 90.0 / (180.0 * Math.PI) / 1000.0;
- geo = [
- [0, 0, guiControls[robotIndex].offset],
- [0, 0, guiControls[robotIndex].leg1],
- [0, 0, guiControls[robotIndex].leg2],
- [0, 0, guiControls[robotIndex].offset],
- [0, 0, 0],
- [0, 0, 0],
- ];
- defaultRobotState[robotIndex] = {
- target: {
- position: {
- x: 10,
- y: 10,
- z: 10,
- },
- rotation: {
- x: Math.PI,
- y: 0,
- z: 0,
- },
- },
- angles: {
- A0: 0,
- A1: 0,
- A2: 0,
- A3: 0,
- A4: 0,
- A5: 0,
- },
- jointOutOfBound: [false, false, false, false, false, false],
- maxAngleVelocities: {
- J0: maxAngleVelocity,
- J1: maxAngleVelocity,
- J2: maxAngleVelocity,
- J3: maxAngleVelocity,
- J4: maxAngleVelocity,
- J5: maxAngleVelocity,
- },
- jointLimits: {
- J0: [-190 / 180 * Math.PI, 190 / 180 * Math.PI],
- J1: [-58 / 180 * Math.PI, 90 / 180 * Math.PI],
- J2: [-135 / 180 * Math.PI, 40 / 180 * Math.PI],
- J3: [-90 / 180 * Math.PI, 75 / 180 * Math.PI],
- J4: [-139 / 180 * Math.PI, 20 / 180 * Math.PI],
- J5: [-188 / 180 * Math.PI, 181 / 180 * Math.PI],
- },
- geometry: {
- V0: {
- x: geo[0][0],
- y: geo[0][1],
- z: geo[0][2],
- },
- V1: {
- x: geo[1][0],
- y: geo[1][1],
- z: geo[1][2],
- },
- V2: {
- x: geo[2][0],
- y: geo[2][1],
- z: geo[2][2],
- },
- V3: {
- x: geo[3][0],
- y: geo[3][1],
- z: geo[3][2],
- },
- V4: {
- x: geo[4][0],
- y: geo[4][1],
- z: geo[4][2],
- },
- },
- };
-
- THREESimulationRobot[robotIndex] = new THREE.Group();
- scene.add(THREESimulationRobot[robotIndex]);
-
- var geometry = Object.values(defaultRobotState[robotIndex].geometry).map((val, i, array) => [val.x, val.y, val.z]);
- var jointLimits = Object.values(defaultRobotState[robotIndex].jointLimits);
-
- VisualRobot[robotIndex] = new THREERobot(robotIndex,geometry, jointLimits, THREESimulationRobot[robotIndex]);
- // var angles = Object.values(defaultRobotState.angles);
- // VisualRobot[robotIndex].setAngles(angles);
- var restAngle=60;
- // VisualRobot[robotIndex].setAngle(0,restAngle/ 180 * Math.PI);
- VisualRobot[robotIndex].setAngle(robotIndex,1,restAngle*RAD_TO_DEG);
- VisualRobot[robotIndex].setAngle(robotIndex,2,restAngle*RAD_TO_DEG);
- VisualRobot[robotIndex].setAngle(robotIndex,3,restAngle*RAD_TO_DEG);
-
- // var target= new THREE.Vector3(guiControls[robotIndex].x,guiControls[robotIndex].y,guiControls[robotIndex].z);
- // updateGUI();
-
- targetControl(robotIndex);
- THREE1[robotIndex].position.x=robotState[robotIndex].leg2Pos.x*voxelSpacing;
- THREE1[robotIndex].position.y=robotState[robotIndex].leg2Pos.y*voxelSpacing;
- THREE1[robotIndex].position.z=voxelSpacing/2;
+ THREE1[robotIndex].position.z=0;
updateAngles(robotIndex);
}
@@ -813,63 +621,14 @@ function updateRobotGeometry1(robotIndex){
updateAngles(robotIndex);
}
-function updateRobotGeometryOld(robotIndex){
- geo = [
- [0, 0, guiControls[robotIndex].offset],
- [0, 0, guiControls[robotIndex].leg1],
- [0, 0, guiControls[robotIndex].leg2],
- [0, 0, guiControls[robotIndex].offset],
- [0, 0, 0],
- [0, 0, 0],
- ];
-
- defaultRobotState[robotIndex].geometry ={
- V0: {
- x: geo[0][0],
- y: geo[0][1],
- z: geo[0][2],
- },
- V1: {
- x: geo[1][0],
- y: geo[1][1],
- z: geo[1][2],
- },
- V2: {
- x: geo[2][0],
- y: geo[2][1],
- z: geo[2][2],
- },
- V3: {
- x: geo[3][0],
- y: geo[3][1],
- z: geo[3][2],
- },
- V4: {
- x: geo[4][0],
- y: geo[4][1],
- z: geo[4][2],
- },
- };
-
- var geometry = Object.values(defaultRobotState[robotIndex].geometry).map((val, i, array) => [val.x, val.y, val.z]);
- var jointLimits = Object.values(defaultRobotState[robotIndex].jointLimits);
-
- while (THREESimulationRobot[robotIndex].children.length) {
- THREESimulationRobot[robotIndex].remove(THREESimulationRobot[robotIndex].children[0]);
- }
-
- VisualRobot[robotIndex] = new THREERobot(robotIndex,geometry, jointLimits, THREESimulationRobot[robotIndex]);
-
- updateAngles(robotIndex);
-}
////////////////////////////////GUI///////////////////////////////
function setupGUI(robotIndex){
//Parameters that can be modified.
guiControls[robotIndex] = new function() {
- this.x = 10;
- this.y = 10;
- this.z = 10;
+ this.x = startLocations[robotIndex].x;
+ this.y = startLocations[robotIndex].y;
+ this.z = startLocations[robotIndex].z;
this.j1 = 0.0;
this.j2 = 0.0;
this.j3 = 0.0;
@@ -982,9 +741,9 @@ function updateAngles(robotIndex){
// const calculateAngles = (jointLimits, position, rotation, configuration) => {
const angles = []
IK[robotIndex].calculateAngles(
- defaultRobotState[robotIndex].target.position.x,
- defaultRobotState[robotIndex].target.position.y,
- defaultRobotState[robotIndex].target.position.z,
+ guiControls[robotIndex].x,
+ guiControls[robotIndex].y,
+ guiControls[robotIndex].z +2.5*voxelSpacing,
defaultRobotState[robotIndex].target.rotation.x,
defaultRobotState[robotIndex].target.rotation.y,
defaultRobotState[robotIndex].target.rotation.z,
@@ -1023,61 +782,6 @@ function updateAngles(robotIndex){
}
-function updateAnglesOld(robotIndex){
- THREE1[robotIndex].updateMatrixWorld();
- var matrix = new THREE.Matrix4();
- matrix.extractRotation( THREE1[robotIndex].matrix );
-
- //check rotation
-
- var vector = THREE1[robotIndex].position.clone().sub(target[robotIndex].position.clone().add(normalAdjustmentVector[robotIndex].clone()));
- vector.applyMatrix4(matrix);
-
- if(THREE1[robotIndex].rotation.x!=0&&THREE1[robotIndex].rotation.x!=180*DEG_TO_RAD)
- {
- vector.x = -vector.x;
- vector.add(THREE1[robotIndex].position.clone());
- }else if(THREE1[robotIndex].rotation.y!=0&&THREE1[robotIndex].rotation.y!=180*DEG_TO_RAD)
- {
- vector.y = -vector.y;
- vector.add(THREE1[robotIndex].position.clone());
-
- }else
- {
- vector = new THREE.Vector3(0,0,0).sub(vector.clone());
- vector.add(THREE1[robotIndex].position.clone());
- }
-
- var origin= new THREE.Vector3(THREE1[robotIndex].position.x, THREE1[robotIndex].position.y, vector.z);
-
- var a=ik_2d( vector.z-THREE1[robotIndex].position.z ,origin.distanceTo(vector) , guiControls[robotIndex].leg1, guiControls[robotIndex].leg2);
-
- VisualRobot[robotIndex].setAngle(robotIndex,0,Math.atan2( vector.y-THREE1[robotIndex].position.y , vector.x-THREE1[robotIndex].position.x));
- VisualRobot[robotIndex].setAngle(robotIndex,1,a.theta1);
- VisualRobot[robotIndex].setAngle(robotIndex,2,a.theta2-a.theta1);
- VisualRobot[robotIndex].setAngle(robotIndex,3,(voxelNormal[robotIndex]*DEG_TO_RAD)-(a.theta2));
- VisualRobot[robotIndex].setAngle(robotIndex,4,0);
-
- if(leg[robotIndex]==1)
- {
- guiControls[robotIndex].j1=angles[robotIndex][0]*RAD_TO_DEG;
- guiControls[robotIndex].j2=angles[robotIndex][1]*RAD_TO_DEG;
- guiControls[robotIndex].j3=angles[robotIndex][2]*RAD_TO_DEG;
- guiControls[robotIndex].j4=angles[robotIndex][3]*RAD_TO_DEG;
- guiControls[robotIndex].j5=angles[robotIndex][4]*RAD_TO_DEG;
- //later output package
- // console.log(angles[robotIndex][0]+","+angles[robotIndex][1]+","+angles[robotIndex][2]+","+angles[robotIndex][3]+","+angles[robotIndex][4]);
- }else
- {
- guiControls[robotIndex].j1=angles[robotIndex][4]*RAD_TO_DEG;
- guiControls[robotIndex].j2=angles[robotIndex][3]*RAD_TO_DEG;
- guiControls[robotIndex].j3=angles[robotIndex][2]*RAD_TO_DEG;
- guiControls[robotIndex].j4=angles[robotIndex][1]*RAD_TO_DEG;
- guiControls[robotIndex].j5=angles[robotIndex][0]*RAD_TO_DEG;
- //later output package
- // console.log(angles[robotIndex][4]+","+angles[robotIndex][3]+","+angles[robotIndex][2]+","+angles[robotIndex][1]+","+angles[robotIndex][0]);
- }
-}
function ik_2d(x, y, d1, d2) {
let dist = Math.sqrt(x ** 2 + y ** 2);
@@ -1180,6 +884,251 @@ function updateTarget(robotIndex){
target[robotIndex].position.z = guiControls[robotIndex].z;
}
+///////////////////////assembly/////////
+function assemble(robotIndex){
+ resetPath(robotIndex);
+ builtShape();
+ generatePoints(robotIndex);
+
+ // steps[robotIndex]=[startLocations[robotIndex],new THREE.Vector3(10*voxelSpacing,0*voxelSpacing,0)];
+ // showTargetPosition(robotIndex,minIndex,true);
+
+ for(var i=0;i<steps[robotIndex].length;i++){
+ if(i%2!=0){
+ moveRobot(robotIndex,true,steps[robotIndex][i]);
+ }else{
+ moveRobot(robotIndex,false,steps[robotIndex][i+1]);
+ }
+
+ }
+
+}
+
+function createPath(robotIndex,start,end){
+ var snormal=new THREE.Vector3(0,0,1);
+ var enormal=new THREE.Vector3(0,0,1);
+ var robotUp=new THREE.Vector3(0,0,1);
+ var p1=start.clone();
+ p1.add(snormal.clone().multiplyScalar(1));
+ var p2=new THREE.Vector3(0,0,0);
+ var p3=new THREE.Vector3(0,0,0);
+ var p4=end.clone();
+ p4.add(enormal.clone().multiplyScalar(1));
+
+ var nor = snormal.clone();
+ nor.add(enormal);
+ nor.normalize();
+
+ var dir=end.clone().sub(start);
+
+ var temp1=new THREE.Vector3(0,0,0);
+ var temp2=new THREE.Vector3(0,0,0);
+ nor.multiplyScalar(path[robotIndex].cHeight);
+
+
+ temp1.addVectors(start,dir.multiplyScalar(1/3));
+ temp2.addVectors(start,dir.multiplyScalar(2));
+
+
+ p2.addVectors(nor,temp1);
+ p3.addVectors(nor,temp2);
+
+ //create bezier curve
+ path[robotIndex].curve= new THREE.CubicBezierCurve3 (
+ p1,
+ p2,
+ p3,
+ p4
+ );
+ dividePath(robotIndex,snormal.clone(),enormal.clone());
+}
+
+function dividePath(robotIndex,snormal,enormal,robotUp,robotLocation){
+
+ var snormal=new THREE.Vector3(0,0,1);
+ var enormal=new THREE.Vector3(0,0,1);
+ var robotUp=new THREE.Vector3(0,0,1);
+ var robotLocation=new THREE.Vector3(0,0,1);
+
+ //points
+ var d=1/path[robotIndex].number;
+ var tempPoints=path[robotIndex].curve.getSpacedPoints(path[robotIndex].number);
+
+ var forward=new THREE.Vector3(0,0,0);
+ var tempV=tempPoints[0].clone().sub(robotLocation);
+ if(tempV.x!=0 && robotUp.x==0)
+ {
+ forward.x=tempV.x;
+ }else if(tempV.y!=0 && robotUp.y==0)
+ {
+ forward.y=tempV.y;
+ }else if(tempV.z!=0 && robotUp.z==0)
+ {
+ forward.z=tempV.z;
+ }
+ forward.normalize();
+
+ var p1=tempPoints[0];
+ var p2=tempPoints[path[robotIndex].number-1];
+ var diff=p2.clone().sub(p1);
+ diff.multiply(snormal);
+
+ //normals
+ var vnormal1=180;
+ var vnormal2=180;
+ if(!snormal.equals(enormal))
+ {
+
+ if(diff.x>0||diff.y>0||diff.z>0)
+ {
+ if(robotUp.equals(snormal))
+ {
+ vnormal1=180;
+ vnormal2=90;
+
+ }else
+ {
+ vnormal2=180;
+ vnormal1=90;
+
+ }
+
+ }else if(diff.x<0||diff.y<0||diff.z<0)
+ {
+ if(robotUp.equals(snormal))
+ {
+ vnormal1=180;
+ vnormal2=180+90;
+
+ }else
+ {
+ vnormal2=180;
+ vnormal1=180+90;
+
+ }
+ }
+ }
+ var dn=(vnormal2-vnormal1)/path[robotIndex].number;
+
+
+
+ for (var i=0;i<=path[robotIndex].number;i++)
+ {
+ path[robotIndex].normals.push(vnormal1+i*dn);
+ path[robotIndex].normalAdjustments.push(getNormalAdjustment(robotIndex,vnormal1+i*dn,robotUp,forward));
+ path[robotIndex].points.push(tempPoints[i].clone());
+
+
+ if(path[robotIndex].showPath)
+ {
+ var material = new THREE.MeshLambertMaterial({ color:0xff7171,});
+ var geometry = new THREE.SphereGeometry(0.05, 0.05, 0.05);
+ var mesh = new THREE.Mesh(geometry, material);
+ mesh.position.x=tempPoints[i].x;
+ mesh.position.y=tempPoints[i].y;
+ mesh.position.z=tempPoints[i].z;
+ scene.add(mesh);
+ }
+ }
+
+}
+
+function moveRobot(robotIndex,leaveVoxel,voxelLoc){
+ var ps= path[robotIndex].points.slice();
+ if(leaveVoxel){
+ setTimeout(function(){ buildVoxelAt(voxelLoc);showTargetPosition(robotIndex,voxelLoc,false) }, path[robotIndex].timeout);
+
+
+ }else{
+ setTimeout(function(){showTargetPosition(robotIndex,voxelLoc,true) }, path[robotIndex].timeout);
+
+ }
+ for(var i=0;i<=path[robotIndex].number;i++)
+ {
+ setTimeout(function(){ move(robotIndex); }, path[robotIndex].timeout+=path[robotIndex].delay);
+ }
+
+
+
+}
+
+function move(robotIndex){
+ guiControls[robotIndex].x=path[robotIndex].points[path[robotIndex].currentPoint].x;
+ guiControls[robotIndex].y=path[robotIndex].points[path[robotIndex].currentPoint].y;
+ guiControls[robotIndex].z=path[robotIndex].points[path[robotIndex].currentPoint].z;
+ voxelNormal[robotIndex]=path[robotIndex].normals[path[robotIndex].currentPoint];
+ normalAdjustmentVector[robotIndex]=path[robotIndex].normalAdjustments[path[robotIndex].currentPoint];
+
+ updateAngles(robotIndex);
+
+ control[robotIndex].position.x = guiControls[robotIndex].x;
+ control[robotIndex].position.y = guiControls[robotIndex].y;
+ control[robotIndex].position.z = guiControls[robotIndex].z;
+
+ target[robotIndex].position.x = guiControls[robotIndex].x;
+ target[robotIndex].position.y = guiControls[robotIndex].y;
+ target[robotIndex].position.z = guiControls[robotIndex].z;
+
+ path[robotIndex].currentPoint++;
+ if(path[robotIndex].currentPoint==path[robotIndex].points.length)
+ {
+ // if(goHome[robotIndex])
+ // {
+
+ // buildVoxelAt(robotState[robotIndex].leg1Pos.clone().multiplyScalar(voxelSpacing));
+ // //go Home
+ // // console.log("robotIndex:"+robotIndex+" s2s");
+ // startMovement(robotIndex,true);
+
+ // }else
+ // {
+ // //go to new Voxel
+ // // console.log("robotIndex:"+robotIndex+" s2s");
+ // startMovement(robotIndex,false);
+ // }
+ }
+
+}
+
+function builtShape(){
+ for(var i=0;i<gridSize;i++)
+ {
+ var t=[];
+ grid.push(t)
+ for(var j=0;j<gridSize;j++)
+ {
+ var tt=[];
+ grid[i].push(tt);
+ for(var k=0;k<gridSize;k++)
+ {
+ grid[i][j].push(false);
+ }
+ }
+ }
+ for(var i=gridSize/2.0;i<gridSize;i++)
+ {
+ grid[i][0][0]=true;
+ locations.push(new THREE.Vector3(i*voxelSpacing,0,0)); //TODO CHANGE LATER BASED ON NUMBER OF ROBOTS
+ }
+
+}
+
+function generatePoints(robotIndex){
+ for(var i=0;i<locations.length;i++){
+ steps[robotIndex].push(startLocations[robotIndex]);
+ steps[robotIndex].push(locations[i]);
+
+ }
+ console.log(steps[robotIndex])
+ for(var i=0;i<steps[robotIndex].length-1;i++){
+ createPath(robotIndex,steps[robotIndex][i],steps[robotIndex][i+1]);
+ }
+
+
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////Change Fixed End////////////////////////////
function changeEnd(robotIndex){
//TODO: send fix end and unfix end to code
@@ -1265,6 +1214,8 @@ function getRotation(dir){
////////////////////////////////Path////////////////////////////
+
+
function _createPath(robotIndex,start,end,snormal,enormal,robotUp,robotLocation){
var p1=start.clone();
p1.add(snormal.clone().multiplyScalar(1));
@@ -1386,6 +1337,8 @@ function _dividePath(robotIndex,snormal,enormal,robotUp,robotLocation){
}
+////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
function _BilleStep(robotIndex,stepLeg1,stepLeg2,legsNormal){
var changeLegBefore=false;
var leg1Pos=new THREE.Vector3(0,0,0);
@@ -1445,7 +1398,7 @@ function moveLeg(robotIndex){
}
-function move(robotIndex){
+function _move(robotIndex){
guiControls[robotIndex].x=path[robotIndex].points[path[robotIndex].currentPoint].x;
guiControls[robotIndex].y=path[robotIndex].points[path[robotIndex].currentPoint].y;
guiControls[robotIndex].z=path[robotIndex].points[path[robotIndex].currentPoint].z;
@@ -1517,7 +1470,7 @@ function resetPath(robotIndex){
}
//////////////////////////commands stack////////////////////////////
-function generatePoints(robotIndex){
+function _generatePoints(robotIndex){
for (var i=0; i<steps[robotIndex].length ; i++)
{
var s=_BilleStep(robotIndex,steps[robotIndex][i][0],steps[robotIndex][i][1],steps[robotIndex][i][2]);
@@ -1778,9 +1731,9 @@ function loadVoxel(){
// object.scale.y=0.04;
// object.scale.z=0.04;
// object.position.z=-1.5;
- object.scale.x=0.5;
- object.scale.y=0.5;
- object.scale.z=0.5;
+ object.scale.x=0.5/3.0;
+ object.scale.y=0.5/3.0;
+ object.scale.z=0.5/3.0;
object.position.x=-15;
object.position.y=-15;
voxel=object;
@@ -1887,18 +1840,18 @@ function buildVoxelAt(loc){
var object1=voxel.clone();
object1.position.x=loc.x;
object1.position.y=loc.y;
- object1.position.z=loc.z-voxelSpacing/2;
- if(loc.z==0){
- var color1= new THREE.Color( 0, 0, 0 )
+ object1.position.z=loc.z+voxelSpacing/2;
+ // if(loc.z==0){
+ // var color1= new THREE.Color( 0, 0, 0 )
- var material = new THREE.MeshLambertMaterial( { color: 0x000000 } );
+ // var material = new THREE.MeshLambertMaterial( { color: 0x000000 } );
- // var color = new THREE.Color( 1/globalRank, 0, 0 );
+ // // var color = new THREE.Color( 1/globalRank, 0, 0 );
- object1.material=material.clone();
- object1.material.color=color1;
+ // object1.material=material.clone();
+ // object1.material.color=color1;
- }
+ // }
--
GitLab