ROS通信机制(一)--话题通信基本操作
话题通信
话题通信是基于发布订阅模式的,即一个节点发布消息,另一个节点订阅该消息。
流程:编写发布方实现–编写订阅方实现–(用python实现时,为python文件编写可执行权限)–编写配置文件–编译执行
要求:编写发布订阅实现,要求发布以10Hz(每秒10次)的频率发布文本,订阅方订阅消息并将消息内容打印输出。
前期准备工作:创建一个ROS功能包–vscode中编译ros(修改.vscode/tasks.json 文件)
src目录下创建ros功能包、设置包名、添加依赖
话题发布
- C++实现
–>在ros功能包下的src目录新建demo01_pub.cpp文件(必要时修改 .vscode/c_cpp_properties.json文件)
发布者C++代码如下:
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
/*发布方实现:1.包含头文件ROS中文本类型 -->std_msgs/String.h2.初始化ros节点3.创建节点句柄;4.创建发布者对象5.编写发布逻辑并发布数据
*/
int main(int argc, char *argv[])
{setlocale(LC_ALL,""); //防止中文乱码//初始化ROS节点;ros::init(argc,argv,"ergouzi");//创建节点句柄;ros::NodeHandle nh;//创建发布者对象;ros::Publisher pub = nh.advertise<std_msgs::String>("fang",10);//编写发布逻辑并发布数据//要求以 10Hz 的频率发布数据,并且文本后添加编号//先创建被发布的消息std_msgs::String msg;//发布频率ros::Rate rate(10);//设置编号int count = 0;//编写循环,循环中发布数据while (ros::ok()){count++;//实现字符串拼接数字std::stringstream ss;ss << "hello --> " << count;//msg.data = "hello";msg.data = ss.str();pub.publish(msg);//添加日志;ROS_INFO("发布的数据是:%s",ss.str().c_str());rate.sleep();}return 0;
}
修改Cmakelist.txt文件并编译执行
执行:启动roscore
rosrun plumbing_pub_sub demo01_pub
发布话题完毕
- Python实现
#!/usr/bin/env python
# -*- coding: UTF-8 -*-#导包
import rospy
from std_msgs.msg import Stringif __name__ == "__main__":#初始化ROS节点 rospy.init_node("sandai") #创建发布对象pub = rospy.Publisher("che",String,queue_size=10)#4.组织被发布的数据,并编写逻辑发布数据 msg = String()rate = rospy.Rate(10)count = 0while not rospy.is_shutdown():count += 1msg.data = "hello" + str(count)pub.publish(msg)rospy.loginfo(msg.data)rate.sleep()
话题订阅
- C++实现
–>在ros功能包下的src目录新建demo02_sub.cpp文件(必要时修改 .vscode/c_cpp_properties.json文件)
订阅者C++代码如下:
#include "ros/ros.h"
#include "std_msgs/String.h"
/*发布方实现:1.包含头文件ROS中文本类型 -->std_msgs/String.h2.初始化ros节点3.创建节点句柄;4.创建订阅者对象5.处理订阅的数据6.声明一个spin()函数
*/
void doMsg(const std_msgs::String::ConstPtr &msg){//通过msg获取并操作订阅到的数据ROS_INFO("翠花订阅到的数据:%s",msg->data.c_str());
}
int main(int argc, char *argv[])
{setlocale(LC_ALL,"");//初始化ros节点ros::init(argc,argv,"cuihua");//创建节点句柄;ros::NodeHandle nh;//创建订阅者对象ros::Subscriber sub = nh.subscribe("fang",10,doMsg); //处理订阅的数据ros::spin();return 0;
}
配置CMakeList.txt文件
执行:启动roscore
rosrun plumbing_pub_sub demo02_sub
话题订阅发布结果如下:
- Python实现
- 1.在scripts目录下新建demo02_sub_p.py
#! /usr/bin/env python
# -*- coding: UTF-8 -*-#1.导包
import rospy
from std_msgs.msg import String
def doMsg(msg):rospy.loginfo("I heard:%s",msg.data)if __name__ == "__main__":#2.初始化 ROS 节点:命名(唯一)rospy.init_node("huahua")#3.实例化订阅者对象sub = rospy.Subscriber("che",String,doMsg,queue_size=10)#4.处理订阅的消息(回调函数)#5.设置循环调用回调函数rospy.spin()
- 2.为python代码添加可执行权限
chmod +x *.py
ll
- 3.编译执行
启动roscore
启动发布节点:
source ./devel/setup.bash
rosrun plumbing_pub_sub demo01_pub_p.py
启动订阅节点:
source ./devel/setup.bash
rosrun plumbing_pub_sub demo02_sub_p.py
注:订阅者不能完全订阅发布者消息,解决办法:对发布代码加一行:rospy.sleep(3),休眠3秒钟
ROS通信机制(一)--话题通信基本操作相关推荐
- ROS通信机制一---话题通信
文章目录 总述 1. 话题通信模型 2. 话题通信基本实现示例 2.1 发布者 2.1.1 创建发布者topic_pub.cpp文件 2.1.2 修改CMakeLists.txt文件 2.1.3 编译 ...
- ROS通信机制:话题、服务、参数
目录 话题通信 理论模型 流程 通信样例 自定义消息的通信 服务通信 理论模型 服务通信自定义srv 参数服务器 理论模型 参数操作 话题通信 话题通信是ROS中使用频率最高的一种通信模式,话题通信是 ...
- ROS通信机制(一) —— 话题(topic)与msg文件
文章目录 简述 特点 相关常用命令 通信模型 核心元素 通信过程 代码示例(发布者和订阅者) 发布者(talker.cpp) 订阅者(listener.cpp) 配置 CMakeLists.txt 编 ...
- 3.ROS编程学习:话题通信python
目录 1.建立scripts文件夹与python文件 2.发布者实现 3.订阅者实现 4.CMakeList.txt配置 5.添加可执行权限 6.运行roscore+rosrun 7.计算图 8.注意 ...
- ROS 通信机制(已整理)
文章目录 节点与节点管理器 ROS通信机制 1. 话题通信 1.1 基本话题通信 1.1.1 C++实现 发布方 demo01_pub.cpp 订阅方 demo01_sub.cpp 1.1.2 Pyt ...
- ROS通信机制--键盘控制乌龟运动线速度角速度XYZ值的解释
目录 前言 案例实现 线速度角速度X.Y.Z值的取值和作用 (END) 前言 在学习ros之初,想必大家运行的第一个案例就是键盘控制乌龟运动.这是ros内置的小案例,采用的通信机制为话题通信.本文介绍 ...
- 【ROS入门-4】嘴对嘴讲解ROS的核心概念——ROS话题通信机制
文章目录 前言 ROS系列文章 ROS的通信机制 话题(topic) 发布者 订阅者 消息(Message) 用C++来写话题通信的代码 发布者 订阅者 使用rqt_graph 源码附录 引用说明 参 ...
- ROS话题通信c++和python实现
机器人是一种高度复杂的系统性实现,在机器人上可能集成各种传感器(雷达.摄像头.GPS...)以及运动控制实现,为了解耦合,在ROS中每一个功能点都是一个单独的进程,每一个进程都是独立运行的.更确切的讲 ...
- Chapter2 ROS通信机制----基础篇(Ⅰ)vs配置及通信基础
目录 一.复习及launch 1.1 深入理解配置信息(非常重要) 1.2 launch文件演示 二.ROS通信机制-----基础 2.1 本节导论 2.2 话题通信 2.2.1 话题通信概述 2.2 ...
- ROS自主导航学习———ROS通信机制
前言 前面ROS很多都忘记了 ,现在来重新回顾一下内容 ROS 中的基本通信机制主要有如下三种实现策略: 话题通信(发布订阅模式) 服务通信(请求响应模式) 参数服务器(参数共享模式) Action通 ...
最新文章
- datatable对两个csv的join操作
- Hive注册表那点事(5.0 VS 6.0)
- 实现线段切割法_漫画:如何实现抢红包算法?
- Java 12:使用开关表达式进行映射
- 【Python爬虫】Scrapy爬虫框架
- redis logfile 只读_docker 配置redis主从,哨兵sentinel
- linux驱动编写(dma驱动)
- js判断数组中重复元素并找出_javascript查找数组中重复元素的方法
- Tomcat加载类机制 - 我们到底能走多远系列(14)
- Turnserver服务器搭建
- 【iOS】使用 otool 命令查看 App 所使用的动态库
- SQL Server2012版完全卸载
- 基于SpringBoot实现在线抽奖系统
- mac下用ImageOptim压缩png图片
- html5图片高斯模糊,CSS实现图片高斯模糊但边界清楚的效果
- 河南省软件测试竞赛证书,河南省大学生国家安全知识竞赛
- Google Dapper,大规模分布式系统的跟踪系统
- Linux Qt cannot find -lGL
- (附超声射频数据)matlab实现b超原始信号数据生成图像
- 北美哪些跨境电商平台十大排行榜