FamiliarObjectDetectionExample.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * ArmarX is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * ArmarX is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * @author Fabian Reister ( fabian dot reister at kit dot edu )
17  * @date 2024
18  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
19  * GNU General Public License
20  */
21 
23 
24 #include <Eigen/Geometry>
25 
26 #include <pcl/point_types.h>
27 
28 #include <opencv2/core/mat.hpp>
29 
30 #include <IceUtil/Time.h>
31 
32 #include <SimoxUtility/math/pose/pose.h>
33 #include <VirtualRobot/Robot.h>
34 #include <VirtualRobot/VirtualRobot.h>
35 #include <VirtualRobot/XML/RobotIO.h>
36 
43 
46 #include <RobotAPI/libraries/armem_objects/aron/FamiliarObjectInstance.aron.generated.h>
48 // #include <RobotAPI/libraries/armem_objects/aron_conversions.h>
49 // #include <RobotAPI/libraries/armem/core/aron_conversions.h>
51 
53 {
55  {
56  addPlugin(familiarObjectInstanceReaderPlugin);
57 
58  p.exemplaryFamiliarObjectID.dataset = "myDataset";
59  p.exemplaryFamiliarObjectID.className = "sphere";
60  p.exemplaryFamiliarObjectID.instanceName = "0";
61  }
62 
65  {
68 
69  defs->required(p.robotName, "p.robotName");
70 
71  defs->optional(p.exemplaryFamiliarObjectID.dataset, "p.objectId.dataset");
72  defs->optional(p.exemplaryFamiliarObjectID.className, "p.objectId.className");
73  defs->optional(p.exemplaryFamiliarObjectID.instanceName, "p.objectId.instanceName");
74 
75  defs->component(familiarObjectPoseStoragePrx, "ObjectMemory");
76 
77  return defs;
78  }
79 
80  std::string
82  {
83  return "FamiliarObjectDetectionExample";
84  }
85 
86  void
88  {
89  }
90 
91  void
93  {
94  //
95  // First, we create a familiar object and send it to the memory.
96  //
97 
98  ARMARX_IMPORTANT << "Storing exemplary familiar object in memory";
100 
101  //
102  // Then, we read the familiar object from the memory.
103  //
104  ARMARX_IMPORTANT << "Reading familiar object from memory";
106  }
107 
108  void
110  {
111 
112  ::armarx::objpose::ProvidedFamiliarObjectPoseSeq data;
113 
114  armem::arondto::FamiliarObjectInstance familiarObject;
115 
116  familiarObject.timestamp = armarx::Clock::Now();
117 
118  familiarObject.poseSensFrame.pose =
119  Eigen::Isometry3f{Eigen::Translation3f{0, 0, 1000}}.matrix();
120  familiarObject.poseSensFrame.header.frame = "DepthCameraSim";
121  familiarObject.poseSensFrame.header.agent = p.robotName;
122  // familiarObject.poseSensFrame.header.frame = "AzureKinect_RGB";
123 
124 
125  familiarObject.objectID = p.exemplaryFamiliarObjectID;
126 
127  familiarObject.confidence = 1.0;
128 
129  // familiarObject.bounding_box =
130 
131  // familiarObject.depth_image_patch = cv::Mat1f(cv::Size(20, 20));
132  // familiarObject.rgb_image_patch = cv::Mat3b(cv::Size(20, 20));
133 
134  const int numPoints = 100;
135 
136  // x in red
137  for (int i = 0; i < numPoints; i++)
138  {
139  pcl::PointXYZRGBA point;
140  point.x = static_cast<float>(i) - numPoints / 2;
141  point.y = 0;
142  point.z = 0;
143  point.r = 255;
144  point.g = 0;
145  point.b = 0;
146  familiarObject.points.points.push_back(point);
147  }
148 
149  // y in green
150  for (int i = 0; i < numPoints; i++)
151  {
152  pcl::PointXYZRGBA point;
153  point.x = 0;
154  point.y = static_cast<float>(i) - numPoints / 2;
155  point.z = 0;
156  point.r = 0;
157  point.g = 255;
158  point.b = 0;
159  familiarObject.points.points.push_back(point);
160  }
161 
162  // z in blue
163  for (int i = 0; i < numPoints; i++)
164  {
165  pcl::PointXYZRGBA point;
166  point.y = 0;
167  point.y = 0;
168  point.z = static_cast<float>(i) - numPoints / 2;
169  point.r = 0;
170  point.g = 0;
171  point.b = 255;
172  familiarObject.points.points.push_back(point);
173  }
174 
175  familiarObject.points.header.frame_id = "DepthCameraSim";
176  familiarObject.points.is_dense = true;
177  familiarObject.points.width = familiarObject.points.points.size();
178  familiarObject.points.height = 1;
179 
180  familiarObject.bounding_box.center.setZero();
181  familiarObject.bounding_box.extents.setConstant(numPoints);
182 
183  data.push_back(familiarObject.toAronDTO());
184 
185  ARMARX_INFO << "Sending " << data.size() << " familiar object to the memory";
186  familiarObjectPoseStoragePrx->reportFamiliarObjectPoses(getName(), data);
187  }
188 
189  void
191  {
192  ARMARX_CHECK_NOT_NULL(familiarObjectInstanceReaderPlugin);
193 
194  const armem::obj::familiar_object_instance::Reader& familiarObjectInstanceReader =
195  familiarObjectInstanceReaderPlugin->get();
196 
197 
198  //
199  // 1. Read from all providers
200  //
201  ARMARX_IMPORTANT << "Reading from all providers";
202  {
203 
204  const auto allFamiliarObjectInstances =
205  familiarObjectInstanceReader.queryAllLatestFamiliarObjectInstances();
206 
207  // print
208  for (const auto& [providerName, instances] : allFamiliarObjectInstances)
209  {
210  ARMARX_INFO << "Provider name: " << providerName;
211  for (const auto& instance : instances)
212  {
213  ARMARX_INFO << "- Instance: " << instance.objectID.dataset << "/"
214  << instance.objectID.className << "/"
215  << instance.objectID.instanceName;
216  }
217  }
218  }
219 
220  //
221  // 2. Read from a specific provider
222  //
223  ARMARX_IMPORTANT << "Reading from a specific provider";
224  {
225  const std::map<std::string, std::vector<armem::arondto::FamiliarObjectInstance>>
226  familiarObjectInstances =
227  familiarObjectInstanceReader.queryAllLatestFamiliarObjectInstances(getName());
228 
229  ARMARX_INFO << "Provider name: " << getName();
230 
231  ARMARX_CHECK_EQUAL(familiarObjectInstances.size(), 1);
232  ARMARX_CHECK_EQUAL(familiarObjectInstances.begin()->first, getName());
233 
234  const auto& thisFamiliarObjectInstances = familiarObjectInstances.begin()->second;
235  // print
236  for (const auto& instance : thisFamiliarObjectInstances)
237  {
238  ARMARX_INFO << "- Instance: " << instance.objectID.dataset << "/"
239  << instance.objectID.className << "/" << instance.objectID.instanceName;
240  }
241  }
242 
243  //
244  // 3. Read all instances of a specific class
245  //
246  ARMARX_IMPORTANT << "Reading all instances of a specific class";
247  {
248  armarx::ObjectID objectId;
249  fromAron(p.exemplaryFamiliarObjectID, objectId);
250 
251  const auto instances =
252  familiarObjectInstanceReader.queryLatestFamiliarObjectInstancesFromClass(
253  objectId.getClassID());
254 
255  for (const auto& [instanceName, instancesForProvider] : instances)
256  {
257  for (const auto& instance : instancesForProvider)
258  {
259  ARMARX_INFO << "- Instance: " << instance.objectID.dataset << "/"
260  << instance.objectID.className << "/"
261  << instance.objectID.instanceName;
262  }
263  }
264  }
265 
266  //
267  // 4. Read a specific instance
268  //
269  ARMARX_IMPORTANT << "Reading a specific instance";
270  {
271  armarx::ObjectID objectId;
272  fromAron(p.exemplaryFamiliarObjectID, objectId);
273 
274  const std::optional<std::map<std::string, armem::arondto::FamiliarObjectInstance>>
275  instances =
276  familiarObjectInstanceReader.queryLatestFamiliarObjectInstance(objectId);
277 
278  ARMARX_CHECK(instances.has_value());
279 
280  for (const auto& [instanceName, instance] : instances.value())
281  {
282  ARMARX_INFO << "- Instance: " << instance.objectID.dataset << "/"
283  << instance.objectID.className << "/" << instance.objectID.instanceName;
284  }
285  }
286  }
287 
288  void
290  {
291  // task->stop();
292  }
293 
294  void
296  {
297  }
298 
299 
300 } // namespace armarx::familiar_objects
armarx::ObjectID
A known object ID of the form "Dataset/ClassName" or "Dataset/ClassName/InstanceName".
Definition: ObjectID.h:10
ARMARX_IMPORTANT
#define ARMARX_IMPORTANT
Definition: Logging.h:190
armarx::familiar_objects::FamiliarObjectDetectionExample::storeExemplaryFamiliarObjectInMemory
void storeExemplaryFamiliarObjectInMemory() const
Definition: FamiliarObjectDetectionExample.cpp:109
armarx::ObjectID::getClassID
ObjectID getClassID() const
Return just the class ID without an intance name.
Definition: ObjectID.cpp:71
ARMARX_CHECK_NOT_NULL
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
Definition: ExpressionException.h:206
armarx::familiar_objects::FamiliarObjectDetectionExample::readExemplaryFamiliarObjectFromMemory
void readExemplaryFamiliarObjectFromMemory() const
Definition: FamiliarObjectDetectionExample.cpp:190
armarx::familiar_objects::FamiliarObjectDetectionExample::createPropertyDefinitions
armarx::PropertyDefinitionsPtr createPropertyDefinitions() override
Definition: FamiliarObjectDetectionExample.cpp:64
PeriodicTask.h
armarx::familiar_objects::FamiliarObjectDetectionExample::onInitComponent
void onInitComponent() override
Pure virtual hook for the subclass.
Definition: FamiliarObjectDetectionExample.cpp:87
armarx::ManagedIceObject::addPlugin
PluginT * addPlugin(const std::string prefix="", ParamsT &&... params)
Definition: ManagedIceObject.h:186
armarx::armem::obj::familiar_object_instance::Reader::queryLatestFamiliarObjectInstance
std::optional< std::map< std::string, arondto::FamiliarObjectInstance > > queryLatestFamiliarObjectInstance(const ObjectID &instanceId, const std::optional< std::string > &providerName=std::nullopt) const
Definition: ObjectReader.cpp:67
ARMARX_CHECK
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
Definition: ExpressionException.h:82
armarx::familiar_objects::FamiliarObjectDetectionExample::getDefaultName
std::string getDefaultName() const override
Definition: FamiliarObjectDetectionExample.cpp:81
Clock.h
types.h
armarx::familiar_objects::FamiliarObjectDetectionExample::onConnectComponent
void onConnectComponent() override
Pure virtual hook for the subclass.
Definition: FamiliarObjectDetectionExample.cpp:92
data
uint8_t data[1]
Definition: EtherCATFrame.h:68
ObjectID.h
armarx::armem::obj::familiar_object_instance::Reader
Definition: ObjectReader.h:41
armarx::familiar_objects::FamiliarObjectDetectionExample::onExitComponent
void onExitComponent() override
Hook for subclass.
Definition: FamiliarObjectDetectionExample.cpp:295
CycleUtil.h
ExpressionException.h
armarx::Component::getConfigIdentifier
std::string getConfigIdentifier()
Retrieve config identifier for this component as set in constructor.
Definition: Component.cpp:79
FamiliarObjectDetectionExample.h
armarx::familiar_objects
Definition: FamiliarObjectDetectionExample.cpp:52
armarx::ComponentPropertyDefinitions
Default component property definition container.
Definition: Component.h:69
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
IceUtil::Handle< class PropertyDefinitionContainer >
Time.h
armarx::fromAron
void fromAron(const arondto::PackagePath &dto, PackageFileLocation &bo)
armarx::core::time::Clock::Now
static DateTime Now()
Current time on the virtual clock.
Definition: Clock.cpp:93
armarx::ManagedIceObject::getName
std::string getName() const
Retrieve name of object.
Definition: ManagedIceObject.cpp:108
armarx::familiar_objects::FamiliarObjectDetectionExample::onDisconnectComponent
void onDisconnectComponent() override
Hook for subclass.
Definition: FamiliarObjectDetectionExample.cpp:289
Logging.h
ARMARX_CHECK_EQUAL
#define ARMARX_CHECK_EQUAL(lhs, rhs)
This macro evaluates whether lhs is equal (==) rhs and if it turns out to be false it will throw an E...
Definition: ExpressionException.h:130
armarx::armem::obj::familiar_object_instance::Reader::queryLatestFamiliarObjectInstancesFromClass
std::map< std::string, std::vector< arondto::FamiliarObjectInstance > > queryLatestFamiliarObjectInstancesFromClass(const ObjectID &classId, const std::optional< std::string > &providerName=std::nullopt) const
Definition: ObjectReader.cpp:181
aron_conversions.h
armarx::armem::obj::familiar_object_instance::Reader::queryAllLatestFamiliarObjectInstances
std::map< std::string, std::vector< arondto::FamiliarObjectInstance > > queryAllLatestFamiliarObjectInstances(const std::optional< std::string > &providerName=std::nullopt) const
Definition: ObjectReader.cpp:127
armarx::familiar_objects::FamiliarObjectDetectionExample::FamiliarObjectDetectionExample
FamiliarObjectDetectionExample()
Definition: FamiliarObjectDetectionExample.cpp:54
PackagePath.h