我使用以下代码用于发布者和订阅者。我能够在Rviz上为输入节点可视化PointCloud,但无法可视化输出节点。因为我是ROS的新手。我怎么能解决这个问题?我甚至在Rviz中设置了固定帧:base_link。
ros::Subscriber subPointCloud;
ros::Publisher pubPointCloud;
void DEM(const sensor_msgs::PointCloud2ConstPtr& input)
{
ROS_DEBUG("Point Cloud Received");
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
sensor_msgs::PointCloud2 output;
// Convert from ROS message to PCL point cloud
pcl::fromROSMsg(*input, *cloud);
pcl::toROSMsg(*cloud, output);
output.header.stamp = ros::Time::now();
output.header.frame_id = "/baselink";
pubPointCloud.publish(output);
}
int main(int argc, char** argv)
{
ROS_INFO("Starting LIDAR Node");
ros::init(argc, argv, "kitti_lidar_node");
ros::NodeHandle nh;
subPointCloud = nh.subscribe<sensor_msgs::PointCloud2>("input", 1, DEM);
pubPointCloud = nh.advertise<pcl::PointCloud<pcl::PointXYZ> > ("output", 1);
ros::spin();
return 0;
}
您已经提到过将RViz中的固定帧设置为base_link
,但是在您的代码中,您将输出消息的frame_id
设置为baselink
(注意缺少的下划线)。您可以双重解决这个问题:使用相同的帧ID(即base_link
)发布其他输出,或者通过例如transformation向base_link
提供baselink
。命令行:
$ rosrun tf static_transform_publisher 0.0 0.0 0.0 0.0 0.0 0.0 1.0 base_link baselink 1000
以下是排除故障的一些步骤...
1.首先在命令行上检查输出是否通过运行实际填充:rostopic echo /output
,确保实际正在填充数组。
2.确保RVIZ中固定帧与消息frame_id之间的TF树已完成。您可以通过添加TF树来检查它:单击添加>按显示类型> rviz> TF。
然后通过展开TF>然后单击树来打开树。
如果有问题,这应该有助于识别它。
3.最后通过展开状态来检查pointcloud消息的状态。