3 #include <boost/filesystem/fstream.hpp>
4 #include <boost/format.hpp>
5 #include <boost/scope_exit.hpp>
6 #include <boost/version.hpp>
8 #include <dynamic_reconfigure/server.h>
9 #include <geometry_msgs/PoseWithCovarianceStamped.h>
15 #include <sensor_msgs/Image.h>
16 #include <std_msgs/String.h>
19 #include <boost/bind.hpp>
20 #include <visp3/core/vpExponentialMap.h>
21 #include <visp3/core/vpImage.h>
22 #include <visp3/core/vpImageConvert.h>
23 #include <visp3/core/vpCameraParameters.h>
40 visp_tracker::Init::Response& res)
42 ROS_INFO(
"Initialization request received.");
44 res.initialization_succeed =
false;
50 if(!res.initialization_succeed)
57 } BOOST_SCOPE_EXIT_END;
59 std::string fullModelPath;
60 boost::filesystem::ofstream modelStream;
80 visp_tracker::ModelBasedSettingsConfig config;
81 convertVpMbTrackerToModelBasedSettingsConfig<visp_tracker::ModelBasedSettingsConfig>(
tracker_, config);
83 convertVpMeToModelBasedSettingsConfig<visp_tracker::ModelBasedSettingsConfig>(
movingEdge_,
tracker_, config);
85 convertVpKltOpencvToModelBasedSettingsConfig<visp_tracker::ModelBasedSettingsConfig>(
kltTracker_,
tracker_, config);
89 visp_tracker::ModelBasedSettingsEdgeConfig config;
90 convertVpMbTrackerToModelBasedSettingsConfig<visp_tracker::ModelBasedSettingsEdgeConfig>(
tracker_, config);
92 convertVpMeToModelBasedSettingsConfig<visp_tracker::ModelBasedSettingsEdgeConfig>(
movingEdge_,
tracker_, config);
96 visp_tracker::ModelBasedSettingsKltConfig config;
97 convertVpMbTrackerToModelBasedSettingsConfig<visp_tracker::ModelBasedSettingsKltConfig>(
tracker_, config);
99 convertVpKltOpencvToModelBasedSettingsConfig<visp_tracker::ModelBasedSettingsKltConfig>(
kltTracker_,
tracker_, config);
110 tracker_.loadModel(fullModelPath.c_str());
118 ROS_DEBUG(
"Model has been successfully loaded.");
124 tracker_.setCovarianceComputation(
true);
132 ROS_INFO(
"Tracker successfully initialized.");
143 catch(
const std::string& str)
149 res.initialization_succeed =
true;
160 std::list<vpMbtDistanceLine*> linesList;
165 std::list<vpMbtDistanceLine*>::iterator linesIterator = linesList.begin();
167 bool noVisibleLine =
true;
168 for (; linesIterator != linesList.end(); ++linesIterator)
170 vpMbtDistanceLine* line = *linesIterator;
172 #if VISP_VERSION_INT >= VP_VERSION_INT(3,0,0) // ViSP >= 3.0.0
173 if (line && line->isVisible() && ! line->meline.empty())
175 if (line && line->isVisible() && line->meline)
178 #if VISP_VERSION_INT >= VP_VERSION_INT(3,0,0) // ViSP >= 3.0.0
179 for(
unsigned int a = 0 ; a < line->meline.size() ; a++)
181 if(line->meline[a] != NULL) {
182 std::list<vpMeSite>::const_iterator sitesIterator = line->meline[a]->getMeList().begin();
183 if (line->meline[a]->getMeList().empty())
185 for (; sitesIterator != line->meline[a]->getMeList().end(); ++sitesIterator)
187 #elif VISP_VERSION_INT >= VP_VERSION_INT(2,10,0) // ViSP >= 2.10.0
188 std::list<vpMeSite>::const_iterator sitesIterator = line->meline->getMeList().begin();
189 if (line->meline->getMeList().empty())
191 for (; sitesIterator != line->meline->getMeList().end(); ++sitesIterator)
194 std::list<vpMeSite>::const_iterator sitesIterator = line->meline->list.begin();
195 if (line->meline->list.empty())
197 for (; sitesIterator != line->meline->list.end(); ++sitesIterator)
200 visp_tracker::MovingEdgeSite movingEdgeSite;
201 movingEdgeSite.x = sitesIterator->get_ifloat();
202 movingEdgeSite.y = sitesIterator->get_jfloat();
203 #if VISP_VERSION_INT < VP_VERSION_INT(2,10,0) // ViSP < 2.10.0
204 movingEdgeSite.suppress = sitesIterator->suppress;
206 sites->moving_edge_sites.push_back (movingEdgeSite);
208 noVisibleLine =
false;
210 #if VISP_VERSION_INT >= VP_VERSION_INT(3,0,0) // ViSP >= 3.0.0
226 #if VISP_VERSION_INT < VP_VERSION_INT(2,10,0) // ViSP < 2.10.0
227 vpMbHiddenFaces<vpMbtKltPolygon> *poly_lst;
228 std::map<int, vpImagePoint> *map_klt;
231 poly_lst = &
dynamic_cast<vpMbKltTracker*
>(
tracker_)->getFaces();
233 for(
unsigned int i = 0 ; i < poly_lst->size() ; i++)
237 map_klt = &((*poly_lst)[i]->getCurrentPoints());
239 if(map_klt->size() > 3)
241 for (std::map<int, vpImagePoint>::iterator it=map_klt->begin(); it!=map_klt->end(); ++it)
243 visp_tracker::KltPoint kltPoint;
244 kltPoint.id = it->first;
245 kltPoint.i = it->second.get_i();
246 kltPoint.j = it->second.get_j();
247 klt->klt_points_positions.push_back (kltPoint);
253 #else // ViSP >= 2.10.0
254 std::list<vpMbtDistanceKltPoints*> poly_lst;
255 std::map<int, vpImagePoint> *map_klt;
258 poly_lst =
tracker_.getFeaturesKlt();
260 for(std::list<vpMbtDistanceKltPoints*>::const_iterator it=poly_lst.begin(); it!=poly_lst.end(); ++it){
261 map_klt = &((*it)->getCurrentPoints());
263 if((*it)->polygon->isVisible()){
264 if(map_klt->size() > 3)
266 for (std::map<int, vpImagePoint>::iterator it=map_klt->begin(); it!=map_klt->end(); ++it)
268 visp_tracker::KltPoint kltPoint;
269 kltPoint.id = it->first;
270 kltPoint.i = it->second.get_i();
271 kltPoint.j = it->second.get_j();
272 klt->klt_points_positions.push_back (kltPoint);
337 tracker_.setTrackerType(vpMbGenericTracker::EDGE_TRACKER);
339 tracker_.setTrackerType(vpMbGenericTracker::KLT_TRACKER);
341 tracker_.setTrackerType(vpMbGenericTracker::EDGE_TRACKER | vpMbGenericTracker::KLT_TRACKER);
346 (
"The camera_prefix parameter not set.\n"
347 "Please relaunch the tracker while setting this parameter, i.e.\n"
348 "$ rosrun visp_tracker tracker _camera_prefix:=/my/camera");
395 typedef boost::function<
396 void (
const geometry_msgs::TransformStampedConstPtr&)>
397 objectPositionHintCallback_t;
398 objectPositionHintCallback_t
callback =
411 boost::ref(
mutex_), _1, _2);
420 boost::ref(
mutex_), _1, _2);
429 boost::ref(
mutex_), _1, _2);
438 throw std::runtime_error(
"failed to retrieve image");
452 ROS_WARN (
"Dubious camera parameters detected.\n"
454 "It seems that the matrix P from your camera\n"
455 "calibration topics is wrong.\n"
456 "The tracker will continue anyway, but you\n"
457 "should double check your calibration data,\n"
458 "especially if the model re-projection fails.\n"
460 "This warning is triggered is px, py, u0 or v0\n"
461 "is set to 0. or 1. (exactly).");
492 std_msgs::Header lastHeader;
499 if (
header_.seq < lastHeader.seq)
520 vpHomogeneousMatrix newMold;
570 geometry_msgs::Transform transformMsg;
576 geometry_msgs::TransformStampedPtr objectPosition
577 (
new geometry_msgs::TransformStamped);
578 objectPosition->header =
header_;
580 objectPosition->transform = transformMsg;
587 geometry_msgs::PoseWithCovarianceStampedPtr result
588 (
new geometry_msgs::PoseWithCovarianceStamped);
590 result->pose.pose.position.x =
591 transformMsg.translation.x;
592 result->pose.pose.position.y =
593 transformMsg.translation.y;
594 result->pose.pose.position.z =
595 transformMsg.translation.z;
597 result->pose.pose.orientation.x =
598 transformMsg.rotation.x;
599 result->pose.pose.orientation.y =
600 transformMsg.rotation.y;
601 result->pose.pose.orientation.z =
602 transformMsg.rotation.z;
603 result->pose.pose.orientation.w =
604 transformMsg.rotation.w;
605 const vpMatrix& covariance =
607 for (
unsigned i = 0; i < covariance.getRows(); ++i)
608 for (
unsigned j = 0; j < covariance.getCols(); ++j)
610 unsigned idx = i * covariance.getCols() + j;
613 result->pose.covariance[idx] = covariance[i][j];
621 visp_tracker::MovingEdgeSitesPtr sites
622 (
new visp_tracker::MovingEdgeSites);
630 visp_tracker::KltPointsPtr klt
631 (
new visp_tracker::KltPoints);
639 (tf::Vector3(transformMsg.translation.x,
640 transformMsg.translation.y,
641 transformMsg.translation.z));
644 (transformMsg.rotation.x,
645 transformMsg.rotation.y,
646 transformMsg.rotation.z,
647 transformMsg.rotation.w));
659 loopRateTracking.
sleep();
682 (
const geometry_msgs::TransformStampedConstPtr& transform)
684 objectPositionHint_ = *transform;