BowlerKernel
WristNormalizer.java
Go to the documentation of this file.
1 package com.neuronrobotics.sdk.addons.kinematics;
2 
3 import java.util.HashMap;
4 
5 public class WristNormalizer {
6  private static boolean strictMode = false;
7 
8  public static double[] normalize(double[] calculated, double[] current, DHChain chain) {
9  AbstractKinematicsNR kin = chain.kin;
10  // DecimalFormat df = new DecimalFormat("000.00");
11  double[] alt1 =option( calculated[0] - 180, -calculated[1], calculated[2] - 180 );
12  double[] calculated2 =option( calculated[0] + 360, calculated[1] + 360, calculated[2] + 360 );
13  double[] calculated3 =option( calculated[0] - 360, calculated[1] - 360, calculated[2] - 360 );
14  double[] alt2 =option( alt1[0] + 360, alt1[1] + 360, alt1[2] + 360 );
15  double[] alt3 =option( alt1[0] - 360, alt1[1] - 360, alt1[2] - 360 );
16  double[] calculated6 =option( calculated[0] - 360, calculated[1], calculated[2] );
17  double[] calculated7 =option( calculated[0] + 360, calculated[1], calculated[2] );
18  double[] als4 =option( alt1[0] - 360, alt1[1], alt1[2] );
19  double[] alt5 =option( alt1[0] + 360, alt1[1], alt1[2] );
20 
21 
22 
23  HashMap<double[], Double> scores = new HashMap<>();
24  score(calculated, current, scores, kin);
25  score(alt1, current, scores, kin);
26  score(calculated2, current, scores, kin);
27  score(calculated3, current, scores, kin);
28  score(alt2, current, scores, kin);
29  score(alt3, current, scores, kin);
30  score(calculated6, current, scores, kin);
31  score(calculated7, current, scores, kin);
32  score(als4, current, scores, kin);
33  score(alt5, current, scores, kin);
34  score(option( calculated[0] -180, -calculated[1], calculated[2]+180 ), current, scores, kin);
35  score(option( alt1[0] -180, alt1[1], -alt1[2]+180 ), current, scores, kin);
36  score(option( calculated[0] +180, -calculated[1], calculated[2]-180 ), current, scores, kin);
37  score(option( alt1[0] +180, -alt1[1], alt1[2]-180 ), current, scores, kin);
38 
39  if (scores.size() > 0) {
40  double[] start =calculated ;
41  if(scores.get(start)==null) {
42  start = (double[]) scores.keySet().toArray()[0];
43  }
44  double score=scores.get(start);
45  double[] ret = start;
46  for (double[] tmp : scores.keySet()) {
47  double delt = scores.get(tmp);
48  if (delt < score) {
49  score = delt;
50  ret = tmp;
51  }
52  }
53  scores.clear();
54 
55  return ret;
56  }
57  if(!strictMode)
58  return current;
59  throw new RuntimeException("No Wrist Solution! ");
60  }
61  private static double[] option(double w1,double w2,double w3) {
62  return new double[] {w1,w2,w3};
63  }
64 
65  private static void score(double[] calculated, double[] current, HashMap<double[], Double> scores,
67  double delt = 0;
68  for (int i = 0; i < 3; i++) {
69  int i3 = i + 3;
70  calculated[i] = calculated[i] % 360;
71  if(strictMode) {
72  if (calculated[i] > kin.getMaxEngineeringUnits(i3)) {
73  return;
74  }
75  if (calculated[i] < kin.getMinEngineeringUnits(i3)) {
76  return;
77  }
78  }
79  double measure = current[i] - calculated[i];
80  if (Math.abs(measure) > Math.abs(delt)) {
81  delt = measure;
82  }
83  }
84  scores.put(calculated, Math.abs(delt));
85  }
86 
87  public static boolean isStrictMode() {
88  return strictMode;
89  }
90  public static void setBoundLinkValueMode() {
92  }
93  public static void setStrictMode() {
95  }
96 }
static double[] normalize(double[] calculated, double[] current, DHChain chain)
static double[] option(double w1, double w2, double w3)
static void score(double[] calculated, double[] current, HashMap< double[], Double > scores, AbstractKinematicsNR kin)