Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

229 wiersze
7.4KB

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