BowlerKernel
GradiantDecentNode.java
Go to the documentation of this file.
1 package com.neuronrobotics.sdk.addons.kinematics;
2 
3 import com.neuronrobotics.sdk.addons.kinematics.math.TransformNR;
4 
5 
6 // TODO: Auto-generated Javadoc
10 public class GradiantDecentNode{
11 
13  TransformNR target;
14 
16  private int index;
17 
19  double offset;
20 
22  double myStart=0;
23 
25  double[] jointSpaceVector;
26 
28  double upper;
29 
31  double lower;
32 
34  private final DHChain chain;
35 
37  double incVect;
38 
40  double incOrent;
41 
43  //integral
44  int integralSize = 100;
45 
47  int integralIndexVect = 0;
48 
50  int integralIndexOrent = 0;
51 
53  double integralTotalVect = 0;
54 
56  double integralTotalOrent = 0;
57 
59  double intVect[] = new double[integralSize];
60 
62  double intOrent[] = new double[integralSize];
63 
65  double Kp = 1;
66 
68  double Ki = 1;
69 
80  public GradiantDecentNode(DHChain chain,int index,double[] jointSpaceVector,TransformNR cartesianSpace, double u, double l){
81  this.chain = chain;
82  this.offset=0;
83  this.setIndex(index);
84  this.jointSpaceVector=jointSpaceVector;
85  target = cartesianSpace;
86  myStart = jointSpaceVector[index];
87  upper = u;
88  lower = l;
89  for(int i=0;i<integralSize;i++){
90  intVect[i]=0;
91  intOrent[i]=0;
92  }
93  }
94 
100  public boolean stepOrent(){
101  double none = myStart+offset;
102  double start = offset;
103  jointSpaceVector[getIndex()]= bound (none);
104  TransformNR tmp =chain.forwardKinematics(jointSpaceVector);
105  tmp =chain.forwardKinematics(jointSpaceVector);
106  double noneOrent = tmp.getOffsetOrentationMagnitude(target);
107 
108  double incOrentP = (noneOrent*10);//Multiply by magic number
109  //Remove old values off rolling buffer
110  integralTotalOrent-=intOrent[integralIndexOrent];
111  //Store current values
112  intOrent[integralIndexOrent] =incOrentP;
113  //Add current values to totals
114  integralTotalOrent+=intOrent[integralIndexOrent];
115  //Reset the index for next iteration
116  integralIndexOrent++;
117  if(integralIndexOrent==integralSize){
118  integralIndexOrent=0;
119  }
120 
121  //The 2 increment numbers
122  incOrent = incOrentP*Kp + (integralTotalOrent/integralSize)*Ki;
123 
124  double upO = myStart+offset+incOrent;
125  double downO =myStart+offset-incOrent;
126 
127  jointSpaceVector[getIndex()]= bound (upO);
128  tmp =chain.forwardKinematics(jointSpaceVector);
129  double upOrent = tmp.getOffsetOrentationMagnitude(target);
130 
131  jointSpaceVector[getIndex()]= bound (downO);
132  tmp =chain.forwardKinematics(jointSpaceVector);
133  double downOrent = tmp.getOffsetOrentationMagnitude(target);
134 
135 
136  if( (upOrent>noneOrent && downOrent>noneOrent)){
137  jointSpaceVector[getIndex()]=none;
138  }
139 
140  if(( noneOrent>upOrent && downOrent>upOrent)){
141  jointSpaceVector[getIndex()]=upO;
142  offset+=incOrent;
143  }
144  if((upOrent>downOrent && noneOrent>downOrent )){
145  jointSpaceVector[getIndex()]=downO;
146  offset-=incOrent;
147  }
148 
149  jointSpaceVector[getIndex()] = myStart+offset;
150  if(start == offset)
151  return true;
152  return false;
153  }
154 
160  public boolean stepLin(){
161  double none = myStart+offset;
162  double start = offset;
163  jointSpaceVector[getIndex()]= bound (none);
164  TransformNR tmp =chain.forwardKinematics(jointSpaceVector);
165  tmp =chain.forwardKinematics(jointSpaceVector);
166  double nonevect = tmp.getOffsetVectorMagnitude(target);
167 
168  double incVectP = (nonevect/1000);// Divide by magic number
169  //Remove old values off rolling buffer
170  integralTotalVect-=intVect[integralIndexVect];
171  //Store current values
172  intVect[integralIndexVect] =incVectP;
173  //Add current values to totals
174  integralTotalVect+=intVect[integralIndexVect];
175  //Reset the index for next iteration
176  integralIndexVect++;
177  if(integralIndexVect==integralSize){
178  integralIndexVect=0;
179  }
180 
181  //The 2 increment numbers
182  incVect = incVectP*Kp + (integralTotalVect/integralSize)*Ki;
183 
184  double up = myStart+offset+incVect;
185  double down =myStart+offset-incVect;
186 
187  jointSpaceVector[getIndex()]= bound (up);
188  tmp =chain.forwardKinematics(jointSpaceVector);
189  double upvect = tmp.getOffsetVectorMagnitude(target);
190 
191 
192  jointSpaceVector[getIndex()]= bound (down);
193  tmp =chain.forwardKinematics(jointSpaceVector);
194  double downvect = tmp.getOffsetVectorMagnitude(target);
195 
196 
197  if((upvect>nonevect && downvect>nonevect) ){
198  jointSpaceVector[getIndex()]=none;
199  }
200  if((nonevect>upvect && downvect>upvect ) ){
201  jointSpaceVector[getIndex()]=up;
202  offset+=incVect;
203  }
204  if((upvect>downvect && nonevect>downvect) ){
205  jointSpaceVector[getIndex()]=down;
206  offset-=incVect;
207  }
208 
209  jointSpaceVector[getIndex()] = myStart+offset;
210  if(start == offset)
211  return true;
212  return false;
213  }
214 
220  public boolean step() {
221  boolean back = stepOrent()||stepLin();
222  return back;
223  }
224 
228  public void jitter(){
229  double jitterAmmount = 10;
230  double jitter=(Math.random()*jitterAmmount)-(jitterAmmount /2) ;
231  System.out.println("Jittering Link #"+getIndex()+" jitter:"+jitter+" current offset:"+offset);
232  offset += jitter;
233  jointSpaceVector[getIndex()] = myStart+offset;
234  }
235 
242  double bound(double in){
243  if(in>upper){
244  offset = 0;// Attempt to reset a link on error case
245  return upper;
246  }
247  if(in<lower){
248  offset = 0;// Attempt to reset a link on error case
249  return lower;
250  }
251  return in;
252  }
253 
259  public void setIndex(int index) {
260  this.index = index;
261  }
262 
268  public int getIndex() {
269  return index;
270  }
271 }
TransformNR forwardKinematics(double[] jointSpaceVector)
Definition: DHChain.java:140
GradiantDecentNode(DHChain chain, int index, double[] jointSpaceVector, TransformNR cartesianSpace, double u, double l)