ROS cpp class example

최준혁·2021년 12월 26일
0

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]

profile
3D Vision, VSLAM, Robotics, Deep_Learning

0개의 댓글