Customer_controller/USER/kinematics.c

107 lines
4.7 KiB
C
Raw Normal View History

//
// Created by 24871 on 2024/10/2.
//
#include "kinematics.h"
#include "RobotAlgorithmModule.h"
#include "arm_math.h"
2024-10-23 15:47:41 +08:00
#include "dm_motor_ctrl.h"
Link_Parameter_s Link[4];
2024-10-23 15:47:41 +08:00
double curr = -2.8,curr_3=-0.5;
double 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;
2024-10-23 15:47:41 +08:00
}
void Kinematic_Calculate() {
//计算通用其次变换矩阵
2024-10-23 15:47:41 +08:00
int num = 0;
Link[0].angle = motor[Motor1].para.pos;
Link[1].angle = motor[Motor2].para.pos;
Link[2].angle = motor[Motor3].para.pos;
Link[3].angle = motor[Motor4].para.pos;
for (num = 0; num<4; num++) {
Link[num].transformation_matrix[0][0] = cos(Link[num].angle);
Link[num].transformation_matrix[0][1] = -sin(Link[num].angle) * cos(Link[num].twist);
Link[num].transformation_matrix[0][2] = sin(Link[num].angle) * sin(Link[num].twist);
Link[num].transformation_matrix[0][3] = Link[num].length * cos(Link[num].angle);
Link[num].transformation_matrix[1][0] = sin(Link[num].angle);
Link[num].transformation_matrix[1][1] = cos(Link[num].angle) * cos(Link[num].twist);
Link[num].transformation_matrix[1][2] = -cos(Link[num].angle) * sin(Link[num].twist);
Link[num].transformation_matrix[1][3] = Link[num].length * sin(Link[num].angle);
Link[num].transformation_matrix[2][0] = 0;
Link[num].transformation_matrix[2][1] = sin(Link[num].twist);
Link[num].transformation_matrix[2][2] = cos(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
double m = Total_Transformation_Matrix[1][3] - Link[3].length * Total_Transformation_Matrix[1][0] -
Link[3].offset * Total_Transformation_Matrix[1][2];
double n = Total_Transformation_Matrix[0][3] - Link[3].length * Total_Transformation_Matrix[0][0] -
Link[3].offset * Total_Transformation_Matrix[0][2];
Link[0].angle_set = atan2(m, n) - atan2(Link[1].offset, 0);
//关节3
Link[2].angle_set = acos(Total_Transformation_Matrix[1][2] * cos(Link[0].angle_set) -
Total_Transformation_Matrix[0][2] * sin(Link[0].angle));
2024-10-23 15:47:41 +08:00
Link[2].angle_set2 = -acos(Total_Transformation_Matrix[1][2] * cos(Link[0].angle_set) -
Total_Transformation_Matrix[0][2] * sin(Link[0].angle));
//关节4
double mm = -Total_Transformation_Matrix[1][2];
double nn = Total_Transformation_Matrix[0][2];
2024-10-23 15:47:41 +08:00
Link[3].angle_set2 = atan2(mm, nn) - atan2(cos(Link[1].angle_set), sqrt(mm * mm + nn * nn -
cos(Link[1].angle_set) *
cos(Link[1].angle_set)));
Link[3].angle_set = atan2(mm, nn) - atan2(sin(Link[1].angle_set), -sqrt(mm * mm + nn * nn -
cos(Link[1].angle_set) *
cos(Link[1].angle_set)));
//关节2
Link[1].angle_set = asin(Total_Transformation_Matrix[2][2] / sin(Link[2].angle_set));
2024-10-23 15:47:41 +08:00
Link[1].angle_set2 = -asin(Total_Transformation_Matrix[2][2] / sin(Link[2].angle_set));
motor[Motor1].ctrl.pos_set = Link[0].angle_set;
if(Link[2].angle>=0) motor[Motor2].ctrl.pos_set = Link[1].angle_set;
else motor[Motor2].ctrl.pos_set = Link[1].angle_set2;
if(Link[2].angle>=0) motor[Motor3].ctrl.pos_set = Link[2].angle_set;
else motor[Motor3].ctrl.pos_set = Link[2].angle_set2;
motor[Motor4].ctrl.pos_set = Link[3].angle_set;
motor[Motor1].ctrl.tor_set = curr * sin(Link[0].angle);
motor[Motor3].ctrl.tor_set = curr_3 * sin(Link[2].angle);
}