ROS基础二:Publisher 和Subscriber

  • 知识点回顾
  • 1. 话题中的Publisher 与Subscriber
    • 1.1 Publisher 发布者
    • 1.2 Subscriber 订阅者
  • 2. 编译功能包
  • 3.运行Publisher和Subscriber
    • 3.1 启动roscore
    • 3.2 启动Publisher
    • 3.3 启动Subscriber

知识点回顾

创建工作空间:
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
$ cd ~/catkin_ws
$ catkin_make
$ echo “source /catkin_ws/devel/setup.bash” >> ~/.bashrc
创建功能包:
$ catkin_create_pkg first_pkg std_msgs roscpp rospy
$ cd ~/catkin_ws
$ catkin_make

内容 详读 细阅 浏览 必看 问题 必记 补充
字体 黑色 蓝色 橙色 红色 棕色 绿色 紫色

1. 话题中的Publisher 与Subscriber

Publisher(发布者)和Subscriber(订阅者)是ROS系统中最基本、最常用的通信方式。Publisher 的主要作用是针对指定话题发布特定数据类型的消息,而Subscriber 是用来订阅(接收)Publisher 发布来的消息。

1.1 Publisher 发布者

gedit 或vim 或使用RoboWare 创建first_pkg/src/talker.cpp:

#include <sstream>                         //C语言头文件
#include "ros/ros.h"                      //ROS头文件
#include "std_msgs/String.h"              //字符String类型消息文件int main(int argc, char **argv)
{//ROS节点初始化,初始化外部argc,argv参数和本程序ros::init(argc, argv, "talker");//创建节点句柄,便于节点管理器ROS Master管理ros::NodeHandle n;//创建一个Publisher,发布名为chatter的话题,消息类型为std_msgs::String//消息发布队列为1000,即最大存留消息数。ros::Publisher chatter_pub = n.advertise<std_msg::String>("chatter", 1000);//设置循环的频率。不停向外发布消息,需要Rate::sleep()时//ROS节点会根据此处设置的频率休眠相同时间,以保证循环维持一致的时间周期ros::Rate loop_rate(10);int count = 0;//进入主循环,若节点正常则一直循环,否则返回flasewhile (ros::ok()):{//初始化std_msgs::String消息std_msgs::String msg;                    //创建消息msgstd::stringstream ss;                  //创建信息流ssss << "hello world" << count;            //循化赋值到ssmsg.data = ss.str();                  //把消息值转为字符串存储进msg的data成员中//发布消息ROS_INFO("%s", msg.data.c_str());      //INFO是ROS的打印函数,c_str()解码用于打印显示//循环等待回调函数,等待Subscriber的订阅ros::spinOnce();                     //用来处理节点订阅话题的所有回调函数//延时loop_rate.sleep();++count;}return 0;
}

1.2 Subscriber 订阅者

创建first_pkg/src/talker.cpp:

#include "ros/ros.h"
#include "std_msgs/String.h"//接收到订阅的消息时,进入消息回调函数,将消息打印出来,返回的是字符常数
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{//打印接收到的消息ROS_INFO("I heard: [%s]", msg -> data.c_str());
}int main(int argc, char **argv)
{//初始化ROS节点ros::init(argc, argv, "listener");//创建节点句柄ros::NodeHandle n;//创建Subscript,订阅名为chatter的话题,在ROS Master中注册,chatter话题上有消息被发布,则进入回调函数chatterCallbackros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);//循环等待回调函数ros::spin();return 0;
}

在敲代码时,建议先敲打入ros的头文件,然后打主函数,进入逻辑思考敲打中,需要引入std_msg的文件时,再去补充。同样需要回调函数时在返回上面补充。

2. 编译功能包

之所以这一步独立为一大节,是为了强调用C++等编译语言,编写实现publisher和subscrber功能的,才需要看,而用Python等解析语言编写的可省去看此步骤(是的,有时间补充Python)。

打开first_pkg/CMakeLIst.txt 设置编译规则,找到以下配置项,去掉注释并修改为如下:

include_directories(include $(catkin_INCLUDE_DIRS))add_executable(talker src/talker.cpp)
add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)
target_link_libraries(talker ${catkin_LIBARIES})add_executable(listener src/listener.cpp)
add_dependencies(listener ${PROJECT_NAME}_generate_messages_cpp)
target_link_libraries(listener ${catkin_LIBARIES})

其他的内容先不要改变,保存后编译:

cd ~catkin_ws
catkin_make

现在我们理解一下这四种配置项:
(1)include_directories
设置头文件的相对路径,全局路径默认是功能包所在目录,功能包根目录下include文件夹下(catkin_INCLUDE_DIRS).
(2)add_execlude
设置需要编译的代码和生成的可执行文件。有多个源代码文件(cpp)时,用空格分隔。
(3)add_dependencies
设置依赖。${PROJECT_NAME}_generate_messages_cpp 为动态产生的消息代码的依赖。

3.运行Publisher和Subscriber

3.1 启动roscore

在运行ROS节定之前,确保ROS Master已经成功启动:

$ roscore

3.2 启动Publisher

$ rosrun first_pkg talker

图3-1 Publisher 节点启动成功后的日志信息:
“Ctrl”+"c"键可中断,先别中断,Subscriber需要接收。

