現在、超音波プローブとモーターを組み合わせたイメージングデバイスをArduinoで作製しております。モーターで超音波プローブを水平方向に360°回転させて周囲にある物体までの距離を測定し、そのデータからpythonを用いて三次元でイメージングすることを目指しております。
得られた距離の情報とモーターの回転角の情報からxとyの値を計算してプロットし、z軸には経過時間をプロットしております。超音波プローブ周辺の物体までの距離の時間変化をイメージングするデバイスになります。
現状、pythonのAxes3Dのライブラリを使用して散布図でリアルタイム画像が得られております。次に散布図ではなく、plot_surfaceを使用して同じくリアルタイム画像を得ようとしたところエラーが発生しました。ネットでエラーについて調べてみましたが、明確な解決方法が見つけられなかっため、こちらに投稿させていただきました。
エラーの詳細と、散布図を作成した際に使用したコードは下記の通りです。なおpythonのバージョンは3.8です。
python
1import numpy as np 2import matplotlib.pyplot as plt 3from mpl_toolkits.mplot3d import Axes3D 4import matplotlib.animation as animation 5import serial 6 7arduinoData = serial.Serial("COM4" , 9600) 8 9def update_lines(num): 10 arduinoString = arduinoData.readline().decode("ascii") 11 dataArray = arduinoString.split(' ') 12 if len(dataArray) == 3: 13 angle , r , time = [int(dataArray[0]) , float(dataArray[1]) , float(dataArray[2]) ] 14 text.set_text("{:d}: [{:.0f},{:.0f},{:.0f}]".format(num, angle, r, time)) # for debugging 15 theta = (360 - angle) * 2 * np.pi / 360 16 dx = r * np.cos(theta) 17 dy = r * np.sin(theta) 18 dz = time 19 20 x.append(dx) 21 y.append(dy) 22 z.append(dz) 23 graph._offsets3d = (x, y, z) 24 return graph, 25 else: 26 pass 27 28 29x = [0] 30y = [0] 31z = [0] 32 33fig = plt.figure(figsize=(5, 5)) 34ax = fig.add_subplot(111, projection="3d") 35graph = ax.scatter(x, y, z, s = 60 , color='g' , alpha = 0.5) 36text = fig.text(0, 1, "TEXT", va='top') # for debugging 37 38ax.set_xlim3d(-20, 20) 39ax.set_ylim3d(-20, 20) 40ax.set_zlim3d(0, 50) 41ax.set_xlabel("Radius_x(cm)") 42ax.set_ylabel("Radius_y(cm)") 43ax.set_zlabel("Time(sec)") 44 45# Creating the Animation object 46ani = animation.FuncAnimation(fig, update_lines, frames=200, interval=50, blit=False) 47plt.show()
こちらのコードで問題なくプロットできましたが、コード後半の
graph = ax.scatter(x, y, z, s = 60 , color='g' , alpha = 0.5)を
graph = ax.plot_surface(x, y, z, s = 60 , color='g' , alpha = 0.5)
に変えてプロットしようとしたところ、
if Z.ndim != 2:
AttributeError: 'list' object has no attribute 'ndim'
というエラーが出ました。ネットで調べたところ、zをnumpy配列に変えればよいとのことでしたので、
z = [0]の下に下記のコードを追加しました。
z = np.array(z)
そうしたところ今度は下記のエラーが発生しました。
ValueError: Argument Z must be 2-dimensional.
どうやらzを2次元配列に直す必要があるようですが、やり方がわからず、ここでスタックしてしまいました。
python初心者なので、全然的外れのことをしているかもしれませんが、もし解決策をご存知でしたらご教授いただきたく存じます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/18 21:11
2020/06/23 00:57
2020/06/25 00:12