Merge remote-tracking branch 'upstream/edge' into upstream-master
[clinton/Smoothieware.git] / src / modules / robot / arm_solutions / ExperimentalDeltaSolution.cpp
CommitLineData
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
20ExperimentalDeltaSolution::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 40void 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 59void ExperimentalDeltaSolution::actuator_to_cartesian(const float actuator_mm[], float cartesian_mm[] ){
78d0e16a
MM
60 // unimplemented
61}
4e04bcd3 62
2a06c415 63float 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 67void 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}