消息:

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之话题的发布与订阅相关推荐

  1. redis订阅怎么退出_redis-消息的发布与订阅,高效实现原理详述

    一.Redis 中的发布/订阅功能 发布/ 订阅系统 是 Web 系统中比较常用的一个功能.简单点说就是 发布者发布消息,订阅者接受消息,这有点类似于我们的报纸/ 杂志社之类的: (借用前边的一张图) ...

  2. StackExchange.Redis学习笔记(五) 发布和订阅

    StackExchange.Redis学习笔记(五) 发布和订阅 原文:StackExchange.Redis学习笔记(五) 发布和订阅 Redis命令中的Pub/Sub Redis在 2.0之后的版 ...

  3. redis 发布和订阅 持久化 事务 缓存问题

    redis的发布订阅 使用数据类型lists 原理 可以有多个消费者和订阅者 订阅者:subscribe cla 命令 执行成功后 subscribe :表示成功订阅到响应 第二个元素:提供的频道 第 ...

  4. Java实现Redis的发布和订阅

    Redis上的操作: 打开两个窗口,打开redis客户端: 一个客户端:订阅(客户端订阅channel1频道):127.0.0.1:6379> subscribe channel1 另一个客户端 ...

  5. ros订阅话题python_ROS入门教程 (写一个简单的消息发布器和订阅器 (Python))

    Note: This tutorial assumes that you have completed the previous tutorials: 创建ROS消息和ROS服务. Descripti ...

  6. ROS入门学习笔记|话题发布与订阅

    文章目录 一.工作空间 1.创建一个名称为sor_ws的工作空间 2.编译工作空间 3.创建功能包 二.自定义话题消息 1.定义msg文件 2.配置package.xml和CMakeLists.txt ...

  7. 【一学就会的ROS基础入门教程 】03-1 ROS基础编程:ROS工作空间的创建、话题topic的发布与接收、以及话题消息的自定义使用

    [一学就会的ROS基础入门教程 ]03-1 ROS基础编程:ROS工作空间的创建.话题topic的发布与接收.以及话题消息的自定义使用 文前白话 1.创建工作空间与功能包 关于工作空间的介绍 创建开发 ...

  8. ROS笔记(7) 话题通信

    ROS笔记(7) 话题通信 1. 话题发布 2. 话题订阅 3. 话题通信 1. 话题发布 节点的话题发布: 初始化ROS节点 向ROS Master 注册节点信息 按照一定频率循环发布消息 使用py ...

  9. ROS学习(一)——话题通信的C++与Python实现

    ROS学习(一)--话题通信的C++与Python实现 引言:本文分为三个部分,分别为话题通信的理论模型以及其C++与Python的实现代码. 一.理论模型 在我们的实际使用中,需要注意的几个东西就是 ...

最新文章

  1. MyEclipse极速优化
  2. java对象的访问定位_JVM创建对象及访问定位过程详解
  3. python中html.parser_在Python中使用HTMLParser解析HTML的教程
  4. JavaWeb笔记04-解决GET与POST乱码问题
  5. 最简单的6种防止数据重复提交的方法!(干货)
  6. realme GT Neo3重磅细节曝光:首发150W快充 5分钟充50%
  7. MFC_recvfrom
  8. 从1.6W名面试者中收集的Java面试题精选汇总(内附知识脑图)
  9. gson 设置多个别名SerializedName
  10. 给定一个数组,将所有的元素在一行里打印出来,中间以逗号分开
  11. [高数][高昆轮][高等数学上][第二章-导数与微分]05.函数的微分
  12. SqliteDeveloper使用方法及注册
  13. 怎样设置路由器禁用其他设备
  14. item的介绍与使用-2.0
  15. 优化 WordPress 网站让百度快速收录
  16. SpringBoot 教程核心功能-Web 开发(请求处理)
  17. 一个人的精神结构和他的精神资源
  18. 渠道面前,SaaS露出“素颜”
  19. 上班拍抖音需谨慎!Tiktok「科技网红」因自拍泄密被苹果解雇
  20. 华为 组播之IGMPv1

热门文章

  1. 15 EXCEL仪表盘创建2
  2. 2022年全球与中国数模转换器市场现状及未来发展趋势
  3. 计算机进行科学实验报告,计算机组成原理实验报告5- PC实验
  4. oracle10安装注意事项,科学网—Asianux server 3.0下安装oracle 10.2注意事项 - 谢安涛的博文...
  5. Python接口自动化测试框架(练习篇)-- 数据类型及控制流程(一)
  6. css 背景效果_前端教程 :20个CSS的常用套路附demo的效果实现与源码
  7. vue全家桶学习笔记
  8. 6GK5116-0BA00-2AB2的技术参数说明
  9. 上兵伐谋,其次伐交,其次伐兵,其下攻城
  10. 山艺2021年高考成绩查询,2021年山东艺术学院高考录取结果什么时候出来及查询系统入口...