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


    1. Footswitch介绍

    Footswitch实际上可以看作一个超大号的键盘按键,或者是鼠标按键。它可以作为一个USB口外接设备人为产生触发信号给被控的设备,如常见的例子有激光发射或超声设备录制图像等的触发信号。那么如果我们需要把这个硬件用起来,接入到ROS中,作为机械臂切换交互还是不交互模式的触发信号,应该怎么使用?这就是这篇博文的写作动机。

    2. Footswitch触发按键配置

    简单的理解,Footswitch的基本原理其实就是向系统发送键盘指令,或者鼠标指令。因此在使用前,我们需要对刚买回来的footswtich做一个键盘的映射,这就需要用到厂家提供的配套软件了。

    2.1 软件下载

    下载地址: https://pcsensor.com/article1/download-footswitch , 下载之后解压安装即可,由于没有Linux的版本,所以需要先在windows系统下配置好,再切回到Linux系统下编写代码接入到ROS中。

    软件下载

    2.2 软件设置

    软件的设置逻辑是需要将按键映射到一个键盘上不存在的按键,可以是F13到F24的任意一个按键,这里我们映射到F13。 此外,Footswitch是一个常开按键,所以触发方式选择按下触发,至于为什么4中我们选择持续触发,在下文的可能的疑问中我们会做相应的解释。
    Footswitch配置

    3. 键盘监听程序

    3.1 python 配置

    python需要安装一个包:

    pip install pynput

    3.2 python 程序

    所有准备工作完成后,可以编写代码,所监听到的按键值的数据类型为pynput.keyboard.Key, 如果令flag_onlyfw=True则会监听所有的按键,按下Esc键可退出程序。

    # !/usr/bin/env python
    # --*--coding=utf-8--*--
    # author: Dianye Huang
    from pynput import keyboard
    from pynput.keyboard import Key
    
    class FootSwitchListener:
        def __init__(self,
                     target_key=Key.f13,
                     flag_onlyfw=False) -> None:
            self.count = 0
            self.target_key = target_key
            self.flag_onlyfw = flag_onlyfw
    
        def on_press(self, key):
            self.process_key(key, 'press')
    
        def on_release(self, key):
            self.process_key(key, 'release')
            if key == keyboard.Key.esc:  # Stop listener when press key.esc
                return False
    
        def process_key(self, key, prompt:str):
            if self.flag_onlyfw:
                if key == self.target_key:
                    self.count += 1
                    print(f' {self.count} {prompt}: {key}')
            else:
                self.count += 1
                print(f' {self.count} {prompt}: {key}')
    
        def run(self):
            with keyboard.Listener(on_press=self.on_press,
                        on_release=self.on_release) as listener:
                listener.join()
    
    if __name__ == '__main__':
        footswitch = FootSwitchListener(target_key=Key.f13, flag_onlyfw=True)
        print('Start listening footswitch!')
        footswitch.run()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    4. 可能的疑问

    4.1 为什么不直接在软件上设置单触发?

    因为经过试验,我们所购买的FS22-PM型号的footswitch选择触发信号为单触发后,按下按键后on_press和on_release函数会先后触发,而选择触发信号为持续触发后,按下按键会一直触发on_press函数,直到释放按键后才会触发一次on_release函数。这与需求是一致的,例如按下footswitch后超声设备持续录像,松开后停止录像。

    4.2 如何将其封装成ROS接口?

    上述程序是不完整的,如,没有必要一直读取触发的信号,可以增加一个标志位判断按下状态和释放状态。除了比较懒的原因,还有一点是,不希望直接提供off the shelf 的代码,直接复制粘贴容易误人子弟。而ROS接口,可以声明一个publisher 发送一个以std_msg::UInt8为数据类型的话题。或者在参数服务器rosparam中设置一个参数,改变该参数的值供调用程序参考。又或者是开一个service,这种方法我觉得效率比较低,不建议采用。

    以上,希望对大家有所帮助,祝周末愉快!

    Dianye Huang
    2022年8月20日

  • 相关阅读:
    【C++】类与对象(中)
    Oracle数据泵导入和导出命令
    PHP后台实现微信小程序登录
    北大教授建议财政向职业教育倾斜,职业教育行业开启加速度!
    机器学习——推荐系统和强化学习
    智慧社区解决方案
    十大经典排序算法——插入排序与希尔排序(超详解)
    Java项目:校园相册管理系统(java+SSM+html+bootstrap+layui+Mysql)
    深入理解 XML 和 HTML 之间的区别
    企业架构LNMP学习笔记47
  • 原文地址:https://blog.csdn.net/huangdianye/article/details/126442666