27 #include <boost/regex.hpp>
29 #include <SimoxUtility/algorithm/string.h>
30 #include <SimoxUtility/json.h>
39 using namespace ScanLocationGroup;
41 namespace fs = std::filesystem;
44 NameRecognizedObjects::SubClassRegistry
53 NameRecognizedObjects::waitForSpeechFinished()
55 ARMARX_INFO <<
"Starting to wait for speech to finish";
57 while (!isRunningTaskStopped())
61 << getSpeechObserver()->getDatafieldByName(
"TextToSpeech",
"State")->getString();
62 if (getSpeechObserver()->getDatafieldByName(
"TextToSpeech",
"State")->getString() ==
66 <<
"Speech observer status: "
67 << getSpeechObserver()->getDatafieldByName(
"TextToSpeech",
"State")->getString();
72 if (isRunningTaskStopped())
83 static std::vector<std::string>
84 getNamesFromChannels(std::vector<ChannelRefPtr>
const& channels,
85 std::map<std::string, std::string>
const& humanObjectNameMap)
87 boost::regex re(
"[^a-zA-Z0-9]+");
91 std::string
memoryName = channelRef->getDataField(
"className")->getString();
98 return boost::regex_replace(
memoryName, re, std::string(
" "));
102 std::vector<ChannelRefPtr>
const& objectInstanceChannels = channels;
103 std::vector<std::string> objectNames;
105 std::set<std::string> uniqueObjectNames;
108 auto resolvedName = resolveObjectName(p);
109 if (uniqueObjectNames.count(resolvedName))
113 uniqueObjectNames.insert(resolvedName);
114 objectNames.push_back(resolvedName);
123 std::map<std::string, std::string> humanObjectNameMap = in.getHumanObjectNameMap();
125 std::vector<std::string> recognizedObjectsVec =
126 getNamesFromChannels(in.getObjectInstanceChannels(), humanObjectNameMap);
128 if (in.getUseObjectPoseStorage())
132 const std::vector<std::string> objPoseProviderNames = in.getObjectPoseProviderNames();
133 const std::set<std::string> objPoseProviderNamesSet(objPoseProviderNames.begin(),
134 objPoseProviderNames.end());
137 ARMARX_INFO <<
"Got " << objectPoses.size() <<
" object poses.";
142 if (objPoseProviderNamesSet.count(objectPose.providerName))
144 const static bool includeClassName =
false;
145 const std::vector<std::string>
names =
147 ARMARX_IMPORTANT <<
"Loaded names for object " << objectPose.objectID <<
": "
150 const std::string objectName =
151 names.size() > 0 ?
names.front() : objectPose.objectID.className();
152 recognizedObjectsVec.push_back(objectName);
156 std::set<std::string> recognizedObjects;
157 for (
const std::string& name : recognizedObjectsVec)
159 recognizedObjects.insert(simox::alg::to_lower(name));
162 std::vector<std::string>
display = in.getDisplay_Text();
168 std::vector<std::string> ttsSeq;
169 if (recognizedObjects.empty())
171 ttsSeq.push_back(
"I cannot see any objects that I know.");
172 display[1] =
"I did not find any objects.";
174 else if (recognizedObjects.size() == 1)
176 const std::string resolvedName = *recognizedObjects.begin();
177 ttsSeq.push_back(
"I can see " + resolvedName);
178 display[1] =
"I can see the " + resolvedName;
182 ttsSeq.push_back(
"I can see the following objects: ");
183 for (
const std::string& objectName : recognizedObjects)
185 ttsSeq.push_back(
" a " + objectName +
"");
193 if (in.getReportObjectsWithSpeech())
195 for (
auto tts : ttsSeq)
197 getTextToSpeech()->reportText(tts);
198 if (in.getWaitForSpeechToFinish())
200 waitForSpeechFinished();