00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 #ifndef __ar_pose__ARSINGLEPUBLISHERCONFIG_H__
00048 #define __ar_pose__ARSINGLEPUBLISHERCONFIG_H__
00049
00050 #include <dynamic_reconfigure/config_tools.h>
00051 #include <limits>
00052 #include <ros/node_handle.h>
00053 #include <dynamic_reconfigure/ConfigDescription.h>
00054 #include <dynamic_reconfigure/ParamDescription.h>
00055 #include <dynamic_reconfigure/Group.h>
00056 #include <dynamic_reconfigure/config_init_mutex.h>
00057 #include <boost/any.hpp>
00058
00059 namespace ar_pose
00060 {
00061 class ARSinglePublisherConfigStatics;
00062
00063 class ARSinglePublisherConfig
00064 {
00065 public:
00066 class AbstractParamDescription : public dynamic_reconfigure::ParamDescription
00067 {
00068 public:
00069 AbstractParamDescription(std::string n, std::string t, uint32_t l,
00070 std::string d, std::string e)
00071 {
00072 name = n;
00073 type = t;
00074 level = l;
00075 description = d;
00076 edit_method = e;
00077 }
00078
00079 virtual void clamp(ARSinglePublisherConfig &config, const ARSinglePublisherConfig &max, const ARSinglePublisherConfig &min) const = 0;
00080 virtual void calcLevel(uint32_t &level, const ARSinglePublisherConfig &config1, const ARSinglePublisherConfig &config2) const = 0;
00081 virtual void fromServer(const ros::NodeHandle &nh, ARSinglePublisherConfig &config) const = 0;
00082 virtual void toServer(const ros::NodeHandle &nh, const ARSinglePublisherConfig &config) const = 0;
00083 virtual bool fromMessage(const dynamic_reconfigure::Config &msg, ARSinglePublisherConfig &config) const = 0;
00084 virtual void toMessage(dynamic_reconfigure::Config &msg, const ARSinglePublisherConfig &config) const = 0;
00085 virtual void getValue(const ARSinglePublisherConfig &config, boost::any &val) const = 0;
00086 };
00087
00088 typedef boost::shared_ptr<AbstractParamDescription> AbstractParamDescriptionPtr;
00089 typedef boost::shared_ptr<const AbstractParamDescription> AbstractParamDescriptionConstPtr;
00090
00091 template <class T>
00092 class ParamDescription : public AbstractParamDescription
00093 {
00094 public:
00095 ParamDescription(std::string name, std::string type, uint32_t level,
00096 std::string description, std::string edit_method, T ARSinglePublisherConfig::* f) :
00097 AbstractParamDescription(name, type, level, description, edit_method),
00098 field(f)
00099 {}
00100
00101 T (ARSinglePublisherConfig::* field);
00102
00103 virtual void clamp(ARSinglePublisherConfig &config, const ARSinglePublisherConfig &max, const ARSinglePublisherConfig &min) const
00104 {
00105 if (config.*field > max.*field)
00106 config.*field = max.*field;
00107
00108 if (config.*field < min.*field)
00109 config.*field = min.*field;
00110 }
00111
00112 virtual void calcLevel(uint32_t &comb_level, const ARSinglePublisherConfig &config1, const ARSinglePublisherConfig &config2) const
00113 {
00114 if (config1.*field != config2.*field)
00115 comb_level |= level;
00116 }
00117
00118 virtual void fromServer(const ros::NodeHandle &nh, ARSinglePublisherConfig &config) const
00119 {
00120 nh.getParam(name, config.*field);
00121 }
00122
00123 virtual void toServer(const ros::NodeHandle &nh, const ARSinglePublisherConfig &config) const
00124 {
00125 nh.setParam(name, config.*field);
00126 }
00127
00128 virtual bool fromMessage(const dynamic_reconfigure::Config &msg, ARSinglePublisherConfig &config) const
00129 {
00130 return dynamic_reconfigure::ConfigTools::getParameter(msg, name, config.*field);
00131 }
00132
00133 virtual void toMessage(dynamic_reconfigure::Config &msg, const ARSinglePublisherConfig &config) const
00134 {
00135 dynamic_reconfigure::ConfigTools::appendParameter(msg, name, config.*field);
00136 }
00137
00138 virtual void getValue(const ARSinglePublisherConfig &config, boost::any &val) const
00139 {
00140 val = config.*field;
00141 }
00142 };
00143
00144 class AbstractGroupDescription : public dynamic_reconfigure::Group
00145 {
00146 public:
00147 AbstractGroupDescription(std::string n, std::string t, int p, int i, bool s)
00148 {
00149 name = n;
00150 type = t;
00151 parent = p;
00152 state = s;
00153 id = i;
00154 }
00155
00156 std::vector<AbstractParamDescriptionConstPtr> abstract_parameters;
00157 bool state;
00158
00159 virtual void toMessage(dynamic_reconfigure::Config &msg, const boost::any &config) const = 0;
00160 virtual bool fromMessage(const dynamic_reconfigure::Config &msg, boost::any &config) const =0;
00161 virtual void updateParams(boost::any &cfg, ARSinglePublisherConfig &top) const= 0;
00162 virtual void setInitialState(boost::any &cfg) const = 0;
00163
00164
00165 void convertParams()
00166 {
00167 for(std::vector<AbstractParamDescriptionConstPtr>::const_iterator i = abstract_parameters.begin(); i != abstract_parameters.end(); i++)
00168 {
00169 parameters.push_back(dynamic_reconfigure::ParamDescription(**i));
00170 }
00171 }
00172 };
00173
00174 typedef boost::shared_ptr<AbstractGroupDescription> AbstractGroupDescriptionPtr;
00175 typedef boost::shared_ptr<const AbstractGroupDescription> AbstractGroupDescriptionConstPtr;
00176
00177 template<class T, class PT>
00178 class GroupDescription : public AbstractGroupDescription
00179 {
00180 public:
00181 GroupDescription(std::string name, std::string type, int parent, int id, bool s, T PT::* f) : AbstractGroupDescription(name, type, parent, id, s), field(f)
00182 {
00183 }
00184
00185 GroupDescription(const GroupDescription<T, PT>& g): AbstractGroupDescription(g.name, g.type, g.parent, g.id, g.state), field(g.field), groups(g.groups)
00186 {
00187 parameters = g.parameters;
00188 abstract_parameters = g.abstract_parameters;
00189 }
00190
00191 virtual bool fromMessage(const dynamic_reconfigure::Config &msg, boost::any &cfg) const
00192 {
00193 PT* config = boost::any_cast<PT*>(cfg);
00194 if(!dynamic_reconfigure::ConfigTools::getGroupState(msg, name, (*config).*field))
00195 return false;
00196
00197 for(std::vector<AbstractGroupDescriptionConstPtr>::const_iterator i = groups.begin(); i != groups.end(); i++)
00198 {
00199 boost::any n = &((*config).*field);
00200 if(!(*i)->fromMessage(msg, n))
00201 return false;
00202 }
00203
00204 return true;
00205 }
00206
00207 virtual void setInitialState(boost::any &cfg) const
00208 {
00209 PT* config = boost::any_cast<PT*>(cfg);
00210 T* group = &((*config).*field);
00211 group->state = state;
00212
00213 for(std::vector<AbstractGroupDescriptionConstPtr>::const_iterator i = groups.begin(); i != groups.end(); i++)
00214 {
00215 boost::any n = boost::any(&((*config).*field));
00216 (*i)->setInitialState(n);
00217 }
00218
00219 }
00220
00221 virtual void updateParams(boost::any &cfg, ARSinglePublisherConfig &top) const
00222 {
00223 PT* config = boost::any_cast<PT*>(cfg);
00224
00225 T* f = &((*config).*field);
00226 f->setParams(top, abstract_parameters);
00227
00228 for(std::vector<AbstractGroupDescriptionConstPtr>::const_iterator i = groups.begin(); i != groups.end(); i++)
00229 {
00230 boost::any n = &((*config).*field);
00231 (*i)->updateParams(n, top);
00232 }
00233 }
00234
00235 virtual void toMessage(dynamic_reconfigure::Config &msg, const boost::any &cfg) const
00236 {
00237 const PT config = boost::any_cast<PT>(cfg);
00238 dynamic_reconfigure::ConfigTools::appendGroup<T>(msg, name, id, parent, config.*field);
00239
00240 for(std::vector<AbstractGroupDescriptionConstPtr>::const_iterator i = groups.begin(); i != groups.end(); i++)
00241 {
00242 (*i)->toMessage(msg, config.*field);
00243 }
00244 }
00245
00246 T (PT::* field);
00247 std::vector<ARSinglePublisherConfig::AbstractGroupDescriptionConstPtr> groups;
00248 };
00249
00250 class DEFAULT
00251 {
00252 public:
00253 DEFAULT()
00254 {
00255 state = true;
00256 name = "Default";
00257 }
00258
00259 void setParams(ARSinglePublisherConfig &config, const std::vector<AbstractParamDescriptionConstPtr> params)
00260 {
00261 for (std::vector<AbstractParamDescriptionConstPtr>::const_iterator i = params.begin(); i != params.end(); i++)
00262 {
00263 boost::any val;
00264 (*i)->getValue(config, val);
00265
00266 if("window_size"==(*i)->name){window_size = boost::any_cast<int>(val);}
00267 if("k"==(*i)->name){k = boost::any_cast<double>(val);}
00268 if("enable_hist"==(*i)->name){enable_hist = boost::any_cast<bool>(val);}
00269 if("enable_thresholded"==(*i)->name){enable_thresholded = boost::any_cast<bool>(val);}
00270 if("enable_local_thresh"==(*i)->name){enable_local_thresh = boost::any_cast<bool>(val);}
00271 if("original_thresh"==(*i)->name){original_thresh = boost::any_cast<int>(val);}
00272 }
00273 }
00274
00275 int window_size;
00276 double k;
00277 bool enable_hist;
00278 bool enable_thresholded;
00279 bool enable_local_thresh;
00280 int original_thresh;
00281
00282 bool state;
00283 std::string name;
00284
00285
00286 }groups;
00287
00288
00289
00290
00291 int window_size;
00292
00293 double k;
00294
00295 bool enable_hist;
00296
00297 bool enable_thresholded;
00298
00299 bool enable_local_thresh;
00300
00301 int original_thresh;
00302
00303
00304 bool __fromMessage__(dynamic_reconfigure::Config &msg)
00305 {
00306 const std::vector<AbstractParamDescriptionConstPtr> &__param_descriptions__ = __getParamDescriptions__();
00307 const std::vector<AbstractGroupDescriptionConstPtr> &__group_descriptions__ = __getGroupDescriptions__();
00308
00309 int count = 0;
00310 for (std::vector<AbstractParamDescriptionConstPtr>::const_iterator i = __param_descriptions__.begin(); i != __param_descriptions__.end(); i++)
00311 if ((*i)->fromMessage(msg, *this))
00312 count++;
00313
00314 for (std::vector<AbstractGroupDescriptionConstPtr>::const_iterator i = __group_descriptions__.begin(); i != __group_descriptions__.end(); i ++)
00315 {
00316 if ((*i)->id == 0)
00317 {
00318 boost::any n = boost::any(this);
00319 (*i)->updateParams(n, *this);
00320 (*i)->fromMessage(msg, n);
00321 }
00322 }
00323
00324 if (count != dynamic_reconfigure::ConfigTools::size(msg))
00325 {
00326 ROS_ERROR("ARSinglePublisherConfig::__fromMessage__ called with an unexpected parameter.");
00327 ROS_ERROR("Booleans:");
00328 for (unsigned int i = 0; i < msg.bools.size(); i++)
00329 ROS_ERROR(" %s", msg.bools[i].name.c_str());
00330 ROS_ERROR("Integers:");
00331 for (unsigned int i = 0; i < msg.ints.size(); i++)
00332 ROS_ERROR(" %s", msg.ints[i].name.c_str());
00333 ROS_ERROR("Doubles:");
00334 for (unsigned int i = 0; i < msg.doubles.size(); i++)
00335 ROS_ERROR(" %s", msg.doubles[i].name.c_str());
00336 ROS_ERROR("Strings:");
00337 for (unsigned int i = 0; i < msg.strs.size(); i++)
00338 ROS_ERROR(" %s", msg.strs[i].name.c_str());
00339
00340
00341 return false;
00342 }
00343 return true;
00344 }
00345
00346
00347
00348 void __toMessage__(dynamic_reconfigure::Config &msg, const std::vector<AbstractParamDescriptionConstPtr> &__param_descriptions__, const std::vector<AbstractGroupDescriptionConstPtr> &__group_descriptions__) const
00349 {
00350 dynamic_reconfigure::ConfigTools::clear(msg);
00351 for (std::vector<AbstractParamDescriptionConstPtr>::const_iterator i = __param_descriptions__.begin(); i != __param_descriptions__.end(); i++)
00352 (*i)->toMessage(msg, *this);
00353
00354 for (std::vector<AbstractGroupDescriptionConstPtr>::const_iterator i = __group_descriptions__.begin(); i != __group_descriptions__.end(); i++)
00355 {
00356 if((*i)->id == 0)
00357 {
00358 (*i)->toMessage(msg, *this);
00359 }
00360 }
00361 }
00362
00363 void __toMessage__(dynamic_reconfigure::Config &msg) const
00364 {
00365 const std::vector<AbstractParamDescriptionConstPtr> &__param_descriptions__ = __getParamDescriptions__();
00366 const std::vector<AbstractGroupDescriptionConstPtr> &__group_descriptions__ = __getGroupDescriptions__();
00367 __toMessage__(msg, __param_descriptions__, __group_descriptions__);
00368 }
00369
00370 void __toServer__(const ros::NodeHandle &nh) const
00371 {
00372 const std::vector<AbstractParamDescriptionConstPtr> &__param_descriptions__ = __getParamDescriptions__();
00373 for (std::vector<AbstractParamDescriptionConstPtr>::const_iterator i = __param_descriptions__.begin(); i != __param_descriptions__.end(); i++)
00374 (*i)->toServer(nh, *this);
00375 }
00376
00377 void __fromServer__(const ros::NodeHandle &nh)
00378 {
00379 static bool setup=false;
00380
00381 const std::vector<AbstractParamDescriptionConstPtr> &__param_descriptions__ = __getParamDescriptions__();
00382 for (std::vector<AbstractParamDescriptionConstPtr>::const_iterator i = __param_descriptions__.begin(); i != __param_descriptions__.end(); i++)
00383 (*i)->fromServer(nh, *this);
00384
00385 const std::vector<AbstractGroupDescriptionConstPtr> &__group_descriptions__ = __getGroupDescriptions__();
00386 for (std::vector<AbstractGroupDescriptionConstPtr>::const_iterator i = __group_descriptions__.begin(); i != __group_descriptions__.end(); i++){
00387 if (!setup && (*i)->id == 0) {
00388 setup = true;
00389 boost::any n = boost::any(this);
00390 (*i)->setInitialState(n);
00391 }
00392 }
00393 }
00394
00395 void __clamp__()
00396 {
00397 const std::vector<AbstractParamDescriptionConstPtr> &__param_descriptions__ = __getParamDescriptions__();
00398 const ARSinglePublisherConfig &__max__ = __getMax__();
00399 const ARSinglePublisherConfig &__min__ = __getMin__();
00400 for (std::vector<AbstractParamDescriptionConstPtr>::const_iterator i = __param_descriptions__.begin(); i != __param_descriptions__.end(); i++)
00401 (*i)->clamp(*this, __max__, __min__);
00402 }
00403
00404 uint32_t __level__(const ARSinglePublisherConfig &config) const
00405 {
00406 const std::vector<AbstractParamDescriptionConstPtr> &__param_descriptions__ = __getParamDescriptions__();
00407 uint32_t level = 0;
00408 for (std::vector<AbstractParamDescriptionConstPtr>::const_iterator i = __param_descriptions__.begin(); i != __param_descriptions__.end(); i++)
00409 (*i)->calcLevel(level, config, *this);
00410 return level;
00411 }
00412
00413 static const dynamic_reconfigure::ConfigDescription &__getDescriptionMessage__();
00414 static const ARSinglePublisherConfig &__getDefault__();
00415 static const ARSinglePublisherConfig &__getMax__();
00416 static const ARSinglePublisherConfig &__getMin__();
00417 static const std::vector<AbstractParamDescriptionConstPtr> &__getParamDescriptions__();
00418 static const std::vector<AbstractGroupDescriptionConstPtr> &__getGroupDescriptions__();
00419
00420 private:
00421 static const ARSinglePublisherConfigStatics *__get_statics__();
00422 };
00423
00424 template <>
00425 inline void ARSinglePublisherConfig::ParamDescription<std::string>::clamp(ARSinglePublisherConfig &config, const ARSinglePublisherConfig &max, const ARSinglePublisherConfig &min) const
00426 {
00427 return;
00428 }
00429
00430 class ARSinglePublisherConfigStatics
00431 {
00432 friend class ARSinglePublisherConfig;
00433
00434 ARSinglePublisherConfigStatics()
00435 {
00436 ARSinglePublisherConfig::GroupDescription<ARSinglePublisherConfig::DEFAULT, ARSinglePublisherConfig> Default("Default", "", 0, 0, true, &ARSinglePublisherConfig::groups);
00437
00438 __min__.window_size = 3;
00439
00440 __max__.window_size = 500;
00441
00442 __default__.window_size = 80;
00443
00444 Default.abstract_parameters.push_back(ARSinglePublisherConfig::AbstractParamDescriptionConstPtr(new ARSinglePublisherConfig::ParamDescription<int>("window_size", "int", 0, "Local threshold windo size", "", &ARSinglePublisherConfig::window_size)));
00445
00446 __param_descriptions__.push_back(ARSinglePublisherConfig::AbstractParamDescriptionConstPtr(new ARSinglePublisherConfig::ParamDescription<int>("window_size", "int", 0, "Local threshold windo size", "", &ARSinglePublisherConfig::window_size)));
00447
00448 __min__.k = 0.0;
00449
00450 __max__.k = 0.5;
00451
00452 __default__.k = 0.06;
00453
00454 Default.abstract_parameters.push_back(ARSinglePublisherConfig::AbstractParamDescriptionConstPtr(new ARSinglePublisherConfig::ParamDescription<double>("k", "double", 0, "Multiplicative constant for local deviation", "", &ARSinglePublisherConfig::k)));
00455
00456 __param_descriptions__.push_back(ARSinglePublisherConfig::AbstractParamDescriptionConstPtr(new ARSinglePublisherConfig::ParamDescription<double>("k", "double", 0, "Multiplicative constant for local deviation", "", &ARSinglePublisherConfig::k)));
00457
00458 __min__.enable_hist = 0;
00459
00460 __max__.enable_hist = 1;
00461
00462 __default__.enable_hist = 0;
00463
00464 Default.abstract_parameters.push_back(ARSinglePublisherConfig::AbstractParamDescriptionConstPtr(new ARSinglePublisherConfig::ParamDescription<bool>("enable_hist", "bool", 0, "Enable histogram publication", "", &ARSinglePublisherConfig::enable_hist)));
00465
00466 __param_descriptions__.push_back(ARSinglePublisherConfig::AbstractParamDescriptionConstPtr(new ARSinglePublisherConfig::ParamDescription<bool>("enable_hist", "bool", 0, "Enable histogram publication", "", &ARSinglePublisherConfig::enable_hist)));
00467
00468 __min__.enable_thresholded = 0;
00469
00470 __max__.enable_thresholded = 1;
00471
00472 __default__.enable_thresholded = 0;
00473
00474 Default.abstract_parameters.push_back(ARSinglePublisherConfig::AbstractParamDescriptionConstPtr(new ARSinglePublisherConfig::ParamDescription<bool>("enable_thresholded", "bool", 0, "Enable binarizaed image publication", "", &ARSinglePublisherConfig::enable_thresholded)));
00475
00476 __param_descriptions__.push_back(ARSinglePublisherConfig::AbstractParamDescriptionConstPtr(new ARSinglePublisherConfig::ParamDescription<bool>("enable_thresholded", "bool", 0, "Enable binarizaed image publication", "", &ARSinglePublisherConfig::enable_thresholded)));
00477
00478 __min__.enable_local_thresh = 0;
00479
00480 __max__.enable_local_thresh = 1;
00481
00482 __default__.enable_local_thresh = 0;
00483
00484 Default.abstract_parameters.push_back(ARSinglePublisherConfig::AbstractParamDescriptionConstPtr(new ARSinglePublisherConfig::ParamDescription<bool>("enable_local_thresh", "bool", 0, "Enable Local Threshold Method", "", &ARSinglePublisherConfig::enable_local_thresh)));
00485
00486 __param_descriptions__.push_back(ARSinglePublisherConfig::AbstractParamDescriptionConstPtr(new ARSinglePublisherConfig::ParamDescription<bool>("enable_local_thresh", "bool", 0, "Enable Local Threshold Method", "", &ARSinglePublisherConfig::enable_local_thresh)));
00487
00488 __min__.original_thresh = 0;
00489
00490 __max__.original_thresh = 255;
00491
00492 __default__.original_thresh = 100;
00493
00494 Default.abstract_parameters.push_back(ARSinglePublisherConfig::AbstractParamDescriptionConstPtr(new ARSinglePublisherConfig::ParamDescription<int>("original_thresh", "int", 0, "Original AR_toolkit threshold", "", &ARSinglePublisherConfig::original_thresh)));
00495
00496 __param_descriptions__.push_back(ARSinglePublisherConfig::AbstractParamDescriptionConstPtr(new ARSinglePublisherConfig::ParamDescription<int>("original_thresh", "int", 0, "Original AR_toolkit threshold", "", &ARSinglePublisherConfig::original_thresh)));
00497
00498 Default.convertParams();
00499
00500 __group_descriptions__.push_back(ARSinglePublisherConfig::AbstractGroupDescriptionConstPtr(new ARSinglePublisherConfig::GroupDescription<ARSinglePublisherConfig::DEFAULT, ARSinglePublisherConfig>(Default)));
00501
00502
00503 for (std::vector<ARSinglePublisherConfig::AbstractGroupDescriptionConstPtr>::const_iterator i = __group_descriptions__.begin(); i != __group_descriptions__.end(); i++)
00504 {
00505 __description_message__.groups.push_back(**i);
00506 }
00507 __max__.__toMessage__(__description_message__.max, __param_descriptions__, __group_descriptions__);
00508 __min__.__toMessage__(__description_message__.min, __param_descriptions__, __group_descriptions__);
00509 __default__.__toMessage__(__description_message__.dflt, __param_descriptions__, __group_descriptions__);
00510 }
00511 std::vector<ARSinglePublisherConfig::AbstractParamDescriptionConstPtr> __param_descriptions__;
00512 std::vector<ARSinglePublisherConfig::AbstractGroupDescriptionConstPtr> __group_descriptions__;
00513 ARSinglePublisherConfig __max__;
00514 ARSinglePublisherConfig __min__;
00515 ARSinglePublisherConfig __default__;
00516 dynamic_reconfigure::ConfigDescription __description_message__;
00517
00518 static const ARSinglePublisherConfigStatics *get_instance()
00519 {
00520
00521
00522
00523
00524 static ARSinglePublisherConfigStatics instance;
00525 return &instance;
00526 }
00527 };
00528
00529 inline const dynamic_reconfigure::ConfigDescription &ARSinglePublisherConfig::__getDescriptionMessage__()
00530 {
00531 return __get_statics__()->__description_message__;
00532 }
00533
00534 inline const ARSinglePublisherConfig &ARSinglePublisherConfig::__getDefault__()
00535 {
00536 return __get_statics__()->__default__;
00537 }
00538
00539 inline const ARSinglePublisherConfig &ARSinglePublisherConfig::__getMax__()
00540 {
00541 return __get_statics__()->__max__;
00542 }
00543
00544 inline const ARSinglePublisherConfig &ARSinglePublisherConfig::__getMin__()
00545 {
00546 return __get_statics__()->__min__;
00547 }
00548
00549 inline const std::vector<ARSinglePublisherConfig::AbstractParamDescriptionConstPtr> &ARSinglePublisherConfig::__getParamDescriptions__()
00550 {
00551 return __get_statics__()->__param_descriptions__;
00552 }
00553
00554 inline const std::vector<ARSinglePublisherConfig::AbstractGroupDescriptionConstPtr> &ARSinglePublisherConfig::__getGroupDescriptions__()
00555 {
00556 return __get_statics__()->__group_descriptions__;
00557 }
00558
00559 inline const ARSinglePublisherConfigStatics *ARSinglePublisherConfig::__get_statics__()
00560 {
00561 const static ARSinglePublisherConfigStatics *statics;
00562
00563 if (statics)
00564 return statics;
00565
00566 boost::mutex::scoped_lock lock(dynamic_reconfigure::__init_mutex__);
00567
00568 if (statics)
00569 return statics;
00570
00571 statics = ARSinglePublisherConfigStatics::get_instance();
00572
00573 return statics;
00574 }
00575
00576
00577 }
00578
00579 #endif // __ARSINGLEPUBLISHERRECONFIGURATOR_H__