为什么循环和可视化点云滞后于 PCL 可视化器?

Why does looping through and visualizing point clouds lag the PCL visualizer?

问题来了。我有一个点云指针矢量,我想一次可视化一个。我拥有的是一个可视化工具,它查看向量中的第一个点并等待键盘输入来更改正在可视化的内容。例如,'n' 将为可视化工具提供向量中的下一个元素,而 'b' 将为您提供前一个元素。

//n moves to the next frame
    if(event.getKeySym () == "n" && event.keyDown ()){
        moveForward();
    }

    //b goes back a frame
    if(event.getKeySym () == "b" && event.keyDown ()){
        if (current_spot > 0){
            newCloud(--current_spot); 
            viewer->updateText("Frame: " + std::to_string(--current_frame), TEXT_X, TEXT_FRAME_Y, "fileNum");
        }
    }

这使您可以在阵列中来回移动并查看点云的某些帧。这很好用,但是我有另一个键 'm' 可以像视频一样播放帧。它通过创建一个 while 循环并在其中向前移动帧、更新可视化工具并休眠以支持帧速率来实现这一点。

//m plays all point clouds from current frame
    if(event.getKeySym () == "m" && event.keyUp ()){
        play = true;
        while(moveForward() && play) { 
            viewer->spinOnce(10);
            std::this_thread::sleep_for(std::chrono::milliseconds(22));
        }
    }

这里是 moveForward() 和 newCloud() 函数:

bool moveForward(){
    if(current_spot < BUFFER_LIMIT || (PC_Done && current_spot < DEQUE_SIZE - 1)){
        newCloud(++current_spot);
        viewer->updateText("Frame: " + std::to_string(++current_frame), TEXT_X, TEXT_FRAME_Y, "fileNum");
        return true;
    }else if(current_spot == BUFFER_LIMIT){
        clouds.pop_front();
        signalPC.notify_one();
        newCloud(current_spot);
        viewer->updateText("Frame: " + std::to_string(++current_frame), TEXT_X, TEXT_FRAME_Y, "fileNum");
        return true;
    }
    return false;
}

void newCloud(int spot){
    viewer->removePointCloud("cloud");
    viewer->addPointCloud(clouds[spot]);
    viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "cloud");
}

这按预期工作,在它到达终点或过早停止后,可视化工具滞后于所有其他输入以移动相机或帧,更糟糕的是,它会堆叠。您击中的移动 'm',可视化器滞后的次数越多。奇怪的是,按住 'n' 向前移动不会破坏任何东西,而使用 'm' 会。任何人都知道为什么这会大大降低性能?

更新

事实证明,可视化工具的整体滞后源于自旋循环。我正在使用 spinOnce(x) 然后休眠,这有点多余并且似乎延迟了输入,因为它正在休眠并存储输入从而导致粘性输入。我摆脱了睡眠并将 spinOnce(x) 更改为 spin() ,这使得输入更加顺畅。然而,这并没有完全解决视频播放功能。我仍然需要在该循环中使用 spinOnce() 以便 1. 在每个新帧之后实际更新可视化工具和 2. 模拟帧速率。这会导致一些奇怪的效果。使用 movie 函数一次会显着减慢一切,但它在停止后不会堆叠,事实上它恰恰相反。再次按下 'm' 键将使一切恢复正常并以适当的速率播放视频,停止播放将使可视化工具处于最佳状态。这将来回进行并且很奇怪。所以我会努力的。如果您有任何想法,请告诉我。谢谢!

这里还有新的 'm' 按键功能:

//m plays all point clouds from current frame
    if(event.getKeySym () == "m" && event.keyUp ()){
        play = true;
        while(moveForward() && play) { 
            viewer->spinOnce(33);
        }
    }

想通了...所以事实证明 m 键绑定到 vtk 中的某些东西。我查看了 pcl source code,但找不到任何绑定到 m 的功能,所以我不知道为什么正是 m 键专门减慢了可视化工具的速度。我只是将我的键绑定从 m 上移开,现在它可以完美运行了。不过,按 m 似乎仍然会造成不良影响,对此一无所知。我知道这是一个小众问题,但我希望有人能从中得到启发,或者,也许,这可以帮助某人。