【ROS, C++】ROSのpub/subをクラスの中で使う書き方

C++のクラスでROSを使う書き方をご紹介します。

クラスを使わないROSのソースコード

#include <ros/ros.h>
#include <std_msgs/String.h>

void Publication(void)
{
	std_msgs::String pub_msg;
	pub_msg.data = "This is pub msg";
	ros::Publisher pub = nh.advertise("/pub_msg", 1);
	pub.publish(pub_msg);
}

void Callback(const std_msgs::String::ConstPtr& msg)
{
	std::cout << msg->data.c_str() << std::endl;
}

int main(int argc, char**argv)
{
	ros::init(argc, argv, "talker");
	ros::NodeHandle nh;

	ros::Subscriber sub = nh.subscribe("/message", 1, Callback);
	
	ros::Rate loop_rate(10);
	while(ros::ok()){
		Publication();
		ros::spinOnce();
		loop_rate.sleep();
	}
}

クラスを使うROSのソースコード

#include <ros/ros.h>
#include <std_msgs/String.h>

Class RosWithClass{
	private:
		ros::NodeHandle nh;
		ros::Publisher pub;
		ros::Subscriber sub;
		std_msgs::String pub_msg;
	public:
		RosWithClass();
		void Publication(void);
		void Callback(const std_msgs::String::ConstPtr& msg);
}

RosWithClass::RosWithClass()
{
	pub = nh.advertise("/pub_msg", 1);
	sub = nh.subscribe("/message", 1, &RosWithClass::Callback, this);
}

void RosWithClass::Publication(void)
{
	pub_msg.data = "message";
	pub.publish(pub_msg);
}

void RosWithClass::Callback(const std_msgs::String::ConstPtr& msg)
{
	std::cout << msg->data.c_str() << std::endl;
}

int main(int argc, char**argv)
{
	ros::init(argc, argv, "talker");
	
	RosWithClass ros_with_class;

	ros::Rate loop_rate(10);
	while(ros::ok()){
		ros_with_class.Publication();
		ros::spinOnce();
		loop_rate.sleep();
	}
}

解説

クラスを使う場合、コンストラクタ内でのSubscriberの代入方法が少し特別です。

sub = nh.subscribe("/message", 1, &RosWithClass::Callback, this);

さいごに

なるべく単純な例を示すことで、ROSをクラス化する方法を紹介しました。クラス化することでコードがキレイにまとまるなどメリットがありますので、ぜひ使ってみてください。

以上です。

Ad.