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 等等。
我正在尝试创建一个节点以使用 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 等等。