簡體   English   中英

有沒有一種方法可以用來可視化我在 Rviz 中從 PC2 轉換的點雲數據?

[英]Is there a method I can utilize to visualize my pointcloud data I converted from PC2 in Rviz?

import hdbscan
import rospy
from rospy.core import rospyinfo
from sensor_msgs.msg import PointCloud, PointCloud2
import numpy as np
import pcl
import ros_numpy
import time
from hdbscan_py.msg import cluster_list 
from rospy.numpy_msg import numpy_msg

   
rospy.init_node('hdbscan')

#This is utilizing the data to cluster
def callback(data):
    tstart = time.time()
    pc = ros_numpy.numpify(data)
    points=np.zeros((pc.shape[0], 3))
    points[:,0]=pc['x']
    points[:,1]=pc['y']
    points[:,2]=pc['z']
    p = pcl.PointCloud(np.array(points, dtype=np.float32))
    

    #Utilizes PointCloud points generated to passthrough HDBSCAN
    clusterer = hdbscan.HDBSCAN(min_cluster_size=15, min_samples=1, alpha=1.3).fit(p)
    cluster_labels = clusterer.fit_predict(p)
    p = pcl.PointCloud(np.array(points, dtype=np.float32))
    cluster_list
    #cluster_cloud = pcl.PointCloud_PointXYZRGB()

    #cloudpoints = 
    #rospy.loginfo(cluster_labels)
    tstop = time.time()
    
    talker(cluster_labels, p)
    rospy.loginfo(tstop-tstart)

   

def talker(cluster_labels, p):
    pubClusters = rospy.Publisher('cluster', numpy_msg(p), queue_size=1)
    cluster_list_msg=cluster_list()
    #cluster=[]
    for cluster_index in range(np.size(p)):
        cluster_list_msg.cluster.append(p[cluster_index])
        #cluster_list_msg[cluster_labels[cluster_index]].append(p[cluster_index])
    
    rospy.loginfo('Test')
    pubClusters.publish(cluster_list_msg)
    #pub.publish(clusters_msg)

#This is subscribing to the sensor data
def listener():
    rospy.Subscriber('/wamv/sensors/lidars/lidar_wamv/points', PointCloud2, callback)
    rospy.spin()

if __name__=='__main__':
    listener()

==================================================== === 我目前正在使用自定義消息,並且如實。 我什至不知道這是否是一個好方法,因為我主要使用 Ros wiki 和其他來自在線研究的輸入。 似乎有很多方法可以做我正在做的事情,但最終我正在努力將它們實施到我的代碼中。 我閱讀了一個很好的方法 pcl::toROSmsg(),但這似乎與我的 python 代碼不兼容。 我最終想驗證我的激光雷達代碼是否正在輸入,並且標准 hdbscan 正在工作並對數據進行聚類。 我正在使用一個彈跳單個浮標的 rosbag,我收到一個錯誤,我將在下面粘貼:

[ERROR] [1638228118.356593]: bad callback: <function callback at 0x7f1940b711f0>
Traceback (most recent call last):
  File "/opt/ros/noetic/lib/python3/dist-packages/rospy/topics.py", line 750, in _invoke_callback
    cb(msg)
  File "dbscan_lidar.py", line 37, in callback
    talker(cluster_labels, p)
  File "dbscan_lidar.py", line 43, in talker
    pubClusters = rospy.Publisher('cluster', numpy_msg(p), queue_size=1)
  File "/usr/local/lib/python3.8/dist-packages/ros_numpy/numpy_msg.py", line 13, in numpy_msg
    res = _numpy_msg(cls)
  File "/opt/ros/noetic/lib/python3/dist-packages/rospy/numpy_msg.py", line 87, in numpy_msg
    classdict = { '__slots__': msg_type.__slots__, '_slot_types': msg_type._slot_types,
AttributeError: 'pcl._pcl.PointCloud' object has no attribute '__slots__'

============================================

我也有 2 個自定義消息,它們是 cluster_list.msg 下的 cluster_list.msg 和 cluster.msg 我有 cluster[] cluster_list 和 cluster.msg 我將它定義為 float32 集群。 我不知道這是否是一個很好的方法,但如果有任何建議可以幫助我實現我的目標。 我很感激。

創建發布numpy_msg時需要一個類型,而您正在給它一個類型的實例。 如果您想在該主題上發布 PointCloud 數據,它應該如下所示:

pubClusters = rospy.Publisher('cluster', numpy_msg(PointCloud), queue_size=1)

另請注意,由於talker()被多次調用,因此您不應該在其中創建發布者。 相反,您應該使pubClusters成為全局變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM