Python 罗德里格矩阵的空间坐标转换——两组公共点求所属坐标系的旋转矩阵与平移矩阵
var code = "69c58911-f211-47df-9a1e-5e8192157285"
import numpy as np
# 罗德里格矩阵模型,根据公共点计算旋转矩阵与平移矩阵
def RodriguesMatrixModel(src, dst):
# 计算比例关系
scale = np.sum(np.sqrt(np.sum((dst - np.mean(dst, axis=0)) ** 2, axis=1))) / np.sum(np.sqrt(np.sum((src - np.mean(src, axis=0)) ** 2, axis=1)))
# 计算旋转矩阵
src_mean = np.mean(src, axis=0)
dst_mean = np.mean(dst, axis=0)
src = src - src_mean
dst = dst - dst_mean
H = np.dot(src.T, dst)
U, S, Vt = np.linalg.svd(H)
R = np.dot(Vt.T, U.T)
if np.linalg.det(R) < 0:
Vt[2, :] *= -1
R = np.dot(Vt.T, U.T)
# 计算平移矩阵
t = dst_mean.T - scale * np.dot(R, src_mean.T)
return R, t, scale
# TEST
if __name__ == '__main__':
# 设置原点
src = np.array([[1, 1, 0], [-1, 1, 0], [1, -1, 0]])
# 绕Z轴旋转90°,平移(-1, 1, 0)
R = np.array([[0, -1, 0], [1, 0, 0], [0, 0, 1]])
t = np.array([[-1], [1], [0]])
# 计算目标点
dst = np.dot(src, R.T) + t.T
print('src = ', src)
print('dst = ', dst)
# 计算旋转矩阵与平移矩阵
R_, t_, scale_ = RodriguesMatrixModel(src, dst)
# 输出R_保留一位小数
print('R = ', np.round(R_, 1))
print('t = ', t_)
print('scale = ', scale_)
作者:Esofar
出处:https://www.cnblogs.com/WindSnowLi/p/16998142.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~