ROS发布pcl::PointXYZ数据时,时间戳问题

本文介绍了一种常见的ROS中发布pcl::PointXYZ数据时遇到的时间戳转换问题及其解决方案。通过使用pcl_conversions库中的转换函数,可以将ros::Time类型的时间戳正确地赋值给pcl云数据的消息头。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在利用ROS发布pcl::pointXYZ数据时,出现错误。

运行时出现错误:ERROR: terminate called after throwing an instance of 'std::runtime_error'   what():  Time is out of dual 32-bit range

#include <ros/ros.h>
#include <pcl_ros/point_cloud.h>
#include <pcl/point_types.h>

typedef pcl::PointCloud<pcl::PointXYZ> PointCloud;

int main(int argc, char** argv)
{
    ros::init (argc, argv, "pub_pcl");
    ros::NodeHandle nh;
    ros::Publisher pub = nh.advertise<PointCloud> ("points2", 1);

    PointCloud::Ptr msg (new PointCloud);
    msg->header.frame_id = "some_tf_frame";
    msg->height = msg->width = 1;
    msg->points.push_back (pcl::PointXYZ(1.0, 2.0, 3.0));

    ros::Rate loop_rate(4);
    while (nh.ok())
    {
        msg->header.stamp = ros::Time::now ();
        pub.publish (msg);
        ros::spinOnce ();
        loop_rate.sleep ();
   } 
}
出现错误:

error: no se puede convertir ‘ros::Time’ a ‘uint64_t {aka long unsigned int}’ en la asignación (it's in Spanish, I don't know how to change my compiler language)
error: 'ros::Time' cannot be converted to 'uint64_t {aka long unsigned int}' in assignment


解决方法:

参考:http://answers.ros.org/question/172730/pcl-header-timestamp/


pcl_conversions has conversion functions :http://docs.ros.org/indigo/api/pcl_co...

To convert the time:

#include <pcl_conversions/pcl_conversions.h>
...
pcl_conversions::toPCL(ros::Time::now(), point_cloud_msg->header.stamp);

Or convert an entire header from a ros message:

pcl_conversions::toPCL(ros_msg->header, point_cloud_msg>header);




#include <ros/ros.h> #include <pcl/point_cloud.h> #include <pcl_conversions/pcl_conversions.h> #include <sensor_msgs/PointCloud2.h> #include <pcl/io/io.h> #include <pcl/io/pcd_io.h> #include <iostream> #include <vector> #include <ctime> #include <pcl/point_types.h> #include <pcl/filters/statistical_outlier_removal.h> //struct MyPoint { float X, Y, Z; }; // 字段名必须与PCD文件完全一致 //POINT_CLOUD_REGISTER_POINT_STRUCT(MyPoint, (float, X, X)(float, Y, Y)(float, Z, Z)) main (int argc, char **argv) { ros::init (argc, argv, "pcl_create"); ros::NodeHandle nh; ros::Publisher pcl_pub = nh.advertise<sensor_msgs::PointCloud2> ("pcl_output", 1); pcl::PointCloud<pcl::PointXYZ>::Ptr cloud3 (new pcl::PointCloud<pcl::PointXYZ>); pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>); pcl::PCLPointCloud2 cloud1; sensor_msgs::PointCloud2 output; //pcl::io::loadPCDFile("/home/zjh/cloud_test/table_scene_lms400.pcd",cloud1); //pcl::io::loadPCDFile(file_path, cloud1); //pcl::io::loadPCDFile<pcl::PointXYZ>;/tmp/table_scene_lms400.pcd //pcl::io::loadPCDFile("/tmp/table_scene_lms400.pcd",cloud1); pcl::io::loadPCDFile("/tmp/costmap_obstacles.pcd",cloud1); pcl::fromPCLPointCloud2 (cloud1,*cloud3); pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor; sor.setInputCloud (cloud3); // 创建过滤器,每个点分析计算考虑的最近邻居个数为50个; // 设置标准差阈值为1,这意味着所有距离查询点的平均距离的标准偏差均大于1个标准偏差的所有点都将被标记为离群值并删除。 // 计算输出并将其存储在cloud_filtered中 // 设置平均距离估计的最近邻居的数量K sor.setMeanK (50); // 设置标准差阈值系数 sor.setStddevMulThresh (1.0); // 执行过滤 sor.filter (*cloud_filtered); std::cerr << "Cloud after filtering: " << std::endl; std::cerr << *cloud_filtered << std::endl; pcl::toROSMsg(*cloud_filtered, output); output.header.frame_id = "odom"; ros::Rate loop_rate(1); while (ros::ok()) { pcl_pub.publish(output); ros::spinOnce(); loop_rate.sleep(); } return 0; }
05-30
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值