void calculate_delta(float cartesian[3]){
float SCARA_pos[2];
sta
tic float SCARA_C2, SCARA_S2, SCARA_K1, SCARA_K2, SCARA_theta, SCARA_psi;
SCARA_pos[X_AXIS] = -cartesian[X_AXIS] - SCARA_offset[X_AXIS]; //求世界坐标系下X值并取反
SCARA_pos[Y_AXIS] = cartesian[Y_AXIS] + SCARA_offset[Y_AXIS]; //求世界坐标系下Y值
SCARA_C2 = ( sq(SCARA_pos[X_AXIS]) + sq(SCARA_pos[Y_AXIS]) - (float)L1_2 - (float)L2_2 ) /(2*Linkage_1*Linkage_2);
SCARA_S2 = sqrt( 1 - sq(SCARA_C2) );
SCARA_K1 = Linkage_1 + Linkage_2 * SCARA_C2;
SCARA_K2 = Linkage_2 * SCARA_S2;
SCARA_theta = ( atan2(SCARA_K1, SCARA_K2)-atan2(SCARA_pos[X_AXIS],SCARA_pos[Y_AXIS]) ) ;//大臂旋转角度,即主臂与-X轴夹角
SCARA_psi = atan2(SCARA_S2,SCARA_C2) + SCARA_theta;//小臂旋转角度,当Y电机控制小臂相对于世界坐标系旋转角度时使用此公式
delta[X_AXIS] = SCARA_theta * SCARA_RAD2DEG; //大臂旋转角度转换为弧度
delta[Y_AXIS] = SCARA_psi * SCARA_RAD2DEG; //小臂旋转角度转换为弧度
}
}
cartesian[X_AXIS][Y_AXIS]为用户坐标系下坐标值,加上SCARA_offset得到世界坐标系下坐标值。
其中SCARA_pos[X_AXIS]向量方向向右,与原坐标值X方向相反,故取反。
#define L1_2 sq(Linkage_1)
#define L2_2 sq(Linkage_2)
L1_2 L2_2是预先定义好的臂长的平方
则直线AB距离的平方为 sq(SCARA_pos[X_AXIS]) + sq(SCARA_pos[Y_AXIS]
三角形ABC中,现已知三边长度,由余弦定理推出 cosC=(a^2+b^2-c^2)/2ab
α的补角为
arccos [ ( (float)L1_2 + (float)L2_2- sq(SCARA_pos[X_AXIS]) - sq(SCARA_pos[Y_AXIS]) ) /(2Linkage_1Linkage_2) ]//这里是伪代码,C语言没有arccos函数
SCARA_C2为补角的cos值得取反
SCARA_C2 = ( sq(SCARA_pos[X_AXIS]) + sq(SCARA_pos[Y_AXIS]) - (float)L1_2 - (float)L2_2 ) /(2Linkage_1Linkage_2);
将α cos值转换为sin值
SCARA_S2 = sqrt( 1 - sq(SCARA_C2) );
根据三角函数关系求出 SCARA_K1 SCARA_K2
由图可知SCARA_theta +δ+β =π/2 δ+γ =π/2
则SCARA_theta =γ-β = ( atan2(SCARA_K1, SCARA_K2)-atan2(SCARA_pos[X_AXIS],SCARA_pos[Y_AXIS]) )
SCARA_psi = α+SCARA_theta = atan2(SCARA_S2,SCARA_C2) + SCARA_theta
乘上弧度角度转换因子得出大小臂角度值
delta[X_AXIS] = SCARA_theta SCARA_RAD2DEG
delta[Y_AXIS] = SCARA_psi SCARA_RAD2DEG
运动平滑度参数设置补充说明,运动平滑度就是工业机器人中的CNT值,因为速度不可以瞬间改变,折线运动中,如果准确运动到折点,折点速度为0,速度为很慢,所有用一条弧线代替折线,两条线的加速度梯形相交,设定值即为相交点的速度,设置越大,速度越快,路径被倒成的圆角也就越大。