2017-10-31 9 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

"배열에 발전기를 변환"의 기본적인 질문에 대답하는 것이 다른 게시물 중 일부를 살펴 보자 :

정확하게 모르는 상태에서 모자 발전기 내가 할 수있는 최선은 다소 일반적인 (그러나 특히 효율적이지) 예를 제공하고, 반환 :

#!/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