Revision 78cc756c
client/python/hlrc_client/MiddlewareRSB.py | ||
---|---|---|
32 | 32 |
import rsb.converter |
33 | 33 |
import rst |
34 | 34 |
|
35 |
#This is untested for now (flier), RST has been refactored during "GGB", so these are the new types (names and packages) |
|
36 |
from rstsandbox.animation.EmotionExpression_pb2 import EmotionExpression as EmotionState |
|
37 |
from rstsandbox.animation.HeadAnimation_pb2 import HeadAnimation as Animation |
|
38 |
from rstsandbox.robot.HumotionGazeTarget_pb2 import HumotionGazeTarget as GazeTarget |
|
39 |
from rstsandbox.robot.MouthTarget_pb2 import MouthTarget |
|
35 |
from rstsandbox.animation.EmotionExpression_pb2 import EmotionExpression |
|
36 |
from rstsandbox.animation.HeadAnimation_pb2 import HeadAnimation |
|
37 |
from rstsandbox.animation.BinocularHeadGaze_pb2 import BinocularHeadGaze |
|
38 |
from rstsandbox.geometry.SphericalDirectionFloat_pb2 import SphericalDirectionFloat |
|
40 | 39 |
|
41 | 40 |
|
42 | 41 |
class MiddlewareRSB(Middleware): |
... | ... | |
65 | 64 |
#initialise RSB stuff |
66 | 65 |
self.logger.info("initialising RSB middleware connection on scope %s, registering rst converters..." % (self.base_scope)) |
67 | 66 |
|
68 |
self.emotionstate_converter = rsb.converter.ProtocolBufferConverter(messageClass = EmotionState)
|
|
69 |
rsb.converter.registerGlobalConverter(self.emotionstate_converter)
|
|
67 |
self.EmotionExpression_converter = rsb.converter.ProtocolBufferConverter(messageClass = EmotionExpression)
|
|
68 |
rsb.converter.registerGlobalConverter(self.EmotionExpression_converter)
|
|
70 | 69 |
|
71 |
self.animation_converter = rsb.converter.ProtocolBufferConverter(messageClass = Animation)
|
|
72 |
rsb.converter.registerGlobalConverter(self.animation_converter)
|
|
70 |
self.HeadAnimation_converter = rsb.converter.ProtocolBufferConverter(messageClass = HeadAnimation)
|
|
71 |
rsb.converter.registerGlobalConverter(self.HeadAnimation_converter)
|
|
73 | 72 |
|
74 |
self.gaze_converter = rsb.converter.ProtocolBufferConverter(messageClass = GazeTarget) |
|
75 |
rsb.converter.registerGlobalConverter(self.gaze_converter) |
|
76 |
|
|
77 |
self.mouth_converter = rsb.converter.ProtocolBufferConverter(messageClass = MouthTarget) |
|
78 |
rsb.converter.registerGlobalConverter(self.mouth_converter) |
|
73 |
self.BinocularHeadGaze_converter = rsb.converter.ProtocolBufferConverter(messageClass = BinocularHeadGaze) |
|
74 |
rsb.converter.registerGlobalConverter(self.BinocularHeadGaze_converter) |
|
79 | 75 |
|
80 | 76 |
try: |
81 | 77 |
self.server = rsb.createRemoteServer(self.base_scope + '/set') |
... | ... | |
93 | 89 |
""" |
94 | 90 |
|
95 | 91 |
#create emotion & fill it with values: |
96 |
rsb_em = EmotionState()
|
|
92 |
rsb_em = EmotionExpression()
|
|
97 | 93 |
|
98 | 94 |
#set value |
99 | 95 |
rsb_em.value = self.convert_emotiontype_to_rsbval(emotion.value) |
... | ... | |
106 | 102 |
|
107 | 103 |
if (blocking): |
108 | 104 |
#blocking rpc call: |
109 |
if (em_type == RobotEmotion.TYPE_DEFAULT):
|
|
105 |
if (em_type == EmotionExpression.TYPE_DEFAULT):
|
|
110 | 106 |
result = server.defaultEmotion(rsb_em) |
111 | 107 |
else: |
112 | 108 |
result = server.currentEmotion(rsb_em) |
113 | 109 |
|
114 | 110 |
self.logger.debug("server reply: '%s'" % result) |
115 | 111 |
else: |
116 |
if (em_type == RobotEmotion.TYPE_DEFAULT):
|
|
112 |
if (em_type == EmotionExpression.TYPE_DEFAULT):
|
|
117 | 113 |
future = server.defaultEmotion.async(rsb_em) |
118 | 114 |
else: |
119 | 115 |
future = server.currentEmotion.async(rsb_em) |
... | ... | |
122 | 118 |
#print '> server reply: "%s"' % future.get(timeout = 10); |
123 | 119 |
self.logger.debug("emotion rpc done") |
124 | 120 |
|
125 |
def publish_head_animation(self, animation, blocking):
|
|
126 |
"""publish an head animation via mw
|
|
127 |
:param animation: animation to set
|
|
121 |
def publish_head_HeadAnimation(self, HeadAnimation, blocking):
|
|
122 |
"""publish an head HeadAnimation via mw
|
|
123 |
:param HeadAnimation: HeadAnimation to set
|
|
128 | 124 |
:param blocking: True if this call should block until execution finished on robot |
129 | 125 |
""" |
130 | 126 |
|
131 |
self.logger.debug("calling the animation rpc (%s)..." % ("BLOCKING" if blocking else "NON-BLOCKING"))
|
|
127 |
self.logger.debug("calling the HeadAnimation rpc (%s)..." % ("BLOCKING" if blocking else "NON-BLOCKING"))
|
|
132 | 128 |
|
133 |
#create animation & fill it with values:
|
|
134 |
rsb_ani = Animation() |
|
129 |
#create HeadAnimation & fill it with values:
|
|
130 |
rsb_ani = HeadAnimation()
|
|
135 | 131 |
|
136 | 132 |
#select ani |
137 |
rsb_ani.target = self.convert_animationtype_to_rsbval(animation.value)
|
|
138 |
rsb_ani.repetitions = animation.repetitions
|
|
139 |
rsb_ani.duration_each = animation.time_ms
|
|
140 |
rsb_ani.scale = animation.scale
|
|
133 |
rsb_ani.target = self.convert_HeadAnimationtype_to_rsbval(HeadAnimation.value)
|
|
134 |
rsb_ani.repetitions = HeadAnimation.repetitions
|
|
135 |
rsb_ani.duration_each = HeadAnimation.time_ms
|
|
136 |
rsb_ani.scale = HeadAnimation.scale
|
|
141 | 137 |
|
142 | 138 |
if (blocking): |
143 | 139 |
#blocking: |
144 |
result = self.server.animation(rsb_ani)
|
|
140 |
result = self.server.HeadAnimation(rsb_ani)
|
|
145 | 141 |
self.logger.debug("server reply: '%s'" % result) |
146 | 142 |
else: |
147 |
future = self.server.animation.async(rsb_ani)
|
|
143 |
future = self.server.HeadAnimation.async(rsb_ani)
|
|
148 | 144 |
#we can block here for a incoming result with a timeout in s |
149 | 145 |
#print '> server reply: "%s"' % future.get(timeout = 10); |
150 | 146 |
|
151 |
self.logger.debug("animation rpc done")
|
|
147 |
self.logger.debug("HeadAnimation rpc done")
|
|
152 | 148 |
|
153 | 149 |
def publish_default_emotion(self, emotion, blocking): |
154 | 150 |
self.publish_emotion(RobotEmotion.TYPE_DEFAULT, emotion, blocking) |
... | ... | |
164 | 160 |
self.logger.debug("calling the gaze rpc (%s)..." % ("BLOCKING" if blocking else "NON-BLOCKING")) |
165 | 161 |
|
166 | 162 |
#create gaze target & fill it with values: |
167 |
rsb_gaze = GazeTarget()
|
|
163 |
rsb_gaze = BinocularHeadGaze()
|
|
168 | 164 |
|
169 | 165 |
#fill proto |
170 |
rsb_gaze.pan = gaze.pan |
|
171 |
rsb_gaze.tilt = gaze.tilt |
|
172 |
rsb_gaze.roll = gaze.roll |
|
166 |
rsb_gaze.target = SphericalDirectionFloat() |
|
167 |
rsb_gaze.target.elevation = gaze.tilt |
|
168 |
rsb_gaze.target.azimuth = gaze.pan |
|
169 |
|
|
173 | 170 |
rsb_gaze.vergence = gaze.vergence |
174 |
rsb_gaze.pan_offset = gaze.pan_offset |
|
175 |
rsb_gaze.tilt_offset = gaze.tilt_offset |
|
171 |
|
|
172 |
|
|
173 |
rsb_gaze.offset = SphericalDirectionFloat() |
|
174 |
rsb_gaze.offset.elevation = gaze.tilt_offset |
|
175 |
rsb_gaze.offset.azimuth = gaze.pan_offset |
|
176 | 176 |
|
177 | 177 |
if (blocking): |
178 | 178 |
#blocking: |
... | ... | |
185 | 185 |
|
186 | 186 |
self.logger.debug("gaze rpc done") |
187 | 187 |
|
188 |
""" |
|
188 | 189 |
def publish_mouth_target(self, mouth, blocking): |
189 |
"""publish a mouth target via mw
|
|
190 |
publish a mouth target via mw |
|
190 | 191 |
:param mouth: mouth value to set |
191 | 192 |
:param blocking: True if this call should block until execution finished on robot |
192 |
""" |
|
193 |
|
|
193 | 194 |
self.logger.debug("calling the mouth rpc (%s)..." % ("BLOCKING" if blocking else "NON-BLOCKING")) |
194 | 195 |
|
195 | 196 |
#create mouth state & fill it with values: |
... | ... | |
213 | 214 |
#print '> server reply: "%s"' % future.get(timeout = 10); |
214 | 215 |
|
215 | 216 |
self.logger.debug("mouth rpc done") |
217 |
""" |
|
216 | 218 |
|
217 | 219 |
def publish_speech(self, text, blocking): |
218 | 220 |
"""publish a tts request via mw |
... | ... | |
237 | 239 |
|
238 | 240 |
####################################################################### |
239 | 241 |
# some helpers |
240 |
def convert_animationtype_to_rsbval(self, value):
|
|
241 |
"""convert RobotAnimation.value to RSB animation value
|
|
242 |
:param value: RobotAnimation.* id to convert to rsb id |
|
242 |
def convert_HeadAnimationtype_to_rsbval(self, value):
|
|
243 |
"""convert RobotHeadAnimation.value to RSB HeadAnimation value
|
|
244 |
:param value: RobotHeadAnimation.* id to convert to rsb id
|
|
243 | 245 |
""" |
244 | 246 |
#NOTE: this convertion is important as the actual integer values of |
245 | 247 |
# thy python api and the protobuf might be different |
246 | 248 |
|
247 |
if (value == RobotAnimation.IDLE): |
|
248 |
return Animation().IDLE |
|
249 |
elif (value == RobotAnimation.HEAD_NOD): |
|
250 |
return Animation().HEAD_NOD |
|
251 |
elif (value == RobotAnimation.HEAD_SHAKE): |
|
252 |
return Animation().HEAD_SHAKE |
|
253 |
elif (value == RobotAnimation.EYEBLINK_L): |
|
254 |
return Animation().EYEBLINK_L |
|
255 |
elif (value == RobotAnimation.EYEBLINK_R): |
|
256 |
return Animation().EYEBLINK_R |
|
257 |
elif (value == RobotAnimation.EYEBLINK_BOTH): |
|
258 |
return Animation().EYEBLINK_BOTH |
|
259 |
elif (value == RobotAnimation.EYEBROWS_RAISE): |
|
260 |
return Animation().EYEBROWS_RAISE |
|
261 |
elif (value == RobotAnimation.EYEBROWS_LOWER): |
|
262 |
return Animation().EYEBROWS_LOWER |
|
249 |
if (value == RobotHeadAnimation.IDLE):
|
|
250 |
return HeadAnimation().IDLE
|
|
251 |
elif (value == RobotHeadAnimation.HEAD_NOD):
|
|
252 |
return HeadAnimation().HEAD_NOD
|
|
253 |
elif (value == RobotHeadAnimation.HEAD_SHAKE):
|
|
254 |
return HeadAnimation().HEAD_SHAKE
|
|
255 |
elif (value == RobotHeadAnimation.EYEBLINK_L):
|
|
256 |
return HeadAnimation().EYEBLINK_L
|
|
257 |
elif (value == RobotHeadAnimation.EYEBLINK_R):
|
|
258 |
return HeadAnimation().EYEBLINK_R
|
|
259 |
elif (value == RobotHeadAnimation.EYEBLINK_BOTH):
|
|
260 |
return HeadAnimation().EYEBLINK_BOTH
|
|
261 |
elif (value == RobotHeadAnimation.EYEBROWS_RAISE):
|
|
262 |
return HeadAnimation().EYEBROWS_RAISE
|
|
263 |
elif (value == RobotHeadAnimation.EYEBROWS_LOWER):
|
|
264 |
return HeadAnimation().EYEBROWS_LOWER
|
|
263 | 265 |
else: |
264 |
self.logger.error("invalid animation type %d\n" % (value))
|
|
265 |
return Animation().NEUTRAL |
|
266 |
self.logger.error("invalid HeadAnimation type %d\n" % (value))
|
|
267 |
return HeadAnimation().NEUTRAL
|
|
266 | 268 |
|
267 | 269 |
def convert_emotiontype_to_rsbval(self, value): |
268 |
"""convert RobotEmotion.value to RSB animation value
|
|
270 |
"""convert RobotEmotion.value to RSB HeadAnimation value
|
|
269 | 271 |
:param value: RobotEmotion.* id to convert to rsb id |
270 | 272 |
""" |
271 | 273 |
#NOTE: this convertion is important as the actual integer values of |
272 | 274 |
# thy python api and the protobuf might be different |
273 | 275 |
|
274 | 276 |
if (value == RobotEmotion.NEUTRAL): |
275 |
return EmotionState().NEUTRAL
|
|
277 |
return EmotionExpression().NEUTRAL
|
|
276 | 278 |
elif (value == RobotEmotion.HAPPY): |
277 |
return EmotionState().HAPPY
|
|
279 |
return EmotionExpression().HAPPY
|
|
278 | 280 |
elif (value == RobotEmotion.SAD): |
279 |
return EmotionState().SAD
|
|
281 |
return EmotionExpression().SAD
|
|
280 | 282 |
elif (value == RobotEmotion.ANGRY): |
281 |
return EmotionState().ANGRY
|
|
283 |
return EmotionExpression().ANGRY
|
|
282 | 284 |
elif (value == RobotEmotion.SURPRISED): |
283 |
return EmotionState().SURPRISED
|
|
285 |
return EmotionExpression().SURPRISED
|
|
284 | 286 |
elif (value == RobotEmotion.FEAR): |
285 |
return EmotionState().FEAR
|
|
287 |
return EmotionExpression().FEAR
|
|
286 | 288 |
else: |
287 | 289 |
self.logger.error("invalid emotion type %d\n" % (value)) |
288 |
return EmotionState().NEUTRAL |
|
290 |
return EmotionExpression().NEUTRAL |
Also available in: Unified diff