前言
面向对象编程时c++等语言的重要特性,之前的文章虽然简单实现了订阅方,但时面向过程编程,本文针对面向对象的编程,编写一个订阅激光扫描话题的节点
要点
与面向过程不同的是,面向对象需要定义很多类,通过实例(对象)的实现来编程
代码
节点代码
这段代码实例化一个控制器的对象
#include <ros/ros.h>
#include <package/Class.hpp>
int main(int argc, char ** argv)
{
ros::init(argc, argv, "node_name");
ros::NodeHandle nodeHandle("~");
node_name::Controller controller(nodeHandle);
ros::spin();
return 0;
}
本文中使用的是private的节点句柄,因为这么使用使得本句柄下所有的函数定义都在句柄为名的名称空间下,这样封装性做得更好,而且在大型项目中也避免了重名的风险。
Controller头文件
定义了Controller类。
#pragma once
#include <ros/ros.h>
#include <sensor_msgs/LaserScan.h>
namespace node_name
{
class Controller
{
public:
Controller(ros::NodeHandle& nodehandle);
virtual ~Controller();
private:
ros::NodeHandle nodehandle_;
ros::Subscriber subscriber_;
std::string topic_;
int queue_size_ ;
bool readParameters();
void callBack(const sensor_msgs::LaserScan& msg);
};
}
Controller实现文件
#include"Controller.hpp"
namespace node_name
{
Controller::Controller(ros::NodeHandle& nodehandle):nodehandle_(nodehandle)
{
if(!readParameters())
{
ROS_ERROR("参数服务器的参数未读取成功");
ros::requestShutdown();
}
subscriber_ = nodehandle_.subscribe(topic_,queue_size_,&Controller::callBack,this);
}
Controller::~Controller(){}
bool Controller::readParameters()
{
bool flag1 = nodehandle_.getParam("topic_name",topic_);
bool flag2 = nodehandle_.getParam("queue_size",queue_size_);
if(flag1==0 || flag2==0)
{
return false;
}
return true;
}
void Controller::callBack(const sensor_msgs::LaserScan& msg)
{
ROS_INFO("回调函数已执行");
}
}
yaml文件
yaml文件是储存参数服务器的配置文件,在roslaunch中可以将yaml中的数据导入服务器
topic_name: /scan
queue_size: 30
launch文件
<launch>
<node name="subscribe" pkg="pkg" type="node_name" >
<rosparam command="load" file="$(find pkg)/config/config.yaml" />
</node>
</launch>