No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

238 líneas
8.2KB

  1. #include "include/controller.h"
  2. void print_point(gbVec2 *point)
  3. {
  4. printf("position x: %.4f, y: %.4f\n", point->x, point->y);
  5. }
  6. int controller_init(controller_t *control)
  7. {
  8. gpio_init(BTN0_PIN,BTN0_MODE);
  9. controller_home(control);
  10. control->flags = control->stepper_a->flags | control->stepper_b->flags;
  11. return 0;
  12. }
  13. int controller_loop(controller_t *control){
  14. path_node_t *setpoint = (path_node_t*)control->path->current.next;
  15. //printf("start controller loop\n");
  16. while(setpoint->list.next != 0x0){
  17. if ((setpoint->point.x > 127) | (setpoint->point.x < 0) | (setpoint->point.y > 127) | (setpoint->point.y < 0 ) ) {
  18. printf("Controller Error, x and y value are out of range x: %i, y: %i\n", setpoint->point.x, setpoint->point.y);
  19. return CONTROLLER_ERR;
  20. }
  21. //printf("Controller: look up x: %i, y: %i\n", setpoint->point.x, setpoint->point.y);
  22. int16_t angle1 = lookup_table_angle1[setpoint->point.y][setpoint->point.x];
  23. int16_t angle2 = lookup_table_angle2[setpoint->point.y][setpoint->point.x];
  24. //printf("Controller: next setpoint A: %i, B: %i\n",angle1, angle2);
  25. stepper_set_setpoint(control->stepper_a, angle1, control->time_step);
  26. stepper_set_setpoint(control->stepper_b, angle2, control->time_step);
  27. xtimer_usleep(10000);
  28. thread_flags_wait_all(control->flags);
  29. setpoint = path_next(setpoint);
  30. }
  31. printf("controller loop done\n");
  32. return CONTROLLER_OK;
  33. }
  34. /*void controller_update(event_t *event)
  35. {
  36. controller_t *control = container_of(event, controller_t, event);
  37. controller_calculate_velocity(control);
  38. event_timeout_set(&(control->event_timeout), control->time_step);
  39. }
  40. int controller_setpoint(controller_t *control, gbVec2 *point)
  41. {
  42. control->setpoint = *point;
  43. controller_inverse_kinematics(control, point, &control->angle1_setpoint , &control->angle2_setpoint);
  44. return 0;
  45. }
  46. void controller_inverse_kinematics(controller_t *control, gbVec2 *point, float *angle1, float *angle2)
  47. {
  48. float phi = gb_arctan2(point->y, point->x);
  49. float length_a2 = gb_square(control->arm_a);
  50. float length_b2 = gb_square(control->arm_b);
  51. float length_c2 = gb_vec2_mag2(*point);
  52. float length_c = gb_sqrt(length_c2);
  53. float b = gb_arccos((length_a2 + length_c2 - length_b2) / (2 * control->arm_a * length_c));
  54. float c = gb_arccos((length_a2 + length_b2 - length_c2) / (2 * control->arm_a * control->arm_b));
  55. *angle1 = b + phi;
  56. *angle2 = *angle1 - GB_MATH_PI + c;
  57. }
  58. void controller_current_position(controller_t *control, gbVec2 *point)
  59. {
  60. float angle_a;
  61. stepper_get_angle(control->stepper_a, &angle_a);
  62. float angle_b;
  63. stepper_get_angle(control->stepper_b, &angle_b);
  64. gbVec2 joint1 = {
  65. .x = control->arm_a * gb_cos(angle_a),
  66. .y = control->arm_a * gb_sin(angle_a)
  67. };
  68. gbVec2 joint2 = {
  69. .x = control->arm_b * gb_cos(angle_b),
  70. .y = control->arm_b * gb_sin(angle_b)
  71. };
  72. gb_vec2_add(point, joint1, joint2);
  73. }
  74. int controller_calculate_velocity(controller_t *control)
  75. {
  76. uint32_t setpoint_time;
  77. uint32_t ik_time;
  78. uint32_t angle_time;
  79. uint32_t velocity_time;
  80. uint32_t start = xtimer_now_usec();
  81. gbVec2 next_setpoint;
  82. int status = controller_sub_setpoint(control, &next_setpoint, 0.005);
  83. setpoint_time = xtimer_now_usec();
  84. float angle1;
  85. float angle2;
  86. controller_inverse_kinematics(control, &next_setpoint, &angle1, &angle2);
  87. ik_time = xtimer_now_usec();
  88. float angle_a;
  89. stepper_get_angle(control->stepper_a, &angle_a);
  90. float angle_b;
  91. stepper_get_angle(control->stepper_b, &angle_b);
  92. angle_time = xtimer_now_usec();
  93. //printf("angle1: %f, angle2 %f\n", angle1, angle2);
  94. //printf("anglea: %f, angleb %f\n", angle_a, angle_b);
  95. float omega1 = (angle1-angle_a)*25;
  96. float omega2 = (angle2-angle_b)*25;
  97. if (status == CONTROLLER_STATISFIED)
  98. {
  99. omega1 = 0.0;
  100. omega2 = 0.0;
  101. }
  102. // printf("omega1: %f, omega2 %f\n", omega1, omega2);
  103. stepper_set_velocity(control->stepper_a, omega1);
  104. stepper_set_velocity(control->stepper_b, omega2);
  105. velocity_time = xtimer_now_usec();
  106. printf("Setpoint: %lu\n", setpoint_time - start);
  107. printf("IK-time: %lu\n", ik_time - setpoint_time);
  108. printf("Angles: %lu\n", angle_time - ik_time);
  109. printf("velocity: %lu\n", velocity_time - angle_time);
  110. return 0;
  111. }
  112. int controller_sub_setpoint(controller_t *control, gbVec2 *setpoint, float distance)
  113. {
  114. // TODO: if the length is shorten than the distance, do not scale it up
  115. // TODO: if the length is zero. Do nothing.
  116. // get current position.
  117. gbVec2 current_position;
  118. controller_current_position(control, &current_position);
  119. // print_point(&current_position);
  120. // compare current position with setpoint.
  121. //
  122. while(1){
  123. gbVec2 position_error;
  124. path_node_t *next_point = path_next_point(control->path);
  125. //gb_vec2_sub(&position_error, next_point->point, current_position);
  126. float error_magnitude = gb_vec2_mag(position_error);
  127. gbVec2 scaled_position_error;
  128. //printf("Magnitude: %f Error ", error_magnitude);
  129. //print_point(&position_error);
  130. if (error_magnitude > distance)
  131. {
  132. gb_vec2_div(&scaled_position_error, position_error, error_magnitude/distance);
  133. gb_vec2_add(setpoint, current_position, scaled_position_error);
  134. //printf("Next ");
  135. //print_point(setpoint);
  136. return CONTROLLER_OK;
  137. }
  138. else if (next_point->list.next == NULL)
  139. {
  140. scaled_position_error = current_position;
  141. gb_vec2_add(setpoint, current_position, scaled_position_error);
  142. //printf("No new point\n");
  143. if (error_magnitude < distance/8)
  144. {
  145. return CONTROLLER_STATISFIED;
  146. }
  147. return CONTROLLER_NO_PATH;
  148. }
  149. else
  150. {
  151. path_increment(control->path);
  152. printf("Increment Path\n");
  153. }
  154. }
  155. gbVec2 position_error;
  156. gb_vec2_sub(&position_error, control->setpoint, current_position);
  157. // scale the length of the error.
  158. // to limit the length.
  159. control->error = gb_vec2_mag(position_error);
  160. gbVec2 scaled_position_error;
  161. if (control->error > distance) {
  162. gb_vec2_div(&scaled_position_error, position_error, control->error/distance);
  163. } else {
  164. scaled_position_error = position_error;
  165. }
  166. gb_vec2_add(setpoint, current_position, scaled_position_error);
  167. return 0;
  168. }
  169. */
  170. int controller_home(controller_t *control){
  171. stepper_disable(control->stepper_b);
  172. stepper_disable(control->stepper_a);
  173. while(gpio_read(BTN0_PIN)!=0)
  174. {
  175. }
  176. xtimer_usleep(1000000);
  177. stepper_enable(control->stepper_b);
  178. stepper_set_direction(control->stepper_b,STEPPER_FORWARD);
  179. while(gpio_read(BTN0_PIN)!=0){
  180. stepper_step(control->stepper_b);
  181. xtimer_usleep(3000);
  182. }
  183. stepper_enable(control->stepper_a);
  184. stepper_set_direction(control->stepper_a,STEPPER_REVERSE);
  185. stepper_set_direction(control->stepper_b,STEPPER_REVERSE);
  186. uint32_t homing_b_steps = stepper_get_count(control->stepper_a,1.92);
  187. uint32_t homing_a_steps= stepper_get_count(control->stepper_b,0.75);
  188. uint32_t homing_combined = homing_b_steps - homing_a_steps;
  189. for(uint32_t i = 0; i < homing_combined; i++)
  190. {
  191. stepper_step(control->stepper_b);
  192. xtimer_usleep(1000);
  193. }
  194. stepper_enable(control->stepper_b);
  195. for(uint32_t i = 0; i < homing_a_steps; i++)
  196. {
  197. stepper_step(control->stepper_b);
  198. stepper_step(control->stepper_a);
  199. xtimer_usleep(1000);
  200. }
  201. control->stepper_a->step_count = stepper_get_count(control->stepper_a,GB_MATH_PI/2.0);
  202. control->stepper_b->step_count = 0;
  203. float angle_a;
  204. float angle_b;
  205. stepper_get_angle(control->stepper_a, &angle_a);
  206. stepper_get_angle(control->stepper_b, &angle_b);
  207. //printf("angle1: %f, angle2 %f\n", angle1, angle2);
  208. printf("Angle A: %f, B: %f\n", angle_a, angle_b);
  209. while(gpio_read(BTN0_PIN)!=0)
  210. {
  211. }
  212. xtimer_usleep(500000);
  213. return 0;
  214. }
  215. int controller_lift_marker(controller_t *control, bool lift){
  216. (void)lift;
  217. (void)control;
  218. return 0;
  219. }