27 const EntityBasePtr& newEntity,
39 if (!oldInstance->getMotionModel())
44 armarx::LinkedPoseBasePtr oldPoseBase =
45 oldInstance->getMotionModel()->getPredictedPoseAtStartOfCurrentLocalization();
50 armarx::LinkedPosePtr::dynamicCast(oldPoseBase->clone());
53 ARMARX_DEBUG_S <<
"Pose of update " << newInstance->getPose()->output();
55 oldPose->changeFrame(newInstance->getPosition()->frame);
59 fusedInstance = oldInstance->clone();
64 float oldExistenceCertainty =
std::max(oldInstance->getExistenceCertainty(), 0.1f);
65 float newExistenceCertainty =
std::max(newInstance->getExistenceCertainty(), 0.1f);
66 float fusedExistenceCertainty =
67 (oldExistenceCertainty * newExistenceCertainty) /
68 ((oldExistenceCertainty * newExistenceCertainty) +
69 (1 - oldExistenceCertainty) * (1 - newExistenceCertainty));
70 fusedInstance->setExistenceCertainty(fusedExistenceCertainty);
77 Eigen::MatrixXd i(3, 3);
80 MultivariateNormalDistributionBasePtr newUncertainty =
81 newInstance->getPositionUncertainty();
82 MultivariateNormalDistributionBasePtr oldUncertainty =
83 oldInstance->getPositionUncertainty();
87 ARMARX_ERROR_S <<
"new instance's position uncertainty is zero! - instance name: "
88 << newInstance->getName();
89 return newInstance->clone();
94 ARMARX_ERROR_S <<
"old instance's position uncertainty is zero! - instance name: "
95 << oldInstance->getName();
96 return newInstance->clone();
106 const float meanRadiusOfMeasurementEllipsoid =
108 const float meanRadiusOfOldBelieveEllipsoid =
110 ARMARX_DEBUG_S <<
"Std dev of old believe: " << meanRadiusOfOldBelieveEllipsoid
111 <<
", std dev of measurement: " << meanRadiusOfMeasurementEllipsoid;
112 const float interpolationFactor =
113 0.01f + 0.99f * meanRadiusOfOldBelieveEllipsoid /
114 (meanRadiusOfMeasurementEllipsoid + meanRadiusOfOldBelieveEllipsoid);
115 Eigen::Vector3f fusedPosition =
116 interpolationFactor * newInstance->getPosition()->toEigen() +
117 (1.0f - interpolationFactor) * oldPose->toEigen().block<3, 1>(0, 3);
120 fusedInstance->setPosition(pos);
123 newInstance->getOrientation()->qx,
124 newInstance->getOrientation()->qy,
125 newInstance->getOrientation()->qz);
127 oldPose->orientation->qx,
128 oldPose->orientation->qy,
129 oldPose->orientation->qz);
131 oldBelieveOrientation.
slerp(interpolationFactor, measurementOrientation);
132 fusedOrientation.normalize();
134 fusedOrientation.toRotationMatrix(), oldPose->frame, oldPose->agent);
135 fusedInstance->setOrientation(ori);
138 fusedInstance->setPositionUncertainty(
141 ARMARX_DEBUG_S <<
"Position after fusion: " << fusedInstance->getPosition()->output();
143 << fusedInstance->getOrientation()->output();
147 ARMARX_VERBOSE_S <<
"No old pose estimation available, using new measurement.";
148 fusedInstance = newInstance->clone();
151 return fusedInstance;