Statistics
| Branch: | Tag: | Revision:

hlrc / client / python / hlrc_client / hlrc_test_gui.py @ 801b4c12

History | View | Annotate | Download (7.146 KB)

1 0c286af0 Simon Schulz
#!/usr/bin/python
2 f8fa1217 Simon Schulz
3
"""
4
This file is part of hlrc
5

6
Copyright(c) sschulz <AT> techfak.uni-bielefeld.de
7
http://opensource.cit-ec.de/projects/hlrc
8

9
This file may be licensed under the terms of the
10
GNU General Public License Version 3 (the ``GPL''),
11
or (at your option) any later version.
12

13
Software distributed under the License is distributed
14
on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
15
express or implied. See the GPL for the specific language
16
governing rights and limitations.
17

18
You should have received a copy of the GPL along with this
19
program. If not, go to http://www.gnu.org/licenses/gpl.html
20
or write to the Free Software Foundation, Inc.,
21
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22

23
The development of this software was supported by the
24
Excellence Cluster EXC 277 Cognitive Interaction Technology.
25
The Excellence Cluster EXC 277 is a grant of the Deutsche
26
Forschungsgemeinschaft (DFG) in the context of the German
27
Excellence Initiative.
28
"""
29
30
31
import logging
32
from hlrc_client import *
33
import time
34
import errno
35 0c286af0 Simon Schulz
import sys
36
import os.path
37 f8fa1217 Simon Schulz
38 0c286af0 Simon Schulz
from PyQt4 import QtGui, QtCore
39
from PyQt4.QtCore import SIGNAL
40
41 f8fa1217 Simon Schulz
#from hlrc_speak_utterance import hlrc_utterance
42
#from hlrc_play_animation import hlrc_animation
43
#from hlrc_set_emotion import hlrc_emotion
44
45
class HLRCExample(QtGui.QWidget):
46 0c286af0 Simon Schulz
    
47 f8fa1217 Simon Schulz
        def __init__(self, scope, mw):
48
                super(HLRCExample, self).__init__()
49 0c286af0 Simon Schulz
        
50 f8fa1217 Simon Schulz
                self.scope = scope
51
                self.mw = mw
52
                self.initUI()
53
                self.robot_controller = RobotController(self.mw, self.scope, logging.DEBUG)
54
55
        def initUtteranceUI(self):
56
                groupBox = QtGui.QGroupBox("utterances")
57
58
                hello = QtGui.QPushButton("hello...")
59
                hello.clicked.connect(self.utterance_button_clicked)
60
61
                count = QtGui.QPushButton("12345...")
62
                count.clicked.connect(self.utterance_button_clicked)
63
64
65
                vbox = QtGui.QVBoxLayout()
66
                vbox.addWidget(hello)
67
                vbox.addWidget(count)
68
                vbox.addStretch(1)
69
                groupBox.setLayout(vbox)
70
71
                return groupBox
72
73
        def initSpinbox(self, _min, _max, _init, double):
74
                if (double): 
75
                        s = QtGui.QDoubleSpinBox()
76
                else:
77
                        s = QtGui.QSpinBox()
78
79
                s.setMinimum(_min)
80
                s.setMaximum(_max)
81
                s.setValue(_init)
82
                return s
83
84
        def initPushButton(self, base_layout, text, action):
85
                button = QtGui.QPushButton(text)
86
                button.clicked.connect(action)
87
                base_layout.addWidget(button)
88
                
89
        def initEmotionUI(self):
90
                vbox = QtGui.QVBoxLayout()
91
                self.duration_spinbox = self.initSpinbox(100, 10000, 1000, 0)
92
                vbox.addWidget(self.duration_spinbox)
93
                
94
                self.duration_spinbox = self.initSpinbox(100, 10000, 1000, 0)
95
                self.initPushButton(vbox, "neutral",  self.emotion_button_clicked)
96
                self.initPushButton(vbox, "surprise", self.emotion_button_clicked)
97
                self.initPushButton(vbox, "angry",    self.emotion_button_clicked)
98
                self.initPushButton(vbox, "happy",    self.emotion_button_clicked)
99
                self.initPushButton(vbox, "sad",      self.emotion_button_clicked)
100
                self.initPushButton(vbox, "fear",     self.emotion_button_clicked)
101
                vbox.addStretch(1)
102
                
103
                groupBox = QtGui.QGroupBox("emotion")
104
                groupBox.setLayout(vbox)
105
                return groupBox
106
107
        def initAnimationButton(self, base_layout, name):
108
                b = QtGui.QPushButton(name)
109
                b.clicked.connect(self.animation_button_clicked)
110
                base_layout.addWidget(b)
111
112
        def initAnimUI(self):
113
                groupBox = QtGui.QGroupBox("animations")
114 0c286af0 Simon Schulz
        
115 f8fa1217 Simon Schulz
                #options
116
                options = QtGui.QHBoxLayout()
117
                vbox_r = QtGui.QVBoxLayout()
118
                vbox_r.addWidget(QtGui.QLabel("repetitions"))
119
                self.repetitions_spinbox = self.initSpinbox(1,10,1,0)
120
                vbox_r.addWidget(self.repetitions_spinbox)
121
122
                vbox_d = QtGui.QVBoxLayout()
123
                vbox_d.addWidget(QtGui.QLabel("duration/ms (each)"))
124
                self.duration_each_spinbox = self.initSpinbox(100,10000,1000,0)
125
                vbox_d.addWidget(self.duration_each_spinbox)
126
127
                vbox_s = QtGui.QVBoxLayout()
