ros订阅话题python_ROS之话题的发布与订阅
消息:
msg文件就是一个描述ROS中所使用消息类型的简单文本。它们会被用来生成不同语言的源代码。
注意,在构建的时候,我们只需要"message_generation"。然而,在运行的时候,我们只需要"message_runtime"。
查看package.xml, 确保它包含以下两条语句:
message_generation
message_runtime
在 CMakeLists.txt文件中,利用find_packag函数,增加对message_generation的依赖:
catkin_package( … CATKIN_DEPENDS message_runtime … …)
add_message_files( FILES Num.msg)
generate_messages()
1、创建工作空间:
mkdir -p ~/ROS_Learning_ws/src
cd ~/ROS_Learning_ws/src
catkin_init_workspace#初始化工作空间
cd ~/ROS_Learning_ws
catkin_make#编译工作空间
source devel/setup.bash#将该工作空间加入环境变量
2创建功能包:
创建工作空间后,工作空间可以顺利通过编译,此时工作空间不存在功能包,即还没有功能实现。需要使用catkin_create_pkg创建功能包。
cd ~/ROS_Leraning/src
catkin_create_pkg learning_communication std_msgs roscpp rospy
catkin_create_pkg命令行格式:catkin_create_pkg [package_name] [depend1] [depend2] [depend3]。因此上述命令行中的std_msgs和roscpp分别为功能包ROS_Test1的依赖项。
std_msgs:包含了常见的消息类型,表示基本数据类型和其他基本的消息构造。
roscpp:表示该功能包通过c++实现ROS的各种功能。提供了一个客户端库,c++开发者可以调用接口迅速完成主题、服务等相关工作。
rospy:表示该功能包通过python实现ROS的各种功能。提供了一个客户端库,python开发者可以调用接口迅速完成主题、服务等相关工作。
此时执行以下命令可以查看功能包的依赖项。
rospack depends learning_communication #查看功能包依赖项
3、编译功能包:
返回到工作空间根目录:
cd ~/ROS_Learning
catkin_make
4、创建发布和订阅节点
在功能包下的src文件下,即learning_communication/src创建发布话题节点文件:talker.cpp 内容如下:
//该例程将发布chatter话题,消息类型String
#include
#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char **argv)
{
// ROS节点初始化
ros::init(argc, argv, "talker");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::String
ros::Publisher chatter_pub = n.advertise<:string>("chatter", 1000);
// 设置循环的频率
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
// 初始化std_msgs::String类型的消息
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();
// 按照循环频率延时
loop_rate.sleep();
++count;
}
return 0;
}
在功能包下的src文件下,即learning_communication/src创建订阅话题节点文件:listener.cpp 内容如下:
//该例程将订阅chatter话题,消息类型String
#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;
// 创建一个Subscriber,订阅名为chatter的topic,注册回调函数chatterCallback
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
// 循环等待回调函数
ros::spin();
return 0;
}
在一个功能包内可以同时发布可创建多个实例化节点句柄,创建多个发布函数,创建多个订阅回调函数。
5、创建CMake文件:
在learning_communication包根目录下找到CMakeLists.txt文件在文件结尾端添加如下:
add_executable(talker src/talker.cpp) #将talker.cpp文件编译成可执行文件talker
target_link_libraries(talker ${catkin_LIBRARIES}) #为可执行文件talker添加链接库
add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp) #添加可执行文件的消息依赖
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)
以上内容编辑完成以后,进行节点编译:
回到工作空间根目录进行编译:
cd ~/ROS_Learning
catkin_make
编译完成后运行
roscore
rosrun learning_communication talker #需开启新终端
rosrun learning_communication listener #需开启新终端
运行结果如下图:
补充:
ros::ok()返回false的条件:
1. SIGINT收到(Ctrl-C)信号
2. 另一个同名节点启动,会先中止之前的同名节点
3. ros::shutdown()被调用
4. 所有的ros::NodeHandles被销毁
spinOnce()与spin()区别:
spinOnce()与spin()是兄弟函数,学名叫做消息回调处理函数。区别如下:
spinOnce()函数调用后,会继续执行后续的代码段。例如talker中,执行该函数后会继续执行loop_rate.sleep()。
spin()调用后,程序不会返回,不会执行后续的代码段。例如listener中,执行该函数后,程序不会返回。
ros订阅话题python_ROS之话题的发布与订阅相关推荐
- redis订阅怎么退出_redis-消息的发布与订阅,高效实现原理详述
一.Redis 中的发布/订阅功能 发布/ 订阅系统 是 Web 系统中比较常用的一个功能.简单点说就是 发布者发布消息,订阅者接受消息,这有点类似于我们的报纸/ 杂志社之类的: (借用前边的一张图) ...
- StackExchange.Redis学习笔记(五) 发布和订阅
StackExchange.Redis学习笔记(五) 发布和订阅 原文:StackExchange.Redis学习笔记(五) 发布和订阅 Redis命令中的Pub/Sub Redis在 2.0之后的版 ...
- redis 发布和订阅 持久化 事务 缓存问题
redis的发布订阅 使用数据类型lists 原理 可以有多个消费者和订阅者 订阅者:subscribe cla 命令 执行成功后 subscribe :表示成功订阅到响应 第二个元素:提供的频道 第 ...
- Java实现Redis的发布和订阅
Redis上的操作: 打开两个窗口,打开redis客户端: 一个客户端:订阅(客户端订阅channel1频道):127.0.0.1:6379> subscribe channel1 另一个客户端 ...
- ros订阅话题python_ROS入门教程 (写一个简单的消息发布器和订阅器 (Python))
Note: This tutorial assumes that you have completed the previous tutorials: 创建ROS消息和ROS服务. Descripti ...
- ROS入门学习笔记|话题发布与订阅
文章目录 一.工作空间 1.创建一个名称为sor_ws的工作空间 2.编译工作空间 3.创建功能包 二.自定义话题消息 1.定义msg文件 2.配置package.xml和CMakeLists.txt ...
- 【一学就会的ROS基础入门教程 】03-1 ROS基础编程:ROS工作空间的创建、话题topic的发布与接收、以及话题消息的自定义使用
[一学就会的ROS基础入门教程 ]03-1 ROS基础编程:ROS工作空间的创建.话题topic的发布与接收.以及话题消息的自定义使用 文前白话 1.创建工作空间与功能包 关于工作空间的介绍 创建开发 ...
- ROS笔记(7) 话题通信
ROS笔记(7) 话题通信 1. 话题发布 2. 话题订阅 3. 话题通信 1. 话题发布 节点的话题发布: 初始化ROS节点 向ROS Master 注册节点信息 按照一定频率循环发布消息 使用py ...
- ROS学习(一)——话题通信的C++与Python实现
ROS学习(一)--话题通信的C++与Python实现 引言:本文分为三个部分,分别为话题通信的理论模型以及其C++与Python的实现代码. 一.理论模型 在我们的实际使用中,需要注意的几个东西就是 ...
最新文章
- MyEclipse极速优化
- java对象的访问定位_JVM创建对象及访问定位过程详解
- python中html.parser_在Python中使用HTMLParser解析HTML的教程
- JavaWeb笔记04-解决GET与POST乱码问题
- 最简单的6种防止数据重复提交的方法!(干货)
- realme GT Neo3重磅细节曝光:首发150W快充 5分钟充50%
- MFC_recvfrom
- 从1.6W名面试者中收集的Java面试题精选汇总(内附知识脑图)
- gson 设置多个别名SerializedName
- 给定一个数组,将所有的元素在一行里打印出来,中间以逗号分开
- [高数][高昆轮][高等数学上][第二章-导数与微分]05.函数的微分
- SqliteDeveloper使用方法及注册
- 怎样设置路由器禁用其他设备
- item的介绍与使用-2.0
- 优化 WordPress 网站让百度快速收录
- SpringBoot 教程核心功能-Web 开发(请求处理)
- 一个人的精神结构和他的精神资源
- 渠道面前,SaaS露出“素颜”
- 上班拍抖音需谨慎!Tiktok「科技网红」因自拍泄密被苹果解雇
- 华为 组播之IGMPv1
热门文章
- 15 EXCEL仪表盘创建2
- 2022年全球与中国数模转换器市场现状及未来发展趋势
- 计算机进行科学实验报告,计算机组成原理实验报告5- PC实验
- oracle10安装注意事项,科学网—Asianux server 3.0下安装oracle 10.2注意事项 - 谢安涛的博文...
- Python接口自动化测试框架(练习篇)-- 数据类型及控制流程(一)
- css 背景效果_前端教程 :20个CSS的常用套路附demo的效果实现与源码
- vue全家桶学习笔记
- 6GK5116-0BA00-2AB2的技术参数说明
- 上兵伐谋,其次伐交,其次伐兵,其下攻城
- 山艺2021年高考成绩查询,2021年山东艺术学院高考录取结果什么时候出来及查询系统入口...