ros python深度カメラの点群データsensor_を読み込むmsgs.PointCloud 2、点群のXYZ座標を取得する

1208 ワード

深さカメラtopic下の点群データをsubscriberで受信し、点群中のXYZ座標msgデータフォーマットをsensor_とするmsgs.PointCloud 2これは1次元あるいは2次元の配列で、データは処理を経て、直接点座標XYZ情報を読み取ることができなくて、1歩の読み取り操作が必要です.私の深度カメラから出たtopicの名前は/myです.camera/depth/points
#! /usr/bin/env python

from sensor_msgs.msg import PointCloud2
from sensor_msgs import point_cloud2
import rospy
import time

def callback_pointcloud(data):
    assert isinstance(data, PointCloud2)
    gen = point_cloud2.read_points(data, field_names=("x", "y", "z"), skip_nans=True)
    time.sleep(1)
    print type(gen)
    for p in gen:
      print " x : %.3f  y: %.3f  z: %.3f" %(p[0],p[1],p[2])

def main():
    rospy.init_node('pcl_listener', anonymous=True)
    rospy.Subscriber('/my_camera/depth/points', PointCloud2, callback_pointcloud)
    rospy.spin()

if __name__ == "__main__":
    main()

重要な部分:関数point_cloud2.read_points(data, field_names=("x", "y", "z"), skip_nans=True)この関数の戻り値はgenerator(pythonのジェネレータであり、Iterator反復器の一種に属する).一度にすべてのポイントを取得する必要がある場合はlist()を使用してリストに変換できます.pythonのgeneratorとiteratorの理解については、次のブログを参照してください.
https://www.cnblogs.com/wj-1314/p/8490822.html