3.3 启动Subscriber

$ rosrun first_pkg listener

图3-2 Subscriber节点启动成功后的日志信息(右终端):

现在可以中断了。

未完,待续!!

上一篇:ROS基础一

ROS机器人学习历程系列:
一:了解与安装
二:ROS基础一

ROS机器人学习历程三:Publisher 和Subscriber相关推荐

  1. 小白学习ROS(3)创建Publisher和Subscriber节点

    创建Publisher和Subscriber节点进行通讯 1.前言 在创建Publisher和Subscriber节点之前,先给介绍一个创建ROS包以及程序编写非常方便的一个ide,真的特别方便,尤其 ...

  2. 【ros】初学ROS的学习笔记——创建Publisher

    发布者Publisher的创建 本文代码为c++,系统为ubuntu20.04 前言 依据材料:古月ros入门21讲 . ROS机器人开发实践 要求:已有合适的工作空间 文章目录 发布者Publish ...

  3. ROS机器人学习——麦克纳姆轮运动学解算

    麦克纳姆轮运动学解算 一.麦克纳姆轮介绍 了解过Robomaster的同学都知道,RM战车所用的轮子均为麦克纳姆轮,这种轮子安装方式与普通轮子无异,可安装于平行轴上,但是麦克纳姆轮可以实现全向移动,即 ...

  4. 【机器人学习】三自由度康复机器人运动学分析()

    具体内容如下: 下载链接 带matlab代码+solidworks模型 1.三自由度康复机器人运动学分析 ( 用q1代替,其他类似) Nx=cos(q3)*(cos(q1)*cos(q2) - sin ...

  5. ROS的学习(三)创建一个工作空间

    在官网上本节的题目是Creating a workspace for catkin,其中的catkin不知道是什么意思,在网上找到的结果是:(1)卡婷是一个广告公司,(2)葇荑花.这两种翻译显然都不太 ...

  6. [Python 高德地图] API调用学习历程(三)

    [三]基于网页/URL的地图点标记 单点标记 #基于网页单点位置标注 def heml_map(loaction: str):url_a = 'https://m.amap.com/navi/?des ...

  7. 【机器人学习】三自由机器人正逆运动学分析+matlab代码+直线轨迹与圆轨迹

    下载链接:https://download.csdn.net/download/yjw0911/85111527 clc clear all close all M=300;l=150;L=50; t ...

  8. NRF52840学习历程(三)串口中断

    时间在2021年1月26日,寒假放假在家好好学一学 开发板:初雪的100出头那块 NRF52840 EVAL KIT 下载工具:JINLK V11(最好是JLINK V9以上 也有人用JLINK OB ...

  9. ROS1学习笔记:话题中的Publisher与Subscriber(ubuntu20.04)

    参考B站古月居ROS入门21讲: 发布者Publisher的编程实现 订阅者Subscriber的编程实现 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录 一.乌龟例程中 ...

  10. ROS中的roslaunch命令和launch文件(ROS入门学习笔记四)

    ROS中的基本对象和概念学习笔记(ROS入门学习笔记一) ROS中创建工作区和包(ROS入门学习笔记二) ROS功能包中CMakeLists.txt的说明(ROS入门学习笔记三) 1.roslaunc ...

最新文章

  1. java web应用解决乱码问题
  2. Android seLinux 设置
  3. 大牛是怎么思考设计MySQL优化方案
  4. LGB 的 .feature_importance() 函数
  5. Java04-day04【IDEA(概述、启动配置、项目结构、内容辅助键、快捷键、模块操作)、数组(定义详解、动态初始化、访问)、内存分配、数组内存图】
  6. JS以及CSS对页面的阻塞
  7. linux备份文件命令tar.gz,Linux系统tar命令备份数据
  8. 大牛讲解Kubernetes实战
  9. 解决 Flex模块切换后导致对象转换失败 注册信息丢失
  10. python手动绘图案例_python绘图案例——递归绘制分形树
  11. 我只注视你全cg存档_科幻国漫持续推出,全CG动画星骸骑士首播,这一次吞噬星空输了...
  12. c语言一维数组程序题,C语言程序设计 练习题参考答案 第四章 一维数组
  13. 聊聊苹果电脑上不错的三维建模软件
  14. 导入项目时遇到的plugin with id com.android.application not found问题解决方案
  15. adobe photoshop cs4 注册码
  16. 7-55 查询水果价格
  17. 终于把Edison板子上线了
  18. CSS3---移动端苹果安卓适配
  19. 周纪一 威烈王二十三年(戊寅、前403)——摘要
  20. python调研报告总结体会_调查报告的心得体会

热门文章

  1. 电子设计教程4:稳压管稳压电路
  2. CyanogenMod 和 Cyanogen OS 对比
  3. 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?
  4. [VOA美国人物] Jackie Robinson: The First Black Player in Modern Major League
  5. 局域网即时通讯软件_企业即时通讯软件需要符合哪些要求?
  6. 使用kmean进行图像分割 使用CRFs进行分割后处理
  7. android rn框架开发的例子,RN与安卓通信架构篇
  8. 你知道腾讯程序员一年写多少代码嘛?
  9. EMBA必看书籍推荐
  10. unbalanced calls to begin/end appearance transitions for uiviewcontroller的解决方法