今天加班又晚了,应鱼粉要求,再推荐一下超好用的Python坐标转换库

487 阅读2分钟

大家好,我是加班加到天荒地老的小惨鱼。今天看 ROS2 的 tf 文档,里面让安装一个库

图片

小鱼一看这个我熟悉,不就是小鱼最常用的那个。又想起来之前有一位粉丝在 CSDN 上留言给小鱼说想让小鱼讲一讲这个库:

图片

小鱼之前也有说过这个库,今天时间不多就结合之前的文章再详细说一说

transforms3d 参考文档:matthew-brett.github.io/transforms3… (需要翻墙,建议直接看源码,非常清晰)

一、安装

这里安装 pip 不行就用 pip3,ubuntu20 之后算是统一了。

pip install transforms3d

如果安装过慢,可以尝试换清华源

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple transforms3d

二、模块介绍

打开官方文档,可以看到 api 的参考。这个库把每一个常用方法按照规则分类好了。小鱼常用的是 euler、quaternions、affines 这三个模块。

  • euler 模块,顾名思义就是和欧拉角相关的转换都在这里,比如欧拉角转旋转矩阵
  • quaternions、是和四元数相关的,比如四元数转成欧拉角、四元数转旋转矩阵
  • affines,可以用于合成矩阵,比如旋转矩阵和平移矩阵合并成齐次矩阵

其他的比如缩放、仿射变换、轴角等等,都非常齐全。

图片

三、小鱼常用方法

下面的常用方法都是小鱼使用最多的一些方法。 将欧拉角转换为旋转矩阵

tfs.euler.euler2mat(math.radians(rx),math.radians(ry),math.radians(rz))

合并成齐次矩阵

tfs.affines.compose(np.squeeze(np.asarray((x,y,z))), rmat, [1, 1, 1])

旋转矩阵转四元数

tfs.quaternions.mat2quat(m[0:3,0:3])

四元数转旋转矩阵

tfs.quaternions.quat2mat([w,q[0],q[1],q[2]])

四、应用:Tsai_Lenz 手眼标定算法实现

def get_matrix_eular_radu(x,y,z,rx,ry,rz):    
    rmat = tfs.euler.euler2mat(math.radians(rx),math.radians(ry),math.radians(rz))    
    rmat = tfs.affines.compose(np.squeeze(np.asarray((x,y,z))), rmat, [1, 1, 1])    
    return rmat    
    
def rot2quat_minimal(m):    
    quat =  tfs.quaternions.mat2quat(m[0:3,0:3])    
    return quat[1:]
    
def quatMinimal2rot(q):    
    p = np.dot(q.T,q)    
    w = np.sqrt(np.subtract(1,p[0][0]))    
    return tfs.quaternions.quat2mat([w,q[0],q[1],q[2]])
    
print(tfs.affines.compose(Tcg,np.squeeze(Rcg),[1,1,1]))

五、总结

总结这里说一下最重要的事情,可能肯多同学都会遇到的一个问题,那就是欧拉角的形式有很多种,有多少种呢?

图片

一共 24 种,学过机器人学基础知识的同学都知道,欧拉角的旋转可以绕着原来的坐标系旋转,也可以绕着自己本身坐标系进行旋转,s 和 r 分别代表静态的和旋转之后的坐标系,而后面的 xyz,xzy 指的是旋转 顺序,所以从任何一个旋转方式转换成欧拉角的时候都要注意转成之后的欧拉角的旋转形式。

今天就到这里了,小鱼还要继续加班,大家早点休息哈~