mayavi 显示bbox 和 朝向

import numpy as np
import mayavi.mlab
import pickle
import time

def plot3Dbox(corners):
    for i in range(corners.shape[0]):
        corner = corners[i]
        idx = np.array([0, 1, 2, 3, 0, 4, 5, 6, 7, 4, 5, 1, 2, 6, 7, 3])
        x = corner[0, idx]
        y = corner[1, idx]
        z = corner[2, idx]
        mayavi.mlab.plot3d(x, y, z, color=(1, 0, 0), colormap='Spectral', representation='wireframe',line_width=2)

def boxes3d_to_corners3d(boxes3d, rotate=True):
    """
    :param boxes3d: (N, 7) [x, y, z, h, w, l, ry]
    :param rotate:
    :return: corners3d: (N, 8, 3)
    """
    boxes_num = boxes3d.shape[0]
    h, w, l = boxes3d[:, 3], boxes3d[:, 4], boxes3d[:, 5]
    x_corners = np.array([l / 2., l / 2., -l / 2., -l / 2., l / 2., l / 2., -l / 2., -l / 2.], dtype=np.float32).T  # (N, 8)
    z_corners = np.array([w / 2., -w / 2., -w / 2., w / 2., w / 2., -w / 2., -w / 2., w / 2.], dtype=np.float32).T  # (N, 8)

    y_corners = np.zeros((boxes_num, 8), dtype=np.float32)
    y_corners[:, 4:8] = -h.reshape(boxes_num, 1).repeat(4, axis=1)  # (N, 8)

    if rotate:
        ry = boxes3d[:, 6]
        zeros, ones = np.zeros(ry.size, dtype=np.float32), np.ones(ry.size, dtype=np.float32)
        rot_list = np.array([[np.cos(ry), zeros, -np.sin(ry)],
                             [zeros,       ones,       zeros],
                             [np.sin(ry), zeros,  np.cos(ry)]])  # (3, 3, N)
        R_list = np.transpose(rot_list, (2, 0, 1))  # (N, 3, 3)

        temp_corners = np.concatenate((x_corners.reshape(-1, 8, 1), y_corners.reshape(-1, 8, 1),
                                       z_corners.reshape(-1, 8, 1)), axis=2)  # (N, 8, 3)
        rotated_corners = np.matmul(temp_corners, R_list)  # (N, 8, 3)
        x_corners, y_corners, z_corners = rotated_corners[:, :, 0], rotated_corners[:, :, 1], rotated_corners[:, :, 2]

    x_loc, y_loc, z_loc = boxes3d[:, 0], boxes3d[:, 1], boxes3d[:, 2]

    x = x_loc.reshape(-1, 1) + x_corners.reshape(-1, 8)
    y = y_loc.reshape(-1, 1) + y_corners.reshape(-1, 8)
    z = z_loc.reshape(-1, 1) + z_corners.reshape(-1, 8)

    corners = np.concatenate((x.reshape(-1, 8, 1), y.reshape(-1, 8, 1), z.reshape(-1, 8, 1)), axis=2)

    return corners.astype(np.float32)


def show_points(gt_data):

    for num in range(0,len(gt_data)):

        print(num)
        pointcloud = gt_data[num]['pts_raw']
        print(pointcloud.shape)
        print(type(pointcloud))

        x = pointcloud[:, 0]  # x position of point
        xmin = np.amin(x, axis=0)
        xmax = np.amax(x, axis=0)

        y = pointcloud[:, 1]  # y position of point
        ymin = np.amin(y, axis=0)
        ymax = np.amax(y, axis=0)

        z = pointcloud[:, 2]  # z position of point
        zmin = np.amin(z, axis=0)
        zmax = np.amax(z, axis=0)

        print(xmin,xmax,ymin,ymax,zmin,zmax)

        d = np.sqrt(x ** 2 + y ** 2)  # Map Distance from sensor

        vals = 'height'

        if vals == "height":
            col = z
        else:
            col = d

        fig = mayavi.mlab.figure(bgcolor=(0, 0, 0), size=(640, 500))
        
        mayavi.mlab.points3d(x, y, z,
                             mode="point",
                             # 灰度图的伪彩映射
                             colormap='spectral',  # 'bone', 'copper', 'gnuplot'
                             color=(1, 1, 1),   # Used a fixed (r,g,b) instead
                             figure=fig,
                             )
        bbox = gt_data[num]["box"]
        if num == 0:
            bbox[6] += np.pi

        print(bbox)

        bbox = bbox[np.newaxis, :]
        corners_3d = boxes3d_to_corners3d(bbox)
        print(corners_3d)
        print(corners_3d.shape)

        _x = (corners_3d[0][0][0] + corners_3d[0][1][0]) / 2
        _y = (corners_3d[0][0][1] + corners_3d[0][4][1]) / 2
        _z =  corners_3d[0][1][2]

        _x = (corners_3d[0][0][0] + corners_3d[0][1][0]) / 2 - bbox[0][0]
        _y = (corners_3d[0][0][1] + corners_3d[0][4][1]) / 2 - bbox[0][1] + (corners_3d[0][0][1] + corners_3d[0][4][1]) / 2 / 2
        _z =  corners_3d[0][1][2] - bbox[0][2]

        print(_x,_y,_z)
        mayavi.mlab.quiver3d(bbox[0][0], bbox[0][1] - (corners_3d[0][0][1] + corners_3d[0][4][1]) / 2 / 2 , bbox[0][2],
                             _x, _y, _z, line_width=6, colormap="copper", mode='arrow', scale_factor=3) # quiver3d
        mayavi.mlab.points3d(bbox[0][0], bbox[0][1] - (corners_3d[0][0][1] + corners_3d[0][4][1]) / 2 / 2 , bbox[0][2], color=(0, 1, 0), mode="sphere", scale_factor=1.5)
        # mayavi.mlab.points3d((corners_3d[0][0][0] + corners_3d[0][1][0]) / 2, (corners_3d[0][0][1] + corners_3d[0][4][1]) / 2, corners_3d[0][1][2], color=(0, 1, 0), mode="sphere", scale_factor=1)

        # draw 3d bbox
        corners_3d = np.array(corners_3d).transpose(0, 2, 1)
        plot3Dbox(np.array(corners_3d))

        mayavi.mlab.view(270.0, 160.0, 50,focalpoint=[0, 0, 10])
        mayavi.mlab.show(stop=True)
        # mayavi.mlab.savefig(filename= '/home/seivl/picture/arrow/' + str(num) + '.png',figure=fig) # for save
        mayavi.mlab.close(all=True)
        time.sleep(1)

    print("done")

