关于在ros回调函数中处理激光雷达点云累计数帧数据一起处理的操作

3 篇文章 0 订阅

ROS中点云数据的叠加处理

在我们处理点云数据的时候,我们经常会对点云的数据进行累加到一起在进行操作,也就是将几帧数据叠加为一个数据在进行处理,这在低线束的情况下是经常用到的,具体的操作过程如下:

class object3dDetector {
  /*************Publish And  Subcriber*************/
private:
    ros::NodeHandle n;
    ros::Subscriber point_date_sub;
    ros::Publisher raw_point_pub;
    sensor_msgs::PointCloud2 raw_point;

public:
    object3dDetector() {
//     ----------------------sub and scrb defination----------------------
        point_date_sub = n.subscribe("/livox/lidar", 3, &object3dDetector::callback, this);
        raw_point_pub = n.advertise<sensor_msgs::PointCloud2>("/raw_Point", 3);
    }
    void getpoint_callback(const sensor_msgs::PointCloud2::ConstPtr &livox_msg);
    void callback(const sensor_msgs::PointCloud2::ConstPtr &msg);
};
int i=1;//一定要放在回调函数外.
pcl::PointCloud<pcl::PointXYZ>::Ptr temp_cloud(new pcl::PointCloud<pcl::PointXYZ>);

void object3dDetector::callback(const sensor_msgs::PointCloud2::ConstPtr &msg) {
    cout << "msg:" << (msg->height) * (msg->width) << endl;
    auto startTime = std::chrono::steady_clock::now();
    //累计数据
    if (i < 3) {
        pcl::PointCloud<pcl::PointXYZ>::Ptr transfer_cloud(new pcl::PointCloud<pcl::PointXYZ>);
        pcl::fromROSMsg(*msg, *transfer_cloud);
        *temp_cloud += *transfer_cloud;
//        cout<<"COUNT POINTS_NUM[:"<<i<<"]:"<<temp_cloud->points.size()<<endl;
        i++;
    } else {

        pcl::PointCloud<pcl::PointXYZ>::Ptr transfer_cloud(new pcl::PointCloud<pcl::PointXYZ>);
        pcl::fromROSMsg(*msg, *transfer_cloud);
        *temp_cloud += *transfer_cloud;
        pcl::toROSMsg(*temp_cloud, raw_point);
        *********todo****************
   i=1;
temp_cloud->clear();//清除点云数据,进行下一次累计.
}
}
int main(int argc, char **argv) {
t << "------------------DO it!-----------------------" << endl;
    ros::init(argc, argv, "object3d_detector");

    object3dDetector A;
    ros::spin();
    }

到此就可以了.

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
ROS回调函数是用来处理订阅的消息数据的。当节点订阅了一个话题后,ROS会不断地接收该话题发布的消息数据,并将数据传递给回调函数回调函数会对数据进行处理,例如将消息数据转化为对应的数据类型,进行计算、控制、决策等等操作回调函数的主要作用是处理订阅到的消息,这样就能够对数据进行分析、处理和控制等操作回调函数可以使用ROS提供的API来操作数据。例如,可以使用ROS消息格式定义的数据类型来访问消息数据字段,也可以使用ROS提供的库函数来执行一些常见的操作,例如数据转换、计算等等。 下面是一个简单的回调函数的例子,该函数用于处理名为“/odom”的话题的消息: ```python def odom_callback(data): # 获取消息的位置信息 x = data.pose.pose.position.x y = data.pose.pose.position.y z = data.pose.pose.position.z # 对位置信息进行处理 # ... # 发布处理后的消息 pub.publish(processed_data) ``` 在这个例子回调函数会从消息获取位置信息,并对位置信息进行处理处理后,回调函数会发布处理后的消息。这个例子只是一个简单的示例,实际上回调函数可以执行非常复杂的操作,例如控制机器人运动、分析传感器数据、决策等等。 总之,ROS回调函数非常灵活和强大,可以用来处理各种类型的数据,从而实现机器人控制和自主决策等功能。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值