ParaView: плагин для визуализации облаков точек в реальном времени - PullRequest
0 голосов
/ 08 мая 2019

Я пишу плагин ParaView версии 5.1.2 на C ++ для визуализации данных облака точек, полученных с помощью датчика LiDAR. Я заметил, что Velodyne имеет пользовательское приложение ParaView с открытым исходным кодом для визуализации своих данных LiDAR, которое называется Veloview. Я настроил часть их кода для начала, но я застрял сейчас.

До сих пор я писал программу для чтения, которая берет файл pcap и отображает облако точек, которое может воспроизводиться кадр за кадром. Я также написал источник ParaView, который прослушивает порт и захватывает пакеты udp, а после того, как они захвачены, использует устройство чтения, чтобы разделить их на кадры и визуализировать ПК.

Теперь я хотел бы взять живые пакеты 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;
}

Метод RequestData вызывается каждый раз, когда временной шаг обновляется в интерфейсе ParaView. Затем кадр с этого временного шага копируется в выходной вектор.

Я не уверен, как реализовать это с живыми данными, потому что в этом случае метод RequestData не вызывается, потому что не запрашиваются временные шаги. Я видел, что есть способ сохранить выполнение RequestData, используя CONTINUE_EXECUTING () таким образом.

request->Set(vtkStreamingDemandDrivenPipeline::CONTINUE_EXECUTING(), 1);

Но я не знаю, предполагается ли это использовать для визуализации живых данных.

На данный момент мне интересно просто читать живые пакеты и выбрасывать их, как только их кадр рендерится. Кто-нибудь знает, как мне этого добиться?

1 Ответ

0 голосов
/ 09 мая 2019

В коде VeloView (который в основном представляет собой связанный ParaView + LidarPlugin) временные шаги ParaView изменяются основным кодом, а не плагином Lidar. Мы советуем вам начать с кода VeloView, который намного ближе к вашей цели. Если вы действительно хотите начать с нуля в ParaView, вам нужно увеличить этот запрошенный временной интервал самостоятельно.

В новейшей версии VeloView (не выпущенной) используется тот же механизм, что и в плагине ParaView «LiveSource» (доступен в версии 5.6+), где плагин сообщает ParaView установить QtTimer, который будет автоматически увеличивать доступные и запрошенные временные шаги.

request->Set(vtkStreamingDemandDrivenPipeline::CONTINUE_EXECUTING(), 1); относится к другому механизму, который будет запускать данные запроса несколько раз, но не будет заботиться об обновлении запрошенного временного шага.

Best

Bastien Jacquet

Руководитель проекта VeloView

...