Go to the documentation of this file.00001 #include <boost/bind.hpp>
00002 #include <boost/make_shared.hpp>
00003 #include <boost/shared_ptr.hpp>
00004 #include <boost/thread.hpp>
00005
00006 #include <nodelet/nodelet.h>
00007 #include <pluginlib/class_list_macros.h>
00008
00009 #include "tracker.hh"
00010
00011 namespace visp_tracker
00012 {
00013 class TrackerNodelet : public nodelet::Nodelet
00014 {
00015 public:
00016 TrackerNodelet ()
00017 : nodelet::Nodelet (),
00018 exiting_ (false),
00019 tracker_ (),
00020 thread_ ()
00021 {}
00022
00023 ~TrackerNodelet ()
00024 {
00025 exiting_ = true;
00026 if (thread_)
00027 if (!thread_->timed_join (boost::posix_time::seconds (2)))
00028 NODELET_WARN ("failed to join thread but continuing anyway");
00029 thread_.reset ();
00030 tracker_.reset ();
00031 }
00032
00033 void spin ()
00034 {
00035 if (exiting_)
00036 return;
00037 tracker_ = boost::shared_ptr<visp_tracker::Tracker>
00038 (new visp_tracker::Tracker (getMTNodeHandle (),
00039 getMTPrivateNodeHandle (),
00040 exiting_, 5u));
00041 while (ros::ok () && !exiting_)
00042 tracker_->spin ();
00043 }
00044
00045 virtual void onInit ()
00046 {
00047 NODELET_DEBUG ("Initializing nodelet...");
00048 exiting_ = false;
00049 thread_ = boost::make_shared<boost::thread>
00050 (boost::bind (&TrackerNodelet::spin, this));
00051 }
00052
00053 private:
00054 volatile bool exiting_;
00055 boost::shared_ptr<visp_tracker::Tracker> tracker_;
00056 boost::shared_ptr<boost::thread> thread_;
00057 };
00058
00059 }
00060
00061 PLUGINLIB_DECLARE_CLASS(visp_tracker, Tracker,
00062 visp_tracker::TrackerNodelet, nodelet::Nodelet);