python在ros中获取键盘输入并且发布

系统环境

ubuntu20 + noetic + python3.8

环境配置

因为这个系统是新系统,所以还没安装pip3

安装pip3

打开终端

sudo apt update
sudo apt install python3-pip

pip3 --version

最后显示版本:

pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)

pip3改源

因为不改源的话,pip下载不了依赖包
修改配置文件:~/.config/pip/pip.conf (Linux), (没有就创建一个),然后输入下面的清华源地址

[global]                                                                    
index-url = http://pypi.tuna.tsinghua.edu.cn/simple/
trusted-host = pypi.tuna.tsinghua.edu.cn

在终端输入:

pip3 config list

来看是否配置成功,如果输出上面配置的地址,说明配置成功,就可以用pip3来安装依赖包。

安装pynput依赖

pip3 install pynput
pip3 install --upgrade pynput

然后是升级Xlib,否则回报错(如果程序没报错可以忽略)

pip3 install --upgrade Xlib

获取全局键盘输入的python代码

#!/usr/bin/env python

from pynput.keyboard import Key, Listener
import rospy
from std_msgs.msg import String

def on_press(key):
    try:
        print('{0} pressed'.format(key))
        pub.publish(key.char)
    except AttributeError:
        print('{0} pressed'.format(key))
        pub.publish(str(key))

def on_release(key):
    print('{0} release'.format(key))
    if key == Key.esc:
        # Stop listener
        return False

rospy.init_node('keyboard_listener', anonymous=True)
pub = rospy.Publisher('keyboard_input', String, queue_size=10)

# Collect events until released
with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()```

终端效果

第一个终端获取键盘输入

这个是运行上面python脚本的终端
在这里插入图片描述

另一个终端

这个是另一个终端,运行

rostopic echo /keyboard_input

得到的输出:

在这里插入图片描述

获取特定终端键盘输入的python代码

这个与上面有所不同,上面是全局获取键盘输入,即使不在启动脚本的终端,键盘也会被监听并且获取。而下面这个就是只会监听启动脚本的终端上的键盘输入。(看情况来选择方案)

#!/usr/bin/env python

import rospy
from std_msgs.msg import String
import sys
import tty
import termios

def getch():
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    try:
        tty.setcbreak(fd, termios.TCSAFLUSH)
        ch = sys.stdin.read(1)
    finally:
        termios.tcsetattr(fd, termios.TCSAFLUSH, old_settings)
    return ch

def keyboard_teleop():
    # 初始化ROS节点
    rospy.init_node('keyboard_teleop')

    # 创建一个发布者,发布到名为'cmd_vel'的主题上,消息类型为String
    pub = rospy.Publisher('cmd_vel', String, queue_size=10)

    # 设置循环频率
    rate = rospy.Rate(10) # 10hz

    while not rospy.is_shutdown():
        try:
            # 读取键盘输入
            key = getch()

            # 根据按键发布不同的消息
            if key == 'w':
                msg = "Moving forward"
            elif key == 's':
                msg = "Moving backward"
            elif key == 'a':
                msg = "Moving left"
            elif key == 'd':
                msg = "Moving right"
            else:
                msg = "No command"

            # 发布消息
            pub.publish(msg)

            # 按照设置的频率延迟
            rate.sleep()

        except KeyboardInterrupt:
            print("KeyboardInterrupt")
            break

if __name__ == '__main__':
    try:
        keyboard_teleop()
    except rospy.ROSInterruptException:
        pass

总结

通过这个python小程序,可以全局或者局部获取键盘输入。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值