CS机器人RPY角与四元数转换

CS机器人使用RPY(静态角,即先绕固定坐标系的x轴转,再绕原有固定坐标系的y轴转,最后绕原有固定坐标系的z轴转)

RPY(rx,ry,rz)中的数据 等同于 欧拉角ZYX(rz,ry,rx)中的数据  (欧拉角ZYX表示先绕坐标系的z轴转,再绕新坐标系的y轴转,最后再绕新坐标系的x轴转)

可以使用以下脚本函数,实现RPY角与四元数的转换

def RPY2Quaternion(rpy_vector):
    # 输入RPY,单位弧度
    # 返回四元数

    roll = rpy_vector[0]
    pitch = rpy_vector[1]
    yaw = rpy_vector[2]

    cosRoll =cos(roll*0.5)
    sinRoll =sin(roll*0.5)

    cosPitch  =cos(pitch*0.5)
    sinPitch =sin(pitch*0.5)

    cosHeading =cos(yaw*0.5)
    sinHeading =sin(yaw*0.5)

    q0 =cosRoll*cosPitch*cosHeading+sinRoll*sinPitch*sinHeading
    q1 =sinRoll*cosPitch*cosHeading-cosRoll*sinPitch*sinHeading
    q2 =cosRoll*sinPitch*cosHeading+sinRoll*cosPitch*sinHeading
    q3 =cosRoll*cosPitch*sinHeading-sinRoll*sinPitch*cosHeading

    # [x,y,z,w]
    return [q0,q1,q2,q3]


def Quaternion2RPY(Quaternion):
    # 输入四元数[x,y,z,w]
    # 返回对应RPY

    q0 = Quaternion[0]
    q1 = Quaternion[1]
    q2 = Quaternion[2]
    q3 = Quaternion[3]

    roll=atan2(2*(q2*q3+q0*q1),q0*q0-q1*q1-q2*q2+q3*q3);
    pitch=asin(2*(q0*q2-q1*q3));
    yaw=atan2(2*(q1*q2+q0*q3),q0*q0+q1*q1-q2*q2-q3*q3);

    return [roll,pitch,yaw]


rx = d2r(-88.7011)
ry = d2r(-9.89776)
rz = d2r(172.484)
global rpyinput
rpyinput = [rx,ry,rz] #输入RPY角

global quat
quat = RPY2Quaternion([rx,ry,rz]) #计算得到对应的四元数

global rpy
rpy = Quaternion2RPY(quat) #再将四元数转会RPY角
点击显示全文
赞同0
发表评论
分享

手机扫码分享
0
472
收藏
举报
收起
登录
  • 密码登录
  • 验证码登录
还没有账号,立即注册
还没有账号,立即注册
注册
已有账号,立即登录
选择发帖板块
举报
请选择举报理由
举报
举报说明