[1]Zhu W, Qu W, Cao L, 等. An off-line programming system for robotic drilling in aerospace manufacturing[J]. The International Journal of Advanced Manufacturing Technology, 2013, 68(9–12): 2535–2545.
方法一: #使用轴角法求取向量之间的变换矩阵,和上一个函数是一样的方法 defrotation_matrix_from_vectors2(vec2): vec1 = [0, 0, 1] #规范化两个向量 a, b = (vec1 / np.linalg.norm(vec1)).reshape(3), (vec2 / np.linalg.norm(vec2)).reshape(3) #求两个向量变换的旋转轴 v = np.cross(a, b) s = np.linalg.norm(v) v = v / s #求旋转角度 c = np.dot(a, b) theta = math.acos(c) #使用mr库求取轴角法的旋转矩阵,用的是罗德里格斯公式 omegaHat = mr.VecToso3(v) so3mat = omegaHat * theta matrix = mr.MatrixExp3(so3mat) #求矩阵对应的欧拉角 r = R.from_matrix(matrix) euler = r.as_euler('ZYX',degrees=True) matrix = r.as_matrix() return matrix
方法二:本质上都是一样的 defrotation_matrix_from_vectors(vec1,vec2): """ Find the rotation matrix that aligns vec1 to vec2 :param vec1: A 3d "source" vector :param vec2: A 3d "destination" vector :return mat: A transform matrix (3x3) which when applied to vec1, aligns it with vec2. """ a, b = (vec1 / np.linalg.norm(vec1)).reshape(3), (vec2 / np.linalg.norm(vec2)).reshape(3) v = np.cross(a, b) c = np.dot(a, b) s = np.linalg.norm(v) kmat = np.array([[0, -v[2], v[1]], [v[2], 0, -v[0]], [-v[1], v[0], 0]]) rotation_matrix = np.eye(3) + kmat + kmat.dot(kmat) * ((1 - c) / (s ** 2)) return rotation_matrix