Commit | Line | Data |
---|---|---|
2a06c415 JM |
1 | #include "ExperimentalDeltaSolution.h" |
2 | ||
21461a92 | 3 | #include <fastmath.h> |
8d54c34c | 4 | #include "ConfigValue.h" |
2a06c415 JM |
5 | #include "libs/Kernel.h" |
6 | #include "libs/nuts_bolts.h" | |
7 | #include "libs/Config.h" | |
8 | #include "checksumm.h" | |
9 | ||
10 | #define arm_length_checksum CHECKSUM("arm_length") | |
11 | #define arm_radius_checksum CHECKSUM("arm_radius") | |
12 | ||
13 | #define alpha_angle_checksum CHECKSUM("alpha_angle") | |
14 | #define beta_relative_angle_checksum CHECKSUM("beta_relative_angle") | |
15 | #define gamma_relative_angle_checksum CHECKSUM("gamma_relative_angle") | |
4e04bcd3 | 16 | |
21461a92 | 17 | #define PIOVER180 0.01745329251994329576923690768489F |
deee97d2 | 18 | |
2a06c415 JM |
19 | // NOTE this currently does not work, needs FK and settings |
20 | ExperimentalDeltaSolution::ExperimentalDeltaSolution(Config* config) | |
78d0e16a MM |
21 | { |
22 | float alpha_angle = PIOVER180 * config->value(alpha_angle_checksum)->by_default(30.0f)->as_number(); | |
23 | sin_alpha = sinf(alpha_angle); | |
24 | cos_alpha = cosf(alpha_angle); | |
25 | float beta_angle = PIOVER180 * config->value( beta_relative_angle_checksum)->by_default(120.0f)->as_number(); | |
26 | sin_beta = sinf(beta_angle); | |
27 | cos_beta = cosf(beta_angle); | |
28 | float gamma_angle = PIOVER180 * config->value(gamma_relative_angle_checksum)->by_default(240.0f)->as_number(); | |
29 | sin_gamma = sinf(gamma_angle); | |
30 | cos_gamma = cosf(gamma_angle); | |
deee97d2 | 31 | |
c826a67a | 32 | // arm_length is the length of the arm from hinge to hinge |
78d0e16a | 33 | arm_length = config->value(arm_length_checksum)->by_default(250.0f)->as_number(); |
c826a67a | 34 | // arm_radius is the horizontal distance from hinge to hinge when the effector is centered |
78d0e16a | 35 | arm_radius = config->value(arm_radius_checksum)->by_default(124.0f)->as_number(); |
c826a67a | 36 | |
78d0e16a | 37 | arm_length_squared = powf(arm_length, 2); |
4e04bcd3 L |
38 | } |
39 | ||
3cc3f421 | 40 | void ExperimentalDeltaSolution::cartesian_to_actuator(const float cartesian_mm[], float actuator_mm[] ){ |
78d0e16a | 41 | float alpha_rotated[3], rotated[3]; |
7af0714f | 42 | |
78d0e16a | 43 | if( sin_alpha == 0 && cos_alpha == 1){ |
4c9ccd0b MM |
44 | alpha_rotated[X_AXIS] = cartesian_mm[X_AXIS]; |
45 | alpha_rotated[Y_AXIS] = cartesian_mm[Y_AXIS]; | |
46 | alpha_rotated[Z_AXIS] = cartesian_mm[Z_AXIS]; | |
1d893e5a | 47 | }else{ |
01cf96fb | 48 | rotate( cartesian_mm, alpha_rotated, sin_alpha, cos_alpha ); |
1d893e5a | 49 | } |
01cf96fb | 50 | actuator_mm[ALPHA_STEPPER] = solve_arm( alpha_rotated ); |
1d893e5a L |
51 | |
52 | rotate( alpha_rotated, rotated, sin_beta, cos_beta ); | |
01cf96fb | 53 | actuator_mm[BETA_STEPPER ] = solve_arm( rotated ); |
4e04bcd3 | 54 | |
1d893e5a | 55 | rotate( alpha_rotated, rotated, sin_gamma, cos_gamma ); |
01cf96fb | 56 | actuator_mm[GAMMA_STEPPER] = solve_arm( rotated ); |
4e04bcd3 L |
57 | } |
58 | ||
3cc3f421 | 59 | void ExperimentalDeltaSolution::actuator_to_cartesian(const float actuator_mm[], float cartesian_mm[] ){ |
78d0e16a MM |
60 | // unimplemented |
61 | } | |
4e04bcd3 | 62 | |
2a06c415 | 63 | float ExperimentalDeltaSolution::solve_arm( float cartesian_mm[]) { |
01cf96fb | 64 | return sqrtf(arm_length_squared - powf(cartesian_mm[X_AXIS] - arm_radius, 2) - powf(cartesian_mm[Y_AXIS], 2)) + cartesian_mm[Z_AXIS]; |
4e04bcd3 L |
65 | } |
66 | ||
3cc3f421 | 67 | void ExperimentalDeltaSolution::rotate(const float in[], float out[], float sin, float cos ){ |
1d893e5a L |
68 | out[X_AXIS] = cos * in[X_AXIS] - sin * in[Y_AXIS]; |
69 | out[Y_AXIS] = sin * in[X_AXIS] + cos * in[Y_AXIS]; | |
c826a67a | 70 | out[Z_AXIS] = in[Z_AXIS]; |
4e04bcd3 | 71 | } |