Statistics
| Branch: | Tag: | Revision:

hlrc / client / python / hlrc_client / hlrc_test_gui.py @ master

History | View | Annotate | Download (7.881 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 8b670e17 Robert Haschke
from PyQt5 import QtCore
39
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QSpinBox, QGroupBox, QDoubleSpinBox
40 0c286af0 Simon Schulz
41 8b670e17 Robert Haschke
class HLRCExample(QWidget):
42 70c54617 Simon Schulz
43 3877047d Simon Schulz
    def __init__(self, scope, mw):
44 70c54617 Simon Schulz
        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 8b670e17 Robert Haschke
        groupBox = QGroupBox("utterances")
53 70c54617 Simon Schulz
54 8b670e17 Robert Haschke
        hello = QPushButton("hello...")
55 70c54617 Simon Schulz
        hello.clicked.connect(self.utterance_button_clicked)
56
57 8b670e17 Robert Haschke
        count = QPushButton("12345...")
58 70c54617 Simon Schulz
        count.clicked.connect(self.utterance_button_clicked)
59
60
61 8b670e17 Robert Haschke
        vbox = QVBoxLayout()
62 70c54617 Simon Schulz
        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 8b670e17 Robert Haschke
            s = QDoubleSpinBox()
72 70c54617 Simon Schulz
        else:
73 8b670e17 Robert Haschke
            s = QSpinBox()
74 70c54617 Simon Schulz
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 8b670e17 Robert Haschke
        button = QPushButton(text)
82 70c54617 Simon Schulz
        button.clicked.connect(action)
83
        base_layout.addWidget(button)
84
85
    def initEmotionUI(self):
86 8b670e17 Robert Haschke
        vbox = QVBoxLayout()
87 70c54617 Simon Schulz
        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 8b670e17 Robert Haschke
        groupBox = QGroupBox("emotion")
100 70c54617 Simon Schulz
        groupBox.setLayout(vbox)
101
        return groupBox
102
103
    def initAnimationButton(self, base_layout, name):
104 8b670e17 Robert Haschke
        b = QPushButton(name)
105 70c54617 Simon Schulz
        b.clicked.connect(self.animation_button_clicked)
106
        base_layout.addWidget(b)
107
108
    def initAnimUI(self):
109 8b670e17 Robert Haschke
        groupBox = QGroupBox("animations")
110 70c54617 Simon Schulz
111
        #options
112 8b670e17 Robert Haschke
        options = QHBoxLayout()
113
        vbox_r = QVBoxLayout()
114
        vbox_r.addWidget(QLabel("repetitions"))
115 70c54617 Simon Schulz
        self.repetitions_spinbox = self.initSpinbox(1,10,1,0)
116
        vbox_r.addWidget(self.repetitions_spinbox)
117
118 8b670e17 Robert Haschke
        vbox_d = QVBoxLayout()
119
        vbox_d.addWidget(QLabel("duration/ms (each)"))
120 70c54617 Simon Schulz
        self.duration_each_spinbox = self.initSpinbox(50,10000,1000,0)
121
        vbox_d.addWidget(self.duration_each_spinbox)
122
123 8b670e17 Robert Haschke
        vbox_s = QVBoxLayout()
124
        vbox_s.addWidget(QLabel("scale"))
125 70c54617 Simon Schulz
        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 8b670e17 Robert Haschke
        vbox = QVBoxLayout()
135 70c54617 Simon Schulz
        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 8b670e17 Robert Haschke
        vbox = QVBoxLayout()
150 70c54617 Simon Schulz
151 8b670e17 Robert Haschke
        hboxl = QHBoxLayout()
152
        hboxl.addWidget(QLabel("base scope: "))
153
        hboxl.addWidget(QLabel(self.scope))
154 70c54617 Simon Schulz
        vbox.addLayout(hboxl)
155
156 8b670e17 Robert Haschke
        hbox = QHBoxLayout()
157 70c54617 Simon Schulz
        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 836f314c Robert Haschke
            print("invalid button '%s'" % (button))
186 70c54617 Simon Schulz
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 836f314c Robert Haschke
            print("invalid emotion id '%s'" % (button))
207 70c54617 Simon Schulz
            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 836f314c Robert Haschke
            print("invalid button '%s'" % (button))
235 70c54617 Simon Schulz
            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 8b670e17 Robert Haschke
    app = QApplication(sys.argv)
249 70c54617 Simon Schulz
    ex = HLRCExample(mw, scope)
250
    sys.exit(app.exec_())
251
252
253
if __name__ == '__main__':
254
    main()