Statistics
| Branch: | Tag: | Revision:

hlrc / client / cpp / src / MiddlewareROS.cpp @ c0c0e883

History | View | Annotate | Download (8.653 KB)

1 0c286af0 Simon Schulz
/*
2
* This file is part of hlrc
3
*
4
* Copyright(c) sschulz <AT> techfak.uni-bielefeld.de
5
* http://opensource.cit-ec.de/projects/hlrc
6
*
7
* This file may be licensed under the terms of the
8
* GNU General Public License Version 3 (the ``GPL''),
9
* or (at your option) any later version.
10
*
11
* Software distributed under the License is distributed
12
* on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
13
* express or implied. See the GPL for the specific language
14
* governing rights and limitations.
15
*
16
* You should have received a copy of the GPL along with this
17
* program. If not, go to http://www.gnu.org/licenses/gpl.html
18
* or write to the Free Software Foundation, Inc.,
19
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20
*
21
* The development of this software was supported by the
22
* Excellence Cluster EXC 277 Cognitive Interaction Technology.
23
* The Excellence Cluster EXC 277 is a grant of the Deutsche
24
* Forschungsgemeinschaft (DFG) in the context of the German
25
* Excellence Initiative.
26
*
27
*/
28
#ifdef ROS_SUPPORT
29
30
#include "MiddlewareROS.h"
31
#include <stdio.h>
32
#include <boost/algorithm/string.hpp>
33
#include <boost/range/algorithm_ext/erase.hpp>
34
#include <boost/range/algorithm/remove_if.hpp>
35
36
using namespace std;
37
38
MiddlewareROS::MiddlewareROS(string scope) : Middleware(scope) {
39
    printf("> new MiddlewareROS() on base scope '%s'\n",base_scope.c_str());
40
    init();
41
}
42
43
template <typename actionspec>
44
actionlib::SimpleActionClient<actionspec> * create_action_client(string scope){
45
    printf("> starting SimpleActionClient on %s\n",scope.c_str());
46
47
    actionlib::SimpleActionClient<actionspec> *ac = new actionlib::SimpleActionClient<actionspec>(scope, true);
48
49
    if (!ac->waitForServer(ros::Duration(1))){
50
        char buf[256];
51
        snprintf(buf, 256, "ERROR: action service %s not ready", scope.c_str());
52
        throw runtime_error(buf);
53
    }
54
    return ac;
55
}
56
57
void MiddlewareROS::init(void){
58
    printf("> MiddlewareROS::init()\n");
59
60
    string scope = base_scope + "/set";
61
62
    string node_name = "hlrc_client__"+ base_scope;
63
    node_name.erase(boost::remove_if(node_name, boost::is_any_of("/")), node_name.end());
64
65
    printf("> registering on ROS as node %s, scope = %s\n",node_name.c_str(), scope.c_str());
66
    if (!ros::isInitialized()){
67
        ros::M_string no_remapping;
68
        ros::init(no_remapping, node_name);
69
    }
70
71
    //create node handle
72
    //ros_node_handle = new ros::NodeHandle();
73
    //node_handle = boost::shared_ptr<ros::NodeHandle>(new ros::NodeHandle());
74
75
    printf("> setting up ROS action clients...\n");
76
    animation_ac = create_action_client<hlrc_server::animationAction>(scope + "/animation");
77
    utterance_ac = create_action_client<hlrc_server::utteranceAction>(scope + "/utterance");
78
    current_emotionstate_ac = create_action_client<hlrc_server::emotionstateAction>(scope + "/currentEmotion");
79
    default_emotionstate_ac = create_action_client<hlrc_server::emotionstateAction>(scope + "/defaultEmotion");
80
    gazetarget_ac = create_action_client<hlrc_server::gazetargetAction>(scope + "/gaze");
81
    mouthtarget_ac = create_action_client<hlrc_server::mouthtargetAction>(scope + "/mouth");
82
    speech_ac = create_action_client<hlrc_server::speechAction>(scope + "/speech");
83
84
    printf("> init done.\n");
85
}
86
87
88
void MiddlewareROS::publish_emotion(string scope_target, RobotEmotion e, bool blocking){
89
    hlrc_server::emotionstateGoal goal;
90
91
    switch(e.value){
92
        default:
93
            printf("> WANRING: invalid emotion id %d. defaulting to NEUTRAL\n",e.value);
94
            //fall through:
95
        case(RobotEmotion::NEUTRAL):
96
            goal.value = hlrc_server::emotionstateGoal::NEUTRAL;
97
            break;
98
        case(RobotEmotion::HAPPY):
99
            goal.value = hlrc_server::emotionstateGoal::HAPPY;
100
            break;
101
        case(RobotEmotion::SAD):
102
            goal.value = hlrc_server::emotionstateGoal::SAD;
103
            break;
104
        case(RobotEmotion::ANGRY):
105
            goal.value = hlrc_server::emotionstateGoal::ANGRY;
106
            break;
107
        case(RobotEmotion::SURPRISED):
108
            goal.value = hlrc_server::emotionstateGoal::SURPRISED;
109
            break;
110
        case(RobotEmotion::FEAR):
111
            goal.value = hlrc_server::emotionstateGoal::FEAR;
112
            break;
113
    }
114
115
    goal.duration = e.time_ms;
116
117
    actionlib::SimpleActionClient<hlrc_server::emotionstateAction>  *ac;
118
    if (scope_target == "defaultEmotion"){
119
        ac = default_emotionstate_ac;
120
    }else{
121
        ac = current_emotionstate_ac;
122
    }
123
124
    //send
125
    ac->sendGoal(goal);
126
127
    if (blocking){
128
        bool finished_before_timeout = ac->waitForResult(ros::Duration(ROS_ACTION_CALL_TIMEOUT));
129
        if (!finished_before_timeout){
130
            printf("> ERROR: blocking call timed out!\n");
131
        }
132
    }
133
}
134
135
136
void MiddlewareROS::publish_current_emotion(RobotEmotion e, bool blocking){
137
    publish_emotion("currentEmotion", e, blocking);
138
}
139
140
void MiddlewareROS::publish_default_emotion(RobotEmotion e, bool blocking){
141
    publish_emotion("defaultEmotion", e, blocking);
142
}
143
144
void MiddlewareROS::publish_gaze_target(RobotGaze target, bool blocking){
145
    hlrc_server::gazetargetGoal goal;
146
147
    goal.pan = target.pan;
148
    goal.tilt = target.tilt;
149
    goal.roll = target.roll;
150
    goal.vergence = target.vergence;
151
152
    goal.tilt_offset = target.tilt_offset;
153
    goal.pan_offset = target.pan_offset;
154
155 62aeb8ce Simon Schulz
    //timestamp:
156 3877047d Simon Schulz
    goal.gaze_timestamp.sec  = target.gaze_timestamp.sec;
157
    goal.gaze_timestamp.nsec = target.gaze_timestamp.nsec;
158 62aeb8ce Simon Schulz
159 c5a47e56 Simon Schulz
    if (target.gaze_type == RobotGaze::ABSOLUTE){
160 62aeb8ce Simon Schulz
        goal.gaze_type = hlrc_server::gazetargetGoal::GAZETARGET_ABSOLUTE;
161
    }else{
162
        goal.gaze_type = hlrc_server::gazetargetGoal::GAZETARGET_RELATIVE;
163
    }
164
165 0c286af0 Simon Schulz
    //send
166
    gazetarget_ac->sendGoal(goal);
167
168
    if (blocking){
169
        bool finished_before_timeout = gazetarget_ac->waitForResult(ros::Duration(ROS_ACTION_CALL_TIMEOUT));
170
        if (!finished_before_timeout){
171
            printf("> ERROR: blocking call timed out!\n");
172
        }
173
    }
174
}
175
176
177
void MiddlewareROS::publish_mouth_target(RobotMouth target, bool blocking){
178
    hlrc_server::mouthtargetGoal goal;
179
180
    goal.position_left   = target.position_left;
181
    goal.position_center = target.position_center;
182
    goal.position_right  = target.position_right;
183
184
    goal.opening_left   = target.opening_left;
185
    goal.opening_center = target.opening_center;
186
    goal.opening_right  = target.opening_right;
187
188
189
    //send
190
    mouthtarget_ac->sendGoal(goal);
191
192
    if (blocking){
193
        bool finished_before_timeout = mouthtarget_ac->waitForResult(ros::Duration(ROS_ACTION_CALL_TIMEOUT));
194
        if (!finished_before_timeout){
195
            printf("> ERROR: blocking call timed out!\n");
196
        }
197
    }
198
}
199
200
void MiddlewareROS::publish_head_animation(RobotHeadAnimation a, bool blocking){
201
    hlrc_server::animationGoal goal;
202
203
    switch(a.value){
204
        default:
205
            printf("> WANRING: invalid animation id %d. defaulting to IDLE",a.value);
206
            //fall through:
207
        case(RobotHeadAnimation::IDLE):
208
            goal.target = hlrc_server::animationGoal::IDLE;
209
            break;
210
        case(RobotHeadAnimation::HEAD_NOD):
211
            goal.target = hlrc_server::animationGoal::HEAD_NOD;
212
            break;
213
        case(RobotHeadAnimation::HEAD_SHAKE):
214
            goal.target = hlrc_server::animationGoal::HEAD_SHAKE;
215
            break;
216
        case(RobotHeadAnimation::EYEBLINK_L):
217
            goal.target = hlrc_server::animationGoal::EYEBLINK_L;
218
            break;
219
        case(RobotHeadAnimation::EYEBLINK_R):
220
            goal.target = hlrc_server::animationGoal::EYEBLINK_R;
221
            break;
222
        case(RobotHeadAnimation::EYEBLINK_BOTH):
223
            goal.target = hlrc_server::animationGoal::EYEBLINK_BOTH;
224
            break;
225
        case(RobotHeadAnimation::EYEBROWS_RAISE):
226
            goal.target = hlrc_server::animationGoal::EYEBROWS_RAISE;
227
            break;
228
        case(RobotHeadAnimation::EYEBROWS_LOWER):
229
            goal.target = hlrc_server::animationGoal::EYEBROWS_LOWER;
230
            break;
231
    }
232
233
    goal.repetitions = a.repetitions;
234
    goal.scale       = a.scale;
235
    goal.duration_each = a.time_ms;
236
237
    //send
238
    animation_ac->sendGoal(goal);
239
240
    if (blocking){
241
        bool finished_before_timeout = animation_ac->waitForResult(ros::Duration(ROS_ACTION_CALL_TIMEOUT));
242
        if (!finished_before_timeout){
243
            printf("> ERROR: blocking call timed out!\n");
244
        }
245
    }
246
}
247
248
void MiddlewareROS::publish_speech(string text, bool blocking){
249
    hlrc_server::speechGoal goal;
250
251
    goal.text = text;
252
253
    //send
254
    speech_ac->sendGoal(goal);
255
256
    if (blocking){
257
        bool finished_before_timeout = speech_ac->waitForResult(ros::Duration(ROS_ACTION_CALL_TIMEOUT));
258
        if (!finished_before_timeout){
259
            printf("> ERROR: blocking call timed out!\n");
260
        }
261
    }
262
}
263
264
#endif