44 Eigen::Vector3f leftExtent,
45 Eigen::Vector3f rightExtent)
47 Eigen::Matrix3Xf axes(3, 15);
49 axes.block<3, 3>(0, 0) = leftPose.block<3, 3>(0, 0);
50 axes.block<3, 3>(0, 3) = rightPose.block<3, 3>(0, 0);
53 for (
int i = 0; i < 3; i++)
55 for (
int j = 0; j < 3; j++)
57 Eigen::Vector3f
a = leftPose.col(i).head<3>();
58 Eigen::Vector3f b = rightPose.col(j).head<3>();
59 int idx = 6 + (i * 3 + j);
60 Eigen::Vector3f
c =
a.cross(b);
63 axes.col(idx) = Eigen::Vector3f::Zero();
67 axes.col(idx) =
c /
c.norm();
72 for (
int i = 0; i < 15; i++)
77 Eigen::Vector3f axis = axes.col(i);
84 for (
int j = 0; j < 3; j++)
86 Eigen::Vector3f
a = leftPose.col(j).head<3>();
87 Eigen::Vector3f b = rightPose.col(j).head<3>();
89 ra += fabs(axis.dot(
a) * leftExtent(j));
90 rb += fabs(axis.dot(b) * rightExtent(j));
93 Eigen::Vector3f t = projectVector(axis, leftPose.col(3).head<3>());
94 t = t - projectVector(axis, rightPose.col(3).head<3>());
96 if (t.norm() > (ra + rb))
106 PrimitiveFusion::projectVector(Eigen::Vector3f axis, Eigen::Vector3f u)
108 float v = u.dot(axis) / axis.squaredNorm();
114 memoryx::EnvironmentalPrimitiveBaseList& primitives,
115 memoryx::EnvironmentalPrimitiveBasePtr primitive,
116 memoryx::EnvironmentalPrimitiveBaseList& intersectingPrimitives,
119 Eigen::Matrix4f leftPose = FramedPosePtr::dynamicCast(primitive->getPose())->toEigen();
120 Eigen::Vector3f leftExtent =
121 Vector3Ptr::dynamicCast(primitive->getOBBDimensions())->toEigen() / 2.0 +
122 eps * Eigen::Vector3f::Ones();
124 for (memoryx::EnvironmentalPrimitiveBasePtr& p : primitives)
126 Eigen::Matrix4f rightPose = FramedPosePtr::dynamicCast(p->getPose())->toEigen();
127 Eigen::Vector3f rightExtent =
128 Vector3Ptr::dynamicCast(p->getOBBDimensions())->toEigen() / 2.0 +
129 eps * Eigen::Vector3f::Ones();
131 if (primitive->ice_staticId() != p->ice_staticId())
135 if (primitive->getId() == p->getId())
141 intersectingPrimitives.push_back(p);
148 memoryx::EnvironmentalPrimitiveBaseList& primitives,
149 memoryx::EnvironmentalPrimitiveBasePtr primitive,
150 memoryx::EnvironmentalPrimitiveBaseList& intersectingPrimitives,
153 memoryx::EnvironmentalPrimitiveBaseList candidates;
157 for (memoryx::EnvironmentalPrimitiveBasePtr p : candidates)
159 if (testPlane(p, primitive))
161 intersectingPrimitives.push_back(p);
164 else if (testCylinder(p, primitive))
166 intersectingPrimitives.push_back(p);
172 PrimitiveFusion::testCylinder(memoryx::EnvironmentalPrimitiveBasePtr leftPrimitive,
173 memoryx::EnvironmentalPrimitiveBasePtr rightPrimitive)
176 memoryx::CylinderPrimitivePtr::dynamicCast(leftPrimitive);
178 memoryx::CylinderPrimitivePtr::dynamicCast(rightPrimitive);
180 if (!leftCylinder || !rightCylinder)
185 Eigen::Vector3f leftAxisDirection =
186 Vector3Ptr::dynamicCast(leftCylinder->getCylinderAxisDirection())->toEigen();
187 Eigen::Vector3f rightAxisDirection =
188 Vector3Ptr::dynamicCast(rightCylinder->getCylinderAxisDirection())->toEigen();
190 float r = leftAxisDirection.dot(rightAxisDirection);
192 if (std::acos(r) > pcl::deg2rad(15.0))
206 Eigen::Matrix4f leftPose = FramedPosePtr::dynamicCast(leftCylinder->getPose())->toEigen();
207 Eigen::Vector3f leftExtent = Eigen::Vector3f(leftCylinder->getLength() / 2.0,
208 leftCylinder->getCylinderRadius(),
209 leftCylinder->getCylinderRadius());
212 Eigen::Matrix4f rightPose = FramedPosePtr::dynamicCast(rightCylinder->getPose())->toEigen();
213 Eigen::Vector3f rightExtent = Eigen::Vector3f(rightCylinder->getLength() / 2.0,
214 rightCylinder->getCylinderRadius(),
215 rightCylinder->getCylinderRadius());
227 PrimitiveFusion::testPlane(memoryx::EnvironmentalPrimitiveBasePtr leftPrimitive,
228 memoryx::EnvironmentalPrimitiveBasePtr rightPrimitive)
233 if (!leftPlane || !rightPlane)
238 Eigen::Vector3f leftPlaneNormal =
239 Vector3Ptr::dynamicCast(leftPlane->getPlaneNormal())->toEigen();
240 Eigen::Vector3f rightPlaneNormal =
241 Vector3Ptr::dynamicCast(rightPlane->getPlaneNormal())->toEigen();
243 if ((leftPlaneNormal - rightPlaneNormal).
norm() < 0.001)
248 float alpha = std::acos(leftPlaneNormal.dot(rightPlaneNormal));
250 if (alpha > pcl::deg2rad(10.0))
260 memoryx::EnvironmentalPrimitiveBasePtr rightPrimitive)
262 if (leftPrimitive->ice_staticId() != rightPrimitive->ice_staticId())
267 Eigen::Vector3f leftOBB = Vector3Ptr::dynamicCast(leftPrimitive->getOBBDimensions())->toEigen();
268 Eigen::Vector3f rightOBB =
269 Vector3Ptr::dynamicCast(rightPrimitive->getOBBDimensions())->toEigen();
271 if ((leftOBB - rightOBB).
norm() > 10.0)
276 Eigen::Vector3f leftPosition =
277 Vector3Ptr::dynamicCast(leftPrimitive->getPose()->position)->toEigen();
278 Eigen::Vector3f rightPosition =
279 Vector3Ptr::dynamicCast(rightPrimitive->getPose()->position)->toEigen();
281 if ((leftPosition - rightPosition).
norm() > 5.0)
287 QuaternionPtr::dynamicCast(leftPrimitive->getPose()->orientation)->toEigen();
289 QuaternionPtr::dynamicCast(rightPrimitive->getPose()->orientation)->toEigen();
291 Eigen::Vector3f ea = (leftRotation.transpose() * rightRotation).eulerAngles(0, 1, 2);
294 float delta = pcl::deg2rad(15.0);
295 for (
int i = 0; i < 3; i++)
297 ea[i] = std::fabs(ea[i]);
298 ea[i] = std::fmod(ea[i],
M_PI);
299 if (ea[i] > delta && ea[i] < (
M_PI - delta))
310 memoryx::EnvironmentalPrimitiveBaseList& primitives,
311 std::vector<memoryx::EntityBasePtr>& boxes,
312 memoryx::EnvironmentalPrimitiveSegmentBasePrx environmentalPrimitiveSegment)
314 for (memoryx::EnvironmentalPrimitiveBasePtr& currentPrimitive : primitives)
317 memoryx::PlanePrimitivePtr::dynamicCast(currentPrimitive);
323 Eigen::Vector3f planeNormal = Vector3Ptr::dynamicCast(plane->getPlaneNormal())->toEigen();
324 float alpha = std::acos(planeNormal.dot(Eigen::Vector3f::UnitZ()));
325 if (alpha < pcl::deg2rad(15.0))
327 std::vector<memoryx::PlanePrimitivePtr> boxSides;
328 boxSides.push_back(plane);
330 std::vector<memoryx::EnvironmentalPrimitiveBasePtr> intersectingPrimitives;
333 for (memoryx::EnvironmentalPrimitiveBasePtr& i : intersectingPrimitives)
336 memoryx::PlanePrimitivePtr::dynamicCast(i);
341 else if (plane->getPose()->position->z < sideCandidate->getPose()->position->z)
346 bool isPerpendicular =
true;
349 Eigen::Vector3f sideNormal =
350 Vector3Ptr::dynamicCast(sideCandidate->getPlaneNormal())->toEigen();
351 Eigen::Vector3f otherNormal =
352 Vector3Ptr::dynamicCast(side->getPlaneNormal())->toEigen();
354 float beta = std::acos(sideNormal.dot(otherNormal));
358 ARMARX_LOG_S <<
"found a parallel side. doing nothing at the moment";
360 isPerpendicular =
false;
363 else if (std::fabs(beta - M_PI_2) > pcl::deg2rad(5.0))
365 isPerpendicular =
false;
371 boxSides.push_back(sideCandidate);
375 if (boxSides.size() == 3)
377 memoryx::EntityRefList entityRefList;
378 memoryx::PointList graspPoints;
379 std::vector<Eigen::Vector3f> normals;
380 std::vector<Eigen::Vector3f> positions;
381 for (
size_t i = 0; i < 3; i++)
384 normals.push_back(Vector3Ptr::dynamicCast(side->getPlaneNormal())->toEigen());
386 Vector3Ptr::dynamicCast(side->getPose()->position)->toEigen());
388 memoryx::EntityRefBasePtr entityRef =
389 environmentalPrimitiveSegment->getEntityRefById(side->getId());
390 entityRefList.push_back(entityRef);
392 for (armarx::Vector3BasePtr& g : side->getGraspPoints())
394 graspPoints.push_back(g);
400 rot.col(0) = normals[0];
401 rot.col(1) = normals[1];
402 rot.col(2) = normals[0].cross(normals[1]);
404 Eigen::Vector3f position = positions[0];
405 position(2) = positions[1](2);
409 Eigen::Vector3f dimE;
410 dimE(0) = normals[0].dot(positions[0] - position);
411 dimE(1) = normals[1].dot(positions[1] - position);
412 dimE(2) = normals[2].dot(positions[2] - position);
413 dimE = 2.0 * dimE.cwiseAbs();
416 boxPrimitive->setBoxSides(entityRefList);
417 boxPrimitive->setGraspPoints(graspPoints);
418 boxPrimitive->setLabel(0);
419 boxPrimitive->setOBBDimensions(
new Vector3(dimE));
420 boxPrimitive->setPose(pose);
422 boxPrimitive->setProbability(1.0);
428 boxPrimitive->setTime(boxSides[0]->getTime());
429 boxPrimitive->setName(
"box");
431 boxes.push_back(boxPrimitive);
433 bool mirrorSides =
true;
436 for (
size_t i = 1; i < 3; i++)
439 Eigen::Matrix4f p = FramedPosePtr::dynamicCast(side->getPose())->toEigen();
440 Eigen::Vector3f m = p.block<3, 3>(0, 0).
transpose() * normals[i];
442 Eigen::Vector3f mPosition = position - normals[i] * dimE(2);
446 memoryx::PointList graspPoints;
447 for (armarx::Vector3BasePtr& g : side->getGraspPoints())
450 point.head<3>() = Vector3Ptr::dynamicCast(g)->toEigen();
452 point = p.inverse() * point;
453 point.head<3>() = point.head<3>() - m * dimE(i);
456 Eigen::Vector3f temp = point.head<3>();
457 graspPoints.push_back(
new Vector3(temp));
462 mSide->setOBBDimensions(side->getOBBDimensions());
463 mSide->setGraspPoints(graspPoints);
464 mSide->setPose(mPose);
466 mSide->setPlaneNormal(side->getPlaneNormal());
468 mSide->setTime(side->getTime());
469 mSide->setProbability(0.0);
471 boxes.push_back(mSide);