diff --git a/dynamixel_manager/include/modules/motion_manager.h b/dynamixel_manager/include/modules/motion_manager.h index 59ef8ffd3c0529094abdf8d2fb14ce052d0a4468..26a3e9a11315744a7c225d7d4a643960f5c0b30f 100644 --- a/dynamixel_manager/include/modules/motion_manager.h +++ b/dynamixel_manager/include/modules/motion_manager.h @@ -15,7 +15,7 @@ extern "C" { typedef enum {MM_NONE = 7, MM_ACTION = 0, - MM_WALKING = 1, + MM_WALK = 1, MM_JOINTS = 2, MM_HEAD = 3} TModules; diff --git a/dynamixel_manager/include/modules/walk.h b/dynamixel_manager/include/modules/walk.h index 819a66b1eb3440efc75e382be3716e118dd0d256..09131c27c4ea20d8a700bae2fff59eed826f2b1b 100755 --- a/dynamixel_manager/include/modules/walk.h +++ b/dynamixel_manager/include/modules/walk.h @@ -14,6 +14,76 @@ typedef struct{ TMemModule mem_module; unsigned short int ram_base_address; unsigned short int eeprom_base_address; + // aim control + unsigned char aim_on; + // internal motion variables + float x_swap_phase_shift; + float x_swap_amplitude; + float x_swap_amplitude_shift; + float x_move_phase_shift; + float x_move_amplitude; + float x_move_amplitude_shift; + float y_swap_phase_shift; + float y_swap_amplitude; + float y_swap_amplitude_shift; + float y_move_phase_shift; + float y_move_amplitude; + float y_move_amplitude_shift; + float z_swap_phase_shift; + float z_swap_amplitude; + float z_swap_amplitude_shift; + float z_move_phase_shift; + float z_move_amplitude; + float z_move_amplitude_shift; + float a_move_phase_shift; + float a_move_amplitude; + float a_move_amplitude_shift; + // internal offset variables + float hip_pitch_offset; + float pelvis_offset; + float pelvis_swing; + float arm_swing_gain; + float x_offset; + float y_offset; + float z_offset; + float r_offset; + float p_offset; + float a_offset; + // internal time variables + float time; + float period_time; + float x_swap_period_time; + float x_move_period_time; + float y_swap_period_time; + float y_move_period_time; + float z_swap_period_time; + float z_move_period_time; + float a_move_period_time; + float ssp_time_start_left; + float ssp_time_end_left; + float ssp_time_start_right; + float ssp_time_end_right; + float phase_time1; + float phase_time2; + float phase_time3; + // control variables + unsigned char running; + float walk_period; + unsigned char (*leg_ik_function)(float *out, float x, float y, float z, float a, float b, float c); + unsigned char right_hip_roll_servo_id; + unsigned char right_hip_yaw_servo_id; + unsigned char right_hip_pitch_servo_id; + unsigned char right_knee_servo_id; + unsigned char right_ankle_pitch_servo_id; + unsigned char right_ankle_roll_servo_id; + unsigned char right_shoulder_pitch_servo_id; + unsigned char left_hip_roll_servo_id; + unsigned char left_hip_yaw_servo_id; + unsigned char left_hip_pitch_servo_id; + unsigned char left_knee_servo_id; + unsigned char left_ankle_pitch_servo_id; + unsigned char left_ankle_roll_servo_id; + unsigned char left_shoulder_pitch_servo_id; }TWalkMModule; // public functions diff --git a/dynamixel_manager/include/modules/walk_registers.h b/dynamixel_manager/include/modules/walk_registers.h index 8d2ee7c8a2bbb512950a7f4d2f4e7998968653fd..ac0ef5d92899a63abfdec010decba3ca0cae9217 100644 --- a/dynamixel_manager/include/modules/walk_registers.h +++ b/dynamixel_manager/include/modules/walk_registers.h @@ -3,7 +3,7 @@ #define RAM_WALK_LENGTH 4 -#define WALK_CNTRL 0// bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 +#define WALK_CONTROL 0// bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 // current phase walking stop walking start walking #define WALK_START 0x01 #define WALK_STOP 0x02 @@ -13,7 +13,7 @@ #define WALK_STEP_LEFT_RIGHT 2 #define WALK_STEP_DIRECTION 3 -#define EEPROM_WALK_LENGTH 19 +#define EEPROM_WALK_LENGTH 33 #define WALK_X_OFFSET 0 #define WALK_Y_OFFSET 1 @@ -32,8 +32,23 @@ #define WALK_ARM_SWING_GAIN 16 #define WALK_MAX_VEL 17 #define WALK_MAX_ROT_VEL 18 +#define WALK_R_HIP_YAW_SERVO_ID 19 +#define WALK_R_HIP_ROLL_SERVO_ID 20 +#define WALK_R_HIP_PITCH_SERVO_ID 21 +#define WALK_R_KNEE_SERVO_ID 22 +#define WALK_R_ANKLE_PITCH_SERVO_ID 23 +#define WALK_R_ANKLE_ROLL_SERVO_ID 24 +#define WALK_R_SHOULDER_PITCH_SERVO_ID 25 +#define WALK_L_HIP_YAW_SERVO_ID 26 +#define WALK_L_HIP_ROLL_SERVO_ID 27 +#define WALK_L_HIP_PITCH_SERVO_ID 28 +#define WALK_L_KNEE_SERVO_ID 29 +#define WALK_L_ANKLE_PITCH_SERVO_ID 30 +#define WALK_L_ANKLE_ROLL_SERVO_ID 31 +#define WALK_L_SHOULDER_PITCH_SERVO_ID 32 -#define walk_eeprom_data(name,section_name,base_address,DEFAULT_X_OFFSET,DEFAULT_Y_OFFSET,DEFAULT_Z_OFFSET,DEFAULT_ROLL_OFFSET,DEFAULT_PITCH_OFFSET,DEFAULT_YAW_OFFSET,DEFAULT_HIP_PITCH_OFFSET,DEFAULT_PERIOD_TIME,DEFAULT_DSP_RATIO,DEFAULT_STEP_FW_BW_RATIO,DEFAULT_FOOT_HEIGHT,DEFAULT_SWING_RIGHT_LEFT,DEFAULT_SWING_TOP_DOWN,DEFAULT_PELVIS_OFFSET,DEFAULT_ARM_SWING_GAIN,DEFAULT_MAX_VEL,DEFAULT_MAX_ROT_VEL) \ + +#define walk_eeprom_data(name,section_name,base_address,DEFAULT_X_OFFSET,DEFAULT_Y_OFFSET,DEFAULT_Z_OFFSET,DEFAULT_ROLL_OFFSET,DEFAULT_PITCH_OFFSET,DEFAULT_YAW_OFFSET,DEFAULT_HIP_PITCH_OFFSET,DEFAULT_PERIOD_TIME,DEFAULT_DSP_RATIO,DEFAULT_STEP_FW_BW_RATIO,DEFAULT_FOOT_HEIGHT,DEFAULT_SWING_RIGHT_LEFT,DEFAULT_SWING_TOP_DOWN,DEFAULT_PELVIS_OFFSET,DEFAULT_ARM_SWING_GAIN,DEFAULT_MAX_VEL,DEFAULT_MAX_ROT_VEL,DEFAULT_R_HIP_YAW_SERVO_ID,DEFAULT_R_HIP_ROLL_SERVO_ID,DEFAULT_R_HIP_PITCH_SERVO_ID,DEFAULT_R_KNEE_SERVO_ID,DEFAULT_R_ANKLE_PITCH_SERVO_ID,DEFAULT_R_ANKLE_ROLL_SERVO_ID,DEFAULT_R_SHOULDER_PITCH_SERVO_ID,DEFAULT_L_HIP_YAW_SERVO_ID,DEFAULT_L_HIP_ROLL_SERVO_ID,DEFAULT_L_HIP_PITCH_SERVO_ID,DEFAULT_L_KNEE_SERVO_ID,DEFAULT_L_ANKLE_PITCH_SERVO_ID,DEFAULT_L_ANKLE_ROLL_SERVO_ID,DEFAULT_L_SHOULDER_PITCH_SERVO_ID) \ unsigned short int name##_eeprom_data[] __attribute__ ((section (section_name))) __attribute__ ((aligned (4)))= {\ DEFAULT_X_OFFSET,base_address+WALK_X_OFFSET, \ DEFAULT_Y_OFFSET,base_address+WALK_Y_OFFSET, \ @@ -53,7 +68,21 @@ unsigned short int name##_eeprom_data[] __attribute__ ((section (section_name))) DEFAULT_PELVIS_OFFSET,base_address+WALK_PELVIS_OFFSET, \ DEFAULT_ARM_SWING_GAIN,base_address+WALK_ARM_SWING_GAIN, \ DEFAULT_MAX_VEL,base_address+WALK_MAX_VEL, \ - DEFAULT_MAX_ROT_VEL,base_address+WALK_MAX_ROT_VEL}; + DEFAULT_MAX_ROT_VEL,base_address+WALK_MAX_ROT_VEL \ + DEFAULT_R_HIP_YAW_SERVO_ID,base_address+WALK_R_HIP_YAW_SERVO_ID \ + DEFAULT_R_HIP_ROLL_SERVO_ID,base_address+WALK_R_HIP_ROLL_SERVO_ID \ + DEFAULT_R_HIP_PITCH_SERVO_ID,base_address+WALK_R_HIP_PITCH_SERVO_ID \ + DEFAULT_R_KNEE_SERVO_ID,base_address+WALK_R_KNEE_SERVO_ID \ + DEFAULT_R_ANKLE_PITCH_SERVO_ID,base_address+WALK_R_ANKLE_PITCH_SERVO_ID \ + DEFAULT_R_ANKLE_ROLL_SERVO_ID,base_address+WALK_R_ANKLE_ROLL_SERVO_ID \ + DEFAULT_R_SHOULDER_PITCH_SERVO_ID,base_address+WALK_R_SHOULDER_PITCH_SERVO_ID \ + DEFAULT_L_HIP_YAW_SERVO_ID,base_address+WALK_L_HIP_YAW_SERVO_ID \ + DEFAULT_L_HIP_ROLL_SERVO_ID,base_address+WALK_L_HIP_ROLL_SERVO_ID \ + DEFAULT_L_HIP_PITCH_SERVO_ID,base_address+WALK_L_HIP_PITCH_SERVO_ID \ + DEFAULT_L_KNEE_SERVO_ID,base_address+WALK_L_KNEE_SERVO_ID \ + DEFAULT_L_ANKLE_PITCH_SERVO_ID,base_address+WALK_L_ANKLE_PITCH_SERVO_ID \ + DEFAULT_L_ANKLE_ROLL_SERVO_ID,base_address+WALK_L_ANKLE_ROLL_SERVO_ID \ + DEFAULT_L_SHOULDER_PITCH_SERVO_ID,base_address+WALK_L_SHOULDER_PITCH_SERVO_ID}; #endif diff --git a/dynamixel_manager/src/modules/walk.c b/dynamixel_manager/src/modules/walk.c index 57277dec02844b3cb7f8eb400228833f35e35f30..cf3a3edb4e5b276ebe8329e43be136a960c2b11d 100755 --- a/dynamixel_manager/src/modules/walk.c +++ b/dynamixel_manager/src/modules/walk.c @@ -1,111 +1,110 @@ -#include "walking.h" -#include "darwin_kinematics.h" -#include "darwin_math.h" +#include "walk.h" +#include "walk_registers.h" #include "ram.h" #include <math.h> enum {PHASE0=0x00,PHASE1=0x40,PHASE2=0x80,PHASE3=0xC0}; -// Walking control -uint8_t A_MOVE_AIM_ON=0x00; - -// internal motion variables -float m_X_Swap_Phase_Shift; -float m_X_Swap_Amplitude; -float m_X_Swap_Amplitude_Shift; -float m_X_Move_Phase_Shift; -float m_X_Move_Amplitude; -float m_X_Move_Amplitude_Shift; -float m_Y_Swap_Phase_Shift; -float m_Y_Swap_Amplitude; -float m_Y_Swap_Amplitude_Shift; -float m_Y_Move_Phase_Shift; -float m_Y_Move_Amplitude; -float m_Y_Move_Amplitude_Shift; -float m_Z_Swap_Phase_Shift; -float m_Z_Swap_Amplitude; -float m_Z_Swap_Amplitude_Shift; -float m_Z_Move_Phase_Shift; -float m_Z_Move_Amplitude; -float m_Z_Move_Amplitude_Shift; -float m_A_Move_Phase_Shift; -float m_A_Move_Amplitude; -float m_A_Move_Amplitude_Shift; - -// internal offset variables -float m_Hip_Pitch_Offset; -float m_Pelvis_Offset; -float m_Pelvis_Swing; -float m_Arm_Swing_Gain; -float m_X_Offset; -float m_Y_Offset; -float m_Z_Offset; -float m_R_Offset; -float m_P_Offset; -float m_A_Offset; - -// internal time variables -float m_Time; -float m_PeriodTime; -float m_X_Swap_PeriodTime; -float m_X_Move_PeriodTime; -float m_Y_Swap_PeriodTime; -float m_Y_Move_PeriodTime; -float m_Z_Swap_PeriodTime; -float m_Z_Move_PeriodTime; -float m_A_Move_PeriodTime; -float m_SSP_Time_Start_L; -float m_SSP_Time_End_L; -float m_SSP_Time_Start_R; -float m_SSP_Time_End_R; -float m_Phase_Time1; -float m_Phase_Time2; -float m_Phase_Time3; - -// control variables -uint8_t m_Ctrl_Running; -float walking_period; - // private functions + +void walk_read_cmd(TWalkMModule *module,unsigned short int address,unsigned short int length,unsigned char *data) +{ + ram_read_table(module->memory,address,length,data); +} + +void walk_write_cmd(TWalkMModule *module,unsigned short int address,unsigned short int length,unsigned char *data) +{ + unsigned short int i,ram_offset,eeprom_offset; + + // walk control + ram_offset=address-module->ram_base_address; + if(ram_in_range(module->ram_base_address+WALK_CONTROL,address,length)) + { + if(data[WALK_CONTROL-ram_offset]&WALK_START) + walk_start(module); + if(data[WALK_CONTROL-ram_offset]&WALK_STOP) + walk_stop(module); + } + if(ram_in_range(module->ram_base_address+WALK_STEP_FW_BW,address,length)) + module->memory->data[module->ram_base_address+WALK_STEP_FW_BW]=data[WALK_STEP_FW_BW-ram_offset]; + if(ram_in_range(module->ram_base_address+WALK_STEP_LEFT_RIGHT,address,length)) + module->memory->data[module->ram_base_address+WALK_STEP_LEFT_RIGHT]=data[WALK_STEP_LEFT_RIGHT-ram_offset]; + if(ram_in_range(module->ram_base_address+WALK_STEP_DIRECTION,address,length)) + module->memory->data[module->ram_base_address+WALK_STEP_DIRECTION]=data[WALK_STEP_DIRECTION-ram_offset]; + // walk parameters + eeprom_offset=address-module->eeprom_base_address; + if(ram_in_range(module->ram_base_address+WALK_R_HIP_ROLL_SERVO_ID,address,length)) + module->right_hip_roll_servo_id=data[WALK_R_HIP_ROLL_SERVO_ID-eeprom_offset]; + if(ram_in_range(module->ram_base_address+WALK_R_HIP_YAW_SERVO_ID,address,length)) + module->right_hip_yaw_servo_id=data[WALK_R_HIP_YAW_SERVO_ID-eeprom_offset]; + if(ram_in_range(module->ram_base_address+WALK_R_HIP_PITCH_SERVO_ID,address,length)) + module->right_hip_pitch_servo_id=data[WALK_R_HIP_PITCH_SERVO_ID-eeprom_offset]; + if(ram_in_range(module->ram_base_address+WALK_R_KNEE_SERVO_ID,address,length)) + module->right_knee_servo_id=data[WALK_R_KNEE_SERVO_ID-eeprom_offset]; + if(ram_in_range(module->ram_base_address+WALK_R_ANKLE_PITCH_SERVO_ID,address,length)) + module->right_ankle_pitch_servo_id=data[WALK_R_ANKLE_PITCH_SERVO_ID-eeprom_offset]; + if(ram_in_range(module->ram_base_address+WALK_R_ANKLE_ROLL_SERVO_ID,address,length)) + module->right_ankle_roll_servo_id=data[WALK_R_ANKLE_ROLL_SERVO_ID-eeprom_offset]; + if(ram_in_range(module->ram_base_address+WALK_R_SHOULDER_PITCH_SERVO_ID,address,length)) + module->right_shoulder_pitch_servo_id=data[WALK_R_SHOULDER_PITCH_SERVO_ID-eeprom_offset]; + if(ram_in_range(module->ram_base_address+WALK_L_HIP_ROLL_SERVO_ID,address,length)) + module->left_hip_roll_servo_id=data[WALK_L_HIP_ROLL_SERVO_ID-eeprom_offset]; + if(ram_in_range(module->ram_base_address+WALK_L_HIP_YAW_SERVO_ID,address,length)) + module->left_hip_yaw_servo_id=data[WALK_L_HIP_YAW_SERVO_ID-eeprom_offset]; + if(ram_in_range(module->ram_base_address+WALK_L_HIP_PITCH_SERVO_ID,address,length)) + module->left_hip_pitch_servo_id=data[WALK_L_HIP_PITCH_SERVO_ID-eeprom_offset]; + if(ram_in_range(module->ram_base_address+WALK_L_KNEE_SERVO_ID,address,length)) + module->left_knee_servo_id=data[WALK_L_KNEE_SERVO_ID-eeprom_offset]; + if(ram_in_range(module->ram_base_address+WALK_L_ANKLE_PITCH_SERVO_ID,address,length)) + module->left_ankle_pitch_servo_id=data[WALK_L_ANKLE_PITCH_SERVO_ID-eeprom_offset]; + if(ram_in_range(module->ram_base_address+WALK_L_ANKLE_ROLL_SERVO_ID,address,length)) + module->left_ankle_roll_servo_id=data[WALK_L_ANKLE_ROLL_SERVO_ID-eeprom_offset]; + if(ram_in_range(module->ram_base_address+WALK_L_SHOULDER_PITCH_SERVO_ID,address,length)) + module->left_shoulder_pitch_servo_id=data[WALK_L_SHOULDER_PITCH_SERVO_ID-eeprom_offset]; + for(i=0;i<EEPROM_WALK_LENGTH;i++) + if(ram_in_range(module->eeprom_base_address+i,address,length)) + module->memory->data[module->eeprom_base_address+i]=data[i-eeprom_offset]; +} + float wsin(float time, float period, float period_shift, float mag, float mag_shift) { - return mag*sin(((2.0*PI*time)/period)-period_shift)+mag_shift; + return mag*sin(((2.0*3.14159*time)/period)-period_shift)+mag_shift; } -void update_param_time() +void update_param_time(TWalkMModule *walk) { - float m_SSP_Ratio; - float m_SSP_Time; + float ssp_ratio; + float ssp_time; - m_PeriodTime=((float)((int16_t)(ram_data[DARWIN_WALK_PERIOD_TIME_L]+(ram_data[DARWIN_WALK_PERIOD_TIME_H]<<8)))); - m_SSP_Ratio=1.0-((float)ram_data[DARWIN_WALK_DSP_RATIO])/256.0; + walk->period_time=((float)((short int)(walk->memory->data[walk->eeprom_base_address+WALK_PERIOD_TIME]+(walk->memory->data[walk->eeprom_base_address+WALK_PERIOD_TIME+1]<<8)))); + ssp_ratio=1.0-((float)walk->memory->data[walk->eeprom_base_address+WALK_DSP_RATIO])/256.0; - m_SSP_Time=m_PeriodTime*m_SSP_Ratio; + ssp_time=walk->period_time*ssp_ratio; - m_X_Swap_PeriodTime=m_PeriodTime/2.0; - m_X_Move_PeriodTime=m_SSP_Time; - m_Y_Swap_PeriodTime=m_PeriodTime; - m_Y_Move_PeriodTime=m_SSP_Time; - m_Z_Swap_PeriodTime=m_PeriodTime/2.0; - m_Z_Move_PeriodTime=m_SSP_Time/2.0; - m_A_Move_PeriodTime=m_SSP_Time; + walk->x_swap_period_time=walk->period_time/2.0; + walk->x_move_period_time=ssp_time; + walk->y_swap_period_time=walk->period_time; + walk->y_move_period_time=ssp_time; + walk->z_swap_period_time=walk->period_time/2.0; + walk->z_move_period_time=ssp_time/2.0; + walk->a_move_period_time=ssp_time; - m_SSP_Time_Start_L=(1-m_SSP_Ratio)*m_PeriodTime/4.0; - m_SSP_Time_End_L=(1+m_SSP_Ratio)*m_PeriodTime/4.0; - m_SSP_Time_Start_R=(3-m_SSP_Ratio)*m_PeriodTime/4.0; - m_SSP_Time_End_R=(3+m_SSP_Ratio)*m_PeriodTime/4.0; + walk->ssp_time_start_left=(1-ssp_ratio)*walk->period_time/4.0; + walk->ssp_time_end_left=(1+ssp_ratio)*walk->period_time/4.0; + walk->ssp_time_start_right=(3-ssp_ratio)*walk->period_time/4.0; + walk->ssp_time_end_right=(3+ssp_ratio)*walk->period_time/4.0; - m_Phase_Time1=(m_SSP_Time_End_L+m_SSP_Time_Start_L)/2.0; - m_Phase_Time2=(m_SSP_Time_Start_R+m_SSP_Time_End_L)/2.0; - m_Phase_Time3=(m_SSP_Time_End_R+m_SSP_Time_Start_R)/2.0; + walk->phase_time1=(walk->ssp_time_end_left+walk->ssp_time_start_left)/2.0; + walk->phase_time2=(walk->ssp_time_start_right+walk->ssp_time_end_left)/2.0; + walk->phase_time3=(walk->ssp_time_end_right+walk->ssp_time_start_right)/2.0; // m_pelvis_offset and m_pelvis_Swing in degrees - m_Pelvis_Offset=((float)ram_data[DARWIN_WALK_PELVIS_OFFSET])*PI/1440.0; - m_Pelvis_Swing=m_Pelvis_Offset*0.35; - m_Arm_Swing_Gain=((float)ram_data[DARWIN_WALK_ARM_SWING_GAIN])/32.0; + walk->pelvis_offset=((float)walk->memory->data[walk->eeprom_base_address+WALK_PELVIS_OFFSET])*3.14159/1440.0; + walk->pelvis_swing=walk->pelvis_offset*0.35; + walk->arm_swing_gain=((float)walk->memory->data[walk->eeprom_base_address+WALK_ARM_SWING_GAIN])/32.0; } -void update_param_move() +void update_param_move(TWalkMModule *walk) { float target_x_amplitude; float target_y_amplitude; @@ -114,277 +113,221 @@ void update_param_move() static float current_y_amplitude=0; static float current_a_amplitude=0; - target_x_amplitude=((float)((int8_t)ram_data[DARWIN_WALK_STEP_FW_BW])); + target_x_amplitude=((float)((char)walk->memory->data[walk->ram_base_address+WALK_STEP_FW_BW])); // change longitudinal and transversal velocities to get to the target ones if(current_x_amplitude<target_x_amplitude) { - current_x_amplitude+=(((float)ram_data[DARWIN_WALK_MAX_VEL])*m_PeriodTime)/1000.0; + current_x_amplitude+=(((float)walk->memory->data[walk->eeprom_base_address+WALK_MAX_VEL])*walk->period_time)/1000.0; if(current_x_amplitude>target_x_amplitude) current_x_amplitude=target_x_amplitude; } else if(current_x_amplitude>target_x_amplitude) { - current_x_amplitude-=(((float)ram_data[DARWIN_WALK_MAX_VEL])*m_PeriodTime)/1000.0; + current_x_amplitude-=(((float)walk->memory->data[walk->eeprom_base_address+WALK_MAX_VEL])*walk->period_time)/1000.0; if(current_x_amplitude<target_x_amplitude) current_x_amplitude=target_x_amplitude; } - m_X_Move_Amplitude=current_x_amplitude; - m_X_Swap_Amplitude=current_x_amplitude*((float)ram_data[DARWIN_WALK_STEP_FW_BW_RATIO])/256.0; + walk->x_move_amplitude=current_x_amplitude; + walk->x_swap_amplitude=current_x_amplitude*((float)walk->memory->data[walk->eeprom_base_address+WALK_STEP_FW_BW_RATIO])/256.0; // Right/Left - target_y_amplitude=((float)((int8_t)ram_data[DARWIN_WALK_STEP_LEFT_RIGHT])); + target_y_amplitude=((float)((char)walk->memory->data[walk->ram_base_address+WALK_STEP_LEFT_RIGHT])); if(current_y_amplitude<target_y_amplitude) { - current_y_amplitude+=(((float)ram_data[DARWIN_WALK_MAX_VEL])*m_PeriodTime)/1000.0; + current_y_amplitude+=(((float)walk->memory->data[walk->eeprom_base_address+WALK_MAX_VEL])*walk->period_time)/1000.0; if(current_y_amplitude>target_y_amplitude) current_y_amplitude=target_y_amplitude; } else if(current_y_amplitude>target_y_amplitude) { - current_y_amplitude-=(((float)ram_data[DARWIN_WALK_MAX_VEL])*m_PeriodTime)/1000.0; + current_y_amplitude-=(((float)walk->memory->data[walk->eeprom_base_address+WALK_MAX_VEL])*walk->period_time)/1000.0; if(current_y_amplitude<target_y_amplitude) current_y_amplitude=target_y_amplitude; } - m_Y_Move_Amplitude=current_y_amplitude/2.0; - if(m_Y_Move_Amplitude>0) - m_Y_Move_Amplitude_Shift=m_Y_Move_Amplitude; + walk->y_move_amplitude=current_y_amplitude/2.0; + if(walk->y_move_amplitude>0) + walk->y_move_amplitude_shift=walk->y_move_amplitude; else - m_Y_Move_Amplitude_Shift=-m_Y_Move_Amplitude; - m_Y_Swap_Amplitude=((float)ram_data[DARWIN_WALK_SWING_RIGHT_LEFT])+m_Y_Move_Amplitude_Shift*0.04; + walk->y_move_amplitude_shift=-walk->y_move_amplitude; + walk->y_swap_amplitude=((float)walk->memory->data[walk->eeprom_base_address+WALK_SWING_RIGHT_LEFT])+walk->y_move_amplitude_shift*0.04; - m_Z_Move_Amplitude=((float)ram_data[DARWIN_WALK_FOOT_HEIGHT])/2.0; - m_Z_Move_Amplitude_Shift=m_Z_Move_Amplitude / 2.0; - m_Z_Swap_Amplitude=((float)ram_data[DARWIN_WALK_SWING_TOP_DOWN]); - m_Z_Swap_Amplitude_Shift=m_Z_Swap_Amplitude; + walk->z_move_amplitude=((float)walk->memory->data[walk->eeprom_base_address+WALK_FOOT_HEIGHT])/2.0; + walk->z_move_amplitude_shift=walk->z_move_amplitude / 2.0; + walk->z_swap_amplitude=((float)walk->memory->data[walk->eeprom_base_address+WALK_SWING_TOP_DOWN]); + walk->z_swap_amplitude_shift=walk->z_swap_amplitude; // Direction - target_a_amplitude=((float)((int8_t)ram_data[DARWIN_WALK_STEP_DIRECTION]))/8.0; + target_a_amplitude=((float)((char)walk->memory->data[walk->ram_base_address+WALK_STEP_DIRECTION]))/8.0; if(current_a_amplitude<target_a_amplitude) { - current_a_amplitude+=(((float)ram_data[DARWIN_WALK_MAX_ROT_VEL])*m_PeriodTime)/8000.0; + current_a_amplitude+=(((float)walk->memory->data[walk->eeprom_base_address+WALK_MAX_ROT_VEL])*walk->period_time)/8000.0; if(current_a_amplitude>target_a_amplitude) current_a_amplitude=target_a_amplitude; } else if(current_a_amplitude>target_a_amplitude) { - current_a_amplitude-=(((float)ram_data[DARWIN_WALK_MAX_ROT_VEL])*m_PeriodTime)/8000.0; + current_a_amplitude-=(((float)walk->memory->data[walk->eeprom_base_address+WALK_MAX_ROT_VEL])*walk->period_time)/8000.0; if(current_a_amplitude<target_a_amplitude) current_a_amplitude=target_a_amplitude; } - if(A_MOVE_AIM_ON==0x00) + if(walk->aim_on==0x00) { - m_A_Move_Amplitude=current_a_amplitude*PI/180.0/2.0; - if(m_A_Move_Amplitude>0) - m_A_Move_Amplitude_Shift=m_A_Move_Amplitude; + walk->a_move_amplitude=current_a_amplitude*3.14159/180.0/2.0; + if(walk->a_move_amplitude>0) + walk->a_move_amplitude_shift=walk->a_move_amplitude; else - m_A_Move_Amplitude_Shift=-m_A_Move_Amplitude; + walk->a_move_amplitude_shift=-walk->a_move_amplitude; } else { - m_A_Move_Amplitude=-current_a_amplitude*PI/180.0/2.0; - if(m_A_Move_Amplitude>0) - m_A_Move_Amplitude_Shift=-m_A_Move_Amplitude; + walk->a_move_amplitude=-current_a_amplitude*3.14159/180.0/2.0; + if(walk->a_move_amplitude>0) + walk->a_move_amplitude_shift=-walk->a_move_amplitude; else - m_A_Move_Amplitude_Shift=m_A_Move_Amplitude; + walk->a_move_amplitude_shift=walk->a_move_amplitude; } } -void update_param_balance() -{ - m_X_Offset = ((float)((int8_t)ram_data[DARWIN_WALK_X_OFFSET])); - m_Y_Offset = ((float)((int8_t)ram_data[DARWIN_WALK_Y_OFFSET])); - m_Z_Offset = ((float)((int8_t)ram_data[DARWIN_WALK_Z_OFFSET])); - m_R_Offset = ((float)((int8_t)ram_data[DARWIN_WALK_ROLL_OFFSET]))*PI/1440.0;// (r_offset/8)*(pi/180) - m_P_Offset = ((float)((int8_t)ram_data[DARWIN_WALK_PITCH_OFFSET]))*PI/1440.0;// (p_offset/8)*(pi/180) - m_A_Offset = ((float)((int8_t)ram_data[DARWIN_WALK_YAW_OFFSET]))*PI/1440.0;// (a_offset/8)*(pi/180) - m_Hip_Pitch_Offset = ((float)((int16_t)(ram_data[DARWIN_WALK_HIP_PITCH_OFF_L]+(ram_data[DARWIN_WALK_HIP_PITCH_OFF_H]<<8))))/1024.0; -} - -// public functions -void walking_init(uint16_t period_us) -{ - // initialize the internal motion variables - m_X_Swap_Phase_Shift=PI; - m_X_Swap_Amplitude_Shift=0.0; - m_X_Move_Phase_Shift=PI/2.0; - m_X_Move_Amplitude=0.0; - m_X_Move_Amplitude_Shift=0.0; - m_Y_Swap_Phase_Shift=0.0; - m_Y_Swap_Amplitude_Shift=0.0; - m_Y_Move_Phase_Shift=PI/2.0; - m_Z_Swap_Phase_Shift=PI*3.0/2.0; - m_Z_Move_Phase_Shift=PI/2.0; - m_A_Move_Phase_Shift=PI/2.0; - - // initialize internal control variables - m_Time=0; - walking_period=((float)period_us)/1000.0; - m_Ctrl_Running=0x00; - - update_param_time(); - update_param_move(); - - walking_process(); -} - -void walking_set_period(uint16_t period_us) -{ - walking_period=((float)period_us)/1000.0; -} - -uint16_t walking_get_period(void) -{ - return (uint16_t)(walking_period*1000); -} - -void walking_start(void) -{ - ram_data[DARWIN_WALK_CNTRL]|=WALK_STATUS; - m_Ctrl_Running=0x01; -} - -void walking_stop(void) -{ - m_Ctrl_Running=0x00; -} - -uint8_t is_walking(void) +void update_param_balance(TWalkMModule *walk) { - if(ram_data[DARWIN_WALK_CNTRL]&WALK_STATUS) - return 0x01; - else - return 0x00; + walk->x_offset=((float)((char)walk->memory->data[walk->eeprom_base_address+WALK_X_OFFSET])); + walk->y_offset=((float)((char)walk->memory->data[walk->eeprom_base_address+WALK_Y_OFFSET])); + walk->z_offset=((float)((char)walk->memory->data[walk->eeprom_base_address+WALK_Z_OFFSET])); + walk->r_offset=((float)((char)walk->memory->data[walk->eeprom_base_address+WALK_ROLL_OFFSET]))*3.14159/1440.0;// (r_offset/8)*(pi/180) + walk->p_offset = ((float)((char)walk->memory->data[walk->eeprom_base_address+WALK_PITCH_OFFSET]))*3.14159/1440.0;// (p_offset/8)*(pi/180) + walk->a_offset = ((float)((char)walk->memory->data[walk->eeprom_base_address+WALK_YAW_OFFSET]))*3.14159/1440.0;// (a_offset/8)*(pi/180) + walk->hip_pitch_offset = ((float)((short int)(walk->memory->data[walk->eeprom_base_address+WALK_HIP_PITCH_OFFSET]+(walk->memory->data[walk->eeprom_base_address+WALK_HIP_PITCH_OFFSET+1]<<8))))/1024.0; } // motion manager interface functions -void walking_process(void) +void walk_pre_process(void *module) { + TWalkMModule *walk=(TWalkMModule *)module; float x_swap,y_swap,z_swap,a_swap,b_swap,c_swap; float x_move_r,y_move_r,z_move_r,a_move_r,b_move_r,c_move_r; float x_move_l,y_move_l,z_move_l,a_move_l,b_move_l,c_move_l; float pelvis_offset_r,pelvis_offset_l; -// float m_Body_Swing_Y,m_Body_Swing_Z; float angle[14],ep[12]; - if(m_Time==0) + if(walk->time==0) { - update_param_time(); - ram_data[DARWIN_WALK_CNTRL]&=(~WALK_PHASE); - ram_data[DARWIN_WALK_CNTRL]|=PHASE0; - if(m_Ctrl_Running==0x00) + update_param_time(walk); + walk->memory->data[walk->ram_base_address+WALK_CONTROL]&=(~WALK_CURRENT_PHASE); + walk->memory->data[walk->ram_base_address+WALK_CONTROL]|=PHASE0; + if(walk->running==0x00) { - if(m_X_Move_Amplitude==0 && m_Y_Move_Amplitude==0 && m_A_Move_Amplitude==0) - ram_data[DARWIN_WALK_CNTRL]&=(~WALK_STATUS); + if(walk->x_move_amplitude==0 && walk->y_move_amplitude==0 && walk->a_move_amplitude==0) + walk->memory->data[walk->ram_base_address+WALK_CONTROL]&=(~WALK_RUNNING); else { - ram_data[DARWIN_WALK_STEP_FW_BW]=0.0; - ram_data[DARWIN_WALK_STEP_LEFT_RIGHT]=0.0; - ram_data[DARWIN_WALK_STEP_DIRECTION]=0.0; + walk->memory->data[walk->ram_base_address+WALK_STEP_FW_BW]=0.0; + walk->memory->data[walk->ram_base_address+WALK_STEP_LEFT_RIGHT]=0.0; + walk->memory->data[walk->ram_base_address+WALK_STEP_DIRECTION]=0.0; } } } - else if(m_Time>=(m_Phase_Time1-walking_period/2.0) && m_Time<(m_Phase_Time1+walking_period/2.0)) + else if(walk->time>=(walk->phase_time1-walk->walk_period/2.0) && walk->time<(walk->phase_time1+walk->walk_period/2.0)) { - update_param_move(); - ram_data[DARWIN_WALK_CNTRL]&=(~WALK_PHASE); - ram_data[DARWIN_WALK_CNTRL]|=PHASE1; + update_param_move(walk); + walk->memory->data[walk->ram_base_address+WALK_CONTROL]&=(~WALK_CURRENT_PHASE); + walk->memory->data[walk->ram_base_address+WALK_CONTROL]|=PHASE1; } - else if(m_Time>=(m_Phase_Time2-walking_period/2.0) && m_Time<(m_Phase_Time2+walking_period/2.0)) + else if(walk->time>=(walk->phase_time2-walk->walk_period/2.0) && walk->time<(walk->phase_time2+walk->walk_period/2.0)) { - update_param_time(); - m_Time=m_Phase_Time2; - ram_data[DARWIN_WALK_CNTRL]&=(~WALK_PHASE); - ram_data[DARWIN_WALK_CNTRL]|=PHASE2; - if(m_Ctrl_Running==0x00) + update_param_time(walk); + walk->time=walk->phase_time2; + walk->memory->data[walk->ram_base_address+WALK_CONTROL]&=(~WALK_CURRENT_PHASE); + walk->memory->data[walk->ram_base_address+WALK_CONTROL]|=PHASE2; + if(walk->running==0x00) { - if(m_X_Move_Amplitude==0 && m_Y_Move_Amplitude==0 && m_A_Move_Amplitude==0) - ram_data[DARWIN_WALK_CNTRL]&=~WALK_STATUS; + if(walk->x_move_amplitude==0 && walk->y_move_amplitude==0 && walk->a_move_amplitude==0) + walk->memory->data[walk->ram_base_address+WALK_CONTROL]&=~WALK_RUNNING; else { - ram_data[DARWIN_WALK_STEP_FW_BW]=0.0; - ram_data[DARWIN_WALK_STEP_LEFT_RIGHT]=0.0; - ram_data[DARWIN_WALK_STEP_DIRECTION]=0.0; + walk->memory->data[walk->ram_base_address+WALK_STEP_FW_BW]=0.0; + walk->memory->data[walk->ram_base_address+WALK_STEP_LEFT_RIGHT]=0.0; + walk->memory->data[walk->ram_base_address+WALK_STEP_DIRECTION]=0.0; } } } - else if(m_Time>=(m_Phase_Time3-walking_period/2.0) && m_Time<(m_Phase_Time3+walking_period/2.0)) + else if(walk->time>=(walk->phase_time3-walk->walk_period/2.0) && walk->time<(walk->phase_time3+walk->walk_period/2.0)) { - update_param_move(); - ram_data[DARWIN_WALK_CNTRL]&=(~WALK_PHASE); - ram_data[DARWIN_WALK_CNTRL]|=PHASE3; + update_param_move(walk); + walk->memory->data[walk->ram_base_address+WALK_CONTROL]&=(~WALK_CURRENT_PHASE); + walk->memory->data[walk->ram_base_address+WALK_CONTROL]|=PHASE3; } - update_param_balance(); + update_param_balance(walk); // Compute endpoints - x_swap=wsin(m_Time,m_X_Swap_PeriodTime,m_X_Swap_Phase_Shift,m_X_Swap_Amplitude,m_X_Swap_Amplitude_Shift); - y_swap=wsin(m_Time,m_Y_Swap_PeriodTime,m_Y_Swap_Phase_Shift,m_Y_Swap_Amplitude,m_Y_Swap_Amplitude_Shift); - z_swap=wsin(m_Time,m_Z_Swap_PeriodTime,m_Z_Swap_Phase_Shift,m_Z_Swap_Amplitude,m_Z_Swap_Amplitude_Shift); + x_swap=wsin(walk->time,walk->x_swap_period_time,walk->x_swap_phase_shift,walk->x_swap_amplitude,walk->x_swap_amplitude_shift); + y_swap=wsin(walk->time,walk->y_swap_period_time,walk->y_swap_phase_shift,walk->y_swap_amplitude,walk->y_swap_amplitude_shift); + z_swap=wsin(walk->time,walk->z_swap_period_time,walk->z_swap_phase_shift,walk->z_swap_amplitude,walk->z_swap_amplitude_shift); a_swap=0; b_swap=0; c_swap=0; - if(m_Time<=m_SSP_Time_Start_L) + if(walk->time<=walk->ssp_time_start_left) { - x_move_l=wsin(m_SSP_Time_Start_L,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_L,m_X_Move_Amplitude,m_X_Move_Amplitude_Shift); - y_move_l=wsin(m_SSP_Time_Start_L,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_L,m_Y_Move_Amplitude,m_Y_Move_Amplitude_Shift); - z_move_l=wsin(m_SSP_Time_Start_L,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_L,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift); - c_move_l=wsin(m_SSP_Time_Start_L,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_L,m_A_Move_Amplitude,m_A_Move_Amplitude_Shift); - x_move_r=wsin(m_SSP_Time_Start_L,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_L,-m_X_Move_Amplitude,-m_X_Move_Amplitude_Shift); - y_move_r=wsin(m_SSP_Time_Start_L,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_L,-m_Y_Move_Amplitude,-m_Y_Move_Amplitude_Shift); - z_move_r=wsin(m_SSP_Time_Start_R,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_R,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift); - c_move_r=wsin(m_SSP_Time_Start_L,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_L,-m_A_Move_Amplitude,-m_A_Move_Amplitude_Shift); + x_move_l=wsin(walk->ssp_time_start_left,walk->x_move_period_time,walk->x_move_phase_shift+2.0*3.14159/walk->x_move_period_time*walk->ssp_time_start_left,walk->x_move_amplitude,walk->x_move_amplitude_shift); + y_move_l=wsin(walk->ssp_time_start_left,walk->y_move_period_time,walk->y_move_phase_shift+2.0*3.14159/walk->y_move_period_time*walk->ssp_time_start_left,walk->y_move_amplitude,walk->y_move_amplitude_shift); + z_move_l=wsin(walk->ssp_time_start_left,walk->z_move_period_time,walk->z_move_phase_shift+2.0*3.14159/walk->z_move_period_time*walk->ssp_time_start_left,walk->z_move_amplitude,walk->z_move_amplitude_shift); + c_move_l=wsin(walk->ssp_time_start_left,walk->a_move_period_time,walk->a_move_phase_shift+2.0*3.14159/walk->a_move_period_time*walk->ssp_time_start_left,walk->a_move_amplitude,walk->a_move_amplitude_shift); + x_move_r=wsin(walk->ssp_time_start_left,walk->x_move_period_time,walk->x_move_phase_shift+2.0*3.14159/walk->x_move_period_time*walk->ssp_time_start_left,-walk->x_move_amplitude,-walk->x_move_amplitude_shift); + y_move_r=wsin(walk->ssp_time_start_left,walk->y_move_period_time,walk->y_move_phase_shift+2.0*3.14159/walk->y_move_period_time*walk->ssp_time_start_left,-walk->y_move_amplitude,-walk->y_move_amplitude_shift); + z_move_r=wsin(walk->ssp_time_start_right,walk->z_move_period_time,walk->z_move_phase_shift+2.0*3.14159/walk->z_move_period_time*walk->ssp_time_start_right,walk->z_move_amplitude,walk->z_move_amplitude_shift); + c_move_r=wsin(walk->ssp_time_start_left,walk->a_move_period_time,walk->a_move_phase_shift+2.0*3.14159/walk->a_move_period_time*walk->ssp_time_start_left,-walk->a_move_amplitude,-walk->a_move_amplitude_shift); pelvis_offset_l=0; pelvis_offset_r=0; } - else if(m_Time<=m_SSP_Time_End_L) + else if(walk->time<=walk->ssp_time_end_left) { - x_move_l=wsin(m_Time,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_L,m_X_Move_Amplitude,m_X_Move_Amplitude_Shift); - y_move_l=wsin(m_Time,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_L,m_Y_Move_Amplitude,m_Y_Move_Amplitude_Shift); - z_move_l=wsin(m_Time,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_L,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift); - c_move_l=wsin(m_Time,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_L,m_A_Move_Amplitude,m_A_Move_Amplitude_Shift); - x_move_r=wsin(m_Time,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_L,-m_X_Move_Amplitude,-m_X_Move_Amplitude_Shift); - y_move_r=wsin(m_Time,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_L,-m_Y_Move_Amplitude,-m_Y_Move_Amplitude_Shift); - z_move_r=wsin(m_SSP_Time_Start_R,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_R,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift); - c_move_r=wsin(m_Time,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_L,-m_A_Move_Amplitude,-m_A_Move_Amplitude_Shift); - pelvis_offset_l=wsin(m_Time,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_L,m_Pelvis_Swing/2.0,m_Pelvis_Swing/2.0); - pelvis_offset_r=wsin(m_Time,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_L,-m_Pelvis_Offset/2.0,-m_Pelvis_Offset/2.0); + x_move_l=wsin(walk->time,walk->x_move_period_time,walk->x_move_phase_shift+2.0*3.14159/walk->x_move_period_time*walk->ssp_time_start_left,walk->x_move_amplitude,walk->x_move_amplitude_shift); + y_move_l=wsin(walk->time,walk->y_move_period_time,walk->y_move_phase_shift+2.0*3.14159/walk->y_move_period_time*walk->ssp_time_start_left,walk->y_move_amplitude,walk->y_move_amplitude_shift); + z_move_l=wsin(walk->time,walk->z_move_period_time,walk->z_move_phase_shift+2.0*3.14159/walk->z_move_period_time*walk->ssp_time_start_left,walk->z_move_amplitude,walk->z_move_amplitude_shift); + c_move_l=wsin(walk->time,walk->a_move_period_time,walk->a_move_phase_shift+2.0*3.14159/walk->a_move_period_time*walk->ssp_time_start_left,walk->a_move_amplitude,walk->a_move_amplitude_shift); + x_move_r=wsin(walk->time,walk->x_move_period_time,walk->x_move_phase_shift+2.0*3.14159/walk->x_move_period_time*walk->ssp_time_start_left,-walk->x_move_amplitude,-walk->x_move_amplitude_shift); + y_move_r=wsin(walk->time,walk->y_move_period_time,walk->y_move_phase_shift+2.0*3.14159/walk->y_move_period_time*walk->ssp_time_start_left,-walk->y_move_amplitude,-walk->y_move_amplitude_shift); + z_move_r=wsin(walk->ssp_time_start_right,walk->z_move_period_time,walk->z_move_phase_shift+2.0*3.14159/walk->z_move_period_time*walk->ssp_time_start_right,walk->z_move_amplitude,walk->z_move_amplitude_shift); + c_move_r=wsin(walk->time,walk->a_move_period_time,walk->a_move_phase_shift+2.0*3.14159/walk->a_move_period_time*walk->ssp_time_start_left,-walk->a_move_amplitude,-walk->a_move_amplitude_shift); + pelvis_offset_l=wsin(walk->time,walk->z_move_period_time,walk->z_move_phase_shift+2.0*3.14159/walk->z_move_period_time*walk->ssp_time_start_left,walk->pelvis_swing/2.0,walk->pelvis_swing/2.0); + pelvis_offset_r=wsin(walk->time,walk->z_move_period_time,walk->z_move_phase_shift+2.0*3.14159/walk->z_move_period_time*walk->ssp_time_start_left,-walk->pelvis_offset/2.0,-walk->pelvis_offset/2.0); } - else if(m_Time<=m_SSP_Time_Start_R) + else if(walk->time<=walk->ssp_time_start_right) { - x_move_l=wsin(m_SSP_Time_End_L,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_L,m_X_Move_Amplitude,m_X_Move_Amplitude_Shift); - y_move_l=wsin(m_SSP_Time_End_L,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_L,m_Y_Move_Amplitude,m_Y_Move_Amplitude_Shift); - z_move_l=wsin(m_SSP_Time_End_L,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_L,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift); - c_move_l=wsin(m_SSP_Time_End_L,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_L,m_A_Move_Amplitude,m_A_Move_Amplitude_Shift); - x_move_r=wsin(m_SSP_Time_End_L,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_L,-m_X_Move_Amplitude,-m_X_Move_Amplitude_Shift); - y_move_r=wsin(m_SSP_Time_End_L,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_L,-m_Y_Move_Amplitude,-m_Y_Move_Amplitude_Shift); - z_move_r=wsin(m_SSP_Time_Start_R,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_R,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift); - c_move_r=wsin(m_SSP_Time_End_L,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_L,-m_A_Move_Amplitude,-m_A_Move_Amplitude_Shift); + x_move_l=wsin(walk->ssp_time_end_left,walk->x_move_period_time,walk->x_move_phase_shift+2.0*3.14159/walk->x_move_period_time*walk->ssp_time_start_left,walk->x_move_amplitude,walk->x_move_amplitude_shift); + y_move_l=wsin(walk->ssp_time_end_left,walk->y_move_period_time,walk->y_move_phase_shift+2.0*3.14159/walk->y_move_period_time*walk->ssp_time_start_left,walk->y_move_amplitude,walk->y_move_amplitude_shift); + z_move_l=wsin(walk->ssp_time_end_left,walk->z_move_period_time,walk->z_move_phase_shift+2.0*3.14159/walk->z_move_period_time*walk->ssp_time_start_left,walk->z_move_amplitude,walk->z_move_amplitude_shift); + c_move_l=wsin(walk->ssp_time_end_left,walk->a_move_period_time,walk->a_move_phase_shift+2.0*3.14159/walk->a_move_period_time*walk->ssp_time_start_left,walk->a_move_amplitude,walk->a_move_amplitude_shift); + x_move_r=wsin(walk->ssp_time_end_left,walk->x_move_period_time,walk->x_move_phase_shift+2.0*3.14159/walk->x_move_period_time*walk->ssp_time_start_left,-walk->x_move_amplitude,-walk->x_move_amplitude_shift); + y_move_r=wsin(walk->ssp_time_end_left,walk->y_move_period_time,walk->y_move_phase_shift+2.0*3.14159/walk->y_move_period_time*walk->ssp_time_start_left,-walk->y_move_amplitude,-walk->y_move_amplitude_shift); + z_move_r=wsin(walk->ssp_time_start_right,walk->z_move_period_time,walk->z_move_phase_shift+2.0*3.14159/walk->z_move_period_time*walk->ssp_time_start_right,walk->z_move_amplitude,walk->z_move_amplitude_shift); + c_move_r=wsin(walk->ssp_time_end_left,walk->a_move_period_time,walk->a_move_phase_shift+2.0*3.14159/walk->a_move_period_time*walk->ssp_time_start_left,-walk->a_move_amplitude,-walk->a_move_amplitude_shift); pelvis_offset_l=0.0; pelvis_offset_r=0.0; } - else if(m_Time<=m_SSP_Time_End_R) + else if(walk->time<=walk->ssp_time_end_right) { - x_move_l=wsin(m_Time,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_R+PI,m_X_Move_Amplitude,m_X_Move_Amplitude_Shift); - y_move_l=wsin(m_Time,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_R+PI,m_Y_Move_Amplitude,m_Y_Move_Amplitude_Shift); - z_move_l=wsin(m_SSP_Time_End_L,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_L,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift); - c_move_l=wsin(m_Time,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_R+PI,m_A_Move_Amplitude,m_A_Move_Amplitude_Shift); - x_move_r=wsin(m_Time,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_R+PI,-m_X_Move_Amplitude,-m_X_Move_Amplitude_Shift); - y_move_r=wsin(m_Time,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_R+PI,-m_Y_Move_Amplitude,-m_Y_Move_Amplitude_Shift); - z_move_r=wsin(m_Time,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_R,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift); - c_move_r=wsin(m_Time,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_R+PI,-m_A_Move_Amplitude,-m_A_Move_Amplitude_Shift); - pelvis_offset_l=wsin(m_Time,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_R,m_Pelvis_Offset/2,m_Pelvis_Offset/2); - pelvis_offset_r=wsin(m_Time,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_R,-m_Pelvis_Swing/2,-m_Pelvis_Swing/2); + x_move_l=wsin(walk->time,walk->x_move_period_time,walk->x_move_phase_shift+2.0*3.14159/walk->x_move_period_time*walk->ssp_time_start_right+3.14159,walk->x_move_amplitude,walk->x_move_amplitude_shift); + y_move_l=wsin(walk->time,walk->y_move_period_time,walk->y_move_phase_shift+2.0*3.14159/walk->y_move_period_time*walk->ssp_time_start_right+3.14159,walk->y_move_amplitude,walk->y_move_amplitude_shift); + z_move_l=wsin(walk->ssp_time_end_left,walk->z_move_period_time,walk->z_move_phase_shift+2.0*3.14159/walk->z_move_period_time*walk->ssp_time_start_left,walk->z_move_amplitude,walk->z_move_amplitude_shift); + c_move_l=wsin(walk->time,walk->a_move_period_time,walk->a_move_phase_shift+2.0*3.14159/walk->a_move_period_time*walk->ssp_time_start_right+3.14159,walk->a_move_amplitude,walk->a_move_amplitude_shift); + x_move_r=wsin(walk->time,walk->x_move_period_time,walk->x_move_phase_shift+2.0*3.14159/walk->x_move_period_time*walk->ssp_time_start_right+3.14159,-walk->x_move_amplitude,-walk->x_move_amplitude_shift); + y_move_r=wsin(walk->time,walk->y_move_period_time,walk->y_move_phase_shift+2.0*3.14159/walk->y_move_period_time*walk->ssp_time_start_right+3.14159,-walk->y_move_amplitude,-walk->y_move_amplitude_shift); + z_move_r=wsin(walk->time,walk->z_move_period_time,walk->z_move_phase_shift+2.0*3.14159/walk->z_move_period_time*walk->ssp_time_start_right,walk->z_move_amplitude,walk->z_move_amplitude_shift); + c_move_r=wsin(walk->time,walk->a_move_period_time,walk->a_move_phase_shift+2.0*3.14159/walk->a_move_period_time*walk->ssp_time_start_right+3.14159,-walk->a_move_amplitude,-walk->a_move_amplitude_shift); + pelvis_offset_l=wsin(walk->time,walk->z_move_period_time,walk->z_move_phase_shift+2.0*3.14159/walk->z_move_period_time*walk->ssp_time_start_right,walk->pelvis_offset/2,walk->pelvis_offset/2); + pelvis_offset_r=wsin(walk->time,walk->z_move_period_time,walk->z_move_phase_shift+2.0*3.14159/walk->z_move_period_time*walk->ssp_time_start_right,-walk->pelvis_swing/2,-walk->pelvis_swing/2); } else { - x_move_l=wsin(m_SSP_Time_End_R,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_R+PI,m_X_Move_Amplitude,m_X_Move_Amplitude_Shift); - y_move_l=wsin(m_SSP_Time_End_R,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_R+PI,m_Y_Move_Amplitude,m_Y_Move_Amplitude_Shift); - z_move_l=wsin(m_SSP_Time_End_L,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_L,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift); - c_move_l=wsin(m_SSP_Time_End_R,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_R+PI,m_A_Move_Amplitude,m_A_Move_Amplitude_Shift); - x_move_r=wsin(m_SSP_Time_End_R,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_R+PI,-m_X_Move_Amplitude,-m_X_Move_Amplitude_Shift); - y_move_r=wsin(m_SSP_Time_End_R,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_R+PI,-m_Y_Move_Amplitude,-m_Y_Move_Amplitude_Shift); - z_move_r=wsin(m_SSP_Time_End_R,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_R,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift); - c_move_r=wsin(m_SSP_Time_End_R,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_R+PI,-m_A_Move_Amplitude,-m_A_Move_Amplitude_Shift); + x_move_l=wsin(walk->ssp_time_end_right,walk->x_move_period_time,walk->x_move_phase_shift+2.0*3.14159/walk->x_move_period_time*walk->ssp_time_start_right+3.14159,walk->x_move_amplitude,walk->x_move_amplitude_shift); + y_move_l=wsin(walk->ssp_time_end_right,walk->y_move_period_time,walk->y_move_phase_shift+2.0*3.14159/walk->y_move_period_time*walk->ssp_time_start_right+3.14159,walk->y_move_amplitude,walk->y_move_amplitude_shift); + z_move_l=wsin(walk->ssp_time_end_left,walk->z_move_period_time,walk->z_move_phase_shift+2.0*3.14159/walk->z_move_period_time*walk->ssp_time_start_left,walk->z_move_amplitude,walk->z_move_amplitude_shift); + c_move_l=wsin(walk->ssp_time_end_right,walk->a_move_period_time,walk->a_move_phase_shift+2.0*3.14159/walk->a_move_period_time*walk->ssp_time_start_right+3.14159,walk->a_move_amplitude,walk->a_move_amplitude_shift); + x_move_r=wsin(walk->ssp_time_end_right,walk->x_move_period_time,walk->x_move_phase_shift+2.0*3.14159/walk->x_move_period_time*walk->ssp_time_start_right+3.14159,-walk->x_move_amplitude,-walk->x_move_amplitude_shift); + y_move_r=wsin(walk->ssp_time_end_right,walk->y_move_period_time,walk->y_move_phase_shift+2.0*3.14159/walk->y_move_period_time*walk->ssp_time_start_right+3.14159,-walk->y_move_amplitude,-walk->y_move_amplitude_shift); + z_move_r=wsin(walk->ssp_time_end_right,walk->z_move_period_time,walk->z_move_phase_shift+2.0*3.14159/walk->z_move_period_time*walk->ssp_time_start_right,walk->z_move_amplitude,walk->z_move_amplitude_shift); + c_move_r=wsin(walk->ssp_time_end_right,walk->a_move_period_time,walk->a_move_phase_shift+2.0*3.14159/walk->a_move_period_time*walk->ssp_time_start_right+3.14159,-walk->a_move_amplitude,-walk->a_move_amplitude_shift); pelvis_offset_l=0.0; pelvis_offset_r=0.0; } @@ -393,21 +336,21 @@ void walking_process(void) a_move_r=0.0; b_move_r=0.0; - ep[0]=x_swap+x_move_r+m_X_Offset; - ep[1]=y_swap+y_move_r-m_Y_Offset / 2.0; - ep[2]=z_swap+z_move_r+m_Z_Offset; - ep[3]=a_swap+a_move_r-m_R_Offset / 2.0; - ep[4]=b_swap+b_move_r+m_P_Offset; - ep[5]=c_swap+c_move_r-m_A_Offset / 2.0; - ep[6]=x_swap+x_move_l+m_X_Offset; - ep[7]=y_swap+y_move_l+m_Y_Offset / 2.0; - ep[8]=z_swap+z_move_l+m_Z_Offset; - ep[9]=a_swap+a_move_l+m_R_Offset / 2.0; - ep[10]=b_swap+b_move_l+m_P_Offset; - ep[11]=c_swap+c_move_l+m_A_Offset / 2.0; + ep[0]=x_swap+x_move_r+walk->x_offset; + ep[1]=y_swap+y_move_r-walk->y_offset / 2.0; + ep[2]=z_swap+z_move_r+walk->z_offset; + ep[3]=a_swap+a_move_r-walk->r_offset / 2.0; + ep[4]=b_swap+b_move_r+walk->p_offset; + ep[5]=c_swap+c_move_r-walk->a_offset / 2.0; + ep[6]=x_swap+x_move_l+walk->x_offset; + ep[7]=y_swap+y_move_l+walk->y_offset / 2.0; + ep[8]=z_swap+z_move_l+walk->z_offset; + ep[9]=a_swap+a_move_l+walk->r_offset / 2.0; + ep[10]=b_swap+b_move_l+walk->p_offset; + ep[11]=c_swap+c_move_l+walk->a_offset / 2.0; // Compute body swing -/* if(m_Time<=m_SSP_Time_End_L) +/* if(time<=ssp_time_end_left) { m_Body_Swing_Y=-ep[7]; m_Body_Swing_Z=ep[8]; @@ -417,99 +360,154 @@ void walking_process(void) m_Body_Swing_Y=-ep[1]; m_Body_Swing_Z=ep[2]; } - m_Body_Swing_Z-=DARWIN_LEG_LENGTH;*/ + m_Body_Swing_Z-=LEG_LENGTH;*/ // Compute arm swing - if(m_X_Move_Amplitude==0) + if(walk->x_move_amplitude==0) { angle[12]=0; // Right angle[13]=0; // Left } else { - angle[12]=wsin(m_Time,m_PeriodTime,0.0,-m_X_Move_Amplitude*m_Arm_Swing_Gain,0.0); - angle[13]=wsin(m_Time,m_PeriodTime,0.0,m_X_Move_Amplitude*m_Arm_Swing_Gain,0.0); + angle[12]=wsin(walk->time,walk->period_time,0.0,-walk->x_move_amplitude*walk->arm_swing_gain,0.0); + angle[13]=wsin(walk->time,walk->period_time,0.0,walk->x_move_amplitude*walk->arm_swing_gain,0.0); } - if(ram_data[DARWIN_WALK_CNTRL]&WALK_STATUS) + if(walk->memory->data[walk->ram_base_address+WALK_CONTROL]&WALK_RUNNING) { - m_Time += walking_period; - if(m_Time >= m_PeriodTime) - m_Time = 0; + walk->time+=walk->walk_period; + if(walk->time>=walk->period_time) + walk->time=0; } // Compute angles with the inverse kinematics - if((darwin_leg_ik(&angle[0],ep[0],ep[1],ep[2],ep[3],ep[4],ep[5])!=1) || - (darwin_leg_ik(&angle[6],ep[6],ep[7],ep[8],ep[9],ep[10],ep[11])!=1)) - return;// Do not use angles + if(walk->leg_ik_function!=0x00000000) + { + if((walk->leg_ik_function(&angle[0],ep[0],ep[1],ep[2],ep[3],ep[4],ep[5])!=1) || + (walk->leg_ik_function(&angle[6],ep[6],ep[7],ep[8],ep[9],ep[10],ep[11])!=1)) + return;// Do not use angles + } + else + return; // Compute motor value - if(manager_get_module(R_HIP_YAW)==MM_WALKING) - manager_current_angles[R_HIP_YAW]=((-180.0*angle[0])/PI)*65536.0; - if(manager_get_module(R_HIP_ROLL)==MM_WALKING) - manager_current_angles[R_HIP_ROLL]=((-180.0*(angle[1]+pelvis_offset_r))/PI)*65536.0; - if(manager_get_module(R_HIP_PITCH)==MM_WALKING) - manager_current_angles[R_HIP_PITCH]=((180.0*angle[2])/PI-m_Hip_Pitch_Offset)*65536.0; - if(manager_get_module(R_KNEE)==MM_WALKING) - manager_current_angles[R_KNEE]=((180.0*angle[3])/PI)*65536.0; - if(manager_get_module(R_ANKLE_PITCH)==MM_WALKING) - manager_current_angles[R_ANKLE_PITCH]=((-180.0*angle[4])/PI)*65536.0; - if(manager_get_module(R_ANKLE_ROLL)==MM_WALKING) - manager_current_angles[R_ANKLE_ROLL]=((180.0*angle[5])/PI)*65536.0; - if(manager_get_module(L_HIP_YAW)==MM_WALKING) - manager_current_angles[L_HIP_YAW]=((-180.0*angle[6])/PI)*65536.0; - if(manager_get_module(L_HIP_ROLL)==MM_WALKING) - manager_current_angles[L_HIP_ROLL]=((-180.0*(angle[7]+pelvis_offset_l))/PI)*65536.0; - if(manager_get_module(L_HIP_PITCH)==MM_WALKING) - manager_current_angles[L_HIP_PITCH]=((-180.0*angle[8])/PI+m_Hip_Pitch_Offset)*65536.0; - if(manager_get_module(L_KNEE)==MM_WALKING) - manager_current_angles[L_KNEE]=((-180.0*angle[9])/PI)*65536.0; - if(manager_get_module(L_ANKLE_PITCH)==MM_WALKING) - manager_current_angles[L_ANKLE_PITCH]=((180.0*angle[10])/PI)*65536.0; - if(manager_get_module(L_ANKLE_ROLL)==MM_WALKING) - manager_current_angles[L_ANKLE_ROLL]=((180.0*angle[11])/PI)*65536.0; - if(manager_get_module(R_SHOULDER_PITCH)==MM_WALKING) - manager_current_angles[R_SHOULDER_PITCH]=(angle[12]-48.345)*65536.0; - if(manager_get_module(L_SHOULDER_PITCH)==MM_WALKING) - manager_current_angles[L_SHOULDER_PITCH]=(-angle[13]+41.313)*65536.0; + if(mmanager_get_module(walk->mmodule.manager,walk->right_hip_yaw_servo_id)==MM_WALK) + walk->mmodule.manager->servo_values[walk->right_hip_yaw_servo_id].target_angle=((-180.0*angle[0])/3.14159)*65536.0; + if(mmanager_get_module(walk->mmodule.manager,walk->right_hip_roll_servo_id)==MM_WALK) + walk->mmodule.manager->servo_values[walk->right_hip_roll_servo_id].target_angle=((-180.0*(angle[1]+pelvis_offset_r))/3.14159)*65536.0; + if(mmanager_get_module(walk->mmodule.manager,walk->right_hip_pitch_servo_id)==MM_WALK) + walk->mmodule.manager->servo_values[walk->right_hip_pitch_servo_id].target_angle=((180.0*angle[2])/3.14159-walk->hip_pitch_offset)*65536.0; + if(mmanager_get_module(walk->mmodule.manager,walk->right_knee_servo_id)==MM_WALK) + walk->mmodule.manager->servo_values[walk->right_knee_servo_id].target_angle=((180.0*angle[3])/3.14159)*65536.0; + if(mmanager_get_module(walk->mmodule.manager,walk->right_ankle_pitch_servo_id)==MM_WALK) + walk->mmodule.manager->servo_values[walk->right_ankle_pitch_servo_id].target_angle=((-180.0*angle[4])/3.14159)*65536.0; + if(mmanager_get_module(walk->mmodule.manager,walk->right_ankle_roll_servo_id)==MM_WALK) + walk->mmodule.manager->servo_values[walk->right_ankle_roll_servo_id].target_angle=((180.0*angle[5])/3.14159)*65536.0; + if(mmanager_get_module(walk->mmodule.manager,walk->left_hip_yaw_servo_id)==MM_WALK) + walk->mmodule.manager->servo_values[walk->left_hip_yaw_servo_id].target_angle=((-180.0*angle[6])/3.14159)*65536.0; + if(mmanager_get_module(walk->mmodule.manager,walk->left_hip_roll_servo_id)==MM_WALK) + walk->mmodule.manager->servo_values[walk->left_hip_roll_servo_id].target_angle=((-180.0*(angle[7]+pelvis_offset_l))/3.14159)*65536.0; + if(mmanager_get_module(walk->mmodule.manager,walk->left_hip_pitch_servo_id)==MM_WALK) + walk->mmodule.manager->servo_values[walk->left_hip_pitch_servo_id].target_angle=((-180.0*angle[8])/3.14159+walk->hip_pitch_offset)*65536.0; + if(mmanager_get_module(walk->mmodule.manager,walk->left_knee_servo_id)==MM_WALK) + walk->mmodule.manager->servo_values[walk->left_knee_servo_id].target_angle=((-180.0*angle[9])/3.14159)*65536.0; + if(mmanager_get_module(walk->mmodule.manager,walk->left_ankle_pitch_servo_id)==MM_WALK) + walk->mmodule.manager->servo_values[walk->left_ankle_pitch_servo_id].target_angle=((180.0*angle[10])/3.14159)*65536.0; + if(mmanager_get_module(walk->mmodule.manager,walk->left_ankle_roll_servo_id)==MM_WALK) + walk->mmodule.manager->servo_values[walk->left_ankle_roll_servo_id].target_angle=((180.0*angle[11])/3.14159)*65536.0; + if(mmanager_get_module(walk->mmodule.manager,walk->right_shoulder_pitch_servo_id)==MM_WALK) + walk->mmodule.manager->servo_values[walk->right_shoulder_pitch_servo_id].target_angle=(angle[12]-48.345)*65536.0; + if(mmanager_get_module(walk->mmodule.manager,walk->left_shoulder_pitch_servo_id)==MM_WALK) + walk->mmodule.manager->servo_values[walk->left_shoulder_pitch_servo_id].target_angle=(-angle[13]+41.313)*65536.0; } -// operation functions -uint8_t walking_in_range(unsigned short int address, unsigned short int length) +TMotionModule *walk_get_module(TWalkMModule *walk) { - if(ram_in_window(WALK_BASE_ADDRESS,WALK_MEM_LENGTH,address,length) || - ram_in_window(WALK_EEPROM_ADDRESS,WALK_EEPROM_LENGTH,address,length)) - return 0x01; - else - return 0x00; + return &walk->mmodule; } -void walking_process_read_cmd(unsigned short int address,unsigned short int length,unsigned char *data) +void walk_set_period(void *module,unsigned short int period_ms) { + TWalkMModule *walk=(TWalkMModule *)module; + walk->walk_period=((float)period_ms)/1000000.0; } -void walking_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data) +void walk_set_module(void *module,unsigned char servo_id) { - uint16_t i; - // walk control - if(ram_in_range(DARWIN_WALK_CNTRL,address,length)) - { - if(data[DARWIN_WALK_CNTRL-address]&WALK_START) - walking_start(); - if(data[DARWIN_WALK_CNTRL-address]&WALK_STOP) - walking_stop(); - } - if(ram_in_range(DARWIN_WALK_STEP_FW_BW,address,length)) - ram_data[DARWIN_WALK_STEP_FW_BW]=data[DARWIN_WALK_STEP_FW_BW-address]; - if(ram_in_range(DARWIN_WALK_STEP_LEFT_RIGHT,address,length)) - ram_data[DARWIN_WALK_STEP_LEFT_RIGHT]=data[DARWIN_WALK_STEP_LEFT_RIGHT-address]; - if(ram_in_range(DARWIN_WALK_STEP_DIRECTION,address,length)) - ram_data[DARWIN_WALK_STEP_DIRECTION]=data[DARWIN_WALK_STEP_DIRECTION-address]; - // walk parameters - for(i=WALK_EEPROM_ADDRESS;i<=WALK_EEPROM_ADDRESS+WALK_EEPROM_LENGTH;i++) - if(ram_in_range(i,address,length)) - ram_data[i]=data[i-address]; } +// public functions +unsigned char walk_init(TWalkMModule *walk,TMemory *memory,unsigned short int ram_base_address,unsigned short int eeprom_base_address) +{ + // initialize the internal motion variables + walk->aim_on=0x00; + walk->x_swap_phase_shift=3.14159; + walk->x_swap_amplitude_shift=0.0; + walk->x_move_phase_shift=3.14159/2.0; + walk->x_move_amplitude=0.0; + walk->x_move_amplitude_shift=0.0; + walk->y_swap_phase_shift=0.0; + walk->y_swap_amplitude_shift=0.0; + walk->y_move_phase_shift=3.14159/2.0; + walk->z_swap_phase_shift=3.14159*3.0/2.0; + walk->z_move_phase_shift=3.14159/2.0; + walk->a_move_phase_shift=3.14159/2.0; + + // initialize internal control variables + walk->time=0; + walk->running=0x00; + walk->leg_ik_function=0x00000000; + + update_param_time(walk); + update_param_move(walk); + + walk_pre_process(walk); + + /* initialize the motion module */ + mmodule_init(&walk->mmodule); + walk->mmodule.id=MM_WALK; + walk->mmodule.set_period=walk_set_period; + walk->mmodule.set_module=walk_set_module; + walk->mmodule.pre_process=walk_pre_process; + walk->mmodule.data=walk; + + mem_module_init(&walk->mem_module); + walk->mem_module.data=walk; + walk->mem_module.write_cmd=(void(*)(void *,unsigned short int, unsigned short int,unsigned char *))walk_write_cmd; + walk->mem_module.read_cmd=(void(*)(void *,unsigned short int, unsigned short int,unsigned char *))walk_read_cmd; + if(!mem_module_add_ram_segment(&walk->mem_module,ram_base_address,RAM_WALK_LENGTH)) + return 0x00; + if(!mem_module_add_eeprom_segment(&walk->mem_module,eeprom_base_address,EEPROM_WALK_LENGTH)) + return 0x00; + if(!mem_add_module(memory,&walk->mem_module)) + return 0x00; + walk->ram_base_address=ram_base_address; + walk->eeprom_base_address=eeprom_base_address; + walk->memory=memory; + + return 0x01; +} + +void walk_start(TWalkMModule *walk) +{ + walk->memory->data[walk->ram_base_address+WALK_CONTROL]|=WALK_RUNNING; + walk->running=0x01; +} + +void walk_stop(TWalkMModule *walk) +{ + walk->running=0x00; +} + +unsigned char is_walk(TWalkMModule *walk) +{ + if(walk->memory->data[walk->ram_base_address+WALK_CONTROL]&WALK_RUNNING) + return 0x01; + else + return 0x00; +} + +