128
                vbox_s.addWidget(QtGui.QLabel("scale"))
129
                self.scale_spinbox = self.initSpinbox(0.1, 5.0, 1.0, 1)
130
                vbox_s.addWidget(self.scale_spinbox)
131
132
133
                options.addLayout(vbox_r)
134
                options.addLayout(vbox_d)        
135
                options.addLayout(vbox_s)
136
137
                #buttons
138
                vbox = QtGui.QVBoxLayout()
139
                vbox.addLayout(options)
140
                self.initAnimationButton(vbox, "head shake")
141
                self.initAnimationButton(vbox, "head nod")
142
                self.initAnimationButton(vbox, "eyeblink left")
143
                self.initAnimationButton(vbox, "eyeblink right")
144
                self.initAnimationButton(vbox, "eyeblink both")
145
                self.initAnimationButton(vbox, "eyebrows raise")
146
                self.initAnimationButton(vbox, "eyebrows lower")
147
                vbox.addStretch(1)
148
                groupBox.setLayout(vbox)
149
150
                return groupBox
151
152
        def initUI(self):
153
                vbox = QtGui.QVBoxLayout()
154
                
155
                hboxl = QtGui.QHBoxLayout()
156
                hboxl.addWidget(QtGui.QLabel("base scope: "))
157
                hboxl.addWidget(QtGui.QLabel(self.scope))
158
                vbox.addLayout(hboxl)
159
160
                hbox = QtGui.QHBoxLayout()
161
                vbox.addLayout(hbox)
162
                
163
                #emotion
164
                hbox.addWidget(self.initEmotionUI())
165
166
                #utterance:
167
                hbox.addWidget(self.initUtteranceUI())
168
169
                #animations:
170
                hbox.addWidget(self.initAnimUI())
171
172
                self.setLayout(vbox)
173
                #sld.valueChanged.connect(lcd.display)
174
                
175
                self.setGeometry(400, 100, 250, 150)
176
                self.setWindowTitle("HLRC Server test GUI - %s" % self.scope)
177
                self.show()
178
179
        def utterance_button_clicked(self):
180
                button = self.sender().text()
181
                
182
                
183
                if (button == "12345..."):
184
                        self.robot_controller.set_speak("1 2 3 4 5 6 7 8 9 10", False)
185
                elif (button == "hello..."):
186
                        self.robot_controller.set_speak("Hello my name is flobi. How can i help you?", False)
187
                else:
188
                        self.robot_controller.set_speak("invalid button name", False)
189
                        print "invalid button '%s'" % (button)
190
191
        def emotion_button_clicked(self):
192
                button = self.sender().text()
193
                
194
                re = RobotEmotion()
195
                re.time_ms = self.duration_spinbox.value()
196
                
197
                if (button == "angry"):
198
                        re.value = RobotEmotion.ANGRY
199
                elif (button == "neutral"):
200
                        re.value = RobotEmotion.NEUTRAL
201
                elif (button == "happy"):
202
                        re.value = RobotEmotion.HAPPY
203
                elif (button == "sad"):
204
                        re.value = RobotEmotion.SAD
205
                elif (button == "surprise"):
206
                        re.value = RobotEmotion.SURPRISED
207
                elif (button == "fear"):
208
                        re.value = RobotEmotion.FEAR
209
                else:
210
                        print "invalid emotion id '%s'" % (button)
211
                        return 
212
                
213
                self.robot_controller.set_current_emotion(re, False)
214
                
215
        def animation_button_clicked(self):
216
                button = self.sender().text()
217
                
218
                ra = RobotAnimation()
219
                ra.time_ms =  self.duration_each_spinbox.value()
220
                ra.repetitions = self.repetitions_spinbox.value()
221
                ra.scale = self.scale_spinbox.value()
222
223
                if (button == "head nod"):
224
                        ra.value = RobotAnimation.HEAD_NOD
225
                elif (button == "head shake"):
226
                        ra.value = RobotAnimation.HEAD_SHAKE
227
                elif (button == "eyeblink left"):
228
                        ra.value = RobotAnimation.EYEBLINK_L
229
                elif (button == "eyeblink right"):
230
                        ra.value = RobotAnimation.EYEBLINK_R
231
                elif (button == "eyeblink both"):
232
                        ra.value = RobotAnimation.EYEBLINK_BOTH
233
                elif (button == "eyebrows raise"):
234
                        ra.value = RobotAnimation.EYEBROWS_RAISE
235
                elif (button == "eyebrows lower"):
236
                        ra.value = RobotAnimation.EYEBROWS_LOWER
237
                else:
238
                        print "invalid button '%s'" % (button)
239
                        return
240
                
241
                self.robot_controller.set_head_animation(ra, False)
242 0c286af0 Simon Schulz
243
def main():
244 f8fa1217 Simon Schulz
        if (len(sys.argv) != 3):
245
                print("usage:   hlrc_test_gui.py <middleware> <scope>\n\n")
246
                print("example: hlrc_test_gui.py ROS /flobi\n\n")
247
                sys.exit(errno.EINVAL)
248
                
249 0c286af0 Simon Schulz
        scope = sys.argv[1]
250 f8fa1217 Simon Schulz
        mw    = sys.argv[2]
251 0c286af0 Simon Schulz
252 f8fa1217 Simon Schulz
        app = QtGui.QApplication(sys.argv)
253
        ex = HLRCExample(mw, scope)
254
        sys.exit(app.exec_())
255 0c286af0 Simon Schulz
256
257
if __name__ == '__main__':
258 f8fa1217 Simon Schulz
        main()