Files
RC_WheelLeg/01_doc/control/movement_notes.md
T

1405 lines
52 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "main.h"
#include "Init.h"
PID_motor m3508set[8] = {0};
PID_motor m2006set[8] = {0};
u8 Bound_Flag_Point[2]={1,1};
/**
* @name motor_pid_set
* @brief 电机pid初始化
* @param DJ:内环pid1000、6、0 外环0.1、0、0.006
* @param mode1使用外环
* @param deadband10
*/
void motor_pid_set(void)
{
static u8 i[2];
static float PID[6] = {1000.0f, 6.0f, 0.0f, 0.1f, 0.0f, 0.006f};
static float max_out[2] = {16000.0f, 400.0f};
static float max_idout[2] = {2000.0f, 100.0f};
for(i[0] = 0; i[0] < 4; i[0]++)
{
PID_motoinit(&Motor_PID[i[0]], 1, PID, max_out, max_idout, 0);//3508_1
PID_motoinit(&Motor_PID[i[0] + 4], 1, PID, max_out, max_idout, 0); //3508_2
PID_motoinit(&Motor_PID[i[0] + 8], 1, PID, max_out, max_idout, 0); //2006_1
PID_motoinit(&Motor_PID[i[0] + 12], 1, PID, max_out, max_idout, 0); //2006_2
}
for(i[1] = 0; i[1] < 4; i[1]++)
{
m3508set[i[1]].setpos = 0;
m3508set[i[1]].setspeed = 0;
m3508set[i[1] + 4].setpos = 0;
m3508set[i[1] + 4].setspeed = 0;
m2006set[i[1]].setpos = 0;
m2006set[i[1]].setspeed = 0;
m2006set[i[1] + 4].setpos = 0;
m2006set[i[1] + 4].setspeed = 0;
}
}
/**
* @name MOTOR_PID_CHANGE
* @brief
* @param Mid为0为正常
Mid为1柔性
Mid 为2 速度环加P
* @param
* @retval
*/
void MOTOR_PID_CHANGE(u8 Mid)
{
static float OUT_KP[2]= {0.1,0.03};
static float NUM_max[2]= {16000,8000};
static float IN_KP[2]= {1000,1400};
if(Mid==0)
{
Motor_PID[0].out_Kp=OUT_KP[0];
Motor_PID[1].out_Kp=OUT_KP[0];
Motor_PID[2].out_Kp=OUT_KP[0];
Motor_PID[3].out_Kp=OUT_KP[0];
Motor_PID[4].out_Kp=OUT_KP[0];
Motor_PID[5].out_Kp=OUT_KP[0];
Motor_PID[6].out_Kp=OUT_KP[0];
Motor_PID[7].out_Kp=OUT_KP[0];
Motor_PID[0].in_Kp =IN_KP[0];
Motor_PID[1].in_Kp =IN_KP[0];
Motor_PID[2].in_Kp =IN_KP[0];
Motor_PID[3].in_Kp =IN_KP[0];
Motor_PID[4].in_Kp =IN_KP[0];
Motor_PID[5].in_Kp =IN_KP[0];
Motor_PID[6].in_Kp =IN_KP[0];
Motor_PID[7].in_Kp =IN_KP[0];
Motor_PID[0].in_max_out=NUM_max[0];
Motor_PID[1].in_max_out=NUM_max[0];
Motor_PID[2].in_max_out=NUM_max[0];
Motor_PID[3].in_max_out=NUM_max[0];
Motor_PID[4].in_max_out=NUM_max[0];
Motor_PID[5].in_max_out=NUM_max[0];
Motor_PID[6].in_max_out=NUM_max[0];
Motor_PID[7].in_max_out=NUM_max[0];
}
else if(Mid==1)
{
Motor_PID[0].out_Kp=OUT_KP[1];
Motor_PID[1].out_Kp=OUT_KP[1];
Motor_PID[2].out_Kp=OUT_KP[1];
Motor_PID[3].out_Kp=OUT_KP[1];
Motor_PID[4].out_Kp=OUT_KP[1];
Motor_PID[5].out_Kp=OUT_KP[1];
Motor_PID[6].out_Kp=OUT_KP[1];
Motor_PID[7].out_Kp=OUT_KP[1];
Motor_PID[0].in_Kp =IN_KP[0];
Motor_PID[1].in_Kp =IN_KP[0];
Motor_PID[2].in_Kp =IN_KP[0];
Motor_PID[3].in_Kp =IN_KP[0];
Motor_PID[4].in_Kp =IN_KP[0];
Motor_PID[5].in_Kp =IN_KP[0];
Motor_PID[6].in_Kp =IN_KP[0];
Motor_PID[7].in_Kp =IN_KP[0];
Motor_PID[0].in_max_out=NUM_max[1];
Motor_PID[1].in_max_out=NUM_max[1];
Motor_PID[2].in_max_out=NUM_max[1];
Motor_PID[3].in_max_out=NUM_max[1];
Motor_PID[4].in_max_out=NUM_max[1];
Motor_PID[5].in_max_out=NUM_max[1];
Motor_PID[6].in_max_out=NUM_max[1];
Motor_PID[7].in_max_out=NUM_max[1];
}
else if(Mid==2)
{
Motor_PID[0].out_Kp=OUT_KP[0];
Motor_PID[1].out_Kp=OUT_KP[0];
Motor_PID[2].out_Kp=OUT_KP[0];
Motor_PID[3].out_Kp=OUT_KP[0];
Motor_PID[4].out_Kp=OUT_KP[0];
Motor_PID[5].out_Kp=OUT_KP[0];
Motor_PID[6].out_Kp=OUT_KP[0];
Motor_PID[7].out_Kp=OUT_KP[0];
Motor_PID[0].in_Kp =IN_KP[1];
Motor_PID[1].in_Kp =IN_KP[1];
Motor_PID[2].in_Kp =IN_KP[1];
Motor_PID[3].in_Kp =IN_KP[1];
Motor_PID[4].in_Kp =IN_KP[1];
Motor_PID[5].in_Kp =IN_KP[1];
Motor_PID[6].in_Kp =IN_KP[1];
Motor_PID[7].in_Kp =IN_KP[1];
Motor_PID[0].in_max_out=NUM_max[0];
Motor_PID[1].in_max_out=NUM_max[0];
Motor_PID[2].in_max_out=NUM_max[0];
Motor_PID[3].in_max_out=NUM_max[0];
Motor_PID[4].in_max_out=NUM_max[0];
Motor_PID[5].in_max_out=NUM_max[0];
Motor_PID[6].in_max_out=NUM_max[0];
Motor_PID[7].in_max_out=NUM_max[0];
}
}
/**
* @name Stop_flat_ground(float Height_body)
* @brief stop_flag_speed=0初始速度较小,
* @param stop_flag_speed=1速度较大电流大
* @param
* @retval control.s[3]==2 为平地步态下的位置 control.s[3]==3为上斜坡下的位置 control.s[3]==1为下斜坡的位置
*/
void Stop_flat_ground(float Height_body)
{
// static float step=170;
// static float Slope_Err[2]= {60,60}; //100 240
// static float Slope_step[2]= {170,170}; //100,170
Speed=0.00f;
/*************对刚体坐标E点坐标初始化**************/
if(control.s[3]==2&&(control.s[5]==2||control.s[5]==3||control.s[5]==1)&&control.s[4]==2)//平地归零
{ MOTOR_PID_CHANGE(0);
Xstart[0]=0;
Xstart[1]=0;
Xstart[2]=0;
Xstart[3]=0;
Xend[0]=Xstart[0];
Xend[1]=Xstart[1];
Xend[2]=Xstart[2];
Xend[3]=Xstart[3];
Hight[0]=0;
Hight[3]=Hight[2]=Hight[1]=Hight[0];
Zstart[0]=-Height_body; //can2 id 1,2 腿1
Zstart[1]=-Height_body; //can2 id 3,4 腿2
Zstart[2]=-Height_body+20; //can1 id 1,2 腿3
Zstart[3]=-Height_body+20; //can1 id 3,4 腿4
M3508_stop_postion(10,0.5,TS);
}
else if(control.s[3]==3)//上坡落点
{
MOTOR_PID_CHANGE(0);
Xstart[0]=0;
Xstart[1]=0;
Xstart[2]=0;
Xstart[3]=0;
Xend[0]=Xstart[0];
Xend[1]=Xstart[1];
Xend[2]=Xstart[2];
Xend[3]=Xstart[3];
Hight[0]=0;
Hight[3]=Hight[2]=Hight[1]=Hight[0];
Zstart[0]=-Height_body+50; //can2 id 1,2 腿1
Zstart[1]=-Height_body+50; //can2 id 3,4 腿2
Zstart[2]=-Height_body; //can1 id 1,2 腿3
Zstart[3]=-Height_body; //can1 id 3,4 腿4
M3508_stop_postion(15,0.5,TS);
}
else if(control.s[3]==1)//下坡落点
{
MOTOR_PID_CHANGE(0);
Xstart[0]=0;
Xstart[1]=0;
Xstart[2]=0;
Xstart[3]=0;
Xend[0]=Xstart[0];
Xend[1]=Xstart[1];
Xend[2]=Xstart[2];
Xend[3]=Xstart[3];
Hight[0]=0;
Hight[3]=Hight[2]=Hight[1]=Hight[0];
Zstart[0]=-Height_body; //can2 id 1,2 腿1
Zstart[1]=-Height_body; //can2 id 3,4 腿2
Zstart[2]=-Height_body+50; //can1 id 1,2 腿3
Zstart[3]=-Height_body+50; //can1 id 3,4 腿4
M3508_stop_postion(15,0.5,TS);
}
// else if(control.s[3]==2&&control.s[5]==3)//跷跷板出发位置
// {
// MOTOR_PID_CHANGE(0);
// Xstart[0]=-(Slope_step[0]+Slope_Err[0])/2;
// Xstart[1]=(Slope_step[0]-Slope_Err[0])/2;
// Xstart[2]=(Slope_step[1]-Slope_Err[1])/2;
// Xstart[3]=-(Slope_step[1]+Slope_Err[1])/2;
// Xend[0]=Xstart[0] ; //+step为前进 腿1
// Xend[1]=Xstart[1] ; //腿2
// Xend[2]=Xstart[2] ; //腿3
// Xend[3]=Xstart[3] ; //腿4
// Hight[0]=0;
// Hight[3]=Hight[2]=Hight[1]=Hight[0];
// Zstart[0]=-Height_body+15; //can2 id 1,2 腿1
// Zstart[1]=-Height_body+15; //can2 id 3,4 腿2
// Zstart[2]=-Height_body+20; //can1 id 1,2 腿3
// Zstart[3]=-Height_body+20; //can1 id 3,4 腿4
//
// M3508_stop_postion(20,0.5,TS);
// }
}
void M3508_stop_postion(float setspeed,float arr,float Ts)
{
static float M3508_Angle[16]= {0} ;
static float M2006_Angle[16]= {0} ;
/******************生成E,点坐标********************************/
Leg_cycloid(0,&link[0],arr,Ts,Hight[0],Zstart[0],Xstart[0],Xend[0]);
Leg_cycloid(1,&link[1],arr,Ts,Hight[1],Zstart[1],Xstart[1],Xend[1]);
Leg_cycloid(2,&link[2],arr,Ts,Hight[2],Zstart[2],Xstart[2],Xend[2]);
Leg_cycloid(3,&link[3],arr,Ts,Hight[3],Zstart[3],Xstart[3],Xend[3]);
Inverse_leg(&leg[0],&link[0]);
Inverse_leg(&leg[1],&link[1]); //E3,E4的运动学逆解
Inverse_leg(&leg[2],&link[2]);
Inverse_leg(&leg[3],&link[3]); //E3,E4的运动学逆解
M2006_Angle[0]=(RESET_ANGLE+leg[0].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID1,2 腿1
M2006_Angle[1]=(-RESET_ANGLE2-leg[0].real_angle[1])*M3508Reduction_Ratio;
M2006_Angle[2]=(-RESET_ANGLE-leg[1].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID3,4 腿3
M2006_Angle[3]=(RESET_ANGLE2+leg[1].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[0]=(RESET_ANGLE+leg[2].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID1,2 腿2
M3508_Angle[1]=(-RESET_ANGLE2-leg[2].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[2]=(-RESET_ANGLE-leg[3].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID3,4 腿4
M3508_Angle[3]=(RESET_ANGLE2+leg[3].real_angle[1])*M3508Reduction_Ratio;
m2006set[0].setspeed=setspeed;
m2006set[1].setspeed=setspeed;
m2006set[2].setspeed=setspeed;
m2006set[3].setspeed=setspeed;
m3508set[0].setspeed=setspeed;
m3508set[1].setspeed=setspeed;
m3508set[2].setspeed=setspeed;
m3508set[3].setspeed=setspeed;
m2006set[0].setpos = M2006_Angle[0];
m2006set[1].setpos = M2006_Angle[1];
m2006set[2].setpos = M2006_Angle[2];
m2006set[3].setpos = M2006_Angle[3];
m3508set[0].setpos = M3508_Angle[0];
m3508set[1].setpos = M3508_Angle[1];
m3508set[2].setpos = M3508_Angle[2];
m3508set[3].setpos = M3508_Angle[3];
}
/**
* @name trot_flat_ground
* @brief 对角步态
* @param speed 迈步速度
* @param T[0]=T[3]=0 T[2]=T[1]=0.5 顺序位 左后右前->左前有后
* @retval control.s[3]==2 为平地步态下的位置 control.s[3]==3为上斜坡下的位置 control.s[3]==1为下斜坡的位置
*/
void trot_flat_ground(float step,float length_hight,float Height_body,float speed)
{
MOTOR_PID_CHANGE(0);
static float Deviation_Err=5;//8 平地误差
static float Deviation_Err_s5=0;//8 翘翘板误差
static float Slope_Err[2]= {60,60}; //60 60 跷跷板滞后位置
static float Slope_step[2]= {140,140}; //170,170 跷跷板步长
/*************对刚体坐标E点坐标初始化**************/
if(control.s[5]==3)//跷跷板前进轨迹
{
Speed=0.0035;
if(control.s[1]==4)
{
Xstart[0]=-(Slope_Err[0]+Slope_step[0]+38)/2.0f;
Xstart[1]=-(Slope_Err[0]+Slope_step[0]-30)/2.0f;
Xstart[2]=-(Slope_Err[1]+Slope_step[1]+38)/2.0f;
Xstart[3]=-(Slope_Err[1]+Slope_step[1]-30)/2.0f;
Xend[0]=Xstart[0] + Slope_step[0] +38 ; //+step为前进 腿1
Xend[1]=Xstart[1] + Slope_step[0] -30 ; //腿2
Xend[2]=Xstart[2] + Slope_step[1] +38 ; //腿3
Xend[3]=Xstart[3] + Slope_step[1] -30 ; //腿4
}
else if(control.s[1]==3)
{
Xstart[0]=-(Slope_Err[0]+Slope_step[0]-38)/2.0f;
Xstart[1]=-(Slope_Err[0]+Slope_step[0]+48)/2.0f;
Xstart[2]=-(Slope_Err[1]+Slope_step[1]-38)/2.0f;
Xstart[3]=-(Slope_Err[1]+Slope_step[1]+48)/2.0f;
Xend[0]=Xstart[0] + Slope_step[0] -38 ; //+step为前进 腿1
Xend[1]=Xstart[1] + Slope_step[0] +48 ; //腿2
Xend[2]=Xstart[2] + Slope_step[1] -38 ; //腿3
Xend[3]=Xstart[3] + Slope_step[1] +48 ; //腿4
}
else
{
Xstart[0]=-(Slope_Err[0]+Slope_step[0]-Deviation_Err_s5)/2.0f;
Xstart[1]=-(Slope_Err[0]+Slope_step[0])/2.0f;
Xstart[2]=-(Slope_Err[1]+Slope_step[1]-Deviation_Err_s5)/2.0f;
Xstart[3]=-(Slope_Err[1]+Slope_step[1])/2.0f;
Xend[0]=Xstart[0] + Slope_step[0] -Deviation_Err_s5 ; //+step为前进 腿1
Xend[1]=Xstart[1] + Slope_step[0]-0 ; //腿2
Xend[2]=Xstart[2] + Slope_step[1] -Deviation_Err_s5 ; //腿3
Xend[3]=Xstart[3] + Slope_step[1]-0 ; //腿4
}
Hight[0]=length_hight-20;
Hight[1]=length_hight-20;
Hight[2]=length_hight-20;
Hight[3]=length_hight-20;
Zstart[0]=-Height_body+15; //can2 id 1,2 腿1
Zstart[1]=-Height_body+15; //can2 id 3,4 腿2
Zstart[2]=-Height_body+20; //can1 id 1,2 腿3
Zstart[3]=-Height_body+20; //can1 id 3,4 腿4
}
if(control.s[3]==2&&(control.s[5]==2||control.s[5]==1)&&control.s[4]==2)//正常出发轨迹
{
Speed=speed;
if(control.s[1]==4)
{
Xstart[2]=Xstart[0]=-(130-Deviation_Err)/2.0f;
Xstart[3]=Xstart[1]=-100/2.0f;
Xend[0]=Xstart[0] + 130 -Deviation_Err ; //+step为前进 腿1
Xend[1]=Xstart[1] + 100 ; //腿2
Xend[2]=Xstart[2] + 130 -Deviation_Err ; //腿3
Xend[3]=Xstart[3] + 100 ;
}
else if(control.s[1]==3)
{
Xstart[2]=Xstart[0]=-(100-Deviation_Err)/2.0f;
Xstart[3]=Xstart[1]=-130/2.0f;
Xend[0]=Xstart[0] + 100 -Deviation_Err ; //+step为前进 腿1
Xend[1]=Xstart[1] + 130 ; //腿2
Xend[2]=Xstart[2] + 100 -Deviation_Err ; //腿3
Xend[3]=Xstart[3] + 130 ;
}
else
{
Xstart[2]=Xstart[0]=-(100-Deviation_Err)/2.0f;
Xstart[3]=Xstart[1]=-100/2.0f;
Xend[0]=Xstart[0] + 100 -Deviation_Err ; //+step为前进 腿1
Xend[1]=Xstart[1] + 100 ; //腿2
Xend[2]=Xstart[2] + 100 -Deviation_Err ; //腿3
Xend[3]=Xstart[3] + 100 ; //腿4
}
Hight[0]=length_hight+0;
Hight[1]=length_hight+0;
Hight[2]=length_hight+0;
Hight[3]=length_hight+0;
Zstart[0]=-Height_body; //can2 id 1,2 腿1
Zstart[1]=-Height_body; //can2 id 3,4 腿2
Zstart[2]=-Height_body+20; //can1 id 1,2 腿3
Zstart[3]=-Height_body+20; //can1 id 3,4 腿4
}
else if(control.s[3]==3&&control.s[5]==2)//上坡调整轨迹 步长为50
{
Speed=speed;
// if(control.s[1]==4)
// {
//
// Xstart[0]=-(85)/2.0f;
// Xstart[1]=-50/2.0f;
// Xstart[2]=-(85+50)/2.0f;
// Xstart[3]=-(50+50)/2.0f;
// Xend[0]=Xstart[0] + 85 ; //+step为前进 腿1
// Xend[1]=Xstart[1] + 50 ; //腿2
// Xend[2]=Xstart[2] + 85 ; //腿3
// Xend[3]=Xstart[3] + 50 ; //腿4
// }
// else if(control.s[1]==3)
// {
//
// Xstart[0]=-(55)/2.0f;
// Xstart[1]=-80/2.0f;
// Xstart[2]=-(55+50)/2.0f;
// Xstart[3]=-(80+50)/2.0f;
// Xend[0]=Xstart[0] + 55 ; //+step为前进 腿1
// Xend[1]=Xstart[1] + 80 ; //腿2
// Xend[2]=Xstart[2] + 55 ; //腿3
// Xend[3]=Xstart[3] + 80 ; //腿4
// }
Xstart[0]=-(30)/2.0f;
Xstart[1]=-30/2.0f;
Xstart[2]=-(0+30)/2.0f;
Xstart[3]=-(0+30)/2.0f;
Xend[0]=Xstart[0] + 30 ; //+step为前进 腿1
Xend[1]=Xstart[1] + 30 ; //腿2
Xend[2]=Xstart[2] + 30 ; //腿3
Xend[3]=Xstart[3] + 30 ; //腿4
Hight[0]=length_hight-30;
Hight[1]=length_hight-30;
Hight[2]=length_hight-10;
Hight[3]=length_hight-10;
Zstart[0]=-Height_body+40; //can2 id 1,2 腿1
Zstart[1]=-Height_body+40; //can2 id 3,4 腿2
Zstart[2]=-Height_body-10; //can1 id 1,2 腿3
Zstart[3]=-Height_body-10; //can1 id 3,4 腿4
}
else if(control.s[3]==1&&control.s[5]==2)
{
Speed=0.0032;
Xstart[0]=-(75-Deviation_Err)/2.0f;
Xstart[1]=-75/2.0f;
Xstart[2]=-(75-Deviation_Err)/2.0f;
Xstart[3]=-(75)/2.0f;
Xend[0]=Xstart[0] + 75 -Deviation_Err ; //+step为前进 腿1
Xend[1]=Xstart[1] + 75 ; //腿2
Xend[2]=Xstart[2] + 75 -Deviation_Err ; //腿3
Xend[3]=Xstart[3] + 75 ; //腿4
//腿4
Hight[0]=length_hight-0;
Hight[1]=length_hight-0;
Hight[2]=length_hight-30;
Hight[3]=length_hight-30;
Zstart[0]=-Height_body-10; //can2 id 1,2 腿1
Zstart[1]=-Height_body-10; //can2 id 3,4 腿2
Zstart[2]=-Height_body+40; //can1 id 1,2 腿3
Zstart[3]=-Height_body+40; //can1 id 3,4 腿4
}
M3508_trot_postion(0.5,TS);
}
/**
* @name trot_flat_ground
* @brief 对角步态
* @param speed 迈步速度
* @param T[0]=T[3]=0 T[2]=T[1]=0.5 顺序位 左后右前->左前有后
* @retval control.s[3]==2 为平地步态下的位置 control.s[3]==3为上斜坡下的位置 control.s[3]==1为下斜坡的位置
*/
void trot_behind_flat_ground(float step,float length_hight,float Height_body,float speed)
{
MOTOR_PID_CHANGE(0);
Speed=speed;
if(control.s[3]==2)//平地正常
{
/*************对刚体坐标E点坐标初始化**************/
Xstart[2]=Xstart[0]=step/2.0f;
Xstart[3]=Xstart[1]=step/2.0f;
Xend[0]=Xstart[0] - step ; //-step 为后退
Xend[1]=Xstart[1] - step ;
Xend[2]=Xstart[2] - step ;
Xend[3]=Xstart[3] - step ;
Hight[3]=length_hight;
Hight[2]=length_hight;
Hight[1]=length_hight;
Hight[0]=length_hight;
Zstart[0]=-Height_body+15; //can2 id 1,2 腿1
Zstart[1]=-Height_body+15; //can2 id 3,4 腿2
Zstart[2]=-Height_body; //can1 id 1,2 腿3
Zstart[3]=-Height_body; //can1 id 3,4 腿4
}
if(control.s[3]==3)//上坡
{
Xstart[0]=(50)/2.0f;
Xstart[1]=50/2.0f;
Xstart[2]=(50)/2.0f;
Xstart[3]=(50)/2.0f;
/*************对刚体坐标E点坐标初始化**************/
// Xstart[0]=step/2.0f;
// Xstart[1]=step/2.0f;
// Xstart[2]=(step)/2.0f;
// Xstart[3]=(step)/2.0f;
Xend[0]=Xstart[0] - 50 ; //-step 为后退
Xend[1]=Xstart[1] - 50 ;
Xend[2]=Xstart[2] - 50 ;
Xend[3]=Xstart[3] - 50 ;
Hight[0]=length_hight-40;
Hight[1]=length_hight-40;
Hight[2]=length_hight-40;
Hight[3]=length_hight-40;
Zstart[0]=-Height_body+40; //can2 id 1,2 腿1
Zstart[1]=-Height_body+40; //can2 id 3,4 腿2
Zstart[2]=-Height_body-10; //can1 id 1,2 腿3
Zstart[3]=-Height_body-10; //can1 id 3,4 腿4
}
M3508_trot_postion(0.5,TS);
}
/**
* @name trot_flat_Right_ground
* @brief 对角步态右转
* @param speed 迈步速度
* @param T[0]=T[3]=0 T[2]=T[1]=0.5 顺序位 左后右前->左前有后
* @retval
*/
void trot_flat_Right_ground(float step,float length_hight,float Height_body,float speed)
{
// static float Deviation_Err=30;//8
MOTOR_PID_CHANGE(0);
/*************对刚体坐标E点坐标初始化**************/
static float Deviation_Err_s5=50;//8
static float Slope_Err[2]= {60,60}; //100 240
static float Slope_step[2]= {150,150}; //100,170
/*************对刚体坐标E点坐标初始化**************/
// if(control.s[5]==1)
// {
// Speed=0.0025;
// Xstart[0]=-(Slope_Err[0]+Slope_step[0])/2.0f;
// Xstart[1]=-(Slope_Err[0]+Slope_step[0]-Deviation_Err_s5)/2.0f;
// Xstart[2]=-(Slope_Err[1]+Slope_step[1])/2.0f;
// Xstart[3]=-(Slope_Err[1]+Slope_step[1]-Deviation_Err_s5)/2.0f;
// Xend[0]=Xstart[0] + Slope_step[0] ; //+step为前进 腿1
// Xend[1]=Xstart[1] + Slope_step[0] -Deviation_Err_s5 ; //腿2
// Xend[2]=Xstart[2] + Slope_step[1] ; //腿3
// Xend[3]=Xstart[3] + Slope_step[1] -Deviation_Err_s5 ; //腿4
// Hight[0]=length_hight-0;
// Hight[1]=length_hight-0;
// Hight[2]=length_hight-20;
// Hight[3]=length_hight-20;
// Zstart[0]=-Height_body+25; //can2 id 1,2 腿1
// Zstart[1]=-Height_body+25; //can2 id 3,4 腿2
// Zstart[2]=-Height_body+20; //can1 id 1,2 腿3
// Zstart[3]=-Height_body+20; //can1 id 3,4 腿4
// }
if(control.s[3]==2&&control.s[5]==2)
{
Speed=speed;
Xstart[0]=-step/2.0f;
Xstart[1]=step/2.0f;
Xstart[2]=-step/2.0f;
Xstart[3]=step/2.0f;
Xend[0]=Xstart[0] + step ;
Xend[1]=Xstart[1] - step ;
Xend[2]=Xstart[2] + step ;
Xend[3]=Xstart[3] - step ;
Hight[3]=length_hight;
Hight[2]=length_hight;
Hight[1]=length_hight;
Hight[0]=length_hight;
Zstart[0]=-Height_body; //can2 id 1,2
Zstart[1]=-Height_body; //can2 id 3,4
Zstart[2]=-Height_body; //can1 id 1,2
Zstart[3]=-Height_body; //can1 id 3,4
}
if(control.s[3]==3&&control.s[5]==2)
{
Speed=speed;
Xstart[0]=(30)/2.0f;
Xstart[1]=30/2.0f;
Xstart[2]=-(30)/2.0f;
Xstart[3]=-(30)/2.0f;
Xend[0]=Xstart[0] + 30 ;
Xend[1]=Xstart[1] - 30 ;
Xend[2]=Xstart[2] + 30 ;
Xend[3]=Xstart[3] - 30 ;
Hight[3]=length_hight-40;
Hight[2]=length_hight-40;
Hight[1]=length_hight-40;
Hight[0]=length_hight-40;
Zstart[0]=-Height_body+50; //can2 id 1,2
Zstart[1]=-Height_body+50; //can2 id 3,4
Zstart[2]=-Height_body; //can1 id 1,2
Zstart[3]=-Height_body; //can1 id 3,4
}
if(control.s[3]==1&&control.s[5]==2)
{
Speed=speed;
Xstart[0]=(20)/2.0f;
Xstart[1]=20/2.0f;
Xstart[2]=-(20)/2.0f;
Xstart[3]=-(20)/2.0f;
Xend[0]=Xstart[0] + step ;
Xend[1]=Xstart[1] - step ;
Xend[2]=Xstart[2] + step ;
Xend[3]=Xstart[3] - step ;
Hight[3]=length_hight-40;
Hight[2]=length_hight-40;
Hight[1]=length_hight-40;
Hight[0]=length_hight-40;
Zstart[0]=-Height_body; //can2 id 1,2
Zstart[1]=-Height_body; //can2 id 3,4
Zstart[2]=-Height_body+50; //can1 id 1,2
Zstart[3]=-Height_body+50; //can1 id 3,4
}
M3508_trot_postion(0.5,TS);
}
/**
* @name trot_flat_Left_ground
* @brief 对角步态左转
* @param speed 迈步速度
* @param T[0]=T[3]=0 T[2]=T[1]=0.5 顺序位 左后右前->左前有后
* @retval
*/
void trot_flat_Left_ground(float step,float length_hight,float Height_body,float speed)
{
// static float Deviation_Err=-30;//8
// static float Slope_Err[2]= {100,240}; //100 240
// static float Slope_step[2]= {170,120}; //100,170
MOTOR_PID_CHANGE(0);
/*************对刚体坐标E点坐标初始化**************/
static float Deviation_Err_s5=50;//8
static float Slope_Err[2]= {60,60}; //100 240
static float Slope_step[2]= {150,150}; //100,170
/*************对刚体坐标E点坐标初始化**************/
// if(control.s[5]==1)
// {
// Speed=0.0025;
// Xstart[0]=-(Slope_Err[0]+Slope_step[0]-Deviation_Err_s5)/2.0f;
// Xstart[1]=-(Slope_Err[0]+Slope_step[0])/2.0f;
// Xstart[2]=-(Slope_Err[1]+Slope_step[1]-Deviation_Err_s5)/2.0f;
// Xstart[3]=-(Slope_Err[1]+Slope_step[1])/2.0f;
// Xend[0]=Xstart[0] + Slope_step[0] -Deviation_Err_s5 ; //+step为前进 腿1
// Xend[1]=Xstart[1] + Slope_step[0] ; //腿2
// Xend[2]=Xstart[2] + Slope_step[1] -Deviation_Err_s5 ; //腿3
// Xend[3]=Xstart[3] + Slope_step[1] ; //腿4
// Hight[0]=length_hight-0;
// Hight[1]=length_hight-0;
// Hight[2]=length_hight-20;
// Hight[3]=length_hight-20;
// Zstart[0]=-Height_body+25; //can2 id 1,2 腿1
// Zstart[1]=-Height_body+25; //can2 id 3,4 腿2
// Zstart[2]=-Height_body+20; //can1 id 1,2 腿3
// Zstart[3]=-Height_body+20; //can1 id 3,4 腿4
// }
if(control.s[3]==2&&control.s[5]==2)
{
Speed =speed;
/*************对刚体坐标E点坐标初始化**************/
Xstart[0]=step/2.0f;
Xstart[1]=-step/2.0f;
Xstart[2]=step/2.0f;
Xstart[3]=-step/2.0f;
Xend[0]=Xstart[0] - step ;
Xend[1]=Xstart[1] + step ;
Xend[2]=Xstart[2] - step ;
Xend[3]=Xstart[3] + step ;
Zstart[0]=-Height_body; //can2 id 1,2
Zstart[1]=-Height_body; //can2 id 3,4
Zstart[2]=-Height_body; //can1 id 1,2
Zstart[3]=-Height_body; //can1 id 3,4
Hight[3]=Hight[2]=Hight[1]=Hight[0]=length_hight;
}
if(control.s[3]==3&&control.s[5]==2)
{
Speed =speed;
/*************对刚体坐标E点坐标初始化**************/
Xstart[0]=(30)/2.0f;
Xstart[1]=-30/2.0f;
Xstart[2]=(50)/2.0f;
Xstart[3]=-(50)/2.0f;
Xend[0]=Xstart[0] - 30 ;
Xend[1]=Xstart[1] + 30 ;
Xend[2]=Xstart[2] - 50 ;
Xend[3]=Xstart[3] + 50 ;
Zstart[0]=-Height_body+50; //can2 id 1,2
Zstart[1]=-Height_body+50; //can2 id 3,4
Zstart[2]=-Height_body; //can1 id 1,2
Zstart[3]=-Height_body; //can1 id 3,4
Hight[0]=length_hight-40;
Hight[1]=length_hight-40;
Hight[2]=length_hight-40;
Hight[3]=length_hight-40;
}
if(control.s[3]==1&&control.s[5]==2)
{
Speed =speed;
/*************对刚体坐标E点坐标初始化**************/
Xstart[0]=(30)/2.0f;
Xstart[1]=30/2.0f;
Xstart[2]=-(30)/2.0f;
Xstart[3]=-(30)/2.0f;
Xend[0]=Xstart[0] - step ;
Xend[1]=Xstart[1] + step ;
Xend[2]=Xstart[2] - step ;
Xend[3]=Xstart[3] + step ;
Zstart[0]=-Height_body; //can2 id 1,2
Zstart[1]=-Height_body; //can2 id 3,4
Zstart[2]=-Height_body+50; //can1 id 1,2
Zstart[3]=-Height_body+50; //can1 id 3,4
Hight[0]=length_hight-40;
Hight[1]=length_hight-40;
Hight[2]=length_hight-40;
Hight[3]=length_hight-40;
}
M3508_trot_postion(0.5,TS);
}
/*
* @name M3508_postion
* @brief 对角步态电机位置
* @param trot :arr占空比一般取0.5
* @param Walk :arr占空比一般取0.25
* @param Bound:arr占空比一般取0.1
* @retval
*/
void M3508_trot_postion(float arr,float Ts)
{
static float M3508_Angle[16]= {0} ;
static float M2006_Angle[16]= {0} ;
/******************生成E,点坐标********************************/
Leg_cycloid(0,&link[0],arr,Ts,Hight[0],Zstart[0],Xstart[0],Xend[0]);
Leg_cycloid(1,&link[1],arr,Ts,Hight[1],Zstart[1],Xstart[1],Xend[1]);
Leg_cycloid(2,&link[2],arr,Ts,Hight[2],Zstart[2],Xstart[2],Xend[2]);
Leg_cycloid(3,&link[3],arr,Ts,Hight[3],Zstart[3],Xstart[3],Xend[3]);
Inverse_leg(&leg[0],&link[0]);
Inverse_leg(&leg[1],&link[1]); //E3,E4的运动学逆解
Inverse_leg(&leg[2],&link[2]);
Inverse_leg(&leg[3],&link[3]); //E3,E4的运动学逆解
M2006_Angle[0]=(RESET_ANGLE+leg[0].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID1,2 腿1
M2006_Angle[1]=(-RESET_ANGLE2-leg[0].real_angle[1])*M3508Reduction_Ratio;
M2006_Angle[2]=(-RESET_ANGLE-leg[1].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID3,4 腿3
M2006_Angle[3]=(RESET_ANGLE2+leg[1].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[0]=(RESET_ANGLE+leg[2].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID1,2 腿2
M3508_Angle[1]=(-RESET_ANGLE2-leg[2].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[2]=(-RESET_ANGLE-leg[3].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID3,4 腿4
M3508_Angle[3]=(RESET_ANGLE2+leg[3].real_angle[1])*M3508Reduction_Ratio;
if(link[0].point_E.x==Xend[0]||link[0].point_E.x==Xstart[0])
{
m2006set[0].setspeed = 0;
m2006set[1].setspeed = 0;
// LED0=0;
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_RESET);
}
else
{
m2006set[0].setspeed = 150;
m2006set[1].setspeed = 150;
// LED0=1;
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_SET);
}
if(link[1].point_E.x==Xend[1]||link[1].point_E.x==Xstart[1])
{
m2006set[2].setspeed = 0;
m2006set[3].setspeed = 0;
// LED0=0;
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_RESET);
}
else
{
m2006set[2].setspeed = 150;
m2006set[3].setspeed = 150;
// LED0=1;
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_SET);
}
if(link[2].point_E.x==Xend[2]||link[2].point_E.x==Xstart[2])
{
m3508set[0].setspeed = 0;
m3508set[1].setspeed = 0;
// LED0=0;
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_RESET);
}
else
{
m3508set[0].setspeed = 150;
m3508set[1].setspeed = 150;
// LED0=1;//
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_SET);
}
if(link[3].point_E.x==Xend[3]||link[3].point_E.x==Xstart[3])
{
m3508set[2].setspeed = 0;
m3508set[3].setspeed = 0;
// LED0=0;
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_RESET);
}
else
{
m3508set[2].setspeed = 150;
m3508set[3].setspeed = 150;
// LED0=1;
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_SET);
}
m2006set[0].setpos = M2006_Angle[0];
m2006set[1].setpos = M2006_Angle[1];
m2006set[2].setpos = M2006_Angle[2];
m2006set[3].setpos = M2006_Angle[3];
m3508set[0].setpos = M3508_Angle[0];
m3508set[1].setpos = M3508_Angle[1];
m3508set[2].setpos = M3508_Angle[2];
m3508set[3].setpos = M3508_Angle[3];
}
/**
* @name BOUND_Inclined_Plane_flat_ground
* @brief 斜向上跳跃
* @param speed 迈步速度
* @param T[0]=T[3]=0 T[2]=T[1]=0.5 顺序位 左后右前->左前有后
* @retval
*/
void BOUND_Inclined_Plane_flat_ground(float Height_body_start,float Height_body_end)
{
static float M2006_Angle[4]= {0};
static float M3508_Angle[4]= {0};
static float point_Speed[6]= {0,15,150,150,150,20};
static u8 bound_flag_point2=1;
LCD_Num(50, 240,bound_flag_point2,1, 16);
/*******************第一个点***********************/
if(Bound_Flag_Point[0]==1)
{
MOTOR_PID_CHANGE(1);
Leg_Point(0,&link[0],-Height_body_start,-50);
Leg_Point(1,&link[1],-Height_body_start,-50);
Leg_Point(2,&link[2],-Height_body_start,-85);
Leg_Point(3,&link[3],-Height_body_start,-85);//85
Inverse_leg(&leg[0],&link[0]);
Inverse_leg(&leg[1],&link[1]);
Inverse_leg(&leg[2],&link[2]);
Inverse_leg(&leg[3],&link[3]);
M2006_Angle[0]=(RESET_ANGLE+leg[0].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID1,2 腿1
M2006_Angle[1]=(-RESET_ANGLE2-leg[0].real_angle[1])*M3508Reduction_Ratio;
M2006_Angle[2]=(-RESET_ANGLE-leg[1].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID3,4 腿3
M2006_Angle[3]=(RESET_ANGLE2+leg[1].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[0]=(RESET_ANGLE+leg[2].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID1,2 腿2
M3508_Angle[1]=(-RESET_ANGLE2-leg[2].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[2]=(-RESET_ANGLE-leg[3].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID3,4 腿4
M3508_Angle[3]=(RESET_ANGLE2+leg[3].real_angle[1])*M3508Reduction_Ratio;
m2006set[0].setspeed = point_Speed[1];
m2006set[1].setspeed = point_Speed[1];
m2006set[2].setspeed = point_Speed[1];
m2006set[3].setspeed = point_Speed[1];
m3508set[0].setspeed = point_Speed[1];
m3508set[1].setspeed = point_Speed[1];
m3508set[2].setspeed = point_Speed[1];
m3508set[3].setspeed = point_Speed[1];
m2006set[0].setpos = M2006_Angle[0];
m2006set[1].setpos = M2006_Angle[1];
m2006set[2].setpos = M2006_Angle[2];
m2006set[3].setpos = M2006_Angle[3];
m3508set[0].setpos = M3508_Angle[0];
m3508set[1].setpos = M3508_Angle[1];
m3508set[2].setpos = M3508_Angle[2];
m3508set[3].setpos = M3508_Angle[3];
if(control.s[0]==1)Bound_Flag_Point[0]=2;
}
else if(control.s[2]==3)
{bound_flag_point2=1;}
/**********************第二个点*********************************/
else if(Bound_Flag_Point[0]==2&&(control.s[2]==2||control.s[2]==1))
{
MOTOR_PID_CHANGE(0);//速度P加大
if(control.s[2]==3)bound_flag_point2=1;
Leg_Point(0,&link[0],-Height_body_end,-140);
Leg_Point(1,&link[1],-Height_body_end,-140);//双目桥
Leg_Point(2,&link[2],-Height_body_end,-140);
Leg_Point(3,&link[3],-Height_body_end,-140);
Inverse_leg(&leg[0],&link[0]);
Inverse_leg(&leg[1],&link[1]);
Inverse_leg(&leg[2],&link[2]);
Inverse_leg(&leg[3],&link[3]);
M2006_Angle[0]=(RESET_ANGLE+leg[0].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID1,2 腿1
M2006_Angle[1]=(-RESET_ANGLE2-leg[0].real_angle[1])*M3508Reduction_Ratio;
M2006_Angle[2]=(-RESET_ANGLE-leg[1].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID3,4 腿3
M2006_Angle[3]=(RESET_ANGLE2+leg[1].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[0]=(RESET_ANGLE+leg[2].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID1,2 腿2
M3508_Angle[1]=(-RESET_ANGLE2-leg[2].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[2]=(-RESET_ANGLE-leg[3].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID3,4 腿4
M3508_Angle[3]=(RESET_ANGLE2+leg[3].real_angle[1])*M3508Reduction_Ratio;
m2006set[0].setspeed = point_Speed[2];
m2006set[1].setspeed = point_Speed[2];
m2006set[2].setspeed = point_Speed[2];
m2006set[3].setspeed = point_Speed[2];
m3508set[0].setspeed = point_Speed[2];
m3508set[1].setspeed = point_Speed[2];
m3508set[2].setspeed = point_Speed[2];
m3508set[3].setspeed = point_Speed[2];
m2006set[0].setpos = M2006_Angle[0];
m2006set[1].setpos = M2006_Angle[1];
m2006set[2].setpos = M2006_Angle[2];
m2006set[3].setpos = M2006_Angle[3];
m3508set[0].setpos = M3508_Angle[0];
m3508set[1].setpos = M3508_Angle[1];
m3508set[2].setpos = M3508_Angle[2];
m3508set[3].setpos = M3508_Angle[3];
if((fabs(m2006set[0].setpos-m2006[0].real_angle)<15)&&(fabs(m2006set[1].setpos-m2006[1].real_angle)<15)&&(control.s[2]==2||control.s[2]==1))Bound_Flag_Point[0]=3;
}
else if(Bound_Flag_Point[0]==3&&(control.s[2]==2||control.s[2]==1))
{
/*****************3点************************/
MOTOR_PID_CHANGE(0);
if(control.s[2]==3)bound_flag_point2=1;
Leg_Point(0,&link[0],-Height_body_start,0);
Leg_Point(1,&link[1],-Height_body_start,0);
Leg_Point(2,&link[2],-Height_body_start,0);
Leg_Point(3,&link[3],-Height_body_start,0);
Inverse_leg(&leg[0],&link[0]);
Inverse_leg(&leg[1],&link[1]);
Inverse_leg(&leg[2],&link[2]);
Inverse_leg(&leg[3],&link[3]);
M2006_Angle[0]=(RESET_ANGLE+leg[0].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID1,2 腿1
M2006_Angle[1]=(-RESET_ANGLE2-leg[0].real_angle[1])*M3508Reduction_Ratio;
M2006_Angle[2]=(-RESET_ANGLE-leg[1].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID3,4 腿3
M2006_Angle[3]=(RESET_ANGLE2+leg[1].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[0]=(RESET_ANGLE+leg[2].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID1,2 腿2
M3508_Angle[1]=(-RESET_ANGLE2-leg[2].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[2]=(-RESET_ANGLE-leg[3].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID3,4 腿4
M3508_Angle[3]=(RESET_ANGLE2+leg[3].real_angle[1])*M3508Reduction_Ratio;
m2006set[0].setspeed = point_Speed[3];
m2006set[1].setspeed = point_Speed[3];
m2006set[2].setspeed = point_Speed[3];
m2006set[3].setspeed = point_Speed[3];
m3508set[0].setspeed = point_Speed[3];
m3508set[1].setspeed = point_Speed[3];
m3508set[2].setspeed = point_Speed[3];
m3508set[3].setspeed = point_Speed[3];
m2006set[0].setpos = M2006_Angle[0];
m2006set[1].setpos = M2006_Angle[1];
m2006set[2].setpos = M2006_Angle[2];
m2006set[3].setpos = M2006_Angle[3];
m3508set[0].setpos = M3508_Angle[0];
m3508set[1].setpos = M3508_Angle[1];
m3508set[2].setpos = M3508_Angle[2];
m3508set[3].setpos = M3508_Angle[3];
if((fabs(m3508set[1].setpos-m3508[1].real_angle)<20)&&(fabs(m3508set[0].setpos-m3508[0].real_angle)<20)&&(control.s[2]==2||control.s[2]==1))Bound_Flag_Point[0]=4;
}
/**********************第4个点*********************************/
else if(Bound_Flag_Point[0]==4&&(control.s[2]==2||control.s[2]==1))
{
MOTOR_PID_CHANGE(1);
if(control.s[2]==3)bound_flag_point2=1;
Leg_Point(0,&link[0],-Height_body_start-50,120);//-60,120
Leg_Point(1,&link[1],-Height_body_start-50,120);
Leg_Point(2,&link[2],-Height_body_start-50,120);
Leg_Point(3,&link[3],-Height_body_start-50,120);
Inverse_leg(&leg[0],&link[0]);
Inverse_leg(&leg[1],&link[1]);
Inverse_leg(&leg[2],&link[2]);
Inverse_leg(&leg[3],&link[3]);
M2006_Angle[0]=(RESET_ANGLE+leg[0].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID1,2 腿1
M2006_Angle[1]=(-RESET_ANGLE2-leg[0].real_angle[1])*M3508Reduction_Ratio;
M2006_Angle[2]=(-RESET_ANGLE-leg[1].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID3,4 腿3
M2006_Angle[3]=(RESET_ANGLE2+leg[1].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[0]=(RESET_ANGLE+leg[2].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID1,2 腿2
M3508_Angle[1]=(-RESET_ANGLE2-leg[2].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[2]=(-RESET_ANGLE-leg[3].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID3,4 腿4
M3508_Angle[3]=(RESET_ANGLE2+leg[3].real_angle[1])*M3508Reduction_Ratio;
m2006set[0].setspeed = point_Speed[4];
m2006set[1].setspeed = point_Speed[4];
m2006set[2].setspeed = point_Speed[4];
m2006set[3].setspeed = point_Speed[4];
m3508set[0].setspeed = point_Speed[4];
m3508set[1].setspeed = point_Speed[4];
m3508set[2].setspeed = point_Speed[4];
m3508set[3].setspeed = point_Speed[4];
m2006set[0].setpos = M2006_Angle[0];
m2006set[1].setpos = M2006_Angle[1];
m2006set[2].setpos = M2006_Angle[2];
m2006set[3].setpos = M2006_Angle[3];
m3508set[0].setpos = M3508_Angle[0];
m3508set[1].setpos = M3508_Angle[1];
m3508set[2].setpos = M3508_Angle[2];
m3508set[3].setpos = M3508_Angle[3];
if((fabs(m2006set[1].setpos-m2006[1].real_angle)<100)&&(fabs(m2006set[0].setpos-m2006[0].real_angle)<100)&&(control.s[2]==2||control.s[2]==1))
{
Bound_Flag_Point[0]=5;
}
}
else if(Bound_Flag_Point[0]==5&&(control.s[2]==2||control.s[2]==1))
{
MOTOR_PID_CHANGE(1);
if(control.s[2]==3)
bound_flag_point2=1;
Leg_Point(0,&link[0],-Height_body_start-50,-20);
Leg_Point(1,&link[1],-Height_body_start-50,-20);
Leg_Point(2,&link[2],-Height_body_start-50,-20);
Leg_Point(3,&link[3],-Height_body_start-50,-20);
Inverse_leg(&leg[0],&link[0]);
Inverse_leg(&leg[1],&link[1]);
Inverse_leg(&leg[2],&link[2]);
Inverse_leg(&leg[3],&link[3]);
M2006_Angle[0]=(RESET_ANGLE+leg[0].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID1,2 腿1
M2006_Angle[1]=(-RESET_ANGLE2-leg[0].real_angle[1])*M3508Reduction_Ratio;
M2006_Angle[2]=(-RESET_ANGLE-leg[1].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID3,4 腿2
M2006_Angle[3]=(RESET_ANGLE2+leg[1].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[0]=(RESET_ANGLE+leg[2].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID1,2 腿3
M3508_Angle[1]=(-RESET_ANGLE2-leg[2].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[2]=(-RESET_ANGLE-leg[3].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID3,4 腿4
M3508_Angle[3]=(RESET_ANGLE2+leg[3].real_angle[1])*M3508Reduction_Ratio;
m2006set[0].setspeed = point_Speed[5];
m2006set[1].setspeed = point_Speed[5];
m2006set[2].setspeed = point_Speed[5];
m2006set[3].setspeed = point_Speed[5];
m3508set[0].setspeed = point_Speed[5];
m3508set[1].setspeed = point_Speed[5];
m3508set[2].setspeed = point_Speed[5];
m3508set[3].setspeed = point_Speed[5];
m2006set[0].setpos = M2006_Angle[0];
m2006set[1].setpos = M2006_Angle[1];
m2006set[2].setpos = M2006_Angle[2];
m2006set[3].setpos = M2006_Angle[3];
m3508set[0].setpos = M3508_Angle[0];
m3508set[1].setpos = M3508_Angle[1];
m3508set[2].setpos = M3508_Angle[2];
m3508set[3].setpos = M3508_Angle[3];
if((fabs(m2006set[1].setpos-m2006[1].real_angle)<50)&&(fabs(m2006set[0].setpos-m2006[0].real_angle)<50)&&(control.s[2]==2||control.s[2]==1)) {
Bound_Flag_Point[0]=6;
}
}
else if(Bound_Flag_Point[0]==6)
{if(control.s[2]==3)Bound_Flag_Point[0]=1;}
}
/**
* @name BOUND_Inclined_Plane_flat_ground
* @brief 平跳
* @param point_Speed 每个点期望速度
* @param
* @retval
*/
void BOUND_Plane_flat_ground(float Height_body_start,float Height_body_end)
{
static float M2006_Angle[4]= {0};
static float M3508_Angle[4]= {0};
static float point_Speed[6]= {0,15,150,150,150,20};
static u8 bound_flag_point2=1;
LCD_Num(50, 220,bound_flag_point2,1, 16);
/*******************第一个点***********************/
if(Bound_Flag_Point[1]==1)
{
MOTOR_PID_CHANGE(0);
Leg_Point(0,&link[0],-Height_body_start,-50);
Leg_Point(1,&link[1],-Height_body_start,-50);
Leg_Point(2,&link[2],-Height_body_start,-50);
Leg_Point(3,&link[3],-Height_body_start,-50);
Inverse_leg(&leg[0],&link[0]);
Inverse_leg(&leg[1],&link[1]);
Inverse_leg(&leg[2],&link[2]);
Inverse_leg(&leg[3],&link[3]);
M2006_Angle[0]=(RESET_ANGLE+leg[0].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID1,2 腿1
M2006_Angle[1]=(-RESET_ANGLE2-leg[0].real_angle[1])*M3508Reduction_Ratio;
M2006_Angle[2]=(-RESET_ANGLE-leg[1].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID3,4 腿3
M2006_Angle[3]=(RESET_ANGLE2+leg[1].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[0]=(RESET_ANGLE+leg[2].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID1,2 腿2
M3508_Angle[1]=(-RESET_ANGLE2-leg[2].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[2]=(-RESET_ANGLE-leg[3].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID3,4 腿4
M3508_Angle[3]=(RESET_ANGLE2+leg[3].real_angle[1])*M3508Reduction_Ratio;
m2006set[0].setspeed = point_Speed[1];
m2006set[1].setspeed = point_Speed[1];
m2006set[2].setspeed = point_Speed[1];
m2006set[3].setspeed = point_Speed[1];
m3508set[0].setspeed = point_Speed[1];
m3508set[1].setspeed = point_Speed[1];
m3508set[2].setspeed = point_Speed[1];
m3508set[3].setspeed = point_Speed[1];
m2006set[0].setpos = M2006_Angle[0];
m2006set[1].setpos = M2006_Angle[1];
m2006set[2].setpos = M2006_Angle[2];
m2006set[3].setpos = M2006_Angle[3];
m3508set[0].setpos = M3508_Angle[0];
m3508set[1].setpos = M3508_Angle[1];
m3508set[2].setpos = M3508_Angle[2];
m3508set[3].setpos = M3508_Angle[3];
if(control.s[0]==1)Bound_Flag_Point[1]=2;
}
else if(control.s[2]==3)
{bound_flag_point2=1;}
/**********************第二个点*********************************/
else if(Bound_Flag_Point[1]==2&&(control.s[2]==2||control.s[2]==1))
{
MOTOR_PID_CHANGE(0);//速度P加大
if(control.s[2]==3)bound_flag_point2=1;
Leg_Point(0,&link[0],-Height_body_end,-140);
Leg_Point(1,&link[1],-Height_body_end,-140);
Leg_Point(2,&link[2],-Height_body_end,-140);
Leg_Point(3,&link[3],-Height_body_end,-140);
Inverse_leg(&leg[0],&link[0]);
Inverse_leg(&leg[1],&link[1]);
Inverse_leg(&leg[2],&link[2]);
Inverse_leg(&leg[3],&link[3]);
M2006_Angle[0]=(RESET_ANGLE+leg[0].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID1,2 腿1
M2006_Angle[1]=(-RESET_ANGLE2-leg[0].real_angle[1])*M3508Reduction_Ratio;
M2006_Angle[2]=(-RESET_ANGLE-leg[1].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID3,4 腿3
M2006_Angle[3]=(RESET_ANGLE2+leg[1].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[0]=(RESET_ANGLE+leg[2].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID1,2 腿2
M3508_Angle[1]=(-RESET_ANGLE2-leg[2].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[2]=(-RESET_ANGLE-leg[3].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID3,4 腿4
M3508_Angle[3]=(RESET_ANGLE2+leg[3].real_angle[1])*M3508Reduction_Ratio;
m2006set[0].setspeed = point_Speed[2];
m2006set[1].setspeed = point_Speed[2];
m2006set[2].setspeed = point_Speed[2];
m2006set[3].setspeed = point_Speed[2];
m3508set[0].setspeed = point_Speed[2];
m3508set[1].setspeed = point_Speed[2];
m3508set[2].setspeed = point_Speed[2];
m3508set[3].setspeed = point_Speed[2];
m2006set[0].setpos = M2006_Angle[0];
m2006set[1].setpos = M2006_Angle[1];
m2006set[2].setpos = M2006_Angle[2];
m2006set[3].setpos = M2006_Angle[3];
m3508set[0].setpos = M3508_Angle[0];
m3508set[1].setpos = M3508_Angle[1];
m3508set[2].setpos = M3508_Angle[2];
m3508set[3].setpos = M3508_Angle[3];
if((fabs(m2006set[0].setpos-m2006[0].real_angle)<10)&&(fabs(m2006set[1].setpos-m2006[1].real_angle)<10)&&(control.s[2]==2||control.s[2]==1))Bound_Flag_Point[1]=3;
}
else if(Bound_Flag_Point[1]==3&&(control.s[2]==2||control.s[2]==1))
{
/*****************3点************************/
MOTOR_PID_CHANGE(0);
if(control.s[2]==3)bound_flag_point2=1;
Leg_Point(0,&link[0],-Height_body_start,0);
Leg_Point(1,&link[1],-Height_body_start,0);
Leg_Point(2,&link[2],-Height_body_start,0);
Leg_Point(3,&link[3],-Height_body_start,0);
Inverse_leg(&leg[0],&link[0]);
Inverse_leg(&leg[1],&link[1]);
Inverse_leg(&leg[2],&link[2]);
Inverse_leg(&leg[3],&link[3]);
M2006_Angle[0]=(RESET_ANGLE+leg[0].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID1,2 腿1
M2006_Angle[1]=(-RESET_ANGLE2-leg[0].real_angle[1])*M3508Reduction_Ratio;
M2006_Angle[2]=(-RESET_ANGLE-leg[1].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID3,4 腿3
M2006_Angle[3]=(RESET_ANGLE2+leg[1].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[0]=(RESET_ANGLE+leg[2].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID1,2 腿2
M3508_Angle[1]=(-RESET_ANGLE2-leg[2].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[2]=(-RESET_ANGLE-leg[3].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID3,4 腿4
M3508_Angle[3]=(RESET_ANGLE2+leg[3].real_angle[1])*M3508Reduction_Ratio;
m2006set[0].setspeed = point_Speed[3];
m2006set[1].setspeed = point_Speed[3];
m2006set[2].setspeed = point_Speed[3];
m2006set[3].setspeed = point_Speed[3];
m3508set[0].setspeed = point_Speed[3];
m3508set[1].setspeed = point_Speed[3];
m3508set[2].setspeed = point_Speed[3];
m3508set[3].setspeed = point_Speed[3];
m2006set[0].setpos = M2006_Angle[0];
m2006set[1].setpos = M2006_Angle[1];
m2006set[2].setpos = M2006_Angle[2];
m2006set[3].setpos = M2006_Angle[3];
m3508set[0].setpos = M3508_Angle[0];
m3508set[1].setpos = M3508_Angle[1];
m3508set[2].setpos = M3508_Angle[2];
m3508set[3].setpos = M3508_Angle[3];
if((fabs(m3508set[1].setpos-m3508[1].real_angle)<20)&&(fabs(m3508set[0].setpos-m3508[0].real_angle)<20)&&(control.s[2]==2||control.s[2]==1))Bound_Flag_Point[1]=4;
}
/**********************第4个点*********************************/
else if(Bound_Flag_Point[1]==4&&(control.s[2]==2||control.s[2]==1))
{
MOTOR_PID_CHANGE(1);
if(control.s[2]==3)bound_flag_point2=1;
Leg_Point(0,&link[0],-Height_body_start-60,120);
Leg_Point(1,&link[1],-Height_body_start-60,120);
Leg_Point(2,&link[2],-Height_body_start-60,120);
Leg_Point(3,&link[3],-Height_body_start-60,120);
Inverse_leg(&leg[0],&link[0]);
Inverse_leg(&leg[1],&link[1]);
Inverse_leg(&leg[2],&link[2]);
Inverse_leg(&leg[3],&link[3]);
M2006_Angle[0]=(RESET_ANGLE+leg[0].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID1,2 腿1
M2006_Angle[1]=(-RESET_ANGLE2-leg[0].real_angle[1])*M3508Reduction_Ratio;
M2006_Angle[2]=(-RESET_ANGLE-leg[1].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID3,4 腿3
M2006_Angle[3]=(RESET_ANGLE2+leg[1].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[0]=(RESET_ANGLE+leg[2].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID1,2 腿2
M3508_Angle[1]=(-RESET_ANGLE2-leg[2].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[2]=(-RESET_ANGLE-leg[3].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID3,4 腿4
M3508_Angle[3]=(RESET_ANGLE2+leg[3].real_angle[1])*M3508Reduction_Ratio;
m2006set[0].setspeed = point_Speed[4];
m2006set[1].setspeed = point_Speed[4];
m2006set[2].setspeed = point_Speed[4];
m2006set[3].setspeed = point_Speed[4];
m3508set[0].setspeed = point_Speed[4];
m3508set[1].setspeed = point_Speed[4];
m3508set[2].setspeed = point_Speed[4];
m3508set[3].setspeed = point_Speed[4];
m2006set[0].setpos = M2006_Angle[0];
m2006set[1].setpos = M2006_Angle[1];
m2006set[2].setpos = M2006_Angle[2];
m2006set[3].setpos = M2006_Angle[3];
m3508set[0].setpos = M3508_Angle[0];
m3508set[1].setpos = M3508_Angle[1];
m3508set[2].setpos = M3508_Angle[2];
m3508set[3].setpos = M3508_Angle[3];
if((fabs(m2006set[1].setpos-m2006[1].real_angle)<20)&&(fabs(m2006set[0].setpos-m2006[0].real_angle)<20)&&(control.s[2]==2||control.s[2]==1)) {
Bound_Flag_Point[1]=5;
}
}
else if(Bound_Flag_Point[1]==5&&(control.s[2]==2||control.s[2]==1))
{
MOTOR_PID_CHANGE(1);
if(bound_flag_point2==5&&control.s[2]==3)bound_flag_point2=1;
Leg_Point(0,&link[0],-Height_body_start-60,-30);
Leg_Point(1,&link[1],-Height_body_start-60,-30);
Leg_Point(2,&link[2],-Height_body_start-60,-30);
Leg_Point(3,&link[3],-Height_body_start-60,-30);
Inverse_leg(&leg[0],&link[0]);
Inverse_leg(&leg[1],&link[1]);
Inverse_leg(&leg[2],&link[2]);
Inverse_leg(&leg[3],&link[3]);
M2006_Angle[0]=(RESET_ANGLE+leg[0].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID1,2 腿1
M2006_Angle[1]=(-RESET_ANGLE2-leg[0].real_angle[1])*M3508Reduction_Ratio;
M2006_Angle[2]=(-RESET_ANGLE-leg[1].real_angle[0])*M3508Reduction_Ratio; //后 can2 ID3,4 腿2
M2006_Angle[3]=(RESET_ANGLE2+leg[1].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[0]=(RESET_ANGLE+leg[2].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID1,2 腿3
M3508_Angle[1]=(-RESET_ANGLE2-leg[2].real_angle[1])*M3508Reduction_Ratio;
M3508_Angle[2]=(-RESET_ANGLE-leg[3].real_angle[0])*M3508Reduction_Ratio; //前 can1 ID3,4 腿4
M3508_Angle[3]=(RESET_ANGLE2+leg[3].real_angle[1])*M3508Reduction_Ratio;
m2006set[0].setspeed = point_Speed[5];
m2006set[1].setspeed = point_Speed[5];
m2006set[2].setspeed = point_Speed[5];
m2006set[3].setspeed = point_Speed[5];
m3508set[0].setspeed = point_Speed[5];
m3508set[1].setspeed = point_Speed[5];
m3508set[2].setspeed = point_Speed[5];
m3508set[3].setspeed = point_Speed[5];
m2006set[0].setpos = M2006_Angle[0];
m2006set[1].setpos = M2006_Angle[1];
m2006set[2].setpos = M2006_Angle[2];
m2006set[3].setpos = M2006_Angle[3];
m3508set[0].setpos = M3508_Angle[0];
m3508set[1].setpos = M3508_Angle[1];
m3508set[2].setpos = M3508_Angle[2];
m3508set[3].setpos = M3508_Angle[3];
if((fabs(m2006set[1].setpos-m2006[1].real_angle)<50)&&(fabs(m2006set[0].setpos-m2006[0].real_angle)<50)&&(control.s[2]==2||control.s[2]==1)) {
Bound_Flag_Point[1]=6;
}
}
else if(Bound_Flag_Point[1]==6&&(control.s[2]==2||control.s[2]==1))
{if(control.s[2]==3)Bound_Flag_Point[1]=1;}
}