您的位置:首页 > 编程语言 > Python开发

GAZEBO下基于python的键盘控制小程序

2020-01-14 18:10 489 查看

代码如下

#!/usr/bin/env python
import roslib; roslib.load_manifest('teleop_twist_keyboard')
import rospy

from geometry_msgs.msg import Twist

import sys, select, termios, tty

msg = """
Reading from the keyboard  and Publishing to Twist!
---------------------------
Moving around:
u    d    o
j    k    l
m    s    .

For Holonomic mode (strafing), hold down the shift key:
---------------------------
U    I    O
w    K    a
M    <    >

t : up (+z)
b : down (-z)

anything else : stop

t/g : increase/decrease max speeds by 10%
r/f : increase/decrease only linear speed by 10%
y/h : increase/decrease only angular speed by 10%

CTRL-C to quit
"""

moveBindings = {
'd':(1,0,0,0),
'o':(1,0,0,-1),
'j':(0,0,0,1),
'l':(0,0,0,-1),
'u':(1,0,0,1),
'a':(-1,0,0,0),
'.':(-1,0,0,1),
'm':(-1,0,0,-1),
'O':(1,-1,0,0),
'I':(1,0,0,0),
'w':(0,1,0,0),
's':(0,-1,0,0),
'U':(1,1,0,0),
'<':(-1,0,0,0),
'>':(-1,-1,0,0),
'M':(-1,1,0,0),
'v':(0,0,1,0),
'b':(0,0,-1,0),
}

speedBindings={
't':(1.1,1.1),
'g':(.9,.9),
'r':(1.1,1),
'f':(.9,1),
'y':(1,1.1),
'h':(1,.9),
}

def getKey():
tty.setraw(sys.stdin.fileno())
select.select([sys.stdin], [], [], 0)
key = sys.stdin.read(1)
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
return key

def vels(speed,turn):
return "currently:\tspeed %s\tturn %s " % (speed,turn)

if __name__=="__main__":
settings = termios.tcgetattr(sys.stdin)

pub = rospy.Publisher('cmd_vel', Twist, queue_size = 100)
rospy.init_node('teleop_twist_keyboard')

speed = rospy.get_param("~speed", 0.5)
turn = rospy.get_param("~turn", 1.0)
x = 0
y = 0
z = 0
th = 0
status = 0

try:
print msg
print vels(speed,turn)
while(1):
key = getKey()
if key in moveBindings.keys():
x = moveBindings[key][0]
y = moveBindings[key][1]
z = moveBindings[key][2]
th = moveBindings[key][3]
elif key in speedBindings.keys():
speed = speed * speedBindings[key][0]
turn = turn * speedBindings[key][1]

print vels(speed,turn)
if (status == 14):
print msg
status = (status + 1) % 15
else:
x = 0
y = 0
z = 0
th = 0
if (key == '\x03'):
break

twist = Twist()
##twist.header.stamp = rospy.Time.now();
twist.linear.x = x*speed; twist.linear.y = y*speed; twist.linear.z = z*speed;
twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = th*turn
pub.publish(twist)

except:
print e

finally:
twist = Twist()
twist.header.stamp = rospy.Time.now();
twist.linear.x = 0; twist.linear.y = 0; twist.linear.z = 0
twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = 0
pub.publish(twist)

termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)

该代码经过适当修改,可应用于GAZEBO的飞行器以及汽车的键盘控制

  • 点赞
  • 收藏
  • 分享
  • 文章举报
雪域天师 发布了3 篇原创文章 · 获赞 2 · 访问量 563 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: