abaqus 中的零件(或实例)旋转与欧拉角
Part (or instance) rotation in abaqus with Euler angle
我尝试对包含许多夹杂物(圆柱体)的复合材料进行建模。我需要将圆柱体旋转到具有给定欧拉角的正确位置。但是我从abaqus documentation中发现,abaqus中的实例只能按特定轴旋转。
所以我想知道在 abaqus(或 abaqus-python)中有没有办法通过欧拉角旋转实例?
已回答 Abaqus v6.14
您可以在 CAE 中使用 Abaqus Python 命令执行此操作。
回忆一下物体绕轴 x、y[= 旋转角度 θ 的变换矩阵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])
以ra
为assembly
对象,instanceName
为表示要旋转实例名称的字符串,origin
为坐标轴原点.
*在Python中,当指定只有一个成员的tuple
个对象时,必须在唯一成员后加上一个逗号。例如。包含数字 1
的元组由 (1,)
、 而不是 (1)
构造。您也可以改用 list
s。
**确切的字符串可以在模型树中找到:
我尝试对包含许多夹杂物(圆柱体)的复合材料进行建模。我需要将圆柱体旋转到具有给定欧拉角的正确位置。但是我从abaqus documentation中发现,abaqus中的实例只能按特定轴旋转。
所以我想知道在 abaqus(或 abaqus-python)中有没有办法通过欧拉角旋转实例?
已回答 Abaqus v6.14
您可以在 CAE 中使用 Abaqus Python 命令执行此操作。
回忆一下物体绕轴 x、y[= 旋转角度 θ 的变换矩阵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])
以ra
为assembly
对象,instanceName
为表示要旋转实例名称的字符串,origin
为坐标轴原点.
*在Python中,当指定只有一个成员的tuple
个对象时,必须在唯一成员后加上一个逗号。例如。包含数字 1
的元组由 (1,)
、 而不是 (1)
构造。您也可以改用 list
s。
**确切的字符串可以在模型树中找到: