Revision 0c15613f server/src/MiddlewareROS.cpp
server/src/MiddlewareROS.cpp | ||
---|---|---|
35 | 35 |
//CallbackWrapper: |
36 | 36 |
#include <boost/range/algorithm/remove_if.hpp> |
37 | 37 |
#include <boost/algorithm/string/classification.hpp> |
38 |
#include <actionlib/client/simple_action_client.h> |
|
39 |
#include "ROS/UtteranceROS.h" |
|
38 | 40 |
|
39 | 41 |
using namespace std; |
40 | 42 |
using namespace hlrc_server; |
41 | 43 |
|
44 |
template <typename actionspec> |
|
45 |
actionlib::SimpleActionClient<actionspec> * create_action_client(string scope){ |
|
46 |
printf("> starting SimpleActionClient on %s\n",scope.c_str()); |
|
47 |
|
|
48 |
actionlib::SimpleActionClient<actionspec> *ac = new actionlib::SimpleActionClient<actionspec>(scope, true); |
|
49 |
|
|
50 |
if (!ac->waitForServer(ros::Duration(1))){ |
|
51 |
char buf[256]; |
|
52 |
snprintf(buf, 256, "ERROR: action service %s not ready", scope.c_str()); |
|
53 |
throw runtime_error(buf); |
|
54 |
} |
|
55 |
return ac; |
|
56 |
} |
|
57 |
|
|
58 |
|
|
42 | 59 |
MiddlewareROS::MiddlewareROS(Arbiter *arbiter, std::string scope) : Middleware(arbiter, scope){ |
43 | 60 |
init(); |
44 | 61 |
} |
... | ... | |
83 | 100 |
mouth_action_server = new MouthCallbackWrapper(this, scope, "mouth"); |
84 | 101 |
speech_action_server = new SpeechCallbackWrapper(this, scope, "speech"); |
85 | 102 |
|
103 |
//create tts client |
|
104 |
tts_ac = create_action_client<hlrc_server::ttsAction>(base_scope + "/tts_provider"); |
|
105 |
|
|
106 |
|
|
107 |
|
|
86 | 108 |
printf("> init done\n"); |
87 | 109 |
} |
88 | 110 |
|
... | ... | |
98 | 120 |
|
99 | 121 |
boost::shared_ptr<Utterance> utterance(new Utterance()); |
100 | 122 |
|
101 |
printf("> WARNING: ros tts call not implemented yet\n");
|
|
123 |
hlrc_server::ttsGoal goal;
|
|
102 | 124 |
|
103 |
/* |
|
104 |
//build request |
|
105 |
boost::shared_ptr<std::string> request(new string(text)); |
|
125 |
goal.text = text; |
|
106 | 126 |
|
107 |
//try to fetch it asynchronously: |
|
108 |
try{ |
|
109 |
RemoteServer::DataFuture<rst::audition::Utterance> future_ptr = tts_server->callAsync<rst::audition::Utterance>("create_utterance", request); |
|
127 |
//send |
|
128 |
tts_ac->sendGoal(goal); |
|
110 | 129 |
|
111 |
//try to fetch the result |
|
112 |
boost::shared_ptr<rst::audition::Utterance> utterance_ptr = future_ptr.get(tts_timeout); |
|
113 |
utterance = UtteranceRSB(*(utterance_ptr.get())); |
|
130 |
//call ros: |
|
131 |
bool finished_before_timeout = tts_ac->waitForResult(ros::Duration(ROS_ACTION_CALL_TIMEOUT)); |
|
114 | 132 |
|
115 |
}catch(rsc::threading::FutureTimeoutException e){ |
|
116 |
printf("> error: tts_call timed out after %3.1f seconds.\n", tts_timeout); |
|
117 |
}catch(rsc::threading::FutureTaskExecutionException e){ |
|
118 |
printf("> error: tts_call failed: %s\n", e.what()); |
|
133 |
if (!finished_before_timeout){ |
|
134 |
printf("> ERROR: NO REPLY to utterance action call received within %4.2f s\n",ROS_ACTION_CALL_TIMEOUT); |
|
135 |
}else{ |
|
136 |
//done, return utterance ptr |
|
137 |
ttsResultConstPtr tts_res = tts_ac->getResult(); |
|
138 |
boost::shared_ptr<Utterance> utterance(new UtteranceROS(tts_res)); |
|
139 |
printf("> done. got utterance (text=%s)\n",utterance->get_text().c_str()); |
|
140 |
return utterance; |
|
119 | 141 |
} |
120 | 142 |
|
121 |
printf("> done. got utterance (text=%s)\n",utterance.get_text().c_str()); |
|
122 |
*/ |
|
123 |
|
|
143 |
printf("> failed... got no utterance\n"); |
|
124 | 144 |
return utterance; |
125 | 145 |
} |
126 | 146 |
|
Also available in: Unified diff