2.四元数:
3.库卡欧拉角转四元数:
DEFFCT QUATERNION EulerZYXToQuaternion(ABC:IN )
DECL EulerZYX ABC
DECL QUATERNION Q
DECL REAL SINA,COSA
DECL REAL SINB,COSB
DECL REAL SINC,COSC
DECL INT Sum
IF VARSTATE("ABC")<>#INITIALIZED THEN
MsgQuit("Input Euler Angles not initialized!")
LOOP
HALT
ENDLOOP
ENDIF
SINC=SIN(ABC.Rx*0.5)
COSC=COS(ABC.Rx*0.5)
SINB=SIN(ABC.Ry*0.5)
COSB=COS(ABC.Ry*0.5)
SINA=SIN(ABC.Rz*0.5)
COSA=COS(ABC.Rz*0.5)
Q.W=COSC*COSB*COSA+SINC*SINB*SINA
Q.X=SINC*COSB*COSA-COSC*SINB*SINA
Q.Y=COSC*SINB*COSA+SINC*COSB*SINA
Q.Z=COSC*COSB*SINA-SINC*SINB*COSA
Sum=Q.W*Q.W+Q.X*Q.X+Q.Y*Q.Y+Q.Z*Q.Z
IF Sum<>1 THEN
MsgQuit("Sum of Quaternion elements power NOT 1!")
LOOP
HALT
ENDLOOP
ELSE
RETURN (Q)
ENDIF
ENDFCT
DEFFCT EulerZYX QuaternionToEulerZYX(Q:IN )
DECL EulerZYX Ret
DECL QUATERNION Q
DECL INT Sum
DECL REAL Tempz1,Tempz2
DECL REAL Tempy
DECL REAL Tempx1,Tempx2
IF VARSTATE("Q")<>#INITIALIZED THEN
MsgQuit("Input Quaternion not initialized!")
LOOP
HALT
ENDLOOP
ENDIF
Sum=Q.W*Q.W+Q.X*Q.X+Q.Y*Q.Y+Q.Z*Q.Z
IF Sum<>1 THEN
MsgQuit("Sum of Quaternion elements power NOT 1!")
LOOP
HALT
ENDLOOP
ENDIF
Tempx1=2*(Q.Y*Q.Z+Q.W*Q.X)
Tempx2=Q.W*Q.W-Q.X*Q.X-Q.Y*Q.Y+Q.Z*Q.Z
Tempy=2*(Q.W*Q.Y-Q.X*Q.Z)
Tempz1=2*(Q.X*Q.Y+Q.W*Q.Z)
TempZ2=Q.W*Q.W+Q.X*Q.X-Q.Y*Q.Y-Q.Z*Q.Z
Ret.Rx=ATAN2(Tempx1,Tempx2)
Ret.Rz=ATAN2(Tempz1,tempz2)
Ret.Ry=90-ACOS(Tempy)
RETURN (RET)
ENDFCT
DEF FunctionTest( )
DECL QUATERNION Q1,Q2
DECL EulerZYX ZYX1,ZYX2
ZYX1={Rz 3,Ry 2,Rx 1}
Q2={W 0.5,X 0.5,Y 0.5,Z 0.5}
Q1=EulerZYXToQuaternion(ZYX1)
HALT
ZYX2=QuaternionToEulerZYX(Q2)
HALT
END
了解KUKA机器人 gbskukadl.gongboshi.com
- 下一篇:码垛机器人的特点及分类
- 上一篇:库卡机器人的技术应用及优势