Ask Your Question

Revision history [back]

how to operate simulation in gazebo through virtual keyboard via ros?

i have build a keyboard with tkinter & python with 4 buttons and i want to operate my simulation through that keys i want to modify teleop_twist_keyboard will attche files below keyboard.py

!/usr/bin/python3

# #

#
## Please Don't Remove Author Name
######### Thanks
#

# # __author__='Kuldeep Wadaskar'

#
#

Kuldeep Wadaskar, 3NOT ROBOTICS PVT LTd, www.3notrobotics.in

#

import modules

try: import Tkinter except: import tkinter as Tkinter

import pyautogui

keys =[ [

=========================================

===== Keyboard Configurations ===========

=========================================

[ # Layout Name ("Function_Keys"),

# Layout Frame Pack arguments ({'side':'top','expand':'yes','fill':'both'}), [ # list of Keys ('esc'," ", 'F1', 'F2','F3','F4',"",'F5','F6','F7','F8',"",'F9','F10','F11','F12') ] ],

[ ("Character_Keys"), ({'side':'top','expand':'yes','fill':'both'}), [ ('~\n`','!\n1','@\n2','#\n3','$\n4','%\n5','^\n6','&\n7','*\n8','(\n9',')\n0','_\n-','+\n=','|\n\','backspace'), ('tab','q','w','e','r','t','y','u','i','o','p','{\n[','}\n]',' '), ('capslock','a','s','d','f','g','h','j','k','l',':\n;',"\"\n'","enter"), ("shift",'z','x','c','v','b','n','m','<\n,','>\n.','?\n/',"shift"), ("ctrl", "[+]",'alt','\t\tspace\t\t','alt','[+]','[=]','ctrl') ] ] ], [ [ ("System_Keys"), ({'side':'top','expand':'yes','fill':'both'}), [ ( "print\nscreen\nsys", "scroll\nlock", "pause\nbreak" ) ] ], [ ("Editing_Keys"), ({'side':'top','expand':'yes','fill':'both'}), [ ( "insert", "home", "page\nup" ), ( "delete", "end", "page\ndown" ), ] ],

[ ("Navigation_Keys"), ({'side':'top','expand':'yes','fill':'both'}), [ ( "up", ), ( "right", "down", "left" ), ] ],

], [

[ ("Numeric_Keys"), ({'side':'top','expand':'yes','fill':'both'}), [ ("num\nlock","/","*","-"), ("7","8","9","+"), ("4","5","6"," "), ("0","1","2","3"), ("0",".","enter") ] ],

]

]

Frame Class

class Keyboard(Tkinter.Frame): def __init__(self, args, *kwargs): Tkinter.Frame.__init__(self, args, *kwargs)

# Function For Creating Buttons self.create_frames_and_buttons()

# Function For Extracting Data From KeyBoard Table # and then provide us a well looking # keyboard gui def create_frames_and_buttons(self): # take section one by one for key_section in keys: # create Sperate Frame For Every Section store_section = Tkinter.Frame(self) store_section.pack(side='left',expand='yes',fill='both',padx=10,pady=10,ipadx=10,ipady=10)

for layer_name, layer_properties, layer_keys in key_section: store_layer = Tkinter.LabelFrame(store_section)#, text=layer_name) #store_layer.pack(side='top',expand='yes',fill='both') store_layer.pack(layer_properties) for key_bunch in layer_keys: store_key_frame = Tkinter.Frame(store_layer) store_key_frame.pack(side='top',expand='yes',fill='both') for k in key_bunch: k=k.capitalize() if len(k)<=3: store_button = Tkinter.Button(store_key_frame, text=k, width=2, height=2) else: store_button = Tkinter.Button(store_key_frame, text=k.center(5,' '), height=2) if " " in k: store_button['state']='disable' #flat, groove, raised, ridge, solid, or sunken store_button['relief']="sunken" store_button['bg']="powderblue" store_button['command']=lambda q=k: self.button_command(q) store_button.pack(side='left',fill='both',expand='yes') return

# Function For Detecting Pressed Keyword. def button_command(self, event): print (event) return

Creating Main Window

def main(): root = Tkinter.Tk(className=" Python Virtual KeyBoard") Keyboard(root).pack() root.mainloop() return

Function Trigger

if __name__=='__main__': main()

teleop_twist_keyboard.py

!/usr/bin/env python

from __future__ import print_function

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 i o j k l m , .

For Holonomic mode (strafing), hold down the shift key:

U I O J K L M < >

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

anything else : stop

q/z : increase/decrease max speeds by 10% w/x : increase/decrease only linear speed by 10% e/c : increase/decrease only angular speed by 10%

CTRL-C to quit """

moveBindings = { 'i':(1,0,0,0), 'o':(1,0,0,-1), 'j':(0,0,0,1), 'l':(0,0,0,-1), 'u':(1,0,0,1), ',':(-1,0,0,0), '.':(-1,0,0,1), 'm':(-1,0,0,-1), 'O':(1,-1,0,0), 'I':(1,0,0,0), 'J':(0,1,0,0), 'L':(0,-1,0,0), 'U':(1,1,0,0), '<':(-1,0,0,0), '>':(-1,-1,0,0), 'M':(-1,1,0,0), 't':(0,0,1,0), 'b':(0,0,-1,0), }

speedBindings={ 'q':(1.1,1.1), 'z':(.9,.9), 'w':(1.1,1), 'x':(.9,1), 'e':(1,1.1), 'c':(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 = 1)
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.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 Exception as e:
    print(e)

finally:
    twist = Twist()
    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)

how to operate simulation in gazebo through virtual keyboard via ros?

i have build a keyboard with tkinter & python with 4 buttons and i want to operate my simulation through that keys i want to modify teleop_twist_keyboard will attche files below below

keyboard.py

!/usr/bin/python3

#!/usr/bin/python3

#
#

#
## # ################################################## ######## Please Don't Remove Author Name
######### Thanks
#

Name ######### ############### Thanks ########################### ################################################## # # __author__='Kuldeep Wadaskar'

#
#

Wadaskar' ###################################################### ###################################################### Kuldeep Wadaskar, 3NOT ROBOTICS PVT LTd, www.3notrobotics.in

#

www.3notrobotics.in ###################################################### # import modules

modules try: import Tkinter except: import tkinter as Tkinter

Tkinter import pyautogui

pyautogui keys =[ [

=========================================

[ # ========================================= # ===== Keyboard Configurations ===========

=========================================

=========== # ========================================= [ # Layout Name ("Function_Keys"),

("Function_Keys"), # Layout Frame Pack arguments ({'side':'top','expand':'yes','fill':'both'}), [ # list of Keys ('esc'," ", 'F1', 'F2','F3','F4',"",'F5','F6','F7','F8',"",'F9','F10','F11','F12') ] ],

], [ ("Character_Keys"), ({'side':'top','expand':'yes','fill':'both'}), [ ('~\n`','!\n1','@\n2','#\n3','$\n4','%\n5','^\n6','&\n7','*\n8','(\n9',')\n0','_\n-','+\n=','|\n\','backspace'), ('~\n`','!\n1','@\n2','#\n3','$\n4','%\n5','^\n6','&\n7','*\n8','(\n9',')\n0','_\n-','+\n=','|\n\\','backspace'), ('tab','q','w','e','r','t','y','u','i','o','p','{\n[','}\n]',' '), ('capslock','a','s','d','f','g','h','j','k','l',':\n;',"\"\n'","enter"), ("shift",'z','x','c','v','b','n','m','<\n,','>\n.','?\n/',"shift"), ("ctrl", "[+]",'alt','\t\tspace\t\t','alt','[+]','[=]','ctrl') ] ] ], [ [ ("System_Keys"), ({'side':'top','expand':'yes','fill':'both'}), [ ( "print\nscreen\nsys", "scroll\nlock", "pause\nbreak" ) ] ], [ ("Editing_Keys"), ({'side':'top','expand':'yes','fill':'both'}), [ ( "insert", "home", "page\nup" ), ( "delete", "end", "page\ndown" ), ] ],

], [ ("Navigation_Keys"), ({'side':'top','expand':'yes','fill':'both'}), [ ( "up", ), ( "right", "down", "left" ), ] ],

], [

], [ [ ("Numeric_Keys"), ({'side':'top','expand':'yes','fill':'both'}), [ ("num\nlock","/","*","-"), ("7","8","9","+"), ("4","5","6"," "), ("0","1","2","3"), ("0",".","enter") ] ],

]

]

], ] ] ## Frame Class

Class class Keyboard(Tkinter.Frame): def __init__(self, args, *kwargs): *args, **kwargs): Tkinter.Frame.__init__(self, args, *kwargs)

*args, **kwargs) # Function For Creating Buttons self.create_frames_and_buttons()

self.create_frames_and_buttons() # Function For Extracting Data From KeyBoard Table # and then provide us a well looking # keyboard gui def create_frames_and_buttons(self): # take section one by one for key_section in keys: # create Sperate Frame For Every Section store_section = Tkinter.Frame(self) store_section.pack(side='left',expand='yes',fill='both',padx=10,pady=10,ipadx=10,ipady=10)

store_section.pack(side='left',expand='yes',fill='both',padx=10,pady=10,ipadx=10,ipady=10) for layer_name, layer_properties, layer_keys in key_section: store_layer = Tkinter.LabelFrame(store_section)#, text=layer_name) #store_layer.pack(side='top',expand='yes',fill='both') store_layer.pack(layer_properties) for key_bunch in layer_keys: store_key_frame = Tkinter.Frame(store_layer) store_key_frame.pack(side='top',expand='yes',fill='both') for k in key_bunch: k=k.capitalize() if len(k)<=3: store_button = Tkinter.Button(store_key_frame, text=k, width=2, height=2) else: store_button = Tkinter.Button(store_key_frame, text=k.center(5,' '), height=2) if " " in k: store_button['state']='disable' #flat, groove, raised, ridge, solid, or sunken store_button['relief']="sunken" store_button['bg']="powderblue" store_button['command']=lambda q=k: self.button_command(q) store_button.pack(side='left',fill='both',expand='yes') return

return # Function For Detecting Pressed Keyword. def button_command(self, event): print (event) return

return # Creating Main Window

Window def main(): root = Tkinter.Tk(className=" Python Virtual KeyBoard") Keyboard(root).pack() root.mainloop() return

return # Function Trigger

Trigger if __name__=='__main__': main()

main()

teleop_twist_keyboard.py

!/usr/bin/env python

#!/usr/bin/env python

from __future__ import print_function

print_function import roslib; roslib.load_manifest('teleop_twist_keyboard') import rospy

rospy from geometry_msgs.msg import Twist

Twist import sys, select, termios, tty

tty msg = """

""" Reading from the keyboard and Publishing to Twist!

Twist! --------------------------- Moving around: u i o j k l m , .

. For Holonomic mode (strafing), hold down the shift key:

key: --------------------------- U I O J K L M < >

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

(-z) anything else : stop

stop q/z : increase/decrease max speeds by 10% w/x : increase/decrease only linear speed by 10% e/c : increase/decrease only angular speed by 10%

10% CTRL-C to quit """

""" moveBindings = { 'i':(1,0,0,0), 'o':(1,0,0,-1), 'j':(0,0,0,1), 'l':(0,0,0,-1), 'u':(1,0,0,1), ',':(-1,0,0,0), '.':(-1,0,0,1), 'm':(-1,0,0,-1), 'O':(1,-1,0,0), 'I':(1,0,0,0), 'J':(0,1,0,0), 'L':(0,-1,0,0), 'U':(1,1,0,0), '<':(-1,0,0,0), '>':(-1,-1,0,0), 'M':(-1,1,0,0), 't':(0,0,1,0), 'b':(0,0,-1,0), }

} speedBindings={ 'q':(1.1,1.1), 'z':(.9,.9), 'w':(1.1,1), 'x':(.9,1), 'e':(1,1.1), 'c':(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

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

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

termios.tcgetattr(sys.stdin)

    pub = rospy.Publisher('cmd_vel', Twist, queue_size = 1)
 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.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 Exception as e:
     print(e)

 finally:
     twist = Twist()
     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)
click to hide/show revision 3
retagged

how to operate simulation in gazebo through virtual keyboard via ros?

i have build a keyboard with tkinter & python with 4 buttons and i want to operate my simulation through that keys i want to modify teleop_twist_keyboard will attche files below

keyboard.py

#!/usr/bin/python3

#
#
##################################################
######## Please Don't Remove Author Name #########
############### Thanks ###########################
##################################################
#
#
__author__='Kuldeep Wadaskar'

######################################################

######################################################
Kuldeep Wadaskar, 3NOT ROBOTICS PVT LTd,
www.3notrobotics.in

######################################################


# import modules
try:
    import Tkinter
except:
    import tkinter as Tkinter

import pyautogui

keys =[ 
[
# =========================================
# ===== Keyboard Configurations ===========
# =========================================

 [
  # Layout Name
  ("Function_Keys"),

  # Layout Frame Pack arguments
  ({'side':'top','expand':'yes','fill':'both'}),
  [
   # list of Keys
   ('esc'," ", 'F1', 'F2','F3','F4',"",'F5','F6','F7','F8',"",'F9','F10','F11','F12')
  ]
 ],

 [
  ("Character_Keys"),
  ({'side':'top','expand':'yes','fill':'both'}),
  [
   ('~\n`','!\n1','@\n2','#\n3','$\n4','%\n5','^\n6','&\n7','*\n8','(\n9',')\n0','_\n-','+\n=','|\n\\','backspace'),
   ('tab','q','w','e','r','t','y','u','i','o','p','{\n[','}\n]','   '),
   ('capslock','a','s','d','f','g','h','j','k','l',':\n;',"\"\n'","enter"),
   ("shift",'z','x','c','v','b','n','m','<\n,','>\n.','?\n/',"shift"),
   ("ctrl", "[+]",'alt','\t\tspace\t\t','alt','[+]','[=]','ctrl')
  ]
 ]
],
[
 [
  ("System_Keys"),
  ({'side':'top','expand':'yes','fill':'both'}),
  [
   (
    "print\nscreen\nsys",
    "scroll\nlock",
    "pause\nbreak"
   )
  ]
 ],
 [
  ("Editing_Keys"),
  ({'side':'top','expand':'yes','fill':'both'}),
  [
   (
    "insert",
    "home",
    "page\nup"
    ),
   ( "delete",
    "end",
    "page\ndown"
    ),
  ]
 ],

 [
  ("Navigation_Keys"),
  ({'side':'top','expand':'yes','fill':'both'}),
  [
   (
    "up",
    ),
   ( "right",
    "down",
    "left"
    ),
  ]
 ],

],
[

 [
  ("Numeric_Keys"),
  ({'side':'top','expand':'yes','fill':'both'}),
  [
   ("num\nlock","/","*","-"),
   ("7","8","9","+"),
   ("4","5","6"," "),
   ("0","1","2","3"),
   ("0",".","enter")
  ]
 ],

]

]

##  Frame Class
class Keyboard(Tkinter.Frame):
 def __init__(self, *args, **kwargs):
  Tkinter.Frame.__init__(self, *args, **kwargs)

  # Function For Creating Buttons
  self.create_frames_and_buttons()

 # Function For Extracting Data From KeyBoard Table
 # and then provide us a well looking
 # keyboard gui
 def create_frames_and_buttons(self):
  # take section one by one
  for key_section in keys:
   # create Sperate Frame For Every Section
   store_section = Tkinter.Frame(self)
   store_section.pack(side='left',expand='yes',fill='both',padx=10,pady=10,ipadx=10,ipady=10)

   for layer_name, layer_properties, layer_keys in key_section:
    store_layer = Tkinter.LabelFrame(store_section)#, text=layer_name)
    #store_layer.pack(side='top',expand='yes',fill='both')
    store_layer.pack(layer_properties)
    for key_bunch in layer_keys:
     store_key_frame = Tkinter.Frame(store_layer)
     store_key_frame.pack(side='top',expand='yes',fill='both')
     for k in key_bunch:
      k=k.capitalize()
      if len(k)<=3:
       store_button = Tkinter.Button(store_key_frame, text=k, width=2, height=2)
      else:
       store_button = Tkinter.Button(store_key_frame, text=k.center(5,' '), height=2)
      if " " in k:
       store_button['state']='disable'
      #flat, groove, raised, ridge, solid, or sunken
      store_button['relief']="sunken"
      store_button['bg']="powderblue"
      store_button['command']=lambda q=k: self.button_command(q)
      store_button.pack(side='left',fill='both',expand='yes')
  return

  # Function For Detecting Pressed Keyword.
 def button_command(self, event):
  print (event)
  return

# Creating Main Window
def main():
 root = Tkinter.Tk(className=" Python Virtual KeyBoard")
 Keyboard(root).pack()
 root.mainloop()
 return

# Function Trigger
if __name__=='__main__':
 main()

teleop_twist_keyboard.py

#!/usr/bin/env python

from __future__ import print_function

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    i    o
   j    k    l
   m    ,    .

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

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

anything else : stop

q/z : increase/decrease max speeds by 10%
w/x : increase/decrease only linear speed by 10%
e/c : increase/decrease only angular speed by 10%

CTRL-C to quit
"""

moveBindings = {
        'i':(1,0,0,0),
        'o':(1,0,0,-1),
        'j':(0,0,0,1),
        'l':(0,0,0,-1),
        'u':(1,0,0,1),
        ',':(-1,0,0,0),
        '.':(-1,0,0,1),
        'm':(-1,0,0,-1),
        'O':(1,-1,0,0),
        'I':(1,0,0,0),
        'J':(0,1,0,0),
        'L':(0,-1,0,0),
        'U':(1,1,0,0),
        '<':(-1,0,0,0),
        '>':(-1,-1,0,0),
        'M':(-1,1,0,0),
        't':(0,0,1,0),
        'b':(0,0,-1,0),
    }

speedBindings={
        'q':(1.1,1.1),
        'z':(.9,.9),
        'w':(1.1,1),
        'x':(.9,1),
        'e':(1,1.1),
        'c':(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 = 1)
    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.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 Exception as e:
        print(e)

    finally:
        twist = Twist()
        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)