Group of 3 hexapod legs
Tripod.cpp
- Committer:
- el13cj
- Date:
- 2016-05-03
- Revision:
- 3:97561b972647
- Parent:
- 2:81b3104caec1
- Child:
- 4:28821e248538
File content as of revision 3:97561b972647:
#include "Tripod.h" Tripod::Tripod(PCA9685 Board, Hexapod_Leg Leg_1, Hexapod_Leg Leg_2, Hexapod_Leg Leg_3, int group) : leg_1(Leg_1), leg_2(Leg_2), leg_3(Leg_3), group_number(group), board(Board) { } void Tripod::set_gait_start(int start_point) { if (start_point > 5) { start_point = 5; } if (start_point < 0) { start_point = 0; } current_state = start_point; next_state = start_point++; } void Tripod::gait_step(void) { switch(group_number) { case 1: leg_1.set_leg_position(leg_1_angles[next_state]); leg_2.set_leg_position(leg_5_angles[next_state]); leg_3.set_leg_position(leg_3_angles[next_state]); next_state++; if (next_state > 5) { next_state = 0; } break; case 2: leg_1.set_leg_position(leg_4_angles[next_state]); leg_2.set_leg_position(leg_2_angles[next_state]); leg_3.set_leg_position(leg_6_angles[next_state]); next_state++; if (next_state > 5) { next_state = 0; } break; default: break; } //i2c.stop(); board.update(); } void Tripod::sweep_step_group(void) { switch (group_number) { case 1: { float an_a_1 = (leg_1_angles[current_state].a + ((leg_1_angles[next_state].a - leg_1_angles[current_state].a) / NUM_STEPS) * i); float an_b_1 = (leg_1_angles[current_state].b + ((leg_1_angles[next_state].b - leg_1_angles[current_state].b) / NUM_STEPS) * i); float an_c_1 = (leg_1_angles[current_state].c + ((leg_1_angles[next_state].c - leg_1_angles[current_state].c) / NUM_STEPS) * i); float an_a_2 = (leg_5_angles[current_state].a + ((leg_5_angles[next_state].a - leg_5_angles[current_state].a) / NUM_STEPS) * i); float an_b_2 = (leg_5_angles[current_state].b + ((leg_5_angles[next_state].b - leg_5_angles[current_state].b) / NUM_STEPS) * i); float an_c_2 = (leg_5_angles[current_state].c + ((leg_5_angles[next_state].c - leg_5_angles[current_state].c) / NUM_STEPS) * i); float an_a_3 = (leg_3_angles[current_state].a + ((leg_3_angles[next_state].a - leg_3_angles[current_state].a) / NUM_STEPS) * i); float an_b_3 = (leg_3_angles[current_state].b + ((leg_3_angles[next_state].b - leg_3_angles[current_state].b) / NUM_STEPS) * i); float an_c_3 = (leg_3_angles[current_state].c + ((leg_3_angles[next_state].c - leg_3_angles[current_state].c) / NUM_STEPS) * i); leg_1.set_joint_angles(an_a_1, an_b_1, an_c_1); leg_2.set_joint_angles(an_a_2, an_b_2, an_c_2); leg_3.set_joint_angles(an_a_3, an_b_3, an_c_3); board.update(); i++; if (i > NUM_STEPS) { group_ticker.detach(); i = 0; } } break; case 2: { float an_a_1 = (leg_4_angles[current_state].a + ((leg_4_angles[next_state].a - leg_4_angles[current_state].a) / NUM_STEPS) * j); float an_b_1 = (leg_4_angles[current_state].b + ((leg_4_angles[next_state].b - leg_4_angles[current_state].b) / NUM_STEPS) * j); float an_c_1 = (leg_4_angles[current_state].c + ((leg_4_angles[next_state].c - leg_4_angles[current_state].c) / NUM_STEPS) * j); float an_a_2 = (leg_2_angles[current_state].a + ((leg_2_angles[next_state].a - leg_2_angles[current_state].a) / NUM_STEPS) * j); float an_b_2 = (leg_2_angles[current_state].b + ((leg_2_angles[next_state].b - leg_2_angles[current_state].b) / NUM_STEPS) * j); float an_c_2 = (leg_2_angles[current_state].c + ((leg_2_angles[next_state].c - leg_2_angles[current_state].c) / NUM_STEPS) * j); float an_a_3 = (leg_6_angles[current_state].a + ((leg_6_angles[next_state].a - leg_6_angles[current_state].a) / NUM_STEPS) * j); float an_b_3 = (leg_6_angles[current_state].b + ((leg_6_angles[next_state].b - leg_6_angles[current_state].b) / NUM_STEPS) * j); float an_c_3 = (leg_6_angles[current_state].c + ((leg_6_angles[next_state].c - leg_6_angles[current_state].c) / NUM_STEPS) * j); leg_1.set_joint_angles(an_a_1, an_b_1, an_c_1); leg_2.set_joint_angles(an_a_2, an_b_2, an_c_2); leg_3.set_joint_angles(an_a_3, an_b_3, an_c_3); board.update(); j++; if (j > NUM_STEPS) { group_ticker.detach(); j = 0; } } break; default: break; } //i2c.stop(); } void Tripod::gait_smooth(void) { group_ticker.attach(this, &Tripod::sweep_step_group, STEP_DELAY); current_state = next_state; next_state++; if (next_state > 5) { next_state = 0; } }