Dynami c черчение с mplot3d - PullRequest
       16

Dynami c черчение с mplot3d

0 голосов
/ 15 апреля 2020

Я использую Python 2,7 на Windows 10 в ноутбуке Jupyter.

У меня есть внешний датчик ориентации на USB-порту. Я хочу периодически опрашивать этот датчик на частоте около 10 Гц и обновлять ориентацию фигуры на экране с каждым новым образцом. Датчик возвращает кватернион при опросе, который я преобразовываю в матрицу вращения, чтобы вращать массив трехмерных изображений. Все это прекрасно работает.

Моя проблема заключается в получении mplot3d для динамического обновления отображаемого изображения после каждого образца ориентации. Все, что я могу получить, это сюжет в конце пробега, ничего не обновляется, пока я пробую. Как я могу изменить этот код для динамического построения?

Вот мой код:

# import serial module    
import serial.tools.list_ports 
import threespace_api_mod_Bret as ts_api
import numpy as np
import quaternion
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import time

def pack_quat_3space_array( array ):
    return np.quaternion( array[3] , array[0] , array[1] , array[2] )

class SensorAnimation( object ):
def __init__(self,commport):
    # Create 3D axis
    self.fig = plt.figure()
    self.ax = self.fig.add_subplot(111, projection='3d')
    # Initialize the 3space sensor
    self.sensor = ts_api.TSUSBSensor(commport)
        #create the 3d image to rotate
        zline = np.linspace(0, 15, 1000)
        xline = np.sin(zline)
        yline = np.cos(zline)
        # Put the 3d data into an array for rotation
        self.image_array = np.array([xline,yline,zline])
        # Draw the initial image
        self.ax.plot3D(xline, yline, zline, 'red')
        # plt.show(block=False)

    def RefreshPosition( self , previous ):
        if self.sensor is not None:
            rot_matrix = quaternion.as_rotation_matrix(pack_quat_3space_array(sensor.getTaredOrientationAsQuaternion()))
            result = np.dot(rot_matrix,self.image_array)
            if previous is not None:
                try:
                    plt.cla()
                except Exception as e:
                    print(e)
            previous = self.ax.plot3D(result[0], result[1], result[2], 'green')
            # plt.pause(0.00001)
            return previous

    def Close( self ):
        if self.sensor is not None:
            self.sensor.close()


try:
    # Set up animation object
    sanimate = SensorAnimation("COM5")
    previous = None
    for i in range(20):
        previous = sanimate.RefreshPosition( previous )
        time.sleep(0.1)
    sanimate.Close()

except Exception as e:
    print(e)
    sanimate.Close()
...