remoteControl.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 
4 # notwendige Module einbinden
5 from time import sleep
6 import packedCom
7 # zum Tasten auslesen
8 import sys
9 import termios
10 import tty
11 import select
12 
13 
14 class remoteControlMotor(packedCom.packedCom):
15  def __init__(self):
16  """ Initialisieren der Klasse. """
17 
18 
19  self.left = 0
20  self.right = 0
21 
22 
23  packedCom.packedCom.__init__(self, 0xa6, "bb")
24  # packed descriptor is 0xa6
25  # left is of type int8_t
26  # right is of type int8_t
27 
28  def getAsString(self):
29  """ Konvertiert die aktuellen Daten in einen String """
30 
31  # schreibe alle Daten in eine Liste
32  # (Reihenfolge wie bei der Initialisierung)
33  data = [ self.left, self.right ]
34  # rufe die getAsString-Funktion der Basisklasse
35  return super(remoteControlMotor, self).getAsString(data)
36 
37 class remoteControlTwist(packedCom.packedCom):
38  def __init__(self):
39  """ Initialisieren der Klasse. """
40 
41 
42  self.linear = 0
43  self.angular = 0
44 
45 
46  packedCom.packedCom.__init__(self, 0xa5, "hh")
47  # packed descriptor is 0xa5
48  # left is of type int16_t
49  # right is of type int16_t
50 
51  def getAsString(self):
52  """ Konvertiert die aktuellen Daten in einen String """
53 
54  # schreibe alle Daten in eine Liste
55  # (Reihenfolge wie bei der Initialisierung)
56  data = [ self.linear, self.angular ]
57  # rufe die getAsString-Funktion der Basisklasse
58  return super(remoteControlTwist, self).getAsString(data)
59 
60 
61 """
62 Programm zum Testen der Fernsteuer-Funktionen.
63 
64 Zugehöriges Mikrocontroller Programm ist examples/remoteControl.c
65 Wird dieses Programm auf dem Roboter ausgeführt, kann über das Python
66 Skript eine Kommunikation etabliert werden.
67 
68 Dieses Python Skript benötigt das vereinfachte packedCom-Modul unter
69  tools/python/packedCom.py
70 
71 Das Programm kann mit Strg-C abgebrochen werden.
72 """
73 
74 # Comport öffnen
75 # Standarddevice ist Kabelgebundene USB Verbindung zum Roboter
76 # (/dev/tucbot/all_usb)
77 #
78 # Zum öffnen der XBee-Verbindung muss dieses Skript mit dem entsprechenden
79 # Parameter geöffnet werden, für den Roboter Pete wäre dies zum Beispiel:
80 # $ python customData.py -r pete
81 comport = packedCom.comPort()
82 
83 # Initialisierung um Tastaturbefehle abzufangen
84 # Alte Einstellungen sichern
85 stdin_oldattr = termios.tcgetattr(sys.stdin)
86 # Neue Einstellungen setzen
87 tty.setcbreak(sys.stdin)
88 
89 # Steuerung per Nummernblock oder W-A-S-D
90 # w,8 : gerade aus fahren
91 # s,2 : zurück fahren
92 #
93 # a,4 : nach links drehen
94 # d,6 : nach rechts drehen
95 #
96 # q,7 : leicht nach links korrigieren
97 # e,9 : leicht nach rechts korrigieren
98 #
99 # " ",5: stehen bleiben
100 # sonst: stehen bleiben
101 #
102 # Mit Strg-C abbrechen!
103 
104 # Instantierung
105 twist = remoteControlTwist()
106 motor = remoteControlMotor()
107 
108 try:
109  while 1:
110  # Kurz warten
111  sleep(0.1)
112 
113  # Taste auslesen
114  if (sys.stdin in select.select([sys.stdin], [], [], 0)[0]):
115  # ein Zeichen einlesen
116  c = sys.stdin.read(1)
117  else:
118  # keine Zeichen vorhanden --> Schleife von vorne beginnen
119  continue
120 
121  # Esc-Taste
122  if (c == chr(27)):
123  break
124 
125  # Steuerung
126  if (c in ['w', '8']):
127  twist.linear = 200
128  twist.angular = 0
129  motor.right = 50
130  motor.left = 50
131  elif (c in ['s', '2']):
132  twist.linear = -100
133  twist.angular = 0
134  motor.right = -30
135  motor.left = -30
136 
137  elif (c in ['a', '4']):
138  twist.linear = 0
139  twist.angular = 30
140  motor.right = 30
141  motor.left = -30
142  elif (c in ['d', '6']):
143  twist.linear = 0
144  twist.angular = -30
145  motor.right = -30
146  motor.left = 30
147 
148  elif (c in ['q', '7']):
149  twist.angular+= 5
150  motor.right-= 5
151  motor.left += 5
152  elif (c in ['e', '9']):
153  twist.angular-= 5
154  motor.right+= 5
155  motor.left -= 5
156 
157  elif (c in [' ', '5']):
158  twist.linear = 0
159  twist.angular = 0
160  motor.right = 0
161  motor.left = 0
162  else:
163  print "ungültiges Zeichen"
164  twist.linear = 0
165  twist.angular = 0
166  motor.right = 0
167  motor.left = 0
168 
169  comport.write(twist.getAsString())
170  comport.write(motor.getAsString())
171  print "motor(", motor.left, ", ", motor.right, ");", \
172  "\t twist(", twist.linear, ", ", twist.angular, ");"
173 
174 finally:
175  # Alte Einstellungen der Tastatur wiederherstellen
176  termios.tcsetattr(sys.stdin, termios.TCSANOW, stdin_oldattr)
177