[Matplotlib-users] continuous plotting with mplot3d
Bret Foreman
bret.foreman at gmail.com
Wed Apr 15 11:42:24 EDT 2020
I'm using Python 2.7 on Windows 10 in a Jupyter Notebook.
I have an external orientation sensor on a USB port. I want to periodically
poll that sensor at around 10Hz and update the orientation of a figure on
the screen with each new sample. The sensor returns a quaternion when
polled which I convert to a rotation matrix to rotate a 3D image array.
This all works fine.
My problem is getting mplot3d to update the displayed image dynamically
after each orientation sample. All I can get is a plot at the end of the
run, nothing updates while I'm sampling. How can I change this code to plot
dynamically?
Here's my code:
*import serial.tools.list_ports # import serial moduleimport
threespace_api_mod_Bret as ts_apiimport numpy as npimport quaternionimport
matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dimport
timedef 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 <http://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()*
--
Bret Foreman
415-608-0604
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/matplotlib-users/attachments/20200415/47c771ab/attachment.html>
More information about the Matplotlib-users
mailing list