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/

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值