云霄一羽

V1

2022/07/13阅读:25主题:自定义主题1

结构分析底层原理(5):怎样旋转坐标系?

怎样旋转坐标系?

就坐标系这个话题来说,旋转是最常用的操作,在结构分析中经常用到旋转,最常用的场景是指定构件的方向,比如希望使得网格结构中某根矩形构件的方向从强轴平行于大地旋转到曲面法线方向,这样可以减小错边,使得网格构件之间节点构造上更容易实现,这些操作要求将单元的局部坐标系绕某个轴线旋转一个特定的角度。

旋转矩阵

在计算机中,这样的操作在线形代数中我们都学过,可以通过矩阵实现。例如,绕 轴旋转 角,对应的旋转矩阵是

当希望将某个向量 绕绝对 轴旋转时,仅需要将 作用在向量上,就得到了旋转后的向量

对于整个坐标系,则可以直接列成矩阵相乘

类似地,有

对于任意方向的旋转就对应矩阵的连乘。旋转分为内部旋转(始终绕局部轴转动)和外部旋转(始终绕绝对坐标轴转动),对应矩阵乘法顺序有所不同。

四元数

上面的算法是我们线性代数中学过的最熟悉的方法,不过这种实现有一些缺点,就是在连续旋转下可能出现所谓的“万向节锁死“的问题,而且计算空间三个欧拉角比较繁琐,效率稍低。实际上,我们可以用一种更现代更优雅的方法实现,就是所谓的四元数。

四元数可以看作是复数的扩展,表示为

其中 类似于虚数,有以下性质

不满足交换律

运算规则类似于复数,两个四元数相乘展开后,按规则计算即可。

四元数这里不多展开讨论,感兴趣网络上随便一搜都能了解到跟多,实现坐标系的旋转这件事来说,除了以上的基本运算法则,只需要知道某个坐标 绕一个代表旋转轴的单位向量 旋转一个 角,只需要进行简单的计算:

其中

,为 的共轭。

python中的实现

了解上面这些足以让我们轻松实现坐标系的旋转了,特别是当我们用Python来写代码的时候,因为scipy包中提供了非常成熟的解决方案,只需要

from scipy.spatial.transform import Rotation as R

坐标系关于任意向量的旋转就可以写成

    def rotate_about_vec(self,x,y,z,theta):
        l=np.linalg.norm(np.array([x,y,z]))
        r=R.from_quat([x/l*np.sin(theta/2),y/l*np.sin(theta/2),z/l*np.sin(theta/2),np.cos(theta/2)])
        self.__T=r.apply(self.__T)

注意这里四元数的顺序是 ,这里只变换方向,直接变换代表方向的矩阵即可。

分类:

数学

标签:

数学编程

作者介绍

云霄一羽
V1