From bbe55a9ba1eff586c718b9a8e6be583d602864bf Mon Sep 17 00:00:00 2001 From: joanvallve <jvallve@iri.upc.edu> Date: Thu, 11 Jun 2020 12:49:17 +0200 Subject: [PATCH] subscriber new constructor with param server --- include/subscriber.h | 29 +++++++++++++++++++++++++++-- include/subscriber_diffdrive.h | 7 ++++--- include/subscriber_odom2d.h | 7 ++++--- src/subscriber_diffdrive.cpp | 14 +++++--------- src/subscriber_odom2d.cpp | 16 ++++++---------- 5 files changed, 46 insertions(+), 27 deletions(-) diff --git a/include/subscriber.h b/include/subscriber.h index 30f9089..eddd420 100644 --- a/include/subscriber.h +++ b/include/subscriber.h @@ -16,18 +16,43 @@ namespace wolf { WOLF_PTR_TYPEDEFS(Subscriber); +/* + * Macro for defining Autoconf subscriber creator for WOLF's high level API. + * + * Place a call to this macro inside your class declaration (in the subscriber_class.h file), + * preferably just after the constructors. + * + * In order to use this macro, the derived subscriber class, SubscriberClass, + * must have a constructor available with the API: + * + * SubscriberClass(const std::string& _unique_name, + * const ParamsServer& _server, + * const SensorBasePtr _sensor_ptr); + */ +#define WOLF_SUBSCRIBER_CREATE(SubscriberClass) \ +static SubscriberPtr create(const std::string& _unique_name, \ + const ParamsServer& _server, \ + const SensorBasePtr _sensor_ptr) \ +{ \ + return std::make_shared<SubscriberClass>(_unique_name, _server, _sensor_ptr); \ +} \ + class Subscriber { protected: //wolf SensorBasePtr sensor_ptr_; + std::string prefix_; // ros ros::Subscriber sub_; public: - Subscriber(const SensorBasePtr& sensor_ptr) : - sensor_ptr_(sensor_ptr) + Subscriber(const std::string& _unique_name, + const ParamsServer& _server, + const SensorBasePtr _sensor_ptr) : + sensor_ptr_(_sensor_ptr), + prefix_("ROS subscriber/" + _unique_name) { } virtual ~Subscriber(){}; diff --git a/include/subscriber_diffdrive.h b/include/subscriber_diffdrive.h index f2c0fd2..5783bd0 100644 --- a/include/subscriber_diffdrive.h +++ b/include/subscriber_diffdrive.h @@ -26,13 +26,14 @@ class SubscriberDiffdrive : public Subscriber public: - SubscriberDiffdrive(const SensorBasePtr& sensor_ptr); + SubscriberDiffdrive(const std::string& _unique_name, + const ParamsServer& _server, + const SensorBasePtr _sensor_ptr); + WOLF_SUBSCRIBER_CREATE(SubscriberDiffdrive); virtual void initSubscriber(ros::NodeHandle& nh, const std::string& topic); void callback(const sensor_msgs::JointState::ConstPtr& msg); - - static std::shared_ptr<Subscriber> create(const std::string& _unique_name, const ParamsServer& _params, const SensorBasePtr _sensor_ptr); }; WOLF_REGISTER_SUBSCRIBER(SubscriberDiffdrive) diff --git a/include/subscriber_odom2d.h b/include/subscriber_odom2d.h index 72aa775..849bbd1 100644 --- a/include/subscriber_odom2d.h +++ b/include/subscriber_odom2d.h @@ -22,13 +22,14 @@ class SubscriberOdom2d : public Subscriber public: - SubscriberOdom2d(const SensorBasePtr& sensor_ptr); + SubscriberOdom2d(const std::string& _unique_name, + const ParamsServer& _server, + const SensorBasePtr _sensor_ptr); + WOLF_SUBSCRIBER_CREATE(SubscriberOdom2d); virtual void initSubscriber(ros::NodeHandle& nh, const std::string& topic); void callback(const nav_msgs::Odometry::ConstPtr& msg); - - static std::shared_ptr<Subscriber> create(const std::string& _unique_name, const ParamsServer& _params, const SensorBasePtr _sensor_ptr); }; WOLF_REGISTER_SUBSCRIBER(SubscriberOdom2d) diff --git a/src/subscriber_diffdrive.cpp b/src/subscriber_diffdrive.cpp index 368ff40..9463c06 100644 --- a/src/subscriber_diffdrive.cpp +++ b/src/subscriber_diffdrive.cpp @@ -12,13 +12,15 @@ namespace wolf { -SubscriberDiffdrive::SubscriberDiffdrive(const SensorBasePtr& sensor_ptr) - : Subscriber(sensor_ptr) +SubscriberDiffdrive::SubscriberDiffdrive(const std::string& _unique_name, + const ParamsServer& _server, + const SensorBasePtr _sensor_ptr) + : Subscriber(_unique_name, _server, _sensor_ptr) , last_odom_stamp_(ros::Time(0)) , last_odom_seq_(-1) { last_angles_ = Eigen::Vector2d(); - ticks_cov_factor_ = std::static_pointer_cast<SensorDiffDrive>(sensor_ptr)->getParams()->ticks_cov_factor; + ticks_cov_factor_ = std::static_pointer_cast<SensorDiffDrive>(_sensor_ptr)->getParams()->ticks_cov_factor; } void SubscriberDiffdrive::initSubscriber(ros::NodeHandle& nh, const std::string& topic) @@ -66,10 +68,4 @@ void SubscriberDiffdrive::callback(const sensor_msgs::JointState::ConstPtr& msg) last_odom_seq_ = msg->header.seq; } -std::shared_ptr<Subscriber> SubscriberDiffdrive::create(const std::string& _unique_name, - const ParamsServer& _params, - const SensorBasePtr _sensor_ptr) -{ - return std::make_shared<SubscriberDiffdrive>(_sensor_ptr); -}; } // namespace wolf diff --git a/src/subscriber_odom2d.cpp b/src/subscriber_odom2d.cpp index 6cebb0b..90a02c6 100644 --- a/src/subscriber_odom2d.cpp +++ b/src/subscriber_odom2d.cpp @@ -23,11 +23,13 @@ namespace wolf { -SubscriberOdom2d::SubscriberOdom2d(const SensorBasePtr& sensor_ptr) - : Subscriber(sensor_ptr) +SubscriberOdom2d::SubscriberOdom2d(const std::string& _unique_name, + const ParamsServer& _server, + const SensorBasePtr _sensor_ptr) + : Subscriber(_unique_name, _server, _sensor_ptr) , last_odom_stamp_(ros::Time(0)) - , odometry_translational_cov_factor_(std::static_pointer_cast<SensorOdom2d>(sensor_ptr)->getDispVarToDispNoiseFactor()) - , odometry_rotational_cov_factor_(std::static_pointer_cast<SensorOdom2d>(sensor_ptr)->getRotVarToRotNoiseFactor()) + , odometry_translational_cov_factor_(std::static_pointer_cast<SensorOdom2d>(_sensor_ptr)->getDispVarToDispNoiseFactor()) + , odometry_rotational_cov_factor_(std::static_pointer_cast<SensorOdom2d>(_sensor_ptr)->getRotVarToRotNoiseFactor()) { } @@ -58,10 +60,4 @@ void SubscriberOdom2d::callback(const nav_msgs::Odometry::ConstPtr& msg) ROS_DEBUG("WolfNodePolyline::odomCallback: end"); } -std::shared_ptr<Subscriber> SubscriberOdom2d::create(const std::string& _unique_name, - const ParamsServer& _params, - const SensorBasePtr _sensor_ptr) -{ - return std::make_shared<SubscriberOdom2d>(_sensor_ptr); -}; } // namespace wolf -- GitLab