理解ROS:发布器与订阅器

发布消息和订阅消息属于ROS通信的基础操作,详细教程可以参考官方教程,下面贴出我自己做的测试和注释。

发布节点

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char **argv)
{
    
    
  ros::init(argc, argv, "node_1");//初始化ROS,并指定节点名称“node_1”,
  ros::NodeHandle n;//实例化节点
  ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);//消息队列为1000,也就是缓冲区,超过1000后,删除旧的
  ros::Rate loop_rate(10);//发布消息的频率10hz,每秒10次,与sleep来协作控制时间
  int count = 0;
  while (ros::ok())//按下ctrl-c后,ros::ok会返回false
  {
    
    
    std_msgs::String msg;
    std::stringstream ss;
    ss << "hello world " << count;
    msg.data = ss.str();
    ROS_INFO("%s", msg.data.c_str());
    chatter_pub.publish(msg);//开始发布
    ros::spinOnce();//如有订阅,则必须加,不然回调函数不起作用,spinOnce()会往下执行
    loop_rate.sleep();//控制时间
    ++count;
  }
  return 0;
}

订阅节点

#include "ros/ros.h"
#include "std_msgs/String.h"
void chatterCallback(const std_msgs::String::ConstPtr& msg)//回调函数,boost shared_ptr指针形式传输
{
    
    
  ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc, char **argv)
{
    
    
  ros::init(argc, argv, "node_2");
  ros::NodeHandle n;
  ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
  ros::spin();//ros::ok()返回false才会停止,停止之后往下执行,不然一直循环监听消息
  return 0;
}

在同一个CmakeList.txt中加入:

add_executable(node_1 src/main_test_1.cpp)
target_link_libraries(node_1 ${
    
    catkin_LIBRARIES})
add_dependencies(node_1 ${
    
    ${
    
    PROJECT_NAME}_EXPORTED_TARGETS} ${
    
    catkin_EXPORTED_TARGETS})

add_executable(node_2 src/main_test_2.cpp)
target_link_libraries(node_2 ${
    
    catkin_LIBRARIES})
add_dependencies(node_2 ${
    
    ${
    
    PROJECT_NAME}_EXPORTED_TARGETS} ${
    
    catkin_EXPORTED_TARGETS})

猜你喜欢

转载自blog.csdn.net/QLeelq/article/details/111060318