Robotics StackExchange | Archived questions

Question about ROS basics

Hi, I wrote a code about clustering some pointcloud but everytime I tried to run it it gives me this error :

clustering-3] process has died [pid 24822, exit code -11, cmd /home/name/catkin_ws/devel/lib/clustering/clustering_node __name:=clustering __log:=/home/name/.ros/log/a2aa252e-8ee4-11ea-ab03-5800e3afdc5d/clustering-3.log].

I thought at first that I have error in code but I tried to delete some basics line of code that it's surely correct and it worked. Is it possible that my subscriber can't run program fast enough and publish before another messages came. Because my algorithm is not very efficient, I think that complexity is O(n^2). Do you know how to take maybe every 10. messages in subscriber or something similar that could help? Sorry to bother, I'm new in ROS. Kind regards

p.s. I implement function Length of that return number of elements in array and funtions Rangequery that return me pointer of array with indexes (of first pointcloud) of closest neighbours of element My subscriber code is this :

void Cluster_class::DbScan(const sensor_msgs::PointCloud2 &msg ){  

    pcl::PCLPointCloud2 pcl_pc2;
    pcl_conversions::toPCL(msg, pcl_pc2);
    pcl::PointCloud<pcl::PointXYZI> cloud;
    pcl::fromPCLPointCloud2(pcl_pc2, cloud);

    boost::shared_ptr<pcl::PointCloud<pcl::PointXYZI>> scan_cloud(new pcl::PointCloud<pcl::PointXYZI>);
    scan_cloud->height = 1;
    scan_cloud->is_dense = 1;
    scan_cloud->header.frame_id = msg.header.frame_id;

    number_of_points= msg.width;
    int number_of_clusters=0;

    for(int i=0; i<number_of_points; i++){   
    float coef1=0;
    float coef=1./(cloud[i].intensity*10);  
    float distance =Distance(cloud[i].x,cloud[i].y,cloud[i].z);

    if((coef<0.05)&(distance>0.2)){

        int *new_neighbors;
        int *neighbors=RangeQuery(cloud,0.3,cloud[i].x,cloud[i].y,cloud[i].z);

        if(Lenghtof(neighbors)>1){


        for(int j=0; j<Lenghtof(neighbors); j++){
            int help= *(neighbors + j);
            coef1=1./(cloud[help].intensity*10);


           if(coef1<0.05){
             new_neighbors=RangeQuery(cloud,0.3,cloud[neighbors[j]].x,cloud[neighbors[j]].y,cloud[neighbors[j]].z );


             if(Lenghtof(new_neighbors)>2){
             neighbors=Add_new(new_neighbors,neighbors);
             }
            }


        }



        }

        scan_cloud->points[number_of_clusters].x=centralize_x(cloud,neighbors);
        scan_cloud->points[number_of_clusters].y=centralize_y(cloud,neighbors);
        scan_cloud->points[number_of_clusters].y=centralize_z(cloud,neighbors); 
        number_of_clusters++;

        } 
    }  
    scan_cloud->width = number_of_clusters;
    scan_cloud->points.resize(scan_cloud->width * scan_cloud->height);
    pub.publish(scan_cloud);

}

Asked by dembele123 on 2020-05-05 10:50:58 UTC

Comments

Compile with debug flags and find the error.

Asked by stevemacenski on 2020-05-05 11:08:09 UTC

thank you, I found it with help of debug flags. Do you maybe know is there any way to pass velocity parametar for every point via pcl::PointCloudpcl::PointXYZI ?

Asked by dembele123 on 2020-05-06 19:53:33 UTC

You'd need a different pcl::Point template, you can easily create custom ones. I'd check on PCL docs for examples.

Asked by stevemacenski on 2020-05-06 20:37:15 UTC

Closing because you found the issue, you're welcome to open a new on on the point thing, but on the PCL forums

Asked by stevemacenski on 2020-05-06 20:37:56 UTC

Answers