用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的理解,可以參考下面這篇博文: