diff --git a/CMakeLists.txt b/CMakeLists.txt index 07eea06ecda0900215cd10e005addd14be8c12f7..5ace0d9da72e2bb296a7c0a5164b73d6da15a104 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -135,7 +135,8 @@ include_directories( # src/${PROJECT_NAME}/wolf_ros.cpp # ) add_library(subscriber_${PROJECT_NAME} - src/subscriber_imu.cpp) + src/subscriber_imu.cpp + src/subscriber_imu_enablable.cpp) ## Add cmake target dependencies of the library ## as an example, code may need to be generated before libraries diff --git a/include/subscriber_imu.h b/include/subscriber_imu.h index 97b62924a32c4521d34a0187fe1c6b4a15dd8bf1..7d683cfd5356b6b749b6ef18b9a387bb9f97d3c0 100644 --- a/include/subscriber_imu.h +++ b/include/subscriber_imu.h @@ -1,3 +1,6 @@ +#ifndef WOLF_SUBSCRIBER_IMU_H_ +#define WOLF_SUBSCRIBER_IMU_H_ + /************************** * WOLF includes * **************************/ @@ -41,3 +44,5 @@ class SubscriberImu : public Subscriber static std::shared_ptr<Subscriber> create(const std::string& _unique_name, const ParamsServer& _params, const SensorBasePtr _sensor_ptr); }; WOLF_REGISTER_SUBSCRIBER(SubscriberImu) + +#endif diff --git a/include/subscriber_imu_enablable.h b/include/subscriber_imu_enablable.h new file mode 100644 index 0000000000000000000000000000000000000000..e062b775af80d94f5a4494ecd7e74e93463bfd99 --- /dev/null +++ b/include/subscriber_imu_enablable.h @@ -0,0 +1,55 @@ +#ifndef WOLF_SUBSCRIBER_IMU_ENABLABLE_H_ +#define WOLF_SUBSCRIBER_IMU_ENABLABLE_H_ + +/************************** + * WOLF includes * + **************************/ +#include <core/yaml/parser_yaml.h> +#include <core/common/wolf.h> +#include <core/problem/problem.h> +#include <core/utils/params_server.h> +#include <imu/capture/capture_imu.h> +#include <imu/sensor/sensor_imu.h> + +/************************** + * ROS includes * + **************************/ +#include <ros/ros.h> +#include <sensor_msgs/Imu.h> +#include <std_msgs/Bool.h> + +/************************** + * STD includes * + **************************/ +#include <iostream> +#include <iomanip> +#include <queue> + +/************************** + * WOLF-ROS includes * + **************************/ +#include "subscriber_imu.h" + +using namespace wolf; + +class SubscriberImuEnablable : public SubscriberImu +{ + protected: + ros::Subscriber enable_sub_; + bool enabled_; + + public: + // Constructor + SubscriberImuEnablable(const SensorBasePtr& sensor_ptr); + + virtual void initSubscriber(ros::NodeHandle& nh, const std::string& topic); + + void callback(const sensor_msgs::Imu::ConstPtr& msg); + + void enableCallback(const std_msgs::Bool::ConstPtr& msg); + + static std::shared_ptr<Subscriber> create(const std::string& _unique_name, const ParamsServer& _params, const SensorBasePtr _sensor_ptr); +}; +WOLF_REGISTER_SUBSCRIBER(SubscriberImuEnablable) + +#endif diff --git a/src/subscriber_imu_enablable.cpp b/src/subscriber_imu_enablable.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fdb16a1eb769bdac110736d44e63bd397cbb04d6 --- /dev/null +++ b/src/subscriber_imu_enablable.cpp @@ -0,0 +1,34 @@ +#include "../include/subscriber_imu_enablable.h" + +using namespace wolf; + +// Constructor +SubscriberImuEnablable::SubscriberImuEnablable(const SensorBasePtr& sensor_ptr) : + SubscriberImu(sensor_ptr), + enabled_(false) +{ + assert(std::dynamic_pointer_cast<SensorImu>(sensor_ptr) != nullptr); +} + +void SubscriberImuEnablable::initSubscriber(ros::NodeHandle& nh, const std::string& topic) +{ + sub_ = nh.subscribe(topic, 1, &SubscriberImuEnablable::callback, this); +} + +void SubscriberImuEnablable::callback(const sensor_msgs::Imu::ConstPtr& msg) +{ + if (enabled_) + SubscriberImu::callback(msg); +} + +void SubscriberImuEnablable::enableCallback(const std_msgs::Bool::ConstPtr& msg) +{ + ROS_DEBUG("enable callback!"); + if (msg->data) + enabled_ = true; +} + +std::shared_ptr<Subscriber> SubscriberImuEnablable::create(const std::string& _unique_name, const ParamsServer& _params, const SensorBasePtr _sensor_ptr) +{ + return std::make_shared<SubscriberImuEnablable>(_sensor_ptr); +}