系统环境
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小程序,可以全局或者局部获取键盘输入。