1 package com.neuronrobotics.sdk.addons.kinematics;
3 import java.util.HashMap;
8 public static double[]
normalize(
double[] calculated,
double[] current,
DHChain chain) {
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] );
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);
39 if (scores.size() > 0) {
40 double[] start =calculated ;
41 if(scores.get(start)==
null) {
42 start = (
double[]) scores.keySet().toArray()[0];
44 double score=scores.get(start);
46 for (
double[] tmp : scores.keySet()) {
47 double delt = scores.get(tmp);
59 throw new RuntimeException(
"No Wrist Solution! ");
61 private static double[]
option(
double w1,
double w2,
double w3) {
62 return new double[] {w1,w2,w3};
65 private static void score(
double[] calculated,
double[] current, HashMap<
double[], Double> scores,
68 for (
int i = 0; i < 3; i++) {
70 calculated[i] = calculated[i] % 360;
79 double measure = current[i] - calculated[i];
80 if (Math.abs(measure) > Math.abs(delt)) {
84 scores.put(calculated, Math.abs(delt));
double getMinEngineeringUnits(int linkIndex)
double getMaxEngineeringUnits(int linkIndex)
static double[] normalize(double[] calculated, double[] current, DHChain chain)
static boolean strictMode
static double[] option(double w1, double w2, double w3)
static void setStrictMode()
static void score(double[] calculated, double[] current, HashMap< double[], Double > scores, AbstractKinematicsNR kin)
static boolean isStrictMode()
static void setBoundLinkValueMode()