tpp.c:84:使用 pcl_ros::transformPointCloud 时断言失败

tpp.c:84: Assertion fails when using pcl_ros::transformPointCloud

我正在尝试创建一个节点以使用 tf 侦听器并订阅 PointCloud2 主题并使用 pcl_ros::transformPointCloud 函数输出已转换为地面框架的新 PointCloud2 主题。代码运行良好,直到它收到一条消息,当它在第一次调用 pcl_ros 函数时失败并显示以下错误消息:

transf_vox_cloud: tpp.c:84: __pthread_tpp_change_priority: 断言`new_prio == -1 || (new_prio >= fifo_min_prio && new_prio <= fifo_max_prio)' 失败。 已中止(核心已转储)

#include <ros/ros.h>
#include <tf/tf.h>
#include <tf/transform_listener.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl_ros/transforms.h>
#include <string>

class STP
{
    public:
    STP()
    {
        new_PCD_pub = n.advertise<sensor_msgs::PointCloud2>("new_voxel_cloud",500); //define publisher
        old_PCD_sub = n.subscribe("voxel_cloud",500, &STP::transformCallback, this); //define subscriber
        ros::spin();
    }

    private: //initialize node, define pub/sub, initialize tf listener, define destination frame for transforms
    ros::NodeHandle n;
    ros::Publisher new_PCD_pub;
    ros::Subscriber old_PCD_sub;
    tf::TransformListener *tf_listener;
    std::string dest_frame = "/map";

    void transformCallback(const sensor_msgs::PointCloud2::ConstPtr& camera_frame_cloud) //callback func to transform received pointcloud
        {
            sensor_msgs::PointCloud2 map_frame_cloud;
            pcl_ros::transformPointCloud(dest_frame, *camera_frame_cloud, map_frame_cloud, *tf_listener);
            new_PCD_pub.publish(map_frame_cloud);
        }
}; //end callback func
int main(int argc, char** argv){

    ros::init(argc, argv, "voxel_cloud_transformer");
    STP STPobject;

    return 0;

}

您尚未初始化 tf_listener,因此您正在取消引用空指针。所需的最小更改应为:

public:
  STP() :
      tf_listener {new tf::TransformListener}
  {
    new_PCD_pub = n.advertise<sensor_msgs::PointCloud2>("new_voxel_cloud", 500); //define publisher
    old_PCD_sub = n.subscribe("voxel_cloud", 500, &STP::transformCallback, this); //define subscriber
    ros::spin();
  }

但我没试过,请告诉我。

就是说,我建议不要让侦听器在堆上(我没有看到一个很好的理由),或者至少使用智能指针(如果这样做的话)。我还建议初始化 n,而不是在构造函数内部旋转,使用 tf2 而不是 tf 等等。