Statistics
| Branch: | Tag: | Revision:

hlrc / client / python / hlrc_client / hlrc_test_gui.py @ 3877047d

History | View | Annotate | Download (7.943 KB)

1
#!/usr/bin/python
2

    
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
import sys
36
import os.path
37

    
38
from PyQt4 import QtGui, QtCore
39
from PyQt4.QtCore import SIGNAL
40

    
41
class HLRCExample(QtGui.QWidget):
42
    
43
    def __init__(self, scope, mw):
44
        super(HLRCExample, self).__init__()
45
        
46
        self.scope = scope
47
        self.mw = mw
48
        self.initUI()
49
        self.robot_controller = RobotController(self.mw, self.scope, logging.DEBUG)
50

    
51
        def initUtteranceUI(self):
52
            groupBox = QtGui.QGroupBox("utterances")
53

    
54
            hello = QtGui.QPushButton("hello...")
55
            hello.clicked.connect(self.utterance_button_clicked)
56

    
57
            count = QtGui.QPushButton("12345...")
58
            count.clicked.connect(self.utterance_button_clicked)
59

    
60

    
61
            vbox = QtGui.QVBoxLayout()
62
            vbox.addWidget(hello)
63
            vbox.addWidget(count)
64
            vbox.addStretch(1)
65
            groupBox.setLayout(vbox)
66

    
67
            return groupBox
68

    
69
        def initSpinbox(self, _min, _max, _init, double):
70
            if (double):
71
                s = QtGui.QDoubleSpinBox()
72
                else:
73
                    s = QtGui.QSpinBox()
74

    
75
                    s.setMinimum(_min)
76
                    s.setMaximum(_max)
77
                    s.setValue(_init)
78
                    return s
79

    
80
                def initPushButton(self, base_layout, text, action):
81
                    button = QtGui.QPushButton(text)
82
                    button.clicked.connect(action)
83
                    base_layout.addWidget(button)
84

    
85
                    def initEmotionUI(self):
86
                        vbox = QtGui.QVBoxLayout()
87
                        self.duration_spinbox = self.initSpinbox(100, 10000, 1000, 0)
88
                        vbox.addWidget(self.duration_spinbox)
89

    
90
                        #self.duration_spinbox = self.initSpinbox(50, 10000, 1000, 0)
91
                        self.initPushButton(vbox, "neutral",  self.emotion_button_clicked)
92
                        self.initPushButton(vbox, "surprise", self.emotion_button_clicked)
93
                        self.initPushButton(vbox, "angry",    self.emotion_button_clicked)
94
                        self.initPushButton(vbox, "happy",    self.emotion_button_clicked)
95
                        self.initPushButton(vbox, "sad",      self.emotion_button_clicked)
96
                        self.initPushButton(vbox, "fear",     self.emotion_button_clicked)
97
                        vbox.addStretch(1)
98

    
99
                        groupBox = QtGui.QGroupBox("emotion")
100
                        groupBox.setLayout(vbox)
101
                        return groupBox
102

    
103
                    def initAnimationButton(self, base_layout, name):
104
                        b = QtGui.QPushButton(name)
105
                        b.clicked.connect(self.animation_button_clicked)
106
                        base_layout.addWidget(b)
107

    
108
                        def initAnimUI(self):
109
                            groupBox = QtGui.QGroupBox("animations")
110

    
111
                            #options
112
                            options = QtGui.QHBoxLayout()
113
                            vbox_r = QtGui.QVBoxLayout()
114
                            vbox_r.addWidget(QtGui.QLabel("repetitions"))
115
                            self.repetitions_spinbox = self.initSpinbox(1,10,1,0)
116
                            vbox_r.addWidget(self.repetitions_spinbox)
117

    
118
                            vbox_d = QtGui.QVBoxLayout()
119
                            vbox_d.addWidget(QtGui.QLabel("duration/ms (each)"))
120
                            self.duration_each_spinbox = self.initSpinbox(50,10000,1000,0)
121
                            vbox_d.addWidget(self.duration_each_spinbox)
122

    
123
                            vbox_s = QtGui.QVBoxLayout()
124
                            vbox_s.addWidget(QtGui.QLabel("scale"))
125
                            self.scale_spinbox = self.initSpinbox(0.1, 5.0, 1.0, 1)
126
                            vbox_s.addWidget(self.scale_spinbox)
127

    
128

    
129
                            options.addLayout(vbox_r)
130
                            options.addLayout(vbox_d)
131
                            options.addLayout(vbox_s)
132

    
133
                            #buttons
134
                            vbox = QtGui.QVBoxLayout()
135
                            vbox.addLayout(options)
136
                            self.initAnimationButton(vbox, "head shake")
137
                            self.initAnimationButton(vbox, "head nod")
138
                            self.initAnimationButton(vbox, "eyeblink left")
139
                            self.initAnimationButton(vbox, "eyeblink right")
140
                            self.initAnimationButton(vbox, "eyeblink both")
141
                            self.initAnimationButton(vbox, "eyebrows raise")
142
                            self.initAnimationButton(vbox, "eyebrows lower")
143
                            vbox.addStretch(1)
