ROS机器人学习历程三:Publisher 和Subscriber
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相关推荐
- 小白学习ROS(3)创建Publisher和Subscriber节点
创建Publisher和Subscriber节点进行通讯 1.前言 在创建Publisher和Subscriber节点之前,先给介绍一个创建ROS包以及程序编写非常方便的一个ide,真的特别方便,尤其 ...
- 【ros】初学ROS的学习笔记——创建Publisher
发布者Publisher的创建 本文代码为c++,系统为ubuntu20.04 前言 依据材料:古月ros入门21讲 . ROS机器人开发实践 要求:已有合适的工作空间 文章目录 发布者Publish ...
- ROS机器人学习——麦克纳姆轮运动学解算
麦克纳姆轮运动学解算 一.麦克纳姆轮介绍 了解过Robomaster的同学都知道,RM战车所用的轮子均为麦克纳姆轮,这种轮子安装方式与普通轮子无异,可安装于平行轴上,但是麦克纳姆轮可以实现全向移动,即 ...
- 【机器人学习】三自由度康复机器人运动学分析()
具体内容如下: 下载链接 带matlab代码+solidworks模型 1.三自由度康复机器人运动学分析 ( 用q1代替,其他类似) Nx=cos(q3)*(cos(q1)*cos(q2) - sin ...
- ROS的学习(三)创建一个工作空间
在官网上本节的题目是Creating a workspace for catkin,其中的catkin不知道是什么意思,在网上找到的结果是:(1)卡婷是一个广告公司,(2)葇荑花.这两种翻译显然都不太 ...
- [Python 高德地图] API调用学习历程(三)
[三]基于网页/URL的地图点标记 单点标记 #基于网页单点位置标注 def heml_map(loaction: str):url_a = 'https://m.amap.com/navi/?des ...
- 【机器人学习】三自由机器人正逆运动学分析+matlab代码+直线轨迹与圆轨迹
下载链接:https://download.csdn.net/download/yjw0911/85111527 clc clear all close all M=300;l=150;L=50; t ...
- NRF52840学习历程(三)串口中断
时间在2021年1月26日,寒假放假在家好好学一学 开发板:初雪的100出头那块 NRF52840 EVAL KIT 下载工具:JINLK V11(最好是JLINK V9以上 也有人用JLINK OB ...
- ROS1学习笔记:话题中的Publisher与Subscriber(ubuntu20.04)
参考B站古月居ROS入门21讲: 发布者Publisher的编程实现 订阅者Subscriber的编程实现 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录 一.乌龟例程中 ...
- ROS中的roslaunch命令和launch文件(ROS入门学习笔记四)
ROS中的基本对象和概念学习笔记(ROS入门学习笔记一) ROS中创建工作区和包(ROS入门学习笔记二) ROS功能包中CMakeLists.txt的说明(ROS入门学习笔记三) 1.roslaunc ...
最新文章
- java web应用解决乱码问题
- Android seLinux 设置
- 大牛是怎么思考设计MySQL优化方案
- LGB 的 .feature_importance() 函数
- Java04-day04【IDEA(概述、启动配置、项目结构、内容辅助键、快捷键、模块操作)、数组(定义详解、动态初始化、访问)、内存分配、数组内存图】
- JS以及CSS对页面的阻塞
- linux备份文件命令tar.gz,Linux系统tar命令备份数据
- 大牛讲解Kubernetes实战
- 解决 Flex模块切换后导致对象转换失败 注册信息丢失
- python手动绘图案例_python绘图案例——递归绘制分形树
- 我只注视你全cg存档_科幻国漫持续推出,全CG动画星骸骑士首播,这一次吞噬星空输了...
- c语言一维数组程序题,C语言程序设计 练习题参考答案 第四章 一维数组
- 聊聊苹果电脑上不错的三维建模软件
- 导入项目时遇到的plugin with id com.android.application not found问题解决方案
- adobe photoshop cs4 注册码
- 7-55 查询水果价格
- 终于把Edison板子上线了
- CSS3---移动端苹果安卓适配
- 周纪一 威烈王二十三年(戊寅、前403)——摘要
- python调研报告总结体会_调查报告的心得体会
热门文章
- 电子设计教程4:稳压管稳压电路
- CyanogenMod 和 Cyanogen OS 对比
- 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?
- [VOA美国人物] Jackie Robinson: The First Black Player in Modern Major League
- 局域网即时通讯软件_企业即时通讯软件需要符合哪些要求?
- 使用kmean进行图像分割 使用CRFs进行分割后处理
- android rn框架开发的例子,RN与安卓通信架构篇
- 你知道腾讯程序员一年写多少代码嘛?
- EMBA必看书籍推荐
- unbalanced calls to begin/end appearance transitions for uiviewcontroller的解决方法