def main():

    f2 = open('/home/seivl/result.pkl', 'rb')
    gt_data = pickle.load(f2)

    show_points(gt_data)

if __name__ == '__main__':
    main()

在这里插入图片描述
在这里插入图片描述
转:https://blog.youkuaiyun.com/qq_35632833/article/details/107714582

内容概要:本文详细探讨了双馈风力发电机(DFIG)在Simulink环境下的建模方法及其在不同风速条件下的电流与电压波形特征。首先介绍了DFIG的基本原理,即定子直接接入电网,转子通过双向变流器连接电网的特点。接着阐述了Simulink模型的具体搭建步骤,包括风力机模型、传动系统模型、DFIG本体模型变流器模型的建立。文中强调了变流器控制算法的重要性,特别是在应对风速变化时,通过实时调整转子侧的电压电流,确保电流电压波形的良好特性。此外,文章还讨论了模型中的关键技术挑战,如转子电流环控制策略、低电压穿越性能、直流母线电压脉动等问题,并提供了具体的解决方案技术细节。最终,通过对故障工况的仿真测试,验证了所建模型的有效性优越性。 适用人群:从事风力发电研究的技术人员、高校相关专业师生、对电力电子控制系统感兴趣的工程技术人员。 使用场景及目标:适用于希望深入了解DFIG工作原理、掌握Simulink建模技能的研究人员;旨在帮助读者理解DFIG在不同风速条件下的动态响应机制,为优化风力发电系统的控制策略提供理论依据技术支持。 其他说明:文章不仅提供了详细的理论解释,还附有大量Matlab/Simulink代码片段,便于读者进行实践操作。同时,针对一些常见问题给出了实用的调试技巧,有助于提高仿真的准确性可靠性。
### 在 PyQt5 中集成 Mayavi 实现数据可视化 为了在 PyQt5 应用程序中集成 Mayavi 进行数据可视化,通常会利用 `traitsui` `mayavi.mlab` 提供的功能来创建嵌入式的三维图形窗口。下面介绍一种常见的方式,在 PyQt5 的主界面中加入 Mayavi 可视化组件。 #### 创建 Qt 主应用程序框架并加载 Mayavi 场景 首先定义一个继承自 `QWidget` 或者其他合适部件类的新类作为应用的主要容器,并在这个新类里初始化 Mayavi 渲染场景: ```python from pyface.qt import QtGui, QtCore from mayavi.core.ui.api import MlabSceneModel from mayavi.tools.util import get_immediate_subclasses import numpy as np class MainWindow(QtGui.QMainWindow): def __init__(self): super(MainWindow, self).__init__() # 设置中心 widget 并设置布局管理器 central_widget = QtGui.QWidget() layout = QtGui.QVBoxLayout(central_widget) # 添加 Mayavi scene 到 layout container = QtGui.QWidget() layout.addWidget(container) # 初始化 Mayavi Scene Model self.scene = MlabSceneModel() # 构建 Mayavi 图形引擎实例并与当前的 QWidget 关联起来 from tvtk.pyface.ui.qt4.scene_editor import SceneEditor editor = SceneEditor(scene=self.scene) ui = editor.edit_traits(parent=container, kind='subpanel').control layout.addWidget(ui) self.setCentralWidget(central_widget) if __name__ == "__main__": app = QtGui.QApplication.instance() or QtGui.QApplication([]) window = MainWindow() window.show() # 测试绘制一些简单的 3D 数据点 x, y, z = np.random.random((3, 10)) window.scene.mlab.points3d(x, y, z) app.exec_() ``` 上述代码展示了如何在一个标准的 PyQt5 GUI 程序内引入 Mayavi 绘图功能[^2]。这里的关键在于使用了 `MlabSceneModel()` 来获取一个新的 Mayavi 场景区模型对象;接着通过 `tvtk.pyface.ui.qt4.SceneEditor` 类将此模型绑定至特定的小部件上显示出来。 需要注意的是,要使这段代码正常工作,计算机环境中应该已经正确安装好了必要的 Python 包,比如 PyQt5、Mayavi、TVTK 等等。如果遇到依赖项缺失的情况,则可能需要按照提示信息调整环境配置或是解决潜在的兼容性问题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值