From ba9140904e686f00654bf07cd2d3567a9f8f51e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergi=20Hern=C3=A0ndez=20Juan?= <shernand@iri.upc.edu> Date: Sun, 27 Aug 2017 21:54:58 +0200 Subject: [PATCH] First working version of the climb stairs algorithm. Integrated the stairs algorithm to the motion manager structure. Tuned the stairs algorithm parameters to work in simulation. --- Makefile | 1 + include/darwin_registers.h | 39 +-- include/eeprom.h | 2 +- include/eeprom_init.h | 29 ++- src/darwin_dyn_slave.c | 3 + src/eeprom.c | 4 +- src/motion_manager.c | 5 +- src/ram.c | 147 +---------- src/stairs.c | 503 +++++++++++++++++++------------------ 9 files changed, 312 insertions(+), 421 deletions(-) diff --git a/Makefile b/Makefile index c31048f..6e95e7d 100755 --- a/Makefile +++ b/Makefile @@ -29,6 +29,7 @@ TARGET_FILES+=src/joint_motion.c TARGET_FILES+=src/head_tracking.c TARGET_FILES+=src/grippers.c TARGET_FILES+=src/smart_charger.c +TARGET_FILES+=src/stairs.c TARGET_PROCESSOR=STM32F103RE diff --git a/include/darwin_registers.h b/include/darwin_registers.h index 4a4684d..f12214f 100644 --- a/include/darwin_registers.h +++ b/include/darwin_registers.h @@ -95,15 +95,16 @@ extern "C" { #define STAIRS_PHASE7_TIME ((unsigned short int)0x0072) #define STAIRS_PHASE8_TIME ((unsigned short int)0x0074) #define STAIRS_PHASE9_TIME ((unsigned short int)0x0076) -#define STAIRS_X_OFFSET ((unsigned short int)0x0078) -#define STAIRS_Y_OFFSET ((unsigned short int)0x0079) -#define STAIRS_Z_OFFSET ((unsigned short int)0x007A) -#define STAIRS_Y_SHIFT ((unsigned short int)0x007B) -#define STAIRS_X_LEFT_SHIFT ((unsigned short int)0x007C) -#define STAIRS_X_RIGHT_SHIFT ((unsigned short int)0x007D) -#define STAIRS_Z_OVERSHOOT ((unsigned short int)0x007E) -#define STAIRS_Z_HEIGHT ((unsigned short int)0x007F) -#define STAIRS_HIP_PITCH_OFF ((unsigned short int)0x0080) +#define STAIRS_PHASE10_TIME ((unsigned short int)0x0078) +#define STAIRS_X_OFFSET ((unsigned short int)0x007A) +#define STAIRS_Y_OFFSET ((unsigned short int)0x007B) +#define STAIRS_Z_OFFSET ((unsigned short int)0x007C) +#define STAIRS_Y_SHIFT ((unsigned short int)0x007D) +#define STAIRS_X_LEFT_SHIFT ((unsigned short int)0x007E) +#define STAIRS_X_RIGHT_SHIFT ((unsigned short int)0x007F) +#define STAIRS_Z_OVERSHOOT ((unsigned short int)0x0080) +#define STAIRS_Z_HEIGHT ((unsigned short int)0x0081) +#define STAIRS_HIP_PITCH_OFF ((unsigned short int)0x0082) #define LAST_EEPROM_OFFSET ((unsigned short int)0x00FF) @@ -228,6 +229,8 @@ typedef enum { DARWIN_STAIRS_PHASE8_TIME_H = STAIRS_PHASE8_TIME+1, DARWIN_STAIRS_PHASE9_TIME_L = STAIRS_PHASE9_TIME, DARWIN_STAIRS_PHASE9_TIME_H = STAIRS_PHASE9_TIME+1, + DARWIN_STAIRS_PHASE10_TIME_L = STAIRS_PHASE10_TIME, + DARWIN_STAIRS_PHASE10_TIME_H = STAIRS_PHASE10_TIME+1, DARWIN_STAIRS_X_OFFSET = STAIRS_X_OFFSET, DARWIN_STAIRS_Y_OFFSET = STAIRS_Y_OFFSET, DARWIN_STAIRS_Z_OFFSET = STAIRS_Z_OFFSET, @@ -236,7 +239,8 @@ typedef enum { DARWIN_STAIRS_X_RIGHT_SHIFT = STAIRS_X_RIGHT_SHIFT, DARWIN_STAIRS_Z_OVERSHOOT = STAIRS_Z_OVERSHOOT, DARWIN_STAIRS_Z_HEIGHT = STAIRS_Z_HEIGHT, - DARWIN_STAIRS_HIP_PITCH_OFF = STAIRS_HIP_PITCH_OFF, + DARWIN_STAIRS_HIP_PITCH_OFF_L = STAIRS_HIP_PITCH_OFF, + DARWIN_STAIRS_HIP_PITCH_OFF_H = STAIRS_HIP_PITCH_OFF+1, //RAM DARWIN_TX_LED_CNTRL = 0x0100, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 @@ -626,10 +630,10 @@ typedef enum { DARWIN_SMART_CHARGER_BATT_STATUS_H = 0x024F, DARWIN_SMART_CHARGER_CNTRL = 0x0250, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 // | detected | enable - DARWIN_GRIPPER_CNTRL = 0x0251 // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 + DARWIN_GRIPPER_CNTRL = 0x0251, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 // left opened | right opened | left moving | right moving | close left | open left | close right | open right - DARWIN_STAIRS_CNTRL = 0x0252, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 - // current phase | climbing | | | stop stairs | start stairs + DARWIN_STAIRS_CNTRL = 0x0252 // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 + // current phase | climbing | | stop stairs | start stairs }darwin_registers; #define GPIO_BASE_ADDRESS 0x0100 @@ -734,7 +738,14 @@ typedef enum { #define SMART_CHARGER_DET 0x01 #define SMART_CHARGER_EN 0x02 - +#define STAIRS_BASE_ADDRESS 0x0252 +#define STAIRS_MEM_LENGTH 1 +#define STAIRS_EEPROM_ADDRESS 0x0066 +#define STAIRS_EEPROM_LENGTH 30 +#define STAIRS_START 0x01 +#define STAIRS_STOP 0x02 +#define STAIRS_STATUS 0x08 +#define STAIRS_PHASE 0xF0 #ifdef __cplusplus } diff --git a/include/eeprom.h b/include/eeprom.h index c200358..c9c2f12 100755 --- a/include/eeprom.h +++ b/include/eeprom.h @@ -83,7 +83,7 @@ extern "C" { #define PAGE_FULL ((uint8_t)0x80) /* Variables' number */ -#define NB_OF_VAR ((uint8_t)0x60) +#define NB_OF_VAR ((uint8_t)0x83) /* Exported types ------------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/ diff --git a/include/eeprom_init.h b/include/eeprom_init.h index 570db02..db1405a 100644 --- a/include/eeprom_init.h +++ b/include/eeprom_init.h @@ -84,25 +84,28 @@ extern "C" { #define DEFAULT_GRIPPER_RIGHT_MIN_ANGLE 0xF100 // -30 in fixed point format 9|7 #define DEFAULT_GRIPPER_RIGHT_MAX_FORCE 0x0080 // 1023 max force in binary format #define DEFAULT_SMART_CHARGER_PERIOD 0x05DC // 1500 ms -#define DEFAULT_STAIRS_PHASE1_TIME 0x0064 // 100 ms -#define DEFAULT_STAIRS_PHASE2_TIME 0x00C8 // 200 ms -#define DEFAULT_STAIRS_PHASE3_TIME 0x012C // 300 ms -#define DEFAULT_STAIRS_PHASE4_TIME 0x0190 // 400 ms -#define DEFAULT_STAIRS_PHASE5_TIME 0x01F4 // 500 ms -#define DEFAULT_STAIRS_PHASE6_TIME 0x0258 // 600 ms -#define DEFAULT_STAIRS_PHASE7_TIME 0x02BC // 700 ms -#define DEFAULT_STAIRS_PHASE8_TIME 0x0320 // 800 ms -#define DEFAULT_STAIRS_PHASE9_TIME 0x0384 // 900 ms +#define DEFAULT_STAIRS_PHASE1_TIME 0x0640 // 100 ms +#define DEFAULT_STAIRS_PHASE2_TIME 0x0C80 // 200 ms +#define DEFAULT_STAIRS_PHASE3_TIME 0x12C0 // 300 ms +#define DEFAULT_STAIRS_PHASE4_TIME 0x1900 // 400 ms +#define DEFAULT_STAIRS_PHASE5_TIME 0x1F40 // 500 ms +#define DEFAULT_STAIRS_PHASE6_TIME 0x2580 // 600 ms +#define DEFAULT_STAIRS_PHASE7_TIME 0x2BC0 // 700 ms +#define DEFAULT_STAIRS_PHASE8_TIME 0x3200 // 800 ms +#define DEFAULT_STAIRS_PHASE9_TIME 0x3840 // 900 ms +#define DEFAULT_STAIRS_PHASE10_TIME 0x3E80 // 1000 ms #define DEFAULT_STAIRS_X_OFFSET 0xFFF6 // -10 mm #define DEFAULT_STAIRS_Y_OFFSET 0x0005 // 5mm #define DEFAULT_STAIRS_Z_OFFSET 0x0014 // 20 mm -#define DEFAULT_STAIRS_Y_SHIFT 0x0014 // 20 mm -#define DEFAULT_STAIRS_X_LEFT_SHIFT 0x000A // 10 mm -#define DEFAULT_STAIRS_X_RIGHT_SHIFT 0x0032 // 50 mm -#define DEFAULT_STAIRS_Z_OVERSHOOT 0x000A // 10 mm +#define DEFAULT_STAIRS_Y_SHIFT 0x0028 // 40 mm +#define DEFAULT_STAIRS_X_LEFT_SHIFT 0x0000 // 0 mm +#define DEFAULT_STAIRS_X_RIGHT_SHIFT 0x0050 // 80 mm +#define DEFAULT_STAIRS_Z_OVERSHOOT 0x000F // 15 mm #define DEFAULT_STAIRS_Z_HEIGHT 0x001E // 30 mm #define DEFAULT_STAIRS_HIP_PITCH_OFF 0x34B6 // 13.18 degrees in fixed point format 6 (1+5) | 10 +#define EEPROM_SIZE 131 + #ifdef __cplusplus } #endif diff --git a/src/darwin_dyn_slave.c b/src/darwin_dyn_slave.c index dd7f12f..b287d06 100755 --- a/src/darwin_dyn_slave.c +++ b/src/darwin_dyn_slave.c @@ -13,6 +13,7 @@ #include "head_tracking.h" #include "grippers.h" #include "smart_charger.h" +#include "stairs.h" /* timer for the execution of the dynamixel slave loop */ #define DYN_SLAVE_TIMER TIM7 @@ -96,6 +97,8 @@ unsigned char darwin_on_write(unsigned short int address,unsigned short int leng // smart charger commands if(smart_charger_in_range(address,length)) smart_charger_process_write_cmd(address,length,data); + if(stairs_in_range(address,length)) + stairs_process_write_cmd(address,length,data); // write eeprom for(i=address,j=0;i<LAST_EEPROM_OFFSET && i<(address+length);i++,j++) EE_WriteVariable(i,data[j]); diff --git a/src/eeprom.c b/src/eeprom.c index b6eae9e..142ad7a 100755 --- a/src/eeprom.c +++ b/src/eeprom.c @@ -154,7 +154,7 @@ uint16_t eeprom_data[] __attribute__ ((section (".eeprom")))={VALID_PAGE, DEFAULT_GRIPPER_RIGHT_MIN_ANGLE&0xFF, GRIPPER_RIGHT_MIN_ANGLE, DEFAULT_GRIPPER_RIGHT_MIN_ANGLE>>8, GRIPPER_RIGHT_MIN_ANGLE+1, DEFAULT_GRIPPER_RIGHT_MAX_FORCE&0xFF, GRIPPER_RIGHT_MAX_FORCE, - DEFAULT_GRIPPER_RIGHT_MAX_FORCE>>8, GRIPPER_RIGHT_MAX_FORCE+1, + DEFAULT_GRIPPER_RIGHT_MAX_FORCE>>8, GRIPPER_RIGHT_MAX_FORCE+1, DEFAULT_SMART_CHARGER_PERIOD&0xFF, SMART_CHARGER_PERIOD, DEFAULT_SMART_CHARGER_PERIOD>>8, SMART_CHARGER_PERIOD+1, DEFAULT_STAIRS_PHASE1_TIME&0xFF, STAIRS_PHASE1_TIME, @@ -175,6 +175,8 @@ uint16_t eeprom_data[] __attribute__ ((section (".eeprom")))={VALID_PAGE, DEFAULT_STAIRS_PHASE8_TIME>>8, STAIRS_PHASE8_TIME+1, DEFAULT_STAIRS_PHASE9_TIME&0xFF, STAIRS_PHASE9_TIME, DEFAULT_STAIRS_PHASE9_TIME>>8, STAIRS_PHASE9_TIME+1, + DEFAULT_STAIRS_PHASE10_TIME&0xFF, STAIRS_PHASE10_TIME, + DEFAULT_STAIRS_PHASE10_TIME>>8, STAIRS_PHASE10_TIME+1, DEFAULT_STAIRS_X_OFFSET, STAIRS_X_OFFSET, DEFAULT_STAIRS_Y_OFFSET, STAIRS_Y_OFFSET, DEFAULT_STAIRS_Z_OFFSET, STAIRS_Z_OFFSET, diff --git a/src/motion_manager.c b/src/motion_manager.c index 709777c..2e72f34 100755 --- a/src/motion_manager.c +++ b/src/motion_manager.c @@ -11,7 +11,7 @@ #include "imu.h" #include "smart_charger.h" #include "dyn_battery.h" -#include "gpio.h" +#include "stairs.h" #include <stdlib.h> #define MANAGER_TIMER TIM5 @@ -198,6 +198,8 @@ void MANAGER_TIMER_IRQHandler(void) walking_process(); // call the gripper process grippers_process(); + // call the stairs process + stairs_process(); // balance the robot manager_balance(); // access to smart charger @@ -469,6 +471,7 @@ void manager_init(uint16_t period_us) head_tracking_init(period_us); grippers_init(period_us); smart_charger_init(period_us); + stairs_init(period_us); } uint16_t manager_get_period(void) diff --git a/src/ram.c b/src/ram.c index e708a46..be8aa9d 100755 --- a/src/ram.c +++ b/src/ram.c @@ -10,152 +10,11 @@ void ram_init(void) for(i=0;i<RAM_SIZE;i++) ram_data[i]=0x00; // read contents from EEPROM to RAM - if(EE_ReadVariable(DEVICE_MODEL_OFFSET,&eeprom_data)==0) - ram_data[DEVICE_MODEL_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(DEVICE_MODEL_OFFSET+1,&eeprom_data)==0) - ram_data[DEVICE_MODEL_OFFSET+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(FIRMWARE_VERSION_OFFSET,&eeprom_data)==0) - ram_data[FIRMWARE_VERSION_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(DEVICE_ID_OFFSET,&eeprom_data)==0) - ram_data[DEVICE_ID_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(BAUDRATE_OFFSET,&eeprom_data)==0) - ram_data[BAUDRATE_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(RETURN_DELAY_OFFSET,&eeprom_data)==0) - ram_data[RETURN_DELAY_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_PERIOD_OFFSET,&eeprom_data)==0) - ram_data[MM_PERIOD_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_PERIOD_OFFSET+1,&eeprom_data)==0) - ram_data[MM_PERIOD_OFFSET+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_BAL_KNEE_GAIN_OFFSET,&eeprom_data)==0) - ram_data[MM_BAL_KNEE_GAIN_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_BAL_KNEE_GAIN_OFFSET+1,&eeprom_data)==0) - ram_data[MM_BAL_KNEE_GAIN_OFFSET+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_BAL_ANKLE_ROLL_GAIN_OFFSET,&eeprom_data)==0) - ram_data[MM_BAL_ANKLE_ROLL_GAIN_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_BAL_ANKLE_ROLL_GAIN_OFFSET+1,&eeprom_data)==0) - ram_data[MM_BAL_ANKLE_ROLL_GAIN_OFFSET+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_BAL_ANKLE_PITCH_GAIN_OFFSET,&eeprom_data)==0) - ram_data[MM_BAL_ANKLE_PITCH_GAIN_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_BAL_ANKLE_PITCH_GAIN_OFFSET+1,&eeprom_data)==0) - ram_data[MM_BAL_ANKLE_PITCH_GAIN_OFFSET+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_BAL_HIP_ROLL_GAIN_OFFSET,&eeprom_data)==0) - ram_data[MM_BAL_HIP_ROLL_GAIN_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(MM_BAL_HIP_ROLL_GAIN_OFFSET+1,&eeprom_data)==0) - ram_data[MM_BAL_HIP_ROLL_GAIN_OFFSET+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(RETURN_LEVEL_OFFSET,&eeprom_data)==0) - ram_data[RETURN_LEVEL_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - for(i=0;i<32;i++) + for(i=0;i<NB_OF_VAR;i++) { - if(EE_ReadVariable(MM_SERVO0_OFFSET+i,&eeprom_data)==0) - ram_data[DARWIN_MM_SERVO0_OFFSET+i]=(uint8_t)(eeprom_data&0x00FF); + if(EE_ReadVariable(i,&eeprom_data)==0) + ram_data[i]=(uint8_t)(eeprom_data&0x00FF); } - if(EE_ReadVariable(WALK_X_OFFSET,&eeprom_data)==0) - ram_data[WALK_X_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_Y_OFFSET,&eeprom_data)==0) - ram_data[WALK_Y_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_Z_OFFSET,&eeprom_data)==0) - ram_data[WALK_Z_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_ROLL_OFFSET,&eeprom_data)==0) - ram_data[WALK_ROLL_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_PITCH_OFFSET,&eeprom_data)==0) - ram_data[WALK_PITCH_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_YAW_OFFSET,&eeprom_data)==0) - ram_data[WALK_YAW_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_HIP_PITCH_OFF,&eeprom_data)==0) - ram_data[WALK_HIP_PITCH_OFF]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_HIP_PITCH_OFF+1,&eeprom_data)==0) - ram_data[WALK_HIP_PITCH_OFF+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_PERIOD_TIME,&eeprom_data)==0) - ram_data[WALK_PERIOD_TIME]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_PERIOD_TIME+1,&eeprom_data)==0) - ram_data[WALK_PERIOD_TIME+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_DSP_RATIO,&eeprom_data)==0) - ram_data[WALK_DSP_RATIO]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_STEP_FW_BW_RATIO,&eeprom_data)==0) - ram_data[WALK_STEP_FW_BW_RATIO]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_FOOT_HEIGHT,&eeprom_data)==0) - ram_data[WALK_FOOT_HEIGHT]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_SWING_RIGHT_LEFT,&eeprom_data)==0) - ram_data[WALK_SWING_RIGHT_LEFT]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_SWING_TOP_DOWN,&eeprom_data)==0) - ram_data[WALK_SWING_TOP_DOWN]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_PELVIS_OFFSET,&eeprom_data)==0) - ram_data[WALK_PELVIS_OFFSET]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_ARM_SWING_GAIN,&eeprom_data)==0) - ram_data[WALK_ARM_SWING_GAIN]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_MAX_VEL,&eeprom_data)==0) - ram_data[WALK_MAX_VEL]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(WALK_MAX_ROT_VEL,&eeprom_data)==0) - ram_data[WALK_MAX_ROT_VEL]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_PAN_P,&eeprom_data)==0) - ram_data[HEAD_PAN_P]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_PAN_P+1,&eeprom_data)==0) - ram_data[HEAD_PAN_P+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_PAN_I,&eeprom_data)==0) - ram_data[HEAD_PAN_I]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_PAN_I+1,&eeprom_data)==0) - ram_data[HEAD_PAN_I+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_PAN_D,&eeprom_data)==0) - ram_data[HEAD_PAN_D]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_PAN_D+1,&eeprom_data)==0) - ram_data[HEAD_PAN_D+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_PAN_I_CLAMP,&eeprom_data)==0) - ram_data[HEAD_PAN_I_CLAMP]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_PAN_I_CLAMP+1,&eeprom_data)==0) - ram_data[HEAD_PAN_I_CLAMP+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_TILT_P,&eeprom_data)==0) - ram_data[HEAD_TILT_P]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_TILT_P+1,&eeprom_data)==0) - ram_data[HEAD_TILT_P+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_TILT_I,&eeprom_data)==0) - ram_data[HEAD_TILT_I]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_TILT_I+1,&eeprom_data)==0) - ram_data[HEAD_TILT_I+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_TILT_D,&eeprom_data)==0) - ram_data[HEAD_TILT_D]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_TILT_D+1,&eeprom_data)==0) - ram_data[HEAD_TILT_D+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_TILT_I_CLAMP,&eeprom_data)==0) - ram_data[HEAD_TILT_I_CLAMP]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(HEAD_TILT_I_CLAMP+1,&eeprom_data)==0) - ram_data[HEAD_TILT_I_CLAMP+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(GRIPPER_LEFT_TOP_ID,&eeprom_data)==0) - ram_data[GRIPPER_LEFT_TOP_ID]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(GRIPPER_LEFT_BOT_ID,&eeprom_data)==0) - ram_data[GRIPPER_LEFT_BOT_ID]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(GRIPPER_LEFT_MAX_ANGLE,&eeprom_data)==0) - ram_data[GRIPPER_LEFT_MAX_ANGLE]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(GRIPPER_LEFT_MAX_ANGLE+1,&eeprom_data)==0) - ram_data[GRIPPER_LEFT_MAX_ANGLE+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(GRIPPER_LEFT_MIN_ANGLE,&eeprom_data)==0) - ram_data[GRIPPER_LEFT_MIN_ANGLE]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(GRIPPER_LEFT_MIN_ANGLE+1,&eeprom_data)==0) - ram_data[GRIPPER_LEFT_MIN_ANGLE+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(GRIPPER_LEFT_MAX_FORCE,&eeprom_data)==0) - ram_data[GRIPPER_LEFT_MAX_FORCE]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(GRIPPER_LEFT_MAX_FORCE+1,&eeprom_data)==0) - ram_data[GRIPPER_LEFT_MAX_FORCE+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(GRIPPER_RIGHT_TOP_ID,&eeprom_data)==0) - ram_data[GRIPPER_RIGHT_TOP_ID]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(GRIPPER_RIGHT_BOT_ID,&eeprom_data)==0) - ram_data[GRIPPER_RIGHT_BOT_ID]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(GRIPPER_RIGHT_MAX_ANGLE,&eeprom_data)==0) - ram_data[GRIPPER_RIGHT_MAX_ANGLE]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(GRIPPER_RIGHT_MAX_ANGLE+1,&eeprom_data)==0) - ram_data[GRIPPER_RIGHT_MAX_ANGLE+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(GRIPPER_RIGHT_MIN_ANGLE,&eeprom_data)==0) - ram_data[GRIPPER_RIGHT_MIN_ANGLE]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(GRIPPER_RIGHT_MIN_ANGLE+1,&eeprom_data)==0) - ram_data[GRIPPER_RIGHT_MIN_ANGLE+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(GRIPPER_RIGHT_MAX_FORCE,&eeprom_data)==0) - ram_data[GRIPPER_RIGHT_MAX_FORCE]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(GRIPPER_RIGHT_MAX_FORCE+1,&eeprom_data)==0) - ram_data[GRIPPER_RIGHT_MAX_FORCE+1]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(SMART_CHARGER_PERIOD,&eeprom_data)==0) - ram_data[SMART_CHARGER_PERIOD]=(uint8_t)(eeprom_data&0x00FF); - if(EE_ReadVariable(SMART_CHARGER_PERIOD+1,&eeprom_data)==0) - ram_data[SMART_CHARGER_PERIOD+1]=(uint8_t)(eeprom_data&0x00FF); - } inline void ram_read_byte(uint16_t address,uint8_t *data) diff --git a/src/stairs.c b/src/stairs.c index dfa470a..5cefc8e 100755 --- a/src/stairs.c +++ b/src/stairs.c @@ -2,39 +2,40 @@ #include "darwin_kinematics.h" #include "darwin_math.h" #include "ram.h" +#include <stdio.h> #include <math.h> -typedef enum {SHIFT_WEIGHT_LEFT,RISE_RIGHT_FOOT,ADVANCE_RIGHT_FOOT,CONTACT_RIGHT_FOOT,SHIFT_WEIGHT_RIGHT,RISE_LEFT_FOOT,ADVANCE_LEFT_FOOT,CONTACT_LEFT_FOOT,CENTER_WEIGHT} stairs_phase_t; +typedef enum {SHIFT_WEIGHT_LEFT=0x10,RISE_RIGHT_FOOT=0x20,ADVANCE_RIGHT_FOOT=0x30,CONTACT_RIGHT_FOOT=0x40,SHIFT_WEIGHT_RIGHT=0x50,RISE_LEFT_FOOT=0x60,ADVANCE_LEFT_FOOT=0x70,CONTACT_LEFT_FOOT=0x80,CENTER_WEIGHT=0x90,STAND_UP=0xA0} stairs_phase_t; // internal motion variables -float m_Z_stair_height; -float m_Z_overshoot; -float m_Y_swap_amplitude; -float m_X_left_swap_amplitude; -float m_Y_right_swap_amplitude; +float stairs_Z_stair_height; +float stairs_Z_overshoot; +float stairs_Y_shift_amplitude; +float stairs_X_left_shift_amplitude; +float stairs_X_right_shift_amplitude; // internal offset variables -float m_Hip_Pitch_Offset; -float m_X_Offset; -float m_Y_Offset; -float m_Z_Offset; +float stairs_Hip_Pitch_Offset; +float stairs_X_Offset; +float stairs_Y_Offset; +float stairs_Z_Offset; // internal time variables -float m_Time; -float m_stairs_period; -float m_shift_weight_left_time; -float m_rise_right_foot_time; -float advance_right_foot_time; -float contact_right_foot_time; -float shift_weight_right_time; -float rise_left_foot_time; -float advance_left_foot_time; -float contact_left_foot_time; -float center_weight_time; -float total_time; +float stairs_Time; +float stairs_period; +float stairs_shift_weight_left_time; +float stairs_rise_right_foot_time; +float stairs_advance_right_foot_time; +float stairs_contact_right_foot_time; +float stairs_shift_weight_right_time; +float stairs_rise_left_foot_time; +float stairs_advance_left_foot_time; +float stairs_contact_left_foot_time; +float stairs_center_weight_time; +float stairs_walk_ready_time; // control variables -uint8_t m_Ctrl_Running; +uint8_t stairs_Ctrl_Running; // private functions @@ -45,11 +46,9 @@ void stairs_init(uint16_t period_us) // initialize internal control variables - m_Time=0; + stairs_Time=0; stairs_period=((float)period_us)/1000.0; - m_Ctrl_Running=0x00; - - stairs_process(); + stairs_Ctrl_Running=0x00; } inline void stairs_set_period(uint16_t period_us) @@ -64,18 +63,39 @@ inline uint16_t stairs_get_period(void) void stairs_start(void) { - ram_data[DARWIN_WALK_CNTRL]|=WALK_STATUS; - m_Ctrl_Running=0x01; + // load all parameters + stairs_shift_weight_left_time=((float)ram_data[DARWIN_STAIRS_PHASE1_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE1_TIME_H]<<8)); + stairs_rise_right_foot_time=((float)ram_data[DARWIN_STAIRS_PHASE2_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE2_TIME_H]<<8)); + stairs_advance_right_foot_time=((float)ram_data[DARWIN_STAIRS_PHASE3_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE3_TIME_H]<<8)); + stairs_contact_right_foot_time=((float)ram_data[DARWIN_STAIRS_PHASE4_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE4_TIME_H]<<8)); + stairs_shift_weight_right_time=((float)ram_data[DARWIN_STAIRS_PHASE5_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE5_TIME_H]<<8)); + stairs_rise_left_foot_time=((float)ram_data[DARWIN_STAIRS_PHASE6_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE6_TIME_H]<<8)); + stairs_advance_left_foot_time=((float)ram_data[DARWIN_STAIRS_PHASE7_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE7_TIME_H]<<8)); + stairs_contact_left_foot_time=((float)ram_data[DARWIN_STAIRS_PHASE8_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE8_TIME_H]<<8)); + stairs_center_weight_time=((float)ram_data[DARWIN_STAIRS_PHASE9_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE9_TIME_H]<<8)); + stairs_walk_ready_time=((float)ram_data[DARWIN_STAIRS_PHASE10_TIME_L]+(ram_data[DARWIN_STAIRS_PHASE10_TIME_H]<<8)); + stairs_Z_stair_height=((float)ram_data[DARWIN_STAIRS_Z_HEIGHT]); + stairs_Z_overshoot=((float)ram_data[DARWIN_STAIRS_Z_OVERSHOOT]); + stairs_Y_shift_amplitude=((float)ram_data[DARWIN_STAIRS_Y_SHIFT]); + stairs_X_left_shift_amplitude=((float)ram_data[DARWIN_STAIRS_X_LEFT_SHIFT]); + stairs_X_right_shift_amplitude=((float)ram_data[DARWIN_STAIRS_X_RIGHT_SHIFT]); + stairs_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; + stairs_X_Offset=((float)((int8_t)ram_data[DARWIN_STAIRS_X_OFFSET])); + stairs_Y_Offset=((float)((int8_t)ram_data[DARWIN_STAIRS_Y_OFFSET])); + stairs_Z_Offset=((float)((int8_t)ram_data[DARWIN_STAIRS_Z_OFFSET])); + // start operation + ram_data[DARWIN_STAIRS_CNTRL]|=STAIRS_STATUS; + stairs_Ctrl_Running=0x01; } void stairs_stop(void) { - m_Ctrl_Running=0x00; + stairs_Ctrl_Running=0x00; } uint8_t is_climbing_stairs(void) { - if(ram_data[DARWIN_WALK_CNTRL]&WALK_STATUS) + if(ram_data[DARWIN_STAIRS_CNTRL]&STAIRS_STATUS) return 0x01; else return 0x00; @@ -84,225 +104,221 @@ uint8_t is_climbing_stairs(void) // motion manager interface functions void stairs_process(void) { - 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]; + float angle[14]={0},ep[12]={0}; - if(m_Time==0) + if(ram_data[DARWIN_STAIRS_CNTRL]&STAIRS_STATUS) { - update_param_time(); - ram_data[DARWIN_WALK_CNTRL]&=(~WALK_PHASE); - ram_data[DARWIN_WALK_CNTRL]|=PHASE0; - if(m_Ctrl_Running==0x00) + ram_data[DARWIN_STAIRS_CNTRL]&=(~STAIRS_PHASE); + if(stairs_Time>=0 && stairs_Time<=stairs_shift_weight_left_time) { - if(m_X_Move_Amplitude==0 && m_Y_Move_Amplitude==0 && m_A_Move_Amplitude==0) - ram_data[DARWIN_WALK_CNTRL]&=(~WALK_STATUS); - 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; - } + //1 + ep[0]=stairs_X_Offset; + ep[1]=stairs_Y_Offset/2.0+(stairs_Y_shift_amplitude/stairs_shift_weight_left_time)*stairs_Time; + ep[2]=stairs_Z_Offset; + ep[6]=stairs_X_Offset; + ep[7]=stairs_Y_Offset/2.0+(stairs_Y_shift_amplitude/stairs_shift_weight_left_time)*stairs_Time; + ep[8]=stairs_Z_Offset; + ram_data[DARWIN_STAIRS_CNTRL]|=SHIFT_WEIGHT_LEFT; } - } - else if(m_Time>=(m_Phase_Time1-stairs_period/2.0) && m_Time<(m_Phase_Time1+stairs_period/2.0)) - { - update_param_move(); - ram_data[DARWIN_WALK_CNTRL]&=(~WALK_PHASE); - ram_data[DARWIN_WALK_CNTRL]|=PHASE1; - } - else if(m_Time>=(m_Phase_Time2-stairs_period/2.0) && m_Time<(m_Phase_Time2+stairs_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) + else if(stairs_Time>stairs_shift_weight_left_time && stairs_Time<=stairs_rise_right_foot_time) { - if(m_X_Move_Amplitude==0 && m_Y_Move_Amplitude==0 && m_A_Move_Amplitude==0) - ram_data[DARWIN_WALK_CNTRL]&=~WALK_STATUS; - 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; - } + //2 + ep[0]=stairs_X_Offset; + ep[1]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude; + ep[2]=stairs_Z_Offset; + ep[3]=-0.05/(stairs_rise_right_foot_time-stairs_shift_weight_left_time)*(stairs_Time-stairs_shift_weight_left_time); + ep[6]=stairs_X_Offset; + ep[7]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude; + ep[8]=stairs_Z_Offset+(stairs_Z_overshoot+stairs_Z_stair_height)/(stairs_rise_right_foot_time-stairs_shift_weight_left_time)*(stairs_Time-stairs_shift_weight_left_time); + ep[9]=-0.05/(stairs_rise_right_foot_time-stairs_shift_weight_left_time)*(stairs_Time-stairs_shift_weight_left_time); + ram_data[DARWIN_STAIRS_CNTRL]|=RISE_RIGHT_FOOT; } - } - else if(m_Time>=(m_Phase_Time3-stairs_period/2.0) && m_Time<(m_Phase_Time3+stairs_period/2.0)) - { - update_param_move(); - ram_data[DARWIN_WALK_CNTRL]&=(~WALK_PHASE); - ram_data[DARWIN_WALK_CNTRL]|=PHASE3; - } - update_param_balance(); - - // 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); - a_swap=0; - b_swap=0; - c_swap=0; - if(m_Time<=m_SSP_Time_Start_L) - { - 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); - pelvis_offset_l=0; - pelvis_offset_r=0; - } - else if(m_Time<=m_SSP_Time_End_L) - { - 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); - } - else if(m_Time<=m_SSP_Time_Start_R) - { - 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); - pelvis_offset_l=0.0; - pelvis_offset_r=0.0; - } - else if(m_Time<=m_SSP_Time_End_R) - { - 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); - } - 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); - pelvis_offset_l=0.0; - pelvis_offset_r=0.0; - } - a_move_l=0.0; - b_move_l=0.0; - 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; - - // Compute body swing -/* if(m_Time<=m_SSP_Time_End_L) - { - m_Body_Swing_Y=-ep[7]; - m_Body_Swing_Z=ep[8]; - } - else - { - m_Body_Swing_Y=-ep[1]; - m_Body_Swing_Z=ep[2]; - } - m_Body_Swing_Z-=DARWIN_LEG_LENGTH;*/ + else if(stairs_Time>stairs_rise_right_foot_time && stairs_Time<=stairs_advance_right_foot_time) + { + //3 + ep[0]=stairs_X_Offset; + ep[1]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude-10.0/(stairs_advance_right_foot_time-stairs_rise_right_foot_time)*(stairs_Time-stairs_rise_right_foot_time); + ep[2]=stairs_Z_Offset; + ep[3]=-0.05; + ep[4]=0.1/(stairs_advance_right_foot_time-stairs_rise_right_foot_time)*(stairs_Time-stairs_rise_right_foot_time); + ep[5]=0.3/(stairs_advance_right_foot_time-stairs_rise_right_foot_time)*(stairs_Time-stairs_rise_right_foot_time); + ep[6]=stairs_X_Offset+stairs_X_right_shift_amplitude/(stairs_advance_right_foot_time-stairs_rise_right_foot_time)*(stairs_Time-stairs_rise_right_foot_time); + ep[7]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude+10.0/(stairs_advance_right_foot_time-stairs_rise_right_foot_time)*(stairs_Time-stairs_rise_right_foot_time); + ep[8]=stairs_Z_Offset+stairs_Z_overshoot+stairs_Z_stair_height; + ep[9]=-0.05; + ep[10]=0.1/(stairs_advance_right_foot_time-stairs_rise_right_foot_time)*(stairs_Time-stairs_rise_right_foot_time); + ep[11]=0.3/(stairs_advance_right_foot_time-stairs_rise_right_foot_time)*(stairs_Time-stairs_rise_right_foot_time); + ram_data[DARWIN_STAIRS_CNTRL]|=ADVANCE_RIGHT_FOOT; + } + else if(stairs_Time>stairs_advance_right_foot_time && stairs_Time<=stairs_contact_right_foot_time) + { + //4 + ep[0]=stairs_X_Offset; + ep[1]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude-10.0; + ep[2]=stairs_Z_Offset; + ep[3]=-0.05; + ep[4]=0.1; + ep[5]=0.3; + ep[6]=stairs_X_Offset+stairs_X_right_shift_amplitude; + ep[7]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude+10.0; + ep[8]=stairs_Z_Offset+stairs_Z_overshoot+stairs_Z_stair_height-stairs_Z_overshoot/(stairs_contact_right_foot_time-stairs_advance_right_foot_time)*(stairs_Time-stairs_advance_right_foot_time); + ep[9]=-0.05; + ep[10]=0.1; + ep[11]=0.3; + ram_data[DARWIN_STAIRS_CNTRL]|=CONTACT_RIGHT_FOOT; + } + else if(stairs_Time>stairs_contact_right_foot_time && stairs_Time<=stairs_shift_weight_right_time) + { + //5 + ep[0]=stairs_X_Offset-35.0/(stairs_shift_weight_right_time-stairs_contact_right_foot_time)*(stairs_Time-stairs_contact_right_foot_time); + ep[1]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude-10.0-(2*stairs_Y_shift_amplitude)/(stairs_shift_weight_right_time-stairs_contact_right_foot_time)*(stairs_Time-stairs_contact_right_foot_time); + ep[2]=stairs_Z_Offset; + ep[3]=-0.05+0.05/(stairs_shift_weight_right_time-stairs_contact_right_foot_time)*(stairs_Time-stairs_contact_right_foot_time); + ep[4]=0.1-0.2/(stairs_shift_weight_right_time-stairs_contact_right_foot_time)*(stairs_Time-stairs_contact_right_foot_time); + ep[5]=0.3; + ep[6]=stairs_X_Offset+stairs_X_right_shift_amplitude-35.0/(stairs_shift_weight_right_time-stairs_contact_right_foot_time)*(stairs_Time-stairs_contact_right_foot_time); + ep[7]=stairs_Y_Offset/2.0+stairs_Y_shift_amplitude+10.0-(2*stairs_Y_shift_amplitude)/(stairs_shift_weight_right_time-stairs_contact_right_foot_time)*(stairs_Time-stairs_contact_right_foot_time); + ep[8]=stairs_Z_Offset+stairs_Z_stair_height; + ep[9]=-0.05+0.05/(stairs_shift_weight_right_time-stairs_contact_right_foot_time)*(stairs_Time-stairs_contact_right_foot_time); + ep[10]=0.1-0.2/(stairs_shift_weight_right_time-stairs_contact_right_foot_time)*(stairs_Time-stairs_contact_right_foot_time); + ep[11]=0.3; + ram_data[DARWIN_STAIRS_CNTRL]|=SHIFT_WEIGHT_RIGHT; + } + else if(stairs_Time>stairs_shift_weight_right_time && stairs_Time<=stairs_rise_left_foot_time) + { + //6 + ep[0]=stairs_X_Offset-35.0; + ep[1]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude-10.0; + ep[2]=stairs_Z_Offset+(stairs_Z_overshoot+stairs_Z_stair_height)/(stairs_rise_left_foot_time-stairs_shift_weight_right_time)*(stairs_Time-stairs_shift_weight_right_time); + ep[3]=0.05/(stairs_rise_left_foot_time-stairs_shift_weight_right_time)*(stairs_Time-stairs_shift_weight_right_time); + ep[4]=-0.1; + ep[5]=0.3; + ep[6]=stairs_X_Offset+stairs_X_right_shift_amplitude-35.0; + ep[7]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude+10.0; + ep[8]=stairs_Z_Offset+stairs_Z_stair_height; + ep[9]=0.05/(stairs_rise_left_foot_time-stairs_shift_weight_right_time)*(stairs_Time-stairs_shift_weight_right_time); + ep[10]=-0.1; + ep[11]=0.3; + ram_data[DARWIN_STAIRS_CNTRL]|=RISE_LEFT_FOOT; + } + else if(stairs_Time>stairs_rise_left_foot_time && stairs_Time<=stairs_advance_left_foot_time) + { + //7 + ep[0]=stairs_X_Offset-35.0+35.0/(stairs_advance_left_foot_time-stairs_rise_left_foot_time)*(stairs_Time-stairs_rise_left_foot_time); + ep[1]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude-10.0+10.0/(stairs_advance_left_foot_time-stairs_rise_left_foot_time)*(stairs_Time-stairs_rise_left_foot_time); + ep[2]=stairs_Z_Offset+stairs_Z_overshoot+stairs_Z_stair_height; + ep[3]=0.05; + ep[4]=-0.1+0.1/(stairs_advance_left_foot_time-stairs_rise_left_foot_time)*(stairs_Time-stairs_rise_left_foot_time); + ep[5]=0.3-0.3/(stairs_advance_left_foot_time-stairs_rise_left_foot_time)*(stairs_Time-stairs_rise_left_foot_time); + ep[6]=stairs_X_Offset+stairs_X_right_shift_amplitude-35.0-(-35.0+stairs_X_right_shift_amplitude)/(stairs_advance_left_foot_time-stairs_rise_left_foot_time)*(stairs_Time-stairs_rise_left_foot_time); + ep[7]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude+10.0-10.0/(stairs_advance_left_foot_time-stairs_rise_left_foot_time)*(stairs_Time-stairs_rise_left_foot_time); + ep[8]=stairs_Z_Offset+stairs_Z_stair_height; + ep[9]=0.05; + ep[10]=-0.1+0.1/(stairs_advance_left_foot_time-stairs_rise_left_foot_time)*(stairs_Time-stairs_rise_left_foot_time); + ep[11]=0.3-0.3/(stairs_advance_left_foot_time-stairs_rise_left_foot_time)*(stairs_Time-stairs_rise_left_foot_time); + ram_data[DARWIN_STAIRS_CNTRL]|=ADVANCE_LEFT_FOOT; + } + else if(stairs_Time>stairs_advance_left_foot_time && stairs_Time<=stairs_contact_left_foot_time) + { + //8 + ep[0]=stairs_X_Offset; + ep[1]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude; + ep[2]=stairs_Z_Offset+stairs_Z_overshoot+stairs_Z_stair_height-stairs_Z_overshoot/(stairs_contact_left_foot_time-stairs_advance_left_foot_time)*(stairs_Time-stairs_advance_left_foot_time); + ep[3]=0.05-0.05/(stairs_contact_left_foot_time-stairs_advance_left_foot_time)*(stairs_Time-stairs_advance_left_foot_time); + ep[4]=0.0; + ep[5]=0.0; + ep[6]=stairs_X_Offset; + ep[7]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude; + ep[8]=stairs_Z_Offset+stairs_Z_stair_height; + ep[9]=0.05-0.05/(stairs_contact_left_foot_time-stairs_advance_left_foot_time)*(stairs_Time-stairs_advance_left_foot_time); + ep[10]=0.0; + ep[11]=0.0; + ram_data[DARWIN_STAIRS_CNTRL]|=CONTACT_LEFT_FOOT; + } + else if(stairs_Time>stairs_contact_left_foot_time && stairs_Time<=stairs_center_weight_time) + { + //9 + ep[0]=stairs_X_Offset; + ep[1]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude+stairs_Y_shift_amplitude/(stairs_center_weight_time-stairs_contact_left_foot_time)*(stairs_Time-stairs_contact_left_foot_time); + ep[2]=stairs_Z_Offset+stairs_Z_stair_height-stairs_Z_stair_height/(stairs_center_weight_time-stairs_contact_left_foot_time)*(stairs_Time-stairs_contact_left_foot_time); + ep[3]=0.0; + ep[4]=0.0; + ep[5]=0.0; + ep[6]=stairs_X_Offset; + ep[7]=stairs_Y_Offset/2.0-stairs_Y_shift_amplitude+stairs_Y_shift_amplitude/(stairs_center_weight_time-stairs_contact_left_foot_time)*(stairs_Time-stairs_contact_left_foot_time); + ep[8]=stairs_Z_Offset+stairs_Z_stair_height-stairs_Z_stair_height/(stairs_center_weight_time-stairs_contact_left_foot_time)*(stairs_Time-stairs_contact_left_foot_time); + ep[9]=0.0; + ep[10]=0.0; + ep[11]=0.0; + ram_data[DARWIN_STAIRS_CNTRL]|=CENTER_WEIGHT; + } + else if(stairs_Time>stairs_center_weight_time && stairs_Time<=stairs_walk_ready_time) + { + ep[0]=stairs_X_Offset; + ep[1]=stairs_Y_Offset/2.0; + ep[2]=stairs_Z_Offset; + ep[6]=stairs_X_Offset; + ep[7]=stairs_Y_Offset/2.0; + ep[8]=stairs_Z_Offset; + ram_data[DARWIN_STAIRS_CNTRL]|=STAND_UP; + } + else + { + ram_data[DARWIN_STAIRS_CNTRL]&=(~STAIRS_STATUS); + stairs_Ctrl_Running=0x00; + } + printf("%x,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n",ram_data[DARWIN_STAIRS_CNTRL]&STAIRS_PHASE,ep[0],ep[1],ep[2],ep[3],ep[4],ep[5],ep[6],ep[7],ep[8],ep[9],ep[10],ep[11]); + + if(ram_data[DARWIN_STAIRS_CNTRL]&STAIRS_STATUS) + stairs_Time += stairs_period; + else + stairs_Time=0; - // Compute arm swing - if(m_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); - } + // 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)) + { + printf("Impossible to find inverse kinematics solution\n"); + return;// Do not use angles + } - if(ram_data[DARWIN_WALK_CNTRL]&WALK_STATUS) - { - m_Time += stairs_period; - if(m_Time >= m_PeriodTime) - m_Time = 0; + // 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])/PI)*65536.0; + if(manager_get_module(R_HIP_PITCH)==MM_WALKING) + manager_current_angles[R_HIP_PITCH]=((180.0*angle[2])/PI-stairs_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])/PI)*65536.0; + if(manager_get_module(L_HIP_PITCH)==MM_WALKING) + manager_current_angles[L_HIP_PITCH]=((-180.0*angle[8])/PI+stairs_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; } - - // 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 - - // 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; } // operation functions uint8_t stairs_in_range(unsigned short int address, unsigned short int length) { - if(ram_in_window(WALK_BASE_ADDRESS,WALK_MEM_LENGTH,address,length) || - ram_in_window(WALK_EEPROM_ADDRESS,WALK_EEPROM_LENGTH,address,length)) + if(ram_in_window(STAIRS_BASE_ADDRESS,STAIRS_MEM_LENGTH,address,length) || + ram_in_window(STAIRS_EEPROM_ADDRESS,STAIRS_EEPROM_LENGTH,address,length)) return 0x01; else return 0x00; @@ -318,21 +334,14 @@ void stairs_process_write_cmd(unsigned short int address,unsigned short int leng uint16_t i; // walk control - if(ram_in_range(DARWIN_WALK_CNTRL,address,length)) + if(ram_in_range(DARWIN_STAIRS_CNTRL,address,length)) { - if(data[DARWIN_WALK_CNTRL-address]&WALK_START) + if(data[DARWIN_STAIRS_CNTRL-address]&STAIRS_START) stairs_start(); - if(data[DARWIN_WALK_CNTRL-address]&WALK_STOP) + if(data[DARWIN_STAIRS_CNTRL-address]&STAIRS_STOP) stairs_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++) + for(i=STAIRS_EEPROM_ADDRESS;i<=STAIRS_EEPROM_ADDRESS+STAIRS_EEPROM_LENGTH;i++) if(ram_in_range(i,address,length)) ram_data[i]=data[i-address]; } -- GitLab