Customer_controller/USER/kinematics.c

82 lines
3.2 KiB
C
Raw Normal View History

//
// Created by 24871 on 2024/10/2.
//
#include "kinematics.h"
#include "RobotAlgorithmModule.h"
#include "arm_math.h"
Link_Parameter_s Link[4];
float Total_Transformation_Matrix[4][4],Process1_Transformation_Matrix[4][4],Process2_Transformation_Matrix[4][4];
void Kinematic_Init()
{
Link[0].length = LINK_LENGTH1;
Link[1].length = LINK_LENGTH2;
Link[2].length = LINK_LENGTH3;
Link[3].length = LINK_LENGTH4;
Link[0].offset = LINK_OFFSET1;
Link[1].offset = LINK_OFFSET2;
Link[2].offset = LINK_OFFSET3;
Link[3].offset = LINK_OFFSET4;
Link[0].twist = LINK_TWIST1;
Link[1].twist = LINK_TWIST2;
Link[2].twist = LINK_TWIST3;
Link[3].twist = LINK_TWIST4;
}
void Kinematic_Calculate()
{
//计算通用其次变换矩阵
for(int num=0;num++;num<4)
{
Link[num].transformation_matrix[0][0]=cosf(Link[num].angle);
Link[num].transformation_matrix[0][1]=-sinf(Link[num].angle)*cosf(Link[num].twist);
Link[num].transformation_matrix[0][2]=sinf(Link[num].angle)*sinf(Link[num].twist);
Link[num].transformation_matrix[0][3]=Link[num].length*cosf(Link[num].angle);
Link[num].transformation_matrix[1][0]=sinf(Link[num].angle);
Link[num].transformation_matrix[1][1]=cosf(Link[num].angle)*cosf(Link[num].twist);
Link[num].transformation_matrix[1][2]=-cosf(Link[num].angle)*sinf(Link[num].twist);
Link[num].transformation_matrix[1][3]=Link[num].length*sinf(Link[num].angle);
Link[num].transformation_matrix[2][0]=0;
Link[num].transformation_matrix[2][1]=sinf(Link[num].twist);
Link[num].transformation_matrix[2][2]=cosf(Link[num].twist);
Link[num].transformation_matrix[2][3]=Link[num].offset;
Link[num].transformation_matrix[3][0]=0;
Link[num].transformation_matrix[3][1]=0;
Link[num].transformation_matrix[3][2]=0;
Link[num].transformation_matrix[3][3]=1;
}
//求出总变换(正运动学)
Matrix4Mult(Link[0].transformation_matrix,Link[1].transformation_matrix,Process1_Transformation_Matrix);
Matrix4Mult(Process1_Transformation_Matrix,Link[2].transformation_matrix,Process2_Transformation_Matrix);
Matrix4Mult(Process2_Transformation_Matrix,Link[3].transformation_matrix,Total_Transformation_Matrix);
//逆运动学
//关节1
float m=Total_Transformation_Matrix[1][3]-Link[3].length*Total_Transformation_Matrix[1][0]-Link[3].offset*Total_Transformation_Matrix[1][2];
float n=Total_Transformation_Matrix[0][3]-Link[3].length*Total_Transformation_Matrix[0][0]-Link[3].offset*Total_Transformation_Matrix[0][2];
//TODO:多解,需要一个判断位来选择解
Link[0].angle_set = atan2f(m,n)-atan2f(Link[1].offset, sqrtf(m*m+n*n-Link[2].offset*Link[2].offset));
Link[0].angle_set = atan2f(m,n)-atan2f(Link[1].offset, -sqrtf(m*m+n*n-Link[2].offset*Link[2].offset));
//关节3
//TODO:多解问题
Link[2].angle_set = acosf(Total_Transformation_Matrix[1][2]*cosf(Link[0].angle_set)-Total_Transformation_Matrix[0][2]*sinf(Link[0].angle));
Link[2].angle_set = -acosf(Total_Transformation_Matrix[1][2]*cosf(Link[0].angle_set)-Total_Transformation_Matrix[0][2]*sinf(Link[0].angle));
}