You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scipy Rotation对象无as_matrix属性报错修复及代码运行问题咨询

解决AttributeError: 'Rotation'对象没有'as_matrix'属性的问题

这个报错的核心原因是scipy.spatial.transform.Rotation的API版本更新:在较新的scipy版本中,as_matrix()方法已经被弃用并移除,取而代之的是to_matrix()方法来生成旋转矩阵。你降低版本后问题仍存在,大概率是因为降到的版本已经完成了这个API更替,或者版本切换没有生效。

快速修改方案

只需要把代码中调用as_matrix()的那一行替换为to_matrix()即可:

原代码行:

rot_cw = R.from_quat(keyframe["rot_cw"]).as_matrix()

修改后:

rot_cw = R.from_quat(keyframe["rot_cw"]).to_matrix()

完整修正后的代码

import msgpack
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from numpy.linalg import inv
from scipy.spatial.transform import Rotation as R
import open3d as o3d
import sys

if len(sys.argv) < 2:
    print( "ERROR: Please provide path to .msg file. Example usage is; python3 visualize_openvslam_map.py path_to.msg" )
    exit()

with open(sys.argv[1], "rb") as f:
    upacked_msg = msgpack.Unpacker(f)
    packed_msg = upacked_msg.unpack()

keyfarmes = packed_msg["keyframes"]
landmarks = packed_msg["landmarks"]

# FILL IN KEYFRAME POINTS(ODOMETRY) TO ARRAY
keyframe_points = []
keyframe_points_color = []
for keyframe in keyfarmes.values():
    # get conversion from camera to world
    trans_cw = np.matrix(keyframe["trans_cw"]).T
    # 替换as_matrix()为to_matrix()适配新版scipy
    rot_cw = R.from_quat(keyframe["rot_cw"]).to_matrix()
    # compute conversion from world to camera
    rot_wc = rot_cw.T
    trans_wc = -rot_wc * trans_cw
    keyframe_points.append((trans_wc[0, 0], trans_wc[1, 0], trans_wc[2, 0]))

keyframe_points = np.array(keyframe_points)
keyframe_points_color = np.repeat(np.array([[0., 1., 0.]]), keyframe_points.shape[0], axis=0)

# FILL IN LANDMARK POINTS TO ARRAY
landmark_points = []
landmark_points_color = []
for lm in landmarks.values():
    landmark_points.append(lm["pos_w"])
    landmark_points_color.append([ abs(lm["pos_w"][1]) * 4, abs(lm["pos_w"][1]) * 2, abs(lm["pos_w"][1]) * 3 ])

landmark_points = np.array(landmark_points)
landmark_points_color = np.array(landmark_points_color)

# CONSTRUCT KEYFRAME(ODOMETRY) FOR VISUALIZTION
keyframe_points_pointcloud = o3d.geometry.PointCloud()
keyframe_points_pointcloud.points = o3d.utility.Vector3dVector(keyframe_points)
keyframe_points_pointcloud.colors = o3d.utility.Vector3dVector( keyframe_points_color)

# CONSTRUCT LANDMARK POINTCLOUD FOR VISUALIZTION
landmark_points_pointcloud = o3d.geometry.PointCloud()
landmark_points_pointcloud.points = o3d.utility.Vector3dVector(landmark_points)
landmark_points_pointcloud.colors = o3d.utility.Vector3dVector( landmark_points_color)

# VISULIZE MAP
o3d.visualization.draw_geometries([
    keyframe_points_pointcloud,
    landmark_points_pointcloud,
    o3d.geometry.TriangleMesh.create_coordinate_frame()
])

特殊情况补充

如果你使用的是非常老旧的scipy版本(比如1.6.x及更早),to_matrix()可能不存在,此时可以使用as_dcm()方法(DCM即方向余弦矩阵,和旋转矩阵是同一概念):

rot_cw = R.from_quat(keyframe["rot_cw"]).as_dcm()

不过结合你降版本无效的情况,优先使用to_matrix()应该就能解决问题。

内容的提问来源于stack exchange,提问作者jtm101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 10:22:48