BowlerKernel
InterpolationEngine.java
Go to the documentation of this file.
1 package com.neuronrobotics.sdk.pid;
2 
3 // TODO: Auto-generated Javadoc
7 public class InterpolationEngine {
10  private double ticks=0;
11 
13  private double lastTick=getTicks();
14 
16  private double endSetpoint=0;
17 
19  private double duration;
20 
22  private double startTime;
23 
25  private double startSetpoint;
26 
28  private boolean pause = false;
29 
30  private double unitDuration;
31  private double TRAPEZOIDAL_time=0;
32  private double BEZIER_P0;
33  private double BEZIER_P1;
34  private double interpElapsed;
35  private double sinPortion;
36  private double lengthOfLinearMode;
37  private double unitLienear;
38  private double unitRamp;
39  private double unitStartRampDown;
40  private double increment;
41  private double sinPortion2;
42  private double increment2;
43  private double sinPortion3;
44  private double t;
45  private double p0;
46  private double p1;
47  private double p2;
48  private double p3;
49  private double setpointDiff;
50  private double newSetpoint;
51 
52 
58  public void SetVelocity(double unitsPerSecond) {
59 
60  }
61 
67  public double getPosition() {
68  return getTicks();
69  }
70 
71 
72 
79  public void StartLinearMotion(double setpoint,double seconds,long startTimeMs){
80  setSetpointWithTime(startTimeMs,setpoint, seconds, InterpolationType.LINEAR);
81  }
88  public void StartSinusoidalMotion(double setpoint,double seconds,long startTimeMs){
89  setSetpointWithTime(startTimeMs,setpoint, seconds, InterpolationType.SINUSOIDAL);
90  }
91 
92  public void setSetpointWithTime(long startTimeMs ,double setpoint,double seconds, InterpolationType mode,double ...conf) {
93  if(InterpolationType.TRAPEZOIDAL==mode) {
94  TRAPEZOIDAL_time =conf[0];
95  }
96  if(InterpolationType.BEZIER==mode) {
97  BEZIER_P0 = conf[0];
98  BEZIER_P1 = conf[1];
99  }
100  type = mode;
101  if(seconds<0.001)
102  seconds = 0.001;// one ms garunteed
103  //setPause(true);
104 
105  duration = (long) (seconds*1000);
106  startTime=startTimeMs;
107  if(new Double(setpoint).isNaN()) {
108  new RuntimeException("Setpopint in virtual device can not be set to nan").printStackTrace();
109 
110  }else
111  endSetpoint=setpoint;
113 
114  //setPause(false);
115  }
116  public void StartTrapezoidalMotion(double setpoint,double seconds, double trapazoidalTime,long startTimeMs) {
117 
118  if (trapazoidalTime * 2 > seconds) {
119  StartSinusoidalMotion(setpoint, seconds,startTimeMs);
120  return;
121  }
122  setSetpointWithTime(startTimeMs,setpoint, seconds, InterpolationType.TRAPEZOIDAL,trapazoidalTime);
123  }
133  void StartBezierMotion(double setpoint,double seconds, double Control_0 , double Control_1,long startTimeMs)
134  {
135  setSetpointWithTime(startTimeMs,setpoint, seconds, InterpolationType.BEZIER,Control_0,Control_1);
136  }
137 
138 
144  public boolean update(long time){
145  interpolate( time);
146  if((getTicks()!=lastTick)) {
147  lastTick=getTicks();
148  return true;
149  }
150  return false;
151  }
152 
158  public synchronized void ResetEncoder(double value) {
159  //setPause(true);
160  //ThreadUtil.wait((int)(threadTime*2));
161  setTicks(value);
162  lastTick=value;
163  endSetpoint=value;
164  duration=0;
165  startTime=System.currentTimeMillis();
166  startSetpoint=value;
167  //setPause(false);
168  }
169 
170 
171  double myFmapBounded(double x, double in_min, double in_max, double out_min, double out_max) {
172 
173  if (x > in_max)
174  return out_max;
175  if (x < in_min)
176  return out_min;
177  return ((x - in_min) * (out_max - out_min) / (in_max - in_min)) + out_min;
178  }
179 
180  public double getInterpolationUnitIncrement(long time) {
181  interpElapsed = (double)(time - startTime);
182  if (interpElapsed < duration && duration > 0)
183  {
184 
187  sinPortion = (Math.cos(-Math.PI * getUnitDuration()) / 2) + 0.5;
189  }
191  {
194  unitRamp = ((double)TRAPEZOIDAL_time) / duration;
196  if (getUnitDuration() < unitRamp)
197  {
198  increment = 1 - (getUnitDuration()) / (unitRamp * 2);
199  sinPortion2 = 1 + Math.cos(-Math.PI * increment);
201  }
203  {
204  // constant speed
205  }
206  else if (getUnitDuration() > unitStartRampDown)
207  {
209  sinPortion3 = 0.5 - ((Math.cos(-Math.PI * increment2) / 2) + 0.5);
211  }
212  }
214  {
215  if (getUnitDuration() > 0 && getUnitDuration() < 1)
216  {
217  t = getUnitDuration();
218  p0 = 0;
219  p1 = BEZIER_P0;
220  p2 = BEZIER_P1;
221  p3 = 1;
222  setUnitDuration(Math.pow((1 - t), 3) * p0 + 3 * t * Math.pow((1 - t), 2) * p1 + 3 * Math.pow(t, 2) * (1 - t) * p2 + Math.pow(t, 3) * p3);
223  }
224  }
225  return getUnitDuration();
226  }
227  return 1;
228  }
229 
230 
231 
236  private void interpolate(long time) {
238  if (getUnitDuration() < 1) {
242  } else {
243  // If there is no interpoation to perform, set the setpoint to the end state
245  }
246  }
247 
248 // /**
249 // * Checks if is pause.
250 // *
251 // * @return true, if is pause
252 // */
253 // public boolean isPause() {
254 // return pause;
255 // }
256 //
257 // /**
258 // * Sets the pause.
259 // *
260 // * @param pause the new pause
261 // */
262 // private void setPause(boolean pause) {
263 // this.pause = pause;
264 // }
265 
271  public double getTicks() {
272  return ticks;
273  }
274 
280  public void setTicks(double ticks) {
281 // if(new Double(ticks).isNaN()) {
282 // new RuntimeException("Ticks in virtual device can not be set to nan").printStackTrace();
283 // return;
284 // }
285  this.ticks = ticks;
286  }
287 
289  return type;
290  }
291 
293  this.type = type;
294  }
295 
296  public double getUnitDuration() {
297  return unitDuration;
298  }
299 
300  public void setUnitDuration(double unitDuration) {
301  if(unitDuration>1)
302  unitDuration=1;
303  if(unitDuration<0)
304  unitDuration=0;
305  this.unitDuration = unitDuration;
306  }
307 }
void StartTrapezoidalMotion(double setpoint, double seconds, double trapazoidalTime, long startTimeMs)
void setSetpointWithTime(long startTimeMs, double setpoint, double seconds, InterpolationType mode, double ...conf)
void StartSinusoidalMotion(double setpoint, double seconds, long startTimeMs)
void StartLinearMotion(double setpoint, double seconds, long startTimeMs)