在Isaac-sim中弧度转四元数以及四元数转弧度的问题

问题:

在Isaac-sim中如果采用set_world_pose()和get_world_pose()得到的都是四元数,如何将弧度转四元数,或者将四元数转为弧度是需要解决的一个问题,
这里的弧度是以x轴为0度,y轴为90度,逆时针方向逐渐增大;

解决方案:

采用scipy.spatial.transform中的Rotation库,进行转换;
在转换的时候涉及到角度的变换,
即如果直接采用Rotation.from_euler(‘x’, angle_rad2, degrees=False)进行转换,得到的是以x轴负方向为0度,y轴为90度,顺时针方向逐渐增大;
因此需要在rad_to_quaternion函数中通过angle_rad2 = -angle_rad + math.pi方法进行转换,同样的在quaternion_to_angle函数中通过angle_rad = -angle_rad + math.pi将转换回来。

import math
from scipy.spatial.transform import Rotation
import torch

def rad_to_quaternion(angle_rad):
    if angle_rad > math.pi:
        angle_rad -= 2 * math.pi
    elif angle_rad < -math.pi:
        angle_rad += 2 * math.pi
    angle_rad2 = -angle_rad + math.pi
    rotation = Rotation.from_euler('x', angle_rad2, degrees=False)
    # print("rotation.as_quat()=%s" % (str(rotation.as_quat())))
    quaternion = rotation.as_quat()[:]  # 将旋转矩阵转换为四元数
    return quaternion, angle_rad, angle_rad2

def quaternion_to_angle(quaternion):
    rotation = Rotation.from_quat(quaternion)
    euler_angles = rotation.as_euler('xyz')
    angle_rad = euler_angles[0]
    angle_rad = -angle_rad + math.pi
    if angle_rad > math.pi:
        angle_rad -= 2 * math.pi
    elif angle_rad < -math.pi:
        angle_rad += 2 * math.pi
    return angle_rad

for i in range(361):
    rad = math.radians(i)
    quaternion, rad_ori, rad_new = rad_to_quaternion(rad)
    rad_bak = quaternion_to_angle(quaternion)

    theta0 = math.degrees(rad_ori)
    theta1 = math.degrees(rad_new)
    theta2 = math.degrees(rad_bak)
    print("原始角度为%s,经过变换后角度为%s,转换后的角度为%s"%(str(round(theta0)), str(round(theta1)), str(round(theta2))))

    # rad_new = math.floor(rad_new * 10000) / 10000
    # rad_bak = math.floor(rad_bak * 10000) / 10000
    # if rad_new != rad_bak:
    #     print("出错了rad_new=%s, rad_bak=%s"%(str(rad_new), str(rad_bak)))
    # print("rad=%.4f, rad_bak=%.4f"%(rad, rad_bak))

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值