class_example_v1.h
#include <ros/ros.h>
#include <std_msgs/Bool.h>
#include <std_msgs/Float32.h>
#include <vector>
#include <string>
class example
{
public:
example(ros::NodeHandle* nh);
private:
ros::NodeHandle nh_;
ros::Subscriber sub_;
ros::ServiceServer server_;
ros::Publisher pub_;
double val_from_sub_;
double val_to_remember_;
void initSub();
void initPub();
void initService();
void subCB(const std_msgs::Float32::ConstPtr& msg);
void serviceCB(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
};
class_example_v1.cpp
#include "example.h"
example::example(ros::NodeHandle* nh):nh_(nh)
{
initSub();
initPub();
initService();
val_to_remember_ = 0.0;
}
void example::initSub()
{
sub_ = nh_.subscribe("exSubTopic", 1, example::subCB, this);
}
void example::initPub()
{
pub_ = nh_.advertise<std_msgs::Float32>("exPubTopic", 1, true);
}
void example::initService()
{
server_ = nh.advertiseService("exService", &example::serviceCB, this);
}
void example::subCB(const std_msgs::Float32 msg)
{
val_from_sub_ = msg.data;
std_msgs::Float32 output;
val_to_remember_ += val_to_sub_;
output.data = val_to_remember_;
pub_.publish(output);
}
bool example::serviceCB(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res)
{
res.success = true;
return true;
}
cpp_class_v2.cpp
#include <ros/ros.h>
#include <std_msgs/Int64.h>
#include <std_srvs/SetBool.h>
class NumberCounter {
private:
int counter;
ros::Publisher pub;
ros::Subscriber number_subscriber;
ros::ServiceServer reset_service;
public:
NumberCounter(ros::NodeHandle *nh) {
counter = 0;
pub = nh->advertise<std_msgs::Int64>("/number_count", 10);
number_subscriber = nh->subscribe("/number", 1000,
&NumberCounter::callback_number, this);
reset_service = nh->advertiseService("/reset_counter",
&NumberCounter::callback_reset_counter, this);
}
void callback_number(const std_msgs::Int64& msg) {
counter += msg.data;
std_msgs::Int64 new_msg;
new_msg.data = counter;
pub.publish(new_msg);
}
bool callback_reset_counter(std_srvs::SetBool::Request &req,
std_srvs::SetBool::Response &res)
{
if (req.data) {
counter = 0;
res.success = true;
res.message = "Counter has been successfully reset";
}
else {
res.success = false;
res.message = "Counter has not been reset";
}
return true;
}
};
int main (int argc, char **argv)
{
ros::init(argc, argv, "number_counter");
ros::NodeHandle nh;
NumberCounter nc = NumberCounter(&nh);
ros::spin();
}
[ref]