PCL 使用 pcl::visualization::PCLVisualizer 類裏面的鍵盤事件方法 如何使用及需要注意的事項

原博文鏈接在我的官方網站,網址是:http://www.aobosir.com/blog/2017/02/08/pcl-visualization-PCLVisualizer-register-keyboard-callback/


如何使用 pcl 庫裏面的可視化模塊的鍵盤事件

#include <pcl/visualization/pcl_visualizer.h>

bool iteration_flag = false;

void keyboardEventOccurred(const pcl::visualization::KeyboardEvent& event, void* nothing){
    if(event.getKeySym() == "space" && event.keyDown()){
        iteration_flag = true;
    }
}

int main(){
    pcl::visualization::PCLVisualizer *p;
    p = new pcl::visualization::PCLVisualizer("PCL Windows");
    p->registerKeyboardCallback(&keyboardEventOccurred, (void*)NULL);

    while(iteration_flag != true){
        p->spinOnce();
    }
    return 0;
}

需要注意的事項:

第一個:就是,你定義的這個p指針,必須要給它賦值實例化對象:p = new pcl::visualization::PCLVisualizer("PCL Windows");,否則程序編譯不會出現錯誤,但是運行的時候會出現內存異常的運行錯誤。


第二個:就是這個自定義的鍵盤事件函數了:keyboardEventOccurred()函數。想要讓這個函數可以使用,我們不需要再程序中循環的調用p->spinOnce()方法,程序才能響應我們的這個鍵盤事件函數。


第三個:一個也非常重要:其實上面的代碼中,這段程序是不安全的:

    while(iteration_flag != true){
        p->spinOnce();
    }

因爲如何程序在這個地方一直的執行,如果你可視化的是一個點比較多的點雲,那麼一段時間後(大約不到5秒鐘),你的電腦就會卡得要死!!!!

安全的程序應該是下面這個樣子的:(參考網站:這裏

我們添加延時函數,不讓它一直執行spinOnce()方法。

#include <boost/thread/thread.hpp>
  while (iteration_flag != true)
  {
    p->spinOnce (100);
    boost::this_thread::sleep (boost::posix_time::microseconds (100000));
  }

其中spinOnce()函數裏面的100指的是:How long (in ms) should the visualization loop be allowed to run.

Alt text

其中的boost::this_thread::sleep (boost::posix_time::microseconds (100000));是延時100000微秒,也就是0.1秒。

更多精彩的博文,請訪問:http://www.aobosir.com/

發佈了294 篇原創文章 · 獲贊 465 · 訪問量 500萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章