ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

创建简单的发布者和订阅者

2021-11-11 22:03:06  阅读:192  来源: 互联网

标签:std 订阅 ROS msgs 创建 talker 发布者 ros 节点


创建发布者和订阅者

发布者

  • 切换到软件包src目录,创建一个发布节点
roscd <package_name>
cd src
touch talker.cpp
  • 发布节点talker.cpp的内容如下
#include <ros/ros.h> // 导入ROS系统包含核心公共文件
#include <std_msgs/String.h> // 导入std_msgs/String消息头文件,这个由std_msgs包的string.msg自动生成

#include <sstream>

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

  ros::init(argc, argv, "talker"); // ROS节点初始化,指定节点名称为"talker",节点名称要保持唯一性


  ros::NodeHandle n; // 创建节点句柄


  ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
  // 创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::String,队列长度10 

  ros::Rate loop_rate(10); // 指定发布消息的频率

  int count = 0;
  while (ros::ok()) // 检查节点是否应继续运行,当接收到SIGINT(Ctrl+C)或者 ros::shutdown() 被调用时返回false
  {

    std_msgs::String msg; // 初始化std_msgs::String msg类型的消息

    std::stringstream ss; // 初始化std::stringstream类型的消息
    ss << "hello world " << count; // 定义字符串流"hello world"并赋给ss
    msg.data = ss.str(); // 最后转换为字符串赋值给 msg.data

    ROS_INFO("%s", msg.data.c_str()); // 输出调试信息


    chatter_pub.publish(msg); // 发布消息

    ros::spinOnce(); // 处理传入消息的回调函, 不是必需要的,但是保持增加这个调用,是好习惯

    loop_rate.sleep(); // 按照循环频率延时
    ++count;
  }

  return 0;
}

总结

  • 初始化ROS系统

  • 向ROSMaster注册节点信息,包括发布的话题名和话题中的消息类型

  • 创建消息数据

  • 按照一定的频率循环发布消息

订阅者

  • 同样
roscd <package_name>
cd src
touch listener.cpp
  • 订阅节点listener.cpp的内容如下
#include <ros/ros.h> // 导入ROS系统包含核心公共头文件
#include <std_msgs/String.h> // 导入std_msgs/String消息头文件,这个是由std_msgs包的string.msg文件自动生成

// 接收到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节点

  ros::NodeHandle n; // 创建节点句柄


  ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
  // 创建一个Subscriber,订阅名为chatter的topic,指定回调函数chatterCallback


  ros::spin(); // 启动自循环,等待回调函数

  return 0;
}

总结

  • 初始化ROS节点
  • 订阅需要的话题
  • 循环等待话题消息,接收到信息后进入回调函数
  • 在回调函数中完成消息处理

修改CMakeList.txt

  • find_package依赖项
# 将message_generation加在括号闭合前
find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)
  • 调用生成的消息
generate_messages(
  DEPENDENCIES
  std_msgs
)
  • 设置生成可执行文件和链接库(添加到CMakeLists.txt文件的底部)
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})

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

标签:std,订阅,ROS,msgs,创建,talker,发布者,ros,节点
来源: https://www.cnblogs.com/TNTksals/p/15542103.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有