ros python讀取深度相機中的點雲數據sensor_msgs.PointCloud2,獲取點雲中的XYZ座標

用subscriber接收深度相機topic下的點雲數據,獲取點雲中的XYZ座標
msg數據格式是sensor_msgs.PointCloud2
這是一個一維或二維的數組,數據經過處理,無法直接讀取點座標XYZ信息,需要一步讀取操作。
我的深度相機發出的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章