ROS写一个Publisher Node和一个Subcriber Node

一、说明

本篇文章参考

二、写一个publisher node(cpp)

官网教程是写一个talker.cpp

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

int main(int argc, char **argv)
{
	//用自定义的名称初始化节点,argc和argv用来获取命令行参数来重命名。名称不能有/
	ros::init(argc, argv, "talker");
	
	//第一个句柄会初始化节点,当句柄和句柄的复制全部被销毁时,会清楚节点使用的资源
	ros::NodeHandle n;
	
	//告诉master将会在topic话题“chatter”发布一个`std_msgs/String`类型的消息,1000是设置的消息队列,超过会丢弃旧消息
	//NodeHandle::advertise()返回一个ros::Publisher对象,作用:
	//1.包含一个方法publish(),它可以发布消息到topic上
	//2.when it goes out of scope, it will automatically unadvertise.当它超出范围时,会
	ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
	
	//一个ros::Rate对象允许你定义一个循环频率。它会跟踪自上次调用Rate::sleep()以来的时间,并休眠正确的时间。
	ros::Rate loop_rate(10);
	
	int count = 0;
	//默认情况下,roscpp将安装一个SIGINT处理程序,该处理程序提供Ctrl-C处理,如果发生这种情况,将导致ros::ok()返回false。
	while (ros::ok())
	{
		//创建`std_msgs/String`类型的对象,有一个成员:data
		std_msgs::String msg;
		
		std::stringstream ss;
		ss << "hello world " << count;
		msg.data = ss.str();
		
		//ROS_INFO替代print/cout
		ROS_INFO("%s", msg.data.c_str());
		
		//广播消息给任何订阅该主题的节点
		chatter_pub.publish(msg);
		
		//该语句不是必要的,因为我们没有收到任何callback回调。但是,如果您要向这个应用程序添加订阅,并且这里没有ros::spinOnce(),那么您的回调将永远不会被调用。所以最好把它加上去。
		ros::spinOnce();
		
		//休眠,达到上面设置的循环频率会重新发送消息
		loop_rate.sleep();
		++count;
	}

return 0;
}

该节点做的事情:

  1. Initialize the ROS system
  2. Advertise that we are going to be publishing std_msgs/String messages on the chatter topic to the master
  3. Loop while publishing messages to chatter 10 times a second

三、写一个Subcriber Node

#include "ros/ros.h"
#include "std_msgs/String.h"

//当一个新消息到达topic“chatter”时,会调用这个回调函数。
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
  ROS_INFO("I heard: [%s]", msg->data.c_str());
}

int main(int argc, char **argv)
{

  ros::init(argc, argv, "listener");

  ros::NodeHandle n;

//调用subscribe()告诉ROS想要从topic“chatter”接受消息,返回一个Subscriber对象,
//当该对象被销毁时,会自动取消订阅该话题
//当一个新消息到达时,ROS会自动调用chatterCallback回调函数
  ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
  
  //ros::spin()会进入一个循环,调用回调函数。在这个版本中,所有回调函数都会在主线程中被调用。
  //按下Ctrl-C时,或者节点被master shutdown时,循环会结束。
  ros::spin();

  return 0;
}

四、Building your nodes

CMakeLists.txt中添加:

add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)

add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)

将会在devel space(默认在~/catkin_ws/devel/lib/)中创建两个可执行文件:talker和listener。可以直接运行可执行文件,或者使用rosrun。

add_dependencies:必须要将可执行目标的依赖项添加到message generation targets()
target_link_libraries:将确保在使用该包之前生成该包的消息头。如果在catkin工作区中使用来自其他包的消息,还需要向它们各自的生成目标添加依赖项,因为catkin是并行构建所有项目的。

猜你喜欢

转载自blog.csdn.net/lqysgdb/article/details/114596565
今日推荐