144
                            groupBox.setLayout(vbox)
145

    
146
                            return groupBox
147

    
148
                        def initUI(self):
149
                            vbox = QtGui.QVBoxLayout()
150

    
151
                            hboxl = QtGui.QHBoxLayout()
152
                            hboxl.addWidget(QtGui.QLabel("base scope: "))
153
                            hboxl.addWidget(QtGui.QLabel(self.scope))
154
                            vbox.addLayout(hboxl)
155

    
156
                            hbox = QtGui.QHBoxLayout()
157
                            vbox.addLayout(hbox)
158

    
159
                            #emotion
160
                            hbox.addWidget(self.initEmotionUI())
161

    
162
                            #utterance:
163
                                hbox.addWidget(self.initUtteranceUI())
164

    
165
                                #animations:
166
                                    hbox.addWidget(self.initAnimUI())
167

    
168
                                    self.setLayout(vbox)
169
                                    #sld.valueChanged.connect(lcd.display)
170

    
171
                                    self.setGeometry(400, 100, 250, 150)
172
                                    self.setWindowTitle("HLRC Server test GUI - %s" % self.scope)
173
                                    self.show()
174

    
175
                                    def utterance_button_clicked(self):
176
                                        button = self.sender().text()
177

    
178

    
179
                                        if (button == "12345..."):
180
                                            self.robot_controller.set_speak("1 2 3 4 5 6 7 8 9 10", False)
181
                                            elif (button == "hello..."):
182
                                                self.robot_controller.set_speak("Hello my name is flobi. How can i help you?", False)
183
                                                else:
184
                                                    self.robot_controller.set_speak("invalid button name", False)
185
                                                    print "invalid button '%s'" % (button)
186

    
187
                                                    def emotion_button_clicked(self):
188
                                                        button = self.sender().text()
189

    
190
                                                        re = RobotEmotion()
191
                                                        re.time_ms = self.duration_spinbox.value()
192

    
193
                                                        if (button == "angry"):
194
                                                            re.value = RobotEmotion.ANGRY
195
                                                            elif (button == "neutral"):
196
                                                                re.value = RobotEmotion.NEUTRAL
197
                                                                elif (button == "happy"):
198
                                                                    re.value = RobotEmotion.HAPPY
199
                                                                    elif (button == "sad"):
200
                                                                        re.value = RobotEmotion.SAD
201
                                                                        elif (button == "surprise"):
202
                                                                            re.value = RobotEmotion.SURPRISED
203
                                                                            elif (button == "fear"):
204
                                                                                re.value = RobotEmotion.FEAR
205
                                                                                else:
206
                                                                                    print "invalid emotion id '%s'" % (button)
207
                                                                                    return
208

    
209
                                                                                self.robot_controller.set_current_emotion(re, False)
210

    
211
                                                                                def animation_button_clicked(self):
212
                                                                                    button = self.sender().text()
213

    
214
                                                                                    ra = RobotAnimation()
215
                                                                                    ra.time_ms =  self.duration_each_spinbox.value()
216
                                                                                    ra.repetitions = self.repetitions_spinbox.value()
217
                                                                                    ra.scale = self.scale_spinbox.value()
218

    
219
                                                                                    if (button == "head nod"):
220
                                                                                        ra.value = RobotAnimation.HEAD_NOD
221
                                                                                        elif (button == "head shake"):
222
                                                                                            ra.value = RobotAnimation.HEAD_SHAKE
223
                                                                                            elif (button == "eyeblink left"):
224
                                                                                                ra.value = RobotAnimation.EYEBLINK_L
225
                                                                                                elif (button == "eyeblink right"):
226
                                                                                                    ra.value = RobotAnimation.EYEBLINK_R
227
                                                                                                    elif (button == "eyeblink both"):
228
                                                                                                        ra.value = RobotAnimation.EYEBLINK_BOTH
229
                                                                                                        elif (button == "eyebrows raise"):
230
                                                                                                            ra.value = RobotAnimation.EYEBROWS_RAISE
231
                                                                                                            elif (button == "eyebrows lower"):
232
                                                                                                                ra.value = RobotAnimation.EYEBROWS_LOWER
233
                                                                                                                else:
234
                                                                                                                    print "invalid button '%s'" % (button)
235
                                                                                                                    return
236

    
237
                                                                                                                self.robot_controller.set_head_animation(ra, False)
238

    
239
                                                                                                                def main():
240
                                                                                                                    if (len(sys.argv) != 3):
241
                                                                                                                        print("usage:   hlrc_test_gui.py <middleware> <scope>\n\n")
242
                                                                                                                        print("example: hlrc_test_gui.py ROS /flobi\n\n")
243
                                                                                                                        sys.exit(errno.EINVAL)
244

    
245
                                                                                                                        scope = sys.argv[1]
246
                                                                                                                        mw    = sys.argv[2]
247

    
248
                                                                                                                        app = QtGui.QApplication(sys.argv)
249
                                                                                                                        ex = HLRCExample(mw, scope)
250
                                                                                                                        sys.exit(app.exec_())
251

    
252

    
253
                                                                                                                        if __name__ == '__main__':
254
                                                                                                                            main()