ROS中 Python/C++ 键盘按键监听事件

这几天在肝全国智能驾驶大赛,真就挺累的:抓狂思考,手搓代码,疯狂编译,要命运行。在这趟火车上,被各种各样的问题卡住甚至卡死,就很难受好吧。至今,我深深地领悟到:真正能够检验一个大学生能力的方法就是敲代码,能把代码手搓出来,就说明有本事;搓不出来,就是“烂人”一个。

在遇到的这一堆问题中,有一个看似很水,但是一直搞不定,最后还是用 opencv+rostopic pub 勉强变向解决掉了。他就是“键盘按键监听事件”,大致应用场景如下:在main函数中,需要获取键盘按键信息,如果监听到按下了f键(ASCII=102),则将机器人状态复原、打印状态信息并退出程序;若没有监听到按键信息,则机器人继续运行并打印状态信息。

文章目录

  • ROS中 Python/C++ 键盘按键监听事件
    • 1.下面是一种Python版本的代码实现:
    • 2.下面是一种C++版本的代码实现
    • 3.参考资料:

1.下面是一种Python版本的代码实现:

import select,termios,tty,sys## 获取键盘按键信息
def listenKey():## sys.stdin表示标准化输入## termios.tcgetattr(fd)返回一个包含文件描述符fd的tty属性的列表property_list = termios.tcgetattr(sys.stdin)## tty.setraw(fd, when=termios.TCSAFLUSH)将文件描述符fd的模式更改为raw。如果when被省略,则默认为termios.TCSAFLUSH,并传递给termios.tcsetattr()tty.setraw(sys.stdin.fileno())## 第一个参数是需要监听可读的套接字, 第二个是需要监听可写的套接字, 第三个是需要监听异常的套接字, 第四个是时间限制设置## 如果监听的套接字满足了可读可写条件, 那么所返回的can_read 或 can_write就会有值, 然后就可以利用这些返回值进行后续操作can_read, _, _ = select.select([sys.stdin], [], [], 0.1)if can_read:keyValue = sys.stdin.read(1)else:keyValue = ''termios.tcsetattr(sys.stdin, termios.TCSADRAIN, property_list)return keyValue

观察上述代码,可以发现精髓是select.select模块,这个模块用在这里真是妙,上面的注释已经讲解得比较清晰了,如果想要全面仔细地扫盲,可以学习以下链接:python select模块详解 - 听风。 - 博客园 (cnblogs.com)


作为一个惯用C++的同学,总想用C++来实现以上功能,结果码力不足的问题直接暴露无遗。


2.下面是一种C++版本的代码实现

我最初的想法是使用opencv_C++ waitKey()函数来实现,但是却无法完全实现功能(无法实现的原因是:该c++文件是ros/C++/C/opencv融合,不是很好操作)。因此,我上网查了一下资料:

在以下链接(C/C++ 获取键盘事件 | 菜鸟教程 (runoob.com))中提到了监听键盘事件的C/C++版本实现,在惊叹于Windows系统下使用 vs 中的 _kbhit() 函数的同时,由于无人驾驶小车是在linux系统下运行的,看了一眼 Unix/Linux系统下的代码实现,直接整个人都傻住了,Windows系统下两三行解决的功能到了Unix/Linux系统,居然要写四个函数,而且其中两个函数体对于像我一样的菜鸡来说还很难看懂。

被逼无奈,我只能重新操起opencv的大刀,经过一番尝试之后,总算是勉强变向解决了问题,代码如下(其中大部分无关代码被我删除掉了,无法正常运行,主要展示键盘按键监听事件):

int main(int argc, char ** argv){setlocale(LC_ALL, "");ros::init(argc, argv, "plan");ros::NodeHandle nh;//订阅锥桶识别结果数据和激光雷达扫描数据ros::Subscriber cone = nh.subscribe<std_msgs::Float32MultiArray>("/car/barrier", 1000, pict_callBack);ros::Subscriber scan = nh.subscribe<sensor_msgs::LaserScan>("/scan", 1000, laser_callback);//发布处理后的图像数据和速度控制消息ros::Publisher picture = nh.advertise<std_msgs::Float32MultiArray>("/car/picture", 1000);ros::Publisher cmd_vel = nh.advertise<geometry_msgs::Twist>("/car/cmd_vel", 1000);ros::Rate rate(1);while(ros::ok()){ROS_INFO("小汽车启动啦...");while(true){int c = waitKey(100);if(c==102){twist.linear.x = 1500;twist.angular.z = 90;cmd_vel.publish(twist);ROS_INFO("用户手动停止操作!");ROS_INFO("当前线速度:%f,角速度:%f", twist.linear.x, twist.angular.z);return 0;} if(c==-1){ROS_INFO("L_V: %f.....L_A: %f.....B_N:%f.....", linear_v, angular_v, pict_call);twist.linear.x = linear_v;twist.angular.z = angular_v;cmd_vel.publish(twist);ROS_INFO("当前线速度:%f,角速度:%f", twist.linear.x, twist.angular.z);rate.sleep();ros::spinOnce();   }

为什么我一直强调最终是“勉强变向”解决问题了呢?原因是:上述代码无法监听到键盘按键f,从而将机器人状态复原、打印状态信息并退出程序,但无按键信息时需要执行的代码运行正常。最终,我们通过rostopic pub发布ros话题信息,以手动方式使机器人小车能够计时复原状态并退出程序。但是我很想知道为什么无法监听到键盘按键f,殷切盼望有识之士施以援手,CSDN私聊我就行

3.参考资料:

python select模块详解 - 听风。 - 博客园 (cnblogs.com)

C/C++ 获取键盘事件 | 菜鸟教程 (runoob.com)

注:若侵权,请告知删除!

ROS中 Python/C++ 键盘按键监听事件相关推荐

  1. android设备外接键盘实现监听事件

    需求分析 产品为一款基于android的交互终端,现在已经在android嵌入式系统上运行了一个第三方的交易软件(没有源码).在产品量产投入使用时,可以实现以下两点需求: 设备开机时自动启动交易App ...

  2. Footswitch应用之Python键盘按键监听程序

    Footswitch硬件的使用 1. Footswitch介绍 2. Footswitch触发按键配置 2.1 软件下载 2.2 软件设置 3. 键盘监听程序 3.1 python 配置 3.2 py ...

  3. python鼠标键盘同时监听

    from pynput.mouse import Listener as Listener_mouse from pynput.keyboard import Listener as Listener ...

  4. 【RK3399Pro学习笔记】十四、ROS中tf坐标系广播与监听的编程实现

    目录 创建功能包 如何实现一个tf广播器 创建tf广播器代码(C++) 如何实现一个tf监听器 创建tf监听器代码(C++) 配置编译规则 编译并运行 python 编写程序 turtle_tf_br ...

  5. android 电视盒子 遥控器 获取,Android TV开发中所有的遥控器按键监听及注意事项,新增home键监听...

    简单记录下android 盒子开发遥控器的监听 ,希望能帮到新入门的朋友们 不多说,直接贴代码 public class MainActivity extends Activity { private ...

  6. android 后台键盘按键监听,android键盘的监听

    android 键盘监听 从知乎上看到的一种解决方案,目前还没发现有什么坑. public class SoftKeyBroadManager implements ViewTreeObserver. ...

  7. Python 技术篇-pyhook暂停键盘鼠标监听事件,停止键盘鼠标监听事件且不关闭程序

    很多时候只是要暂停一下或只想关闭监听,并不想把程序关闭. 但是网上搜了半天,没有找到,然后自己就去翻了翻源码,发现了. 开启监听是: HookMouse()和HookKeyboard() 暂停监听是: ...

  8. Android中Preference的使用以及监听事件分析

                                                                                                        ...

  9. Android中自定义ScrollView的滑动监听事件,并在滑动时渐变标题栏背景颜色

    效果图 滑动前: 滑动中: 滑动到底部: 项目结构 ObservableScrollView package com.jukopro.titlebarcolor;import android.cont ...

最新文章

  1. python入门第一课练习题_老男孩教育Python 9期第一课练习题答案
  2. python 遍历xml所有节点
  3. IBM的大数据就是返朴归真
  4. 云原生实战派:2021 让改变发生,2022 让创新升级
  5. go build命令参数详解
  6. 为DedeCms的RSS生成绝对地址
  7. c#10:string内插处理
  8. Linux 命令之 ps -- 显示进程状态/查看进程信息
  9. Cocos Studio 2.3.2不再支持直接导入PSD文件
  10. linux httpd 自动启动,在Linux启动时让Apache也自动启动
  11. r 语言ylim = c(0 1),今日R--条形图(barplot)
  12. markdownFormat
  13. oracle分析函数over(Partition by...)及开窗函数详解
  14. keil4调试时出现Error Flash Download failed - “Cortex-M4”问题
  15. 回答cad转pdf格式的简易方法
  16. 怎么制作OC材质预设?
  17. python re group()
  18. 信息检索的基本方法(1)
  19. 编译超频Android内核,安卓超频工具apk下载
  20. Centos7安装开启BBR加速

热门文章

  1. Transformer、Bert、GPT简介
  2. 华为UOS欧拉版 K3S+Rancher 安装完全版
  3. word转pdf转换器使用测试
  4. NETGEAR WNR2200 路由器 变身打印服务器
  5. 数值微分法(DDA)详解
  6. BricsCAD二次开发之外部组件发生异常bug
  7. 源码阅读:SDWebImage(二十一)——UIImageView+WebCache/UIImageView+HighlightedWebCache
  8. 2020下半年软考报名指南
  9. 9000字通俗易懂的讲解下Java注解,你还看不明白?
  10. OpenGL: OpenGL圆柱面绘制贴图