abaqus 中的零件(或实例)旋转与欧拉角

Part (or instance) rotation in abaqus with Euler angle

我尝试对包含许多夹杂物(圆柱体)的复合材料进行建模。我需要将圆柱体旋转到具有给定欧拉角的正确位置。但是我从abaqus documentation中发现,abaqus中的实例只能按特定轴旋转。

所以我想知道在 abaqus(或 abaqus-python)中有没有办法通过欧拉角旋转实例?

已回答 Abaqus v6.14

您可以在 CAE 中使用 Abaqus Python 命令执行此操作。


回忆一下物体绕轴 xy[= 旋转角度 θ 的变换矩阵103=], 和 z:

围绕某个任意轴的旋转 u 看起来像

欧拉角变换类似于乘积

或类似的,取决于您是遵循 Proper Euler angle 约定还是 Tait-Bryan 约定。上面是一个 Tait-Bryan 序列,它将一个对象绕 x 轴旋转角度 γ,然后 y轴关于角度β,然后z轴关于角度α.

Abaqus 旋转是通过命令 ra.rotate(instanceList, axisPoint, axisDirection, angle) 在 CAE 中定义的,其中

  • ra 是一个 assembly 对象 (mdb.models[...].rootAssembly)
  • instanceList 是字符串的可迭代*(元组、列表或类似的),指定要旋转的实例,
  • axisPoint 是一个可迭代的浮点数,指定要围绕 (x,y,z) 旋转的轴的起点,
  • axisDirection 是指定轴方向的浮点数的迭代,
  • angle 是您希望将对象旋转的(正逆时针)角度,度数

例如,如果我想在某个程序集 ra 下围绕原点 (a, b, c)方向(u, v, w) 关于逆时针角度 t 度,我会 运行 命令

ra.rotate(instanceList=('PART-1-MESH-1-1', ), axisPoint=(a, b, c), axisDirection=(u, v, w), angle=t)

这意味着在 CAE 中,欧拉角变换可以在 3 个 rotate 命令中按顺序完成。


您的脚本(包括辅助函数)应如下所示:

"""
Assumes a Right-handed coordinate system.
"""

import numpy as np


def _Ru(t, u):
    return np.array([[np.cos(t) + (u[0]**2)*(1 - np.cos(t)), u[0]*u[1]*(1 - np.cos(t)) - u[2]*np.sin(t), u[0]*u[2]*(1 - np.cos(t)) + u[1]*np.sin(t)],
                     [u[1]*u[0]*(1 - np.cos(t)) + u[2]*np.sin(t), np.cos(t) + (u[1]**2)*(1 - np.cos(t)), u[1]*u[2]*(1 - np.cos(t)) - u[0]*np.sin(t)],
                     [u[2]*u[0]*(1 - np.cos(t)) - u[1]*np.sin(t), u[2]*u[1]*(1 - np.cos(t)) + u[0]*np.sin(t), np.cos(t) + (u[2]**2)*(1 - np.cos(t))]])

def general_rotation(axis_order, angles, axes_dir=((1.0,0.0,0.0),(0.0,1.0,0.0))):
    """
    Inputs:
        axis_order - Iterable of ints specifying the axis order to apply the transformation.
                     For example, (0,1,2) means to apply the rotations around the (x,y,z) axes, in that order.
        angles     - Iterable of angles (in degrees) specifying the rotations. This should be the same length as axis_order.
        axes_dir   - Iterable of iterable of floats, specifying two orthogonal directions forming the local x and y axes, respectively. Defaults to global x and y axes.
    """

    # Convert all angles to radians
    angles = np.deg2rad(angles)

    # Calculate the third (z) axis and normalise all axes
    ax0 = np.array(axes_dir[0])
    ax1 = np.array(axes_dir[1])
    ax2 = np.cross(ax0, ax1)
    ax0 = ax0/np.linalg.norm(ax0)
    ax1 = ax1/np.linalg.norm(ax1)
    ax2 = ax2/np.linalg.norm(ax2)
    ax = [ax0, ax1, ax2] # Or similar iterable but must be mutable

    intermediate_axes = [None]*len(axis_order)

    # Calculate total transformation
    for i, a in enumerate(axis_order):

        # Store intermediate axes
        intermediate_axes[i] = list(ax)

        R = _Ru(angles[i], ax[a])

        # Don't bother transforming current axis that's being rotated about
        zot = [0,1,2]
        zot.remove(a)
        for aj in zot:
            ax[aj] = np.dot(R, ax[aj])

    return intermediate_axes

您可以通过

获取输出并旋转实例
rotate_axes = general_rotation(axis_order, angles, axes_dir)
for i in range(len(rotate_axes)):
    ra.rotate(instanceList=(instanceName, ), axisPoint=origin, axisDirection=rotate_axes[i][axis_order[i]], angle=angles[i])

raassembly对象,instanceName为表示要旋转实例名称的字符串,origin为坐标轴原点.


*在Python中,当指定只有一个成员的tuple个对象时,必须在唯一成员后加上一个逗号。例如。包含数字 1 的元组由 (1,) 而不是 (1) 构造。您也可以改用 lists。

**确切的字符串可以在模型树中找到: