2017-10-31 8 views
1
def laser_callback(self, laserMsg): 
    cloud = self.laser_projector.projectLaser(laserMsg) 
    gen = pc2.read_points(cloud, skip_nans=True, field_names=('x', 'y', 'z')) 
    self.xyz_generator = gen 
    print(gen) 

レーザーデータをpointcloud2データに変換し、matplotlib.pyplotを使用して表示しようとしています。私はジェネレータの個々のポイントを横断しようとしましたが、時間がかかります。代わりに、それらを数の少ない配列に変換してプロットしたいと思います。それをどうやって行うのですか?numpy配列としてジェネレーターデータを読み取る方法

答えて

1

"配列に発電機を変換" の基本的な質問に答えるように見えるこれらの他の記事のいくつかを見てみましょう:

正確にwを知らないと帽子あなたのジェネレータは、私ができる最善のは、(特に効率的ではない)、やや一般的な例を提供している、戻っている:

#!/usr/bin/env -p python 

import numpy as np 

# Sample generator of (x, y, z) tuples 
def my_generator(): 
    for i in range(10): 
     yield (i, i*2, i*2 + 1) 
     i += 1 

def gen_to_numpy(gen): 
    return np.array([x for x in gen]) 

gen = my_generator() 
array = gen_to_numpy(gen) 

print(type(array)) 
print(array) 

出力:再び

<class 'numpy.ndarray'> 
[[ 0 0 1] 
[ 1 2 3] 
[ 2 4 5] 
[ 3 6 7] 
[ 4 8 9] 
[ 5 10 11] 
[ 6 12 13] 
[ 7 14 15] 
[ 8 16 17] 
[ 9 18 19]] 

しかし、私はの効率性についてはコメントできませんこの。ジェネレータからポイントを直接読み取ってプロットするのに時間がかかることに言及しましたが、Numpyアレイに変換するには、ジェネレータ全体を通ってデータを取得する必要があります。あなたが使用しているpointcloud実装のレーザーがアレイとして直接データを提供できるのであれば、おそらくもっと効率的ですが、それはROS Answersフォーラムの質問です(私はあなたに気付きますalready asked this there)。

+0

これは非常に効率的で、効果的でした。ありがとうございました! – MoneyBall

関連する問題