diff --git a/CMakeLists.txt b/CMakeLists.txt index eb679a2e6c02faa593189cfa3eb56ecbde450452..e0ce4dea0e8a06603b0c99c9a6ba53bd712f0c45 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,9 @@ SET(lib_sources ./stm32_libraries/utils/src/buffer.c ./stm32_libraries/dynamixel_manager/src/modules/motion_manager.c ./stm32_libraries/dynamixel_manager/src/modules/motion_module.c ./stm32_libraries/dynamixel_manager/src/modules/action.c + ./stm32_libraries/dynamixel_manager/src/modules/joint_motion.c + ./stm32_libraries/dynamixel_manager/src/modules/head_tracking.c + ./stm32_libraries/dynamixel_manager/src/modules/walk.c ./stm32_libraries/dynamixel_manager/src/modules/motion_pages.c ./stm32_libraries/dynamixel_manager/src/modules/dyn_servos.c) # application header files @@ -50,6 +53,13 @@ SET(lib_headers ./stm32_libraries/utils/include/buffer.h ./stm32_libraries/dynamixel_manager/include/modules/motion_module.h ./stm32_libraries/dynamixel_manager/include/modules/action.h ./stm32_libraries/dynamixel_manager/include/modules/motion_pages.h + ./stm32_libraries/dynamixel_manager/include/modules/action_registers.h + ./stm32_libraries/dynamixel_manager/include/modules/joint_motion.h + ./stm32_libraries/dynamixel_manager/include/modules/joint_motion_registers.h + ./stm32_libraries/dynamixel_manager/include/modules/head_tracking.h + ./stm32_libraries/dynamixel_manager/include/modules/head_tracking_registers.h + ./stm32_libraries/dynamixel_manager/include/modules/walk.h + ./stm32_libraries/dynamixel_manager/include/modules/walk_registers.h ./stm32_libraries/dynamixel_manager/include/modules/dyn_servos.h) # add include directories @@ -99,7 +109,7 @@ set(TARGET_PROCESSOR STM32F103RE) ADD_SUBDIRECTORY(src) # compiler settings -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mlittle-endian -mcpu=cortex-m3 -mthumb -mthumb-interwork -Wall -g -fno-common -msoft-float -ffreestanding -imacros ${configuration_file}") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mlittle-endian -mcpu=cortex-m3 -mthumb -mthumb-interwork -Wall -g -fno-common -msoft-float -ffreestanding -fno-math-errno -imacros ${configuration_file}") # linker settings set(LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/linker_script/darwin.ld") @@ -115,6 +125,8 @@ add_definitions(-DEEPROM_START_ADDRESS=0x08003800) add_executable(${PROJECT_NAME}.elf ${lib_sources} ${hal_sources} ${asm_source} ${sources}) +target_link_libraries(${PROJECT_NAME}.elf -lm) + add_custom_command(TARGET "${PROJECT_NAME}.elf" POST_BUILD # Build .hex and .bin files COMMAND ${CMAKE_OBJCOPY} -O binary ${PROJECT_NAME}.elf ${PROJECT_NAME}.bin diff --git a/include/darwin_conf.h b/include/darwin_conf.h index c922b66055fe760373dc581ad210cbd9e109c172..90314cb9ca2f6bf9266b86a93a2def9bd21e792e 100644 --- a/include/darwin_conf.h +++ b/include/darwin_conf.h @@ -1,69 +1,127 @@ #ifndef _DARWIN_CONF_H #define _DARWIN_CONF_H -#define RAM_SIZE 4096 -#define EEPROM_SIZE 128 +#define RAM_SIZE 4096 +#define EEPROM_SIZE 128 + +#define NUM_MOTION_PAGES 46 +#define MAX_DYN_MASTER_TX_BUFFER_LEN 1024 +#define MAX_DYN_MASTER_RX_BUFFER_LEN 1024 +#define MAX_DYN_SLAVE_TX_BUFFER_LEN 1024 +#define MAX_DYN_SLAVE_RX_BUFFER_LEN 1024 +#define MAX_DYN_SLAVE_REG_BUFFER_LEN 1024 +#define MAX_NUM_SLAVE_DEVICES 4 +#define MAX_DYN_SLAVE_REG_BUFFER_LEN 1024 +#define DYN_MANAGER_MAX_NUM_MASTERS 4 +#define DYN_MANAGER_MAX_NUM_MODULES 8 +#define DYN_MANAGER_MAX_NUM_DEVICES 32 +#define DYN_MANAGER_MAX_NUM_SINGLE_OP 16 +#define DYN_MANAGER_MAX_NUM_SYNC_OP 4 +#define DYN_MANAGER_MAX_NUM_BULK_OP 4 +#define MODULE_MAX_NUM_MODELS 32 +#define MM_MAX_NUM_MOTION_MODULES 8 +#define NUM_JOINT_GROUPS 4 /* Dynamixel slave memory map */ /* dynamixel slave */ -#define EEPROM_DYN_SLAVE_BASE_ADDRESS1 ((unsigned short int)0x0000) -#define EEPROM_DYN_SLAVE_BASE_ADDRESS2 ((unsigned short int)0x0010) +#define EEPROM_DYN_SLAVE_BASE_ADDRESS1 ((unsigned short int)0x0000) +#define EEPROM_DYN_SLAVE_BASE_ADDRESS2 ((unsigned short int)0x0010) /* dynamixel manager */ -#define EEPROM_DYN_MANAGER_BASE_ADDRESS ((unsigned short int)0x0006) -#define RAM_DYN_MANAGER_BASE_ADDRESS ((unsigned short int)0x0080) +#define EEPROM_DYN_MANAGER_BASE_ADDRESS ((unsigned short int)0x0006) +#define RAM_DYN_MANAGER_BASE_ADDRESS ((unsigned short int)0x0080) /* motion manager */ -#define EEPROM_MMANAGER_BASE_ADDRESS ((unsigned short int)0x0011) -#define RAM_MMANAGER_BASE_ADDRESS ((unsigned short int)0x0088) +#define EEPROM_MMANAGER_BASE_ADDRESS ((unsigned short int)0x0011) +#define RAM_MMANAGER_BASE_ADDRESS ((unsigned short int)0x0088) /* action motion module */ -#define RAM_ACTION_MM_BASE_ADDRESS ((unsigned short int)0x009E) - -/* IMU */ -#define RAM_IMU_MM_BASE_ADDRESS ((unsigned short int)0x00A0) +#define RAM_ACTION_MM_BASE_ADDRESS ((unsigned short int)0x009E) /* balance */ -#define EEPROM_BALANCE_BASE_ADDRESS ((unsigned short int)0x0007) -#define RAM_BALANCE_BASE_ADDRESS ((unsigned short int)0x00AF) - -#define NUM_MOTION_PAGES 46 -#define MAX_DYN_MASTER_TX_BUFFER_LEN 1024 -#define MAX_DYN_MASTER_RX_BUFFER_LEN 1024 -#define MAX_DYN_SLAVE_TX_BUFFER_LEN 1024 -#define MAX_DYN_SLAVE_RX_BUFFER_LEN 1024 -#define MAX_DYN_SLAVE_REG_BUFFER_LEN 1024 -#define MAX_NUM_SLAVE_DEVICES 4 -#define MAX_DYN_SLAVE_REG_BUFFER_LEN 1024 -#define DYN_MANAGER_MAX_NUM_MASTERS 4 -#define DYN_MANAGER_MAX_NUM_MODULES 8 -#define DYN_MANAGER_MAX_NUM_DEVICES 32 -#define DYN_MANAGER_MAX_NUM_SINGLE_OP 16 -#define DYN_MANAGER_MAX_NUM_SYNC_OP 4 -#define DYN_MANAGER_MAX_NUM_BULK_OP 4 -#define MODULE_MAX_NUM_MODELS 32 -#define MM_MAX_NUM_MOTION_MODULES 8 +#define EEPROM_BALANCE_BASE_ADDRESS ((unsigned short int)0x0007) +#define RAM_BALANCE_BASE_ADDRESS ((unsigned short int)0x00A0) + +/* action motion module */ +#define RAM_JOINT_MOTION_MM_BASE_ADDRESS ((unsigned short int)0x00A1) + +/* head tracking motion module */ +#define RAM_HEAD_TRACKING_MM_BASE_ADDRESS ((unsigned short int)0x0135) +#define EEPROM_HEAD_TRACKING_MM_BASE_ADDRESS ((unsigned short int)0x0031) + +/* head tracking motion module */ +#define RAM_WALK_MM_BASE_ADDRESS ((unsigned short int)0x0142) +#define EEPROM_WALK_MM_BASE_ADDRESS ((unsigned short int)0x0043) + +/* IMU */ +#define RAM_IMU_MM_BASE_ADDRESS ((unsigned short int)0x0146) /* EEPROM default values */ /* Dynamixel slave */ -#define DARWIN_DEVICE_MODEL 0x7300 -#define DARWIN_FIRMWARE_VERSION 0x0001 -#define DARWIN_DEVICE_ID 0x0001 - -#define DEFAULT_BAUDRATE 0x0010 -#define DEFAULT_RETURN_DELAY 0x0000 -#define DEFAULT_RETURN_LEVEL 0x0002 +#define DARWIN_DEVICE_MODEL 0x7300 +#define DARWIN_FIRMWARE_VERSION 0x0001 +#define DARWIN_DEVICE_ID 0x0001 + +#define DEFAULT_BAUDRATE 0x0010 +#define DEFAULT_RETURN_DELAY 0x0000 +#define DEFAULT_RETURN_LEVEL 0x0002 /* dynamixel manager */ -#define DYN_MANAGER_PERIOD 0x0007 +#define DYN_MANAGER_PERIOD 0x0007 /* motion manager */ -#define MMANAGER_PERIOD 0x0001 +#define MMANAGER_PERIOD 0x0001 /* balance */ -#define DEFAULT_BALANCE_KNEE_GAIN 0x4CCD // 0.3 in fixed point format 0|16 -#define DEFAULT_BALANCE_ANKLE_ROLL_GAIN 0xFFFF // 0.99999 -#define DEFAULT_BALANCE_ANKLE_PITCH_GAIN 0xE666 // 0.9 -#define DEFAULT_BALANCE_HIP_ROLL_GAIN 0x8000 // 0.5 +#define DEFAULT_BALANCE_KNEE_GAIN 0x4CCD // 0.3 in fixed point format 0|16 +#define DEFAULT_BALANCE_ANKLE_ROLL_GAIN 0xFFFF // 0.99999 +#define DEFAULT_BALANCE_ANKLE_PITCH_GAIN 0xE666 // 0.9 +#define DEFAULT_BALANCE_HIP_ROLL_GAIN 0x8000 // 0.5 + +/* head tracking */ +#define DEFAULT_HEAD_PAN_P_GAIN 0x028F // 0.01 in fixed point format 0|16 +#define DEFAULT_HEAD_PAN_I_GAIN 0x0000 // 0.0 in fixed point format 0|16 +#define DEFAULT_HEAD_PAN_D_GAIN 0x0000 // 0.0 in fixed point format 0|16 +#define DEFAULT_HEAD_PAN_I_CLAMP 0x0000 // 0.0 in fixed point format 9|7 +#define DEFAULT_HEAD_TILT_P_GAIN 0x028F // 0.01 in fixed point format 0|16 +#define DEFAULT_HEAD_TILT_I_GAIN 0x0000 // 0.0 in fixed point format 0|16 +#define DEFAULT_HEAD_TILT_D_GAIN 0x0000 // 0.0 in fixed point format 0|16 +#define DEFAULT_HEAD_TILT_I_CLAMP 0x0000 // 0.0 in fixed point format 9|7 +#define DEFAULT_HEAD_PAN_SERVO_ID 0x0013 +#define DEFAULT_HEAD_TILT_SERVO_ID 0x0014 + +/* walk */ +#define DEFAULT_WALK_X_OFFSET 0xFFF6 // -10 mm +#define DEFAULT_WALK_Y_OFFSET 0x0005 // 5 mm +#define DEFAULT_WALK_Z_OFFSET 0x0014 // 20 mm +#define DEFAULT_WALK_ROLL_OFFSET 0x0000 // 0 degrees in fixed point format 5 (1+4) | 3 +#define DEFAULT_WALK_PITCH_OFFSET 0x0000 // 0 degrees in fixed point format 5 (1+4) | 3 +#define DEFAULT_WALK_YAW_OFFSET 0x0000 // 0 degrees in fixed point format 5 (1+4) | 3 +#define DEFAULT_WALK_HIP_PITCH_OFFSET 0x34B6 // 13.18 degrees in fixed point format 6 (1+5) | 10 +#define DEFAULT_WALK_PERIOD_TIME 0x0258 // 600 ms +#define DEFAULT_WALK_DSP_RATIO 0x0019 // 0.1 in fixed point format 0 | 8 +#define DEFAULT_WALK_STEP_FW_BW_RATIO 0x004C // 0.3 in fixed point format 0 | 8 +#define DEFAULT_WALK_FOOT_HEIGHT 0x0028 // 40 mm +#define DEFAULT_WALK_SWING_RIGHT_LEFT 0x0014 // 20 mm +#define DEFAULT_WALK_SWING_TOP_DOWN 0x0005 // 5 mm +#define DEFAULT_WALK_PELVIS_OFFSET 0x0018 // 3 degrees in fixed point format 5 (1+4) | 3 +#define DEFAULT_WALK_ARM_SWING_GAIN 0x0030 // 1.5 in fixed point format 3 | 5 +#define DEFAULT_WALK_MAX_VEL 0x0016 // 20 mm/s +#define DEFAULT_WALK_MAX_ROT_VEL 0x0040 // 8 degrees/s in fixed point format 5 | 3 +#define DEFAULT_WALK_R_HIP_YAW_SERVO_ID 0x0007 +#define DEFAULT_WALK_R_HIP_ROLL_SERVO_ID 0x0009 +#define DEFAULT_WALK_R_HIP_PITCH_SERVO_ID 0x000B +#define DEFAULT_WALK_R_KNEE_SERVO_ID 0x000D +#define DEFAULT_WALK_R_ANKLE_PITCH_SERVO_ID 0x000F +#define DEFAULT_WALK_R_ANKLE_ROLL_SERVO_ID 0x0011 +#define DEFAULT_WALK_R_SHOULDER_PITCH_SERVO_ID 0x0001 +#define DEFAULT_WALK_L_HIP_YAW_SERVO_ID 0x0008 +#define DEFAULT_WALK_L_HIP_ROLL_SERVO_ID 0x000A +#define DEFAULT_WALK_L_HIP_PITCH_SERVO_ID 0x000C +#define DEFAULT_WALK_L_KNEE_SERVO_ID 0x000E +#define DEFAULT_WALK_L_ANKLE_PITCH_SERVO_ID 0x0010 +#define DEFAULT_WALK_L_ANKLE_ROLL_SERVO_ID 0x0012 +#define DEFAULT_WALK_L_SHOULDER_PITCH_SERVO_ID 0x0002 + #endif diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cfb80e21ce0376d79f537dd3d41f73fb2c33ccc0..adc42f27fe21a268bea9d5f7443c28469b51e036 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -10,6 +10,8 @@ SET(sources ${CMAKE_CURRENT_SOURCE_DIR}/cm730_fw.c ${CMAKE_CURRENT_SOURCE_DIR}/stm32f1xx_hal_msp.c ${CMAKE_CURRENT_SOURCE_DIR}/darwin_balance.c ${CMAKE_CURRENT_SOURCE_DIR}/darwin_motion.c + ${CMAKE_CURRENT_SOURCE_DIR}/darwin_kinematics.c + ${CMAKE_CURRENT_SOURCE_DIR}/darwin_math.c ${CMAKE_CURRENT_SOURCE_DIR}/darwin_motion_pages.c #${CMAKE_CURRENT_SOURCE_DIR}/smart_charger.c ${PROJECT_SOURCE_DIR}/stm32_libraries/f1/usart/src/usart3.c diff --git a/src/darwin_motion.c b/src/darwin_motion.c index 8337ac8a889427df90d9879cc8b20008f3eae4bf..a4b04099f3b7d7d665ad5d764741e1c8498a65b5 100644 --- a/src/darwin_motion.c +++ b/src/darwin_motion.c @@ -3,25 +3,59 @@ #include "darwin_dyn_master.h" #include "motion_manager.h" #include "action.h" +#include "joint_motion.h" +#include "head_tracking.h" +#include "walk.h" +#include "darwin_kinematics.h" #include "eeprom.h" TDynManager darwin_dyn_manager; TDynamixelMaster *darwin_master; TMotionManager darwin_mmanager; TActionMModule action_mm; +TJointMModule joints_mm; +THeadMModule head_mm; +TWalkMModule walk_mm; dyn_manager_eeprom_data(darwin_dyn_manager,".eeprom",EEPROM_DYN_MANAGER_BASE_ADDRESS,DYN_MANAGER_PERIOD); + dyn_mm_eeprom_data(darwin_mmanager,".eeprom",EEPROM_MMANAGER_BASE_ADDRESS,MMANAGER_PERIOD,0,EEPROM_MMANAGER_BASE_ADDRESS+1,0,EEPROM_MMANAGER_BASE_ADDRESS+2,0,EEPROM_MMANAGER_BASE_ADDRESS+3,0,EEPROM_MMANAGER_BASE_ADDRESS+4,0,EEPROM_MMANAGER_BASE_ADDRESS+5,0,EEPROM_MMANAGER_BASE_ADDRESS+6,0,EEPROM_MMANAGER_BASE_ADDRESS+7,0,EEPROM_MMANAGER_BASE_ADDRESS+8,0,EEPROM_MMANAGER_BASE_ADDRESS+9,0,EEPROM_MMANAGER_BASE_ADDRESS+10,0,EEPROM_MMANAGER_BASE_ADDRESS+11,0,EEPROM_MMANAGER_BASE_ADDRESS+12,0,EEPROM_MMANAGER_BASE_ADDRESS+13,0,EEPROM_MMANAGER_BASE_ADDRESS+14,0,EEPROM_MMANAGER_BASE_ADDRESS+15,0,EEPROM_MMANAGER_BASE_ADDRESS+16,0,EEPROM_MMANAGER_BASE_ADDRESS+17,0,EEPROM_MMANAGER_BASE_ADDRESS+18,0,EEPROM_MMANAGER_BASE_ADDRESS+19,0,EEPROM_MMANAGER_BASE_ADDRESS+20,0,EEPROM_MMANAGER_BASE_ADDRESS+21,0,EEPROM_MMANAGER_BASE_ADDRESS+22,0,EEPROM_MMANAGER_BASE_ADDRESS+23,0,EEPROM_MMANAGER_BASE_ADDRESS+24,0,EEPROM_MMANAGER_BASE_ADDRESS+25,0,EEPROM_MMANAGER_BASE_ADDRESS+26,0,EEPROM_MMANAGER_BASE_ADDRESS+27,0,EEPROM_MMANAGER_BASE_ADDRESS+28,0,EEPROM_MMANAGER_BASE_ADDRESS+29,0,EEPROM_MMANAGER_BASE_ADDRESS+30,0,EEPROM_MMANAGER_BASE_ADDRESS+31,0,EEPROM_MMANAGER_BASE_ADDRESS+32); +head_tracking_eeprom_data(darwin_head_tracking,".eeprom",EEPROM_HEAD_TRACKING_MM_BASE_ADDRESS,DEFAULT_HEAD_PAN_P_GAIN,DEFAULT_HEAD_PAN_I_GAIN,DEFAULT_HEAD_PAN_D_GAIN,DEFAULT_HEAD_PAN_I_CLAMP,DEFAULT_HEAD_TILT_P_GAIN,DEFAULT_HEAD_TILT_I_GAIN,DEFAULT_HEAD_TILT_D_GAIN,DEFAULT_HEAD_TILT_I_CLAMP,DEFAULT_HEAD_PAN_SERVO_ID,DEFAULT_HEAD_TILT_SERVO_ID); + +walk_eeprom_data(darwin_walk,".eeprom",EEPROM_WALK_MM_BASE_ADDRESS,DEFAULT_WALK_X_OFFSET,DEFAULT_WALK_Y_OFFSET,DEFAULT_WALK_Z_OFFSET,DEFAULT_WALK_ROLL_OFFSET,DEFAULT_WALK_PITCH_OFFSET,DEFAULT_WALK_YAW_OFFSET,DEFAULT_WALK_HIP_PITCH_OFFSET,DEFAULT_WALK_PERIOD_TIME,DEFAULT_WALK_DSP_RATIO,DEFAULT_WALK_STEP_FW_BW_RATIO,DEFAULT_WALK_FOOT_HEIGHT,DEFAULT_WALK_SWING_RIGHT_LEFT,DEFAULT_WALK_SWING_TOP_DOWN,DEFAULT_WALK_PELVIS_OFFSET,DEFAULT_WALK_ARM_SWING_GAIN,DEFAULT_WALK_MAX_VEL,DEFAULT_WALK_MAX_ROT_VEL,DEFAULT_WALK_R_HIP_YAW_SERVO_ID,DEFAULT_WALK_R_HIP_ROLL_SERVO_ID,DEFAULT_WALK_R_HIP_PITCH_SERVO_ID,DEFAULT_WALK_R_KNEE_SERVO_ID,DEFAULT_WALK_R_ANKLE_PITCH_SERVO_ID,DEFAULT_WALK_R_ANKLE_ROLL_SERVO_ID,DEFAULT_WALK_R_SHOULDER_PITCH_SERVO_ID,DEFAULT_WALK_L_HIP_YAW_SERVO_ID,DEFAULT_WALK_L_HIP_ROLL_SERVO_ID,DEFAULT_WALK_L_HIP_PITCH_SERVO_ID,DEFAULT_WALK_L_KNEE_SERVO_ID,DEFAULT_WALK_L_ANKLE_PITCH_SERVO_ID,DEFAULT_WALK_L_ANKLE_ROLL_SERVO_ID,DEFAULT_WALK_L_SHOULDER_PITCH_SERVO_ID); + unsigned char darwin_mm_init(TScheduler *scheduler,TMemory *memory) { + // initialize dynamixel manager dyn_manager_init(&darwin_dyn_manager,memory,scheduler,SCHED_CH3,SCHED_CH2,RAM_DYN_MANAGER_BASE_ADDRESS,EEPROM_DYN_MANAGER_BASE_ADDRESS); + // initialize dynamixel master darwin_master=darwin_dyn_master_init(); + // add master to manager dyn_manager_add_master(&darwin_dyn_manager,darwin_master); + // initialize motion manager mmanager_init(&darwin_mmanager,memory,RAM_MMANAGER_BASE_ADDRESS,EEPROM_MMANAGER_BASE_ADDRESS); + // initialize action motion module action_init(&action_mm,memory,RAM_ACTION_MM_BASE_ADDRESS); + // add action module to motion manager mmanager_add_module(&darwin_mmanager,action_get_module(&action_mm)); + // initialize joint motion module + joint_motion_init(&joints_mm,memory,RAM_JOINT_MOTION_MM_BASE_ADDRESS); + // add joint motion module to motion manager + mmanager_add_module(&darwin_mmanager,joint_motion_get_module(&joints_mm)); + // initialize head tracking motion module + head_tracking_init(&head_mm,memory,RAM_HEAD_TRACKING_MM_BASE_ADDRESS,EEPROM_HEAD_TRACKING_MM_BASE_ADDRESS); + // add head tracking module to motion manager + mmanager_add_module(&darwin_mmanager,head_tracking_get_module(&head_mm)); + EE_update_num_variables(EEPROM_HEAD_TRACKING_LENGTH); + // initialize walking motion module + walk_init(&walk_mm,memory,RAM_WALK_MM_BASE_ADDRESS,EEPROM_WALK_MM_BASE_ADDRESS); + walk_mm.leg_ik_function=darwin_leg_ik; + // add walk module to motion manager + mmanager_add_module(&darwin_mmanager,walk_get_module(&walk_mm)); + EE_update_num_variables(EEPROM_WALK_LENGTH); + // add motion manager to dynamixel manager dyn_manager_add_module(&darwin_dyn_manager,mmanager_get_dyn_module(&darwin_mmanager)); EE_update_num_variables(EEPROM_DYN_MANAGER_LENGTH+EEPROM_DYN_MODULE_LENGTH+EEPROM_MM_LENGTH);