diff --git a/dynamixel_manager/Makefile b/dynamixel_manager/Makefile index 638a1bfc3c31bb541b6f27a99b127138573184db..4974a0a98ab9976a6676b79e5eb9a4426d6731eb 100755 --- a/dynamixel_manager/Makefile +++ b/dynamixel_manager/Makefile @@ -19,7 +19,7 @@ SCHEDULER_PATH = ../scheduler INCLUDE_DIRS = -I./include/ -I./include/modules -I$(COMM_PATH)/include -I$(UTILS_PATH)/include -I$(DYN_BASE_PATH)/include -I$(MEMORY_PATH)/include -I$(SCHEDULER_PATH)/include -MACROS = -DMAX_DYN_MASTER_TX_BUFFER_LEN=256 -DMAX_DYN_MASTER_RX_BUFFER_LEN=256 -DDYN_MANAGER_MAX_NUM_MASTERS=4 -DDYN_MANAGER_MAX_NUM_MODULES=8 -DDYN_MANAGER_MAX_NUM_DEVICES=32 -DDYN_MANAGER_MAX_NUM_SINGLE_OP=16 -DDYN_MANAGER_MAX_NUM_SYNC_OP=4 -DDYN_MANAGER_MAX_NUM_BULK_OP=4 -DMODULE_MAX_NUM_MODELS=32 -DMM_MAX_NUM_MOTION_MODULES=8 -DNUM_MOTION_PAGES=256 +MACROS = -DMAX_DYN_MASTER_TX_BUFFER_LEN=256 -DMAX_DYN_MASTER_RX_BUFFER_LEN=256 -DDYN_MANAGER_MAX_NUM_MASTERS=4 -DDYN_MANAGER_MAX_NUM_MODULES=8 -DDYN_MANAGER_MAX_NUM_DEVICES=32 -DDYN_MANAGER_MAX_NUM_SINGLE_OP=16 -DDYN_MANAGER_MAX_NUM_SYNC_OP=4 -DDYN_MANAGER_MAX_NUM_BULK_OP=4 -DMODULE_MAX_NUM_MODELS=32 -DMM_MAX_NUM_MOTION_MODULES=8 -DNUM_MOTION_PAGES=256 -DNUM_JOINT_GROUPS=4 TCHAIN_PREFIX=arm-none-eabi- diff --git a/dynamixel_manager/include/modules/action.h b/dynamixel_manager/include/modules/action.h index da727468f95e769a37f04fa51b23077ac22fa1a8..0e9a1beb58f6209f90f8069f6df5d261a1670afa 100755 --- a/dynamixel_manager/include/modules/action.h +++ b/dynamixel_manager/include/modules/action.h @@ -1,14 +1,14 @@ #ifndef _ACTION_H #define _ACTION_H -#ifdef __cplusplus -extern "C" { -#endif - #include "motion_pages.h" #include "motion_module.h" #include "memory.h" +#ifdef __cplusplus +extern "C" { +#endif + typedef enum {ACTION_PRE,ACTION_MAIN,ACTION_POST,ACTION_PAUSE} action_states; typedef struct{ diff --git a/dynamixel_manager/include/modules/head_tracking.h b/dynamixel_manager/include/modules/head_tracking.h index 4b552b796b89217cb78c9866e1fb876721b385c4..b4e9a3d0d24c5644ff71b11637bac5f36b8aa441 100644 --- a/dynamixel_manager/include/modules/head_tracking.h +++ b/dynamixel_manager/include/modules/head_tracking.h @@ -1,13 +1,14 @@ #ifndef _HEAD_TRACKING_H #define _HEAD_TRACKINH_H +#include "head_tracking_registers.h" +#include "motion_module.h" +#include "memory.h" + #ifdef __cplusplus extern "C" { #endif -#include "motion_module.h" -#include "memory.h" - typedef struct{ unsigned short int kp; unsigned short int ki; @@ -37,6 +38,7 @@ typedef struct{ // public functions unsigned char head_tracking_init(THeadMModule *joint,TMemory *memory,unsigned short int ram_base_address,unsigned short int eeprom_base_address); +TMotionModule *head_tracking_get_module(THeadMModule *head); void head_tracking_start(THeadMModule *joint); void head_tracking_stop(THeadMModule *joint); unsigned char head_is_tracking(THeadMModule *joint); diff --git a/dynamixel_manager/include/modules/head_tracking_registers.h b/dynamixel_manager/include/modules/head_tracking_registers.h index 761a2c45348383e981d7c54a7f7287b6de0b1d7e..a127cc35250c6662fc075b47a8580efc44e5dca8 100644 --- a/dynamixel_manager/include/modules/head_tracking_registers.h +++ b/dynamixel_manager/include/modules/head_tracking_registers.h @@ -45,7 +45,7 @@ unsigned short int name##_eeprom_data[] __attribute__ ((section (section_name))) DEFAULT_TILT_D_GAIN&0x00FF,base_address+HEAD_TRACKING_TILT_D_GAIN_OFFSET, \ (DEFAULT_TILT_D_GAIN>>8)&0x00FF,base_address+HEAD_TRACKING_TILT_D_GAIN_OFFSET+1, \ DEFAULT_TILT_I_CLAMP&0x00FF,base_address+HEAD_TRACKING_TILT_I_CLAMP_OFFSET, \ - (DEFAULT_TILT_I_CLAMP>>8)&0x00FF,base_address+HEAD_TRACKING_TILT_I_CLAMP_OFFSET+1 \ + (DEFAULT_TILT_I_CLAMP>>8)&0x00FF,base_address+HEAD_TRACKING_TILT_I_CLAMP_OFFSET+1, \ DEFAULT_PAN_SERVO_ID&0x00FF,base_address+HEAD_TRACKING_PAN_SERVO_ID_OFFSET, \ DEFAULT_TILT_SERVO_ID&0x00FF,base_address+HEAD_TRACKING_TILT_SERVO_ID_OFFSET}; diff --git a/dynamixel_manager/include/modules/joint_motion.h b/dynamixel_manager/include/modules/joint_motion.h index dce4992ad5f158bc9f9033a2db0a8c744aa5f13b..bd92ebf2b1a5cf856c9980857a8fc64d19b22d5e 100644 --- a/dynamixel_manager/include/modules/joint_motion.h +++ b/dynamixel_manager/include/modules/joint_motion.h @@ -1,14 +1,17 @@ #ifndef _JOINT_MOTION_H #define _JOINT_MOTION_H +#include "joint_motion_registers.h" +#include "motion_module.h" +#include "memory.h" + #ifdef __cplusplus extern "C" { #endif -#include "motion_module.h" -#include "memory.h" - -#define NUM_JOINT_GROUPS 4 +#ifndef NUM_JOINT_GROUPS + #error "Please, specify the maximum number of joint groups with the NUM_JOINT_GROUPS macro" +#endif typedef struct{ TMotionModule mmodule; @@ -31,6 +34,7 @@ typedef struct{ // public functions unsigned char joint_motion_init(TJointMModule *joint,TMemory *memory,unsigned short int ram_base_address); +TMotionModule *joint_motion_get_module(TJointMModule *action); void joint_motion_set_group_servos(TJointMModule *joint,unsigned char group_id,unsigned int servos); unsigned int joint_motion_get_group_servos(TJointMModule *joint,unsigned char group_id); void joint_motion_start(TJointMModule *joint,unsigned char group_id); diff --git a/dynamixel_manager/include/modules/old/darwin_kinematics.h b/dynamixel_manager/include/modules/old/darwin_kinematics.h deleted file mode 100755 index 783781e8a49a95ab0aecd55691071913b5096959..0000000000000000000000000000000000000000 --- a/dynamixel_manager/include/modules/old/darwin_kinematics.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _DARWIN_KINEMATICS_H -#define _DARWIN_KINEMATICS_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "stm32f1xx.h" - -#define DARWIN_PELVIS_LENGTH 29.0 //mm -#define DARWIN_LEG_SIDE_OFFSET 37.0 //mm -#define DARWIN_THIGH_LENGTH 93.0 //mm -#define DARWIN_CALF_LENGTH 93.0 //mm -#define DARWIN_ANKLE_LENGTH 33.5 //mm -#define DARWIN_LEG_LENGTH (DARWIN_THIGH_LENGTH + DARWIN_CALF_LENGTH + DARWIN_ANKLE_LENGTH) //mm (THIGH_LENGTH + CALF_LENGTH + ANKLE_LENGTH) - -// public functions -uint8_t darwin_leg_ik(float *out, float x, float y, float z, float a, float b, float c); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/dynamixel_manager/include/modules/old/darwin_math.h b/dynamixel_manager/include/modules/old/darwin_math.h deleted file mode 100755 index 82ef927c3d8c6a225cfe6c18086c37e10ea5d4a6..0000000000000000000000000000000000000000 --- a/dynamixel_manager/include/modules/old/darwin_math.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef _DARWIN_MATH_H -#define _DARWIN_MATH_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "stm32f1xx.h" - -#define PI 3.14159 - -typedef struct{ - float x; - float y; - float z; -}TPoint3D; - -// point public functions -void point3d_init(TPoint3D *point); -void point3d_load(TPoint3D *point, float x, float y, float z); -void point3d_copy(TPoint3D *point_dst, TPoint3D *point_src); - -typedef struct { - float x; - float y; - float z; -}TVector3D; - -// vector public functions -void vector3d_init(TVector3D *vector); -void vector3d_load(TVector3D *vector, float x, float y, float z); -void vector3d_copy(TVector3D *vector_dst, TVector3D *vector_src); -float vector3d_length(TVector3D *vector); - -enum{ - m00=0, - m01, - m02, - m03, - m10, - m11, - m12, - m13, - m20, - m21, - m22, - m23, - m30, - m31, - m32, - m33, -}; - -typedef struct{ - float coef[16]; -}TMatrix3D; - -// matrix public functions -void matrix3d_init(TMatrix3D *matrix); -void matrix3d_copy(TMatrix3D *matrix_dst, TMatrix3D *matrix_src); -void matrix3d_identity(TMatrix3D *matrix); -uint8_t matrix3d_inverse(TMatrix3D *org, TMatrix3D *inv); -void matrix3d_set_transform(TMatrix3D *matrix, TPoint3D *point, TVector3D *vector); -void matrix3d_mult(TMatrix3D *dst,TMatrix3D *a,TMatrix3D *b); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/dynamixel_manager/include/modules/walk.h b/dynamixel_manager/include/modules/walk.h index 09131c27c4ea20d8a700bae2fff59eed826f2b1b..f014a00b10d0ca92bddecf007d85582ea3a4be1c 100755 --- a/dynamixel_manager/include/modules/walk.h +++ b/dynamixel_manager/include/modules/walk.h @@ -5,6 +5,7 @@ extern "C" { #endif +#include "walk_registers.h" #include "motion_module.h" #include "memory.h" @@ -88,6 +89,7 @@ typedef struct{ // public functions unsigned char walk_init(TWalkMModule *walk,TMemory *memory,unsigned short int ram_base_address,unsigned short int eeprom_base_address); +TMotionModule *walk_get_module(TWalkMModule *walk); void walk_start(TWalkMModule *walk); void walk_stop(TWalkMModule *walk); unsigned char is_walk(TWalkMModule *walk); diff --git a/dynamixel_manager/include/modules/walk_registers.h b/dynamixel_manager/include/modules/walk_registers.h index ac0ef5d92899a63abfdec010decba3ca0cae9217..ffcb8e111539e26bed6623f5577de4ee66be69c8 100644 --- a/dynamixel_manager/include/modules/walk_registers.h +++ b/dynamixel_manager/include/modules/walk_registers.h @@ -68,20 +68,20 @@ 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_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_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/old/darwin_kinematics.c b/dynamixel_manager/src/modules/old/darwin_kinematics.c deleted file mode 100755 index a60ca577c8c7529d72d3d5d012f44eede9e65e10..0000000000000000000000000000000000000000 --- a/dynamixel_manager/src/modules/old/darwin_kinematics.c +++ /dev/null @@ -1,82 +0,0 @@ -#include "darwin_kinematics.h" -#include "darwin_math.h" -#include <math.h> - -uint8_t darwin_leg_ik(float *out, float x, float y, float z, float a, float b, float c) -{ - TMatrix3D Tad, Tda, Tcd, Tdc, Tac; - TVector3D vec,orientation; - TPoint3D position; - float _Rac, _Acos, _Atan, _k, _l, _m, _n, _s, _c, _theta; - - vector3d_load(&orientation,a * 180.0 / PI, b * 180.0 / PI, c * 180.0 / PI); - point3d_load(&position,x, y, z - DARWIN_LEG_LENGTH); - matrix3d_set_transform(&Tad,&position,&orientation); - - vec.x = x + Tad.coef[2] * DARWIN_ANKLE_LENGTH; - vec.y = y + Tad.coef[6] * DARWIN_ANKLE_LENGTH; - vec.z = (z - DARWIN_LEG_LENGTH) + Tad.coef[10] * DARWIN_ANKLE_LENGTH; - - // Get Knee - _Rac = vector3d_length(&vec); - _Acos = acos((_Rac * _Rac - DARWIN_THIGH_LENGTH * DARWIN_THIGH_LENGTH - DARWIN_CALF_LENGTH * DARWIN_CALF_LENGTH) / (2 * DARWIN_THIGH_LENGTH * DARWIN_CALF_LENGTH)); - if(isnan(_Acos) == 1) - return 0x00;; - *(out + 3) = _Acos; - - // Get Ankle Roll - Tda = Tad; - if(matrix3d_inverse(&Tda,&Tda) == 0x00) - return 0x00; - _k = sqrt(Tda.coef[7] * Tda.coef[7] + Tda.coef[11] * Tda.coef[11]); - _l = sqrt(Tda.coef[7] * Tda.coef[7] + (Tda.coef[11] - DARWIN_ANKLE_LENGTH) * (Tda.coef[11] - DARWIN_ANKLE_LENGTH)); - _m = (_k * _k - _l * _l - DARWIN_ANKLE_LENGTH * DARWIN_ANKLE_LENGTH) / (2 * _l * DARWIN_ANKLE_LENGTH); - if(_m > 1.0) - _m = 1.0; - else if(_m < -1.0) - _m = -1.0; - _Acos = acos(_m); - if(isnan(_Acos) == 1) - return 0x00; - if(Tda.coef[7] < 0.0) - *(out + 5) = -_Acos; - else - *(out + 5) = _Acos; - // Get Hip Yaw - vector3d_load(&orientation,*(out + 5) * 180.0 / PI, 0, 0); - point3d_load(&position,0, 0, -DARWIN_ANKLE_LENGTH); - matrix3d_set_transform(&Tcd,&position,&orientation); - Tdc = Tcd; - if(matrix3d_inverse(&Tdc,&Tdc) == 0x00) - return 0x00; - matrix3d_mult(&Tac,&Tad,&Tdc); - _Atan = atan2(-Tac.coef[1] , Tac.coef[5]); - if(isinf(_Atan) == 1) - return 0x00; - *(out) = _Atan; - - // Get Hip Roll - _Atan = atan2(Tac.coef[9], -Tac.coef[1] * sin(*(out)) + Tac.coef[5] * cos(*(out))); - if(isinf(_Atan) == 1) - return 0x00; - *(out + 1) = _Atan; - - // Get Hip Pitch and Ankle Pitch - _Atan = atan2(Tac.coef[2] * cos(*(out)) + Tac.coef[6] * sin(*(out)), Tac.coef[0] * cos(*(out)) + Tac.coef[4] * sin(*(out))); - if(isinf(_Atan) == 1) - return 0x00; - _theta = _Atan; - _k = sin(*(out + 3)) * DARWIN_CALF_LENGTH; - _l = -DARWIN_THIGH_LENGTH - cos(*(out + 3)) * DARWIN_CALF_LENGTH; - _m = cos(*(out)) * vec.x + sin(*(out)) * vec.y; - _n = cos(*(out + 1)) * vec.z + sin(*(out)) * sin(*(out + 1)) * vec.x - cos(*(out)) * sin(*(out + 1)) * vec.y; - _s = (_k * _n + _l * _m) / (_k * _k + _l * _l); - _c = (_n - _k * _s) / _l; - _Atan = atan2(_s, _c); - if(isinf(_Atan) == 1) - return 0x00; - *(out + 2) = _Atan; - *(out + 4) = _theta - *(out + 3) - *(out + 2); - - return 0x01; -} diff --git a/dynamixel_manager/src/modules/old/darwin_math.c b/dynamixel_manager/src/modules/old/darwin_math.c deleted file mode 100755 index e76646357603c96cf91e2dc5994c9fea00f1971d..0000000000000000000000000000000000000000 --- a/dynamixel_manager/src/modules/old/darwin_math.c +++ /dev/null @@ -1,237 +0,0 @@ -#include "darwin_math.h" -#include <math.h> - -// point functions -void point3d_init(TPoint3D *point) -{ - point->x=0.0; - point->y=0.0; - point->z=0.0; -} - -void point3d_load(TPoint3D *point, float x, float y,float z) -{ - point->x=x; - point->y=y; - point->z=z; -} - -void point3d_copy(TPoint3D *point_dst, TPoint3D *point_src) -{ - point_dst->x=point_src->x; - point_dst->y=point_src->y; - point_dst->z=point_src->z; -} - -// vector functions -void vector3d_init(TVector3D *vector) -{ - vector->x=0.0; - vector->y=0.0; - vector->z=0.0; -} - -void vector3d_load(TVector3D *vector, float x, float y, float z) -{ - vector->x=x; - vector->y=y; - vector->z=z; -} - -void vector3d_copy(TVector3D *vector_dst, TVector3D *vector_src) -{ - vector_dst->x=vector_src->x; - vector_dst->y=vector_src->y; - vector_dst->z=vector_src->z; -} - -float vector3d_length(TVector3D *vector) -{ - return sqrt(vector->x*vector->x + vector->y*vector->y + vector->z*vector->z); -} - -// matrix functions -void matrix3d_init(TMatrix3D *matrix) -{ - matrix3d_identity(matrix); -} - -void matrix3d_copy(TMatrix3D *matrix_dst, TMatrix3D *matrix_src) -{ - matrix_dst->coef[m00]=matrix_src->coef[m00]; - matrix_dst->coef[m01]=matrix_src->coef[m01]; - matrix_dst->coef[m02]=matrix_src->coef[m02]; - matrix_dst->coef[m03]=matrix_src->coef[m03]; - matrix_dst->coef[m10]=matrix_src->coef[m10]; - matrix_dst->coef[m11]=matrix_src->coef[m11]; - matrix_dst->coef[m12]=matrix_src->coef[m12]; - matrix_dst->coef[m13]=matrix_src->coef[m13]; - matrix_dst->coef[m20]=matrix_src->coef[m20]; - matrix_dst->coef[m21]=matrix_src->coef[m21]; - matrix_dst->coef[m22]=matrix_src->coef[m22]; - matrix_dst->coef[m23]=matrix_src->coef[m23]; - matrix_dst->coef[m30]=matrix_src->coef[m30]; - matrix_dst->coef[m31]=matrix_src->coef[m31]; - matrix_dst->coef[m32]=matrix_src->coef[m32]; - matrix_dst->coef[m33]=matrix_src->coef[m33]; -} - -void matrix3d_zero(TMatrix3D *matrix) -{ - matrix->coef[m00]=0.0; - matrix->coef[m01]=0.0; - matrix->coef[m02]=0.0; - matrix->coef[m03]=0.0; - matrix->coef[m10]=0.0; - matrix->coef[m11]=0.0; - matrix->coef[m12]=0.0; - matrix->coef[m13]=0.0; - matrix->coef[m20]=0.0; - matrix->coef[m21]=0.0; - matrix->coef[m22]=0.0; - matrix->coef[m23]=0.0; - matrix->coef[m30]=0.0; - matrix->coef[m31]=0.0; - matrix->coef[m32]=0.0; - matrix->coef[m33]=0.0; -} - -void matrix3d_identity(TMatrix3D *matrix) -{ - matrix->coef[m00]=1.0; - matrix->coef[m01]=0.0; - matrix->coef[m02]=0.0; - matrix->coef[m03]=0.0; - matrix->coef[m10]=0.0; - matrix->coef[m11]=1.0; - matrix->coef[m12]=0.0; - matrix->coef[m13]=0.0; - matrix->coef[m20]=0.0; - matrix->coef[m21]=0.0; - matrix->coef[m22]=1.0; - matrix->coef[m23]=0.0; - matrix->coef[m30]=0.0; - matrix->coef[m31]=0.0; - matrix->coef[m32]=0.0; - matrix->coef[m33]=1.0; -} - -uint8_t matrix3d_inverse(TMatrix3D *org, TMatrix3D *inv) -{ - TMatrix3D src, tmp; - float det; - uint8_t i; - - /* transpose matrix */ - for (i = 0; i < 4; i++) - { - src.coef[i] = org->coef[i*4]; - src.coef[i + 4] = org->coef[i*4 + 1]; - src.coef[i + 8] = org->coef[i*4 + 2]; - src.coef[i + 12] = org->coef[i*4 + 3]; - } - - /* calculate pairs for first 8 elements (cofactors) */ - tmp.coef[0] = src.coef[10] * src.coef[15]; - tmp.coef[1] = src.coef[11] * src.coef[14]; - tmp.coef[2] = src.coef[9] * src.coef[15]; - tmp.coef[3] = src.coef[11] * src.coef[13]; - tmp.coef[4] = src.coef[9] * src.coef[14]; - tmp.coef[5] = src.coef[10] * src.coef[13]; - tmp.coef[6] = src.coef[8] * src.coef[15]; - tmp.coef[7] = src.coef[11] * src.coef[12]; - tmp.coef[8] = src.coef[8] * src.coef[14]; - tmp.coef[9] = src.coef[10] * src.coef[12]; - tmp.coef[10] = src.coef[8] * src.coef[13]; - tmp.coef[11] = src.coef[9] * src.coef[12]; - /* calculate first 8 elements (cofactors) */ - inv->coef[0] = (tmp.coef[0]*src.coef[5] + tmp.coef[3]*src.coef[6] + tmp.coef[4]*src.coef[7]) - (tmp.coef[1]*src.coef[5] + tmp.coef[2]*src.coef[6] + tmp.coef[5]*src.coef[7]); - inv->coef[1] = (tmp.coef[1]*src.coef[4] + tmp.coef[6]*src.coef[6] + tmp.coef[9]*src.coef[7]) - (tmp.coef[0]*src.coef[4] + tmp.coef[7]*src.coef[6] + tmp.coef[8]*src.coef[7]); - inv->coef[2] = (tmp.coef[2]*src.coef[4] + tmp.coef[7]*src.coef[5] + tmp.coef[10]*src.coef[7]) - (tmp.coef[3]*src.coef[4] + tmp.coef[6]*src.coef[5] + tmp.coef[11]*src.coef[7]); - inv->coef[3] = (tmp.coef[5]*src.coef[4] + tmp.coef[8]*src.coef[5] + tmp.coef[11]*src.coef[6]) - (tmp.coef[4]*src.coef[4] + tmp.coef[9]*src.coef[5] + tmp.coef[10]*src.coef[6]); - inv->coef[4] = (tmp.coef[1]*src.coef[1] + tmp.coef[2]*src.coef[2] + tmp.coef[5]*src.coef[3]) - (tmp.coef[0]*src.coef[1] + tmp.coef[3]*src.coef[2] + tmp.coef[4]*src.coef[3]); - inv->coef[5] = (tmp.coef[0]*src.coef[0] + tmp.coef[7]*src.coef[2] + tmp.coef[8]*src.coef[3]) - (tmp.coef[1]*src.coef[0] + tmp.coef[6]*src.coef[2] + tmp.coef[9]*src.coef[3]); - inv->coef[6] = (tmp.coef[3]*src.coef[0] + tmp.coef[6]*src.coef[1] + tmp.coef[11]*src.coef[3]) - (tmp.coef[2]*src.coef[0] + tmp.coef[7]*src.coef[1] + tmp.coef[10]*src.coef[3]); - inv->coef[7] = (tmp.coef[4]*src.coef[0] + tmp.coef[9]*src.coef[1] + tmp.coef[10]*src.coef[2]) - (tmp.coef[5]*src.coef[0] + tmp.coef[8]*src.coef[1] + tmp.coef[11]*src.coef[2]); - /* calculate pairs for second 8 elements (cofactors) */ - tmp.coef[0] = src.coef[2]*src.coef[7]; - tmp.coef[1] = src.coef[3]*src.coef[6]; - tmp.coef[2] = src.coef[1]*src.coef[7]; - tmp.coef[3] = src.coef[3]*src.coef[5]; - tmp.coef[4] = src.coef[1]*src.coef[6]; - tmp.coef[5] = src.coef[2]*src.coef[5]; - //Streaming SIMD Extensions - Inverse of 4x4 Matrix 8 - tmp.coef[6] = src.coef[0]*src.coef[7]; - tmp.coef[7] = src.coef[3]*src.coef[4]; - tmp.coef[8] = src.coef[0]*src.coef[6]; - tmp.coef[9] = src.coef[2]*src.coef[4]; - tmp.coef[10] = src.coef[0]*src.coef[5]; - tmp.coef[11] = src.coef[1]*src.coef[4]; - /* calculate second 8 elements (cofactors) */ - inv->coef[8] = (tmp.coef[0]*src.coef[13] + tmp.coef[3]*src.coef[14] + tmp.coef[4]*src.coef[15]) - (tmp.coef[1]*src.coef[13] + tmp.coef[2]*src.coef[14] + tmp.coef[5]*src.coef[15]); - inv->coef[9] = (tmp.coef[1]*src.coef[12] + tmp.coef[6]*src.coef[14] + tmp.coef[9]*src.coef[15]) - (tmp.coef[0]*src.coef[12] + tmp.coef[7]*src.coef[14] + tmp.coef[8]*src.coef[15]); - inv->coef[10] = (tmp.coef[2]*src.coef[12] + tmp.coef[7]*src.coef[13] + tmp.coef[10]*src.coef[15]) - (tmp.coef[3]*src.coef[12] + tmp.coef[6]*src.coef[13] + tmp.coef[11]*src.coef[15]); - inv->coef[11] = (tmp.coef[5]*src.coef[12] + tmp.coef[8]*src.coef[13] + tmp.coef[11]*src.coef[14]) - (tmp.coef[4]*src.coef[12] + tmp.coef[9]*src.coef[13] + tmp.coef[10]*src.coef[14]); - inv->coef[12] = (tmp.coef[2]*src.coef[10] + tmp.coef[5]*src.coef[11] + tmp.coef[1]*src.coef[9]) - (tmp.coef[4]*src.coef[11] + tmp.coef[0]*src.coef[9] + tmp.coef[3]*src.coef[10]); - inv->coef[13] = (tmp.coef[8]*src.coef[11] + tmp.coef[0]*src.coef[8] + tmp.coef[7]*src.coef[10]) - (tmp.coef[6]*src.coef[10] + tmp.coef[9]*src.coef[11] + tmp.coef[1]*src.coef[8]); - inv->coef[14] = (tmp.coef[6]*src.coef[9] + tmp.coef[11]*src.coef[11] + tmp.coef[3]*src.coef[8]) - (tmp.coef[10]*src.coef[11] + tmp.coef[2]*src.coef[8] + tmp.coef[7]*src.coef[9]); - inv->coef[15] = (tmp.coef[10]*src.coef[10] + tmp.coef[4]*src.coef[8] + tmp.coef[9]*src.coef[9]) - (tmp.coef[8]*src.coef[9] + tmp.coef[11]*src.coef[10] + tmp.coef[5]*src.coef[8]); - /* calculate determinant */ - det = src.coef[0]*inv->coef[0] + src.coef[1]*inv->coef[1] + src.coef[2]*inv->coef[2] + src.coef[3]*inv->coef[3]; - /* calculate matrix inverse */ - if (det == 0) - { - det = 0; - return 0x00; - } - else - { - det = 1 / det; - } - - for (i = 0; i < 16; i++) - inv->coef[i]*=det; - - return 0x01; -} - -void matrix3d_set_transform(TMatrix3D *matrix, TPoint3D *point, TVector3D *vector) -{ - float Cx = cos(vector->x * 3.141592 / 180.0); - float Cy = cos(vector->y * 3.141592 / 180.0); - float Cz = cos(vector->z * 3.141592 / 180.0); - float Sx = sin(vector->x * 3.141592 / 180.0); - float Sy = sin(vector->y * 3.141592 / 180.0); - float Sz = sin(vector->z * 3.141592 / 180.0); - - matrix3d_identity(matrix); - matrix->coef[0] = Cz * Cy; - matrix->coef[1] = Cz * Sy * Sx - Sz * Cx; - matrix->coef[2] = Cz * Sy * Cx + Sz * Sx; - matrix->coef[3] = point->x; - matrix->coef[4] = Sz * Cy; - matrix->coef[5] = Sz * Sy * Sx + Cz * Cx; - matrix->coef[6] = Sz * Sy * Cx - Cz * Sx; - matrix->coef[7] = point->y; - matrix->coef[8] = -Sy; - matrix->coef[9] = Cy * Sx; - matrix->coef[10] = Cy * Cx; - matrix->coef[11] = point->z; -} - -void matrix3d_mult(TMatrix3D *dst,TMatrix3D *a,TMatrix3D *b) -{ - uint8_t i,j,c; - - matrix3d_zero(dst); - for(j = 0; j < 4; j++) - { - for(i = 0; i < 4; i++) - { - for(c = 0; c < 4; c++) - { - dst->coef[j*4+i] += a->coef[j*4+c] * b->coef[c*4+i]; - } - } - } -}