我正在用C++编写一个ParaView版本5.1.2的插件来可视化由LiDAR传感器产生的点云数据。我注意到Velodyne有一个开源的ParaView定制应用程序来可视化他们的LiDAR数据,叫做Veloview。我调整了他们的一些代码来启动,但我现在卡住了。
到目前为止,我写了一个阅读器,它获取一个pcap文件,并渲染一个可以逐帧回放的点云。我还写了一个UDP源程序,它监听端口并捕获ParaView数据包,捕获后使用阅读器将它们拆分成帧并可视化PC。
现在,我想要使用实时udp数据包,并在每个帧完成时实时渲染点云。
由于ParaView插件结构的原因,我很难做到这一点。目前,我的阅读器在调用RequestData方法时显示一个框架。我的方法看起来像这样。
int RequestData(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector){
vtkPolyData* output = vtkPolyData::GetData(outputVector);
vtkInformation* info = outputVector->GetInformationObject(0);
int timestep = 0;
if (info->Has(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEP()))
{
double timeRequest = info->Get(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEP());
int length = info->Length(vtkStreamingDemandDrivenPipeline::TIME_STEPS());
timestep = static_cast<int>(floor(timeRequest + 0.5));
}
this->Open();
// GetFrame returns a vtkSmartPointer<vtkPolyData> that is the frame
output->ShallowCopy(this->GetFrame(timestep));
this->Close();
return 1;
}每次在ParaView gui中更新timestep时都会调用RequestData方法。然后将该时间步长中的帧复制到outputVector中。
我不确定如何使用实时数据实现这一点,因为在这种情况下,不会调用RequestData方法,因为没有请求时间步长。我看到有一种方法可以通过以这种方式使用CONTINUE_EXECUTING()来保持RequestData的执行。
request->Set(vtkStreamingDemandDrivenPipeline::CONTINUE_EXECUTING(), 1);但我不知道这是否应该用于可视化实时数据。
就目前而言,我感兴趣的是简单地读取实时数据包,并在帧呈现后立即丢弃它们。有人知道我是如何做到这一点的吗?
发布于 2019-05-09 18:15:33
在VeloView (基本上是一个捆绑的ParaView+LidarPlugin)的代码中,ParaView的时间步长由主代码更改,而不是由激光雷达插件更改。我们建议您从VeloView代码开始,这更接近您的目标。如果你真的想在ParaView中从头开始,你需要自己递增这个请求的时间步长。
最新版本的VeloView (未发布)使用与ParaView“LiveSource”插件(在5.6+中可用)相同的机制,该插件告诉ParaView设置一个自动递增可用和请求的时间步长的QtTimer。
request->Set(vtkStreamingDemandDrivenPipeline::CONTINUE_EXECUTING(), 1);与另一种机制有关,该机制将多次运行请求数据,但不负责更新请求的时间步长。
最好的
巴斯蒂安提花
VeloView项目负责人
https://stackoverflow.com/questions/56045793
复制相似问题