1、说明

编写完ROS的hello world程序后,基本可以了解ROS的功能包开发的流程,现在再编写一个节点通信的测试代码,使用 topic 模式,即发布-订阅者模式,且传递的消息是自定义类型

上代码

2、创建工作空间

该例不再创建新的工作空间,和hello world示例共用一个

3、创建功能包

cd src
catkin_create_pkg test_topic message_generation std_msgs roscpp

这里在创建功能包的时候,顺带把需要依赖的库也加进去了,好处就是,会默认把依赖库添加到 CMakeLists.txt 和 package.xml 中,而在 hello world 例子中,是手动添加的

message_generation 会根据自定义类型的描述文件生成代码

std_msgs 是ROS的字符串类

这个功能包的名称就是 test_topic

4、编写自定义传输类型文件

cd test_topic
mkdir msg && cd msg
touch MessageDefine.msg

编辑 MessageDefine.msg 文件,内容如下:

time stamp
int32 data
string speak

这里有三种类型,time 会生成ROS的Time类,这里不做详细说明

5、编写源代码

cd ../src

依照惯例,代码还是放在src目录下

5.1、编写发布者代码

新增文件 test_publisher.cpp,代码如下:

#include <ros/ros.h>
#include <test_topic/MessageDefine.h> int main(int argc, char **argv)
{
//初始化发布者节点名称
ros::init(argc, argv, "topic_publisher");
//声明节点句柄与ROS系统进行通讯
ros::NodeHandle nh;
//声明发布者,创建一个使用test_topic功能包MessageDefine消息文件的发布者
//ros_tutorial_pub,话题名称是ros_message,消息发布者队列设置为100,如果消息发送太快,缓冲区的消息大于100,则会丢弃队列头
ros::Publisher ros_tutorial_pub = nh.advertise<test_topic::MessageDefine>("ros_message", 100);
//设定循环周期0.25HZ,4秒,需要配合sleep方法使用
ros::Rate loop_rate(0.25);
test_topic::MessageDefine msg; //声明一个消息
int count = 0;
std::stringstream talk;
while (ros::ok())
{
//给MessageDefine.msg文件中的消息变量赋值
msg.stamp = ros::Time::now();
msg.data = count;
msg.speak = "hello world, number: " + std::to_string(count);
ROS_INFO("send stamp second = %d", msg.stamp.sec); //显示消息
ROS_INFO("send data = %d", msg.data);
ROS_INFO("%s", msg.speak.c_str());
ros_tutorial_pub.publish(msg); //发布显示的消息
ros::spinOnce(); //循环等待订阅节点的所有回调函数
loop_rate.sleep(); //按设定值循环
++count;
}
return 0;
}

这里的 ros_message 是topic名称

5.2、编写订阅者代码

ros_message新增 test_subscriber.cpp,代码如下:

#include <ros/ros.h>
#include <test_topic/MessageDefine.h> //回调函数
void messageCallback(const test_topic::MessageDefine::ConstPtr &msg)
{
ROS_INFO("recieve stamp second = %d", msg->stamp.sec);
ROS_INFO("recieve data = %d", msg->data);
ROS_INFO("receive str:[%s]", msg->speak.c_str());
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "topic_subscriber"); //初始化订阅者节点
ros::NodeHandle nh;
//声明订阅者,创建一个使用test_topic功能包MessageDefine消息文件的订阅者
//ros_tutorial_sub,订阅的话题名称是ros_message,消息接收者队列设置为100,如果消息处理太慢,缓冲区的消息数量大于100,则丢弃队列头部的消息
ros::Subscriber ros_tutorial_sub = nh.subscribe<test_topic::MessageDefine>("ros_message", 100, messageCallback);
ros::spin(); //调用后台,等待接收消息
return 0;
}

ros::spin() 让程序进入自循环的挂起状态,让程序以最好的效率接收并执行回调

当有消息达到 ros_message 时,执行一次回调函数

6、编译

修改编译配置

因为创建功能包的时候,显示地指定了依赖,这些依赖会自动写进 CMakeLists.txt 和 package.xml 文件中,CMakeLists.txt 需要简单修改,package.xml文件无需改动

CMakeLists.txt 文件如下

cmake_minimum_required(VERSION 3.0.2)
project(test_topic) add_compile_options(-std=c++11) #依赖库,创建包的时候添加了依赖,这里自动生成
find_package(catkin REQUIRED COMPONENTS
message_generation
roscpp
std_msgs
) #添加自定义类型文件,这里自动生成的代码中注释说在msg文件夹下
## Generate messages in the 'msg' folder
add_message_files(
FILES
MessageDefine.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
catkin_package(
LIBRARIES test_topic
CATKIN_DEPENDS roscpp std_msgs
) include_directories(
${catkin_INCLUDE_DIRS}
) #以下内容需要手动添加修改
add_executable(${PROJECT_NAME}_publisher_node src/test_publisher.cpp)
target_link_libraries(${PROJECT_NAME}_publisher_node ${catkin_LIBRARIES}) add_executable(${PROJECT_NAME}_subscriber_node src/test_subscriber.cpp)
target_link_libraries(${PROJECT_NAME}_subscriber_node ${catkin_LIBRARIES})

编译指定包

catkin_make -DCATKIN_WHITELIST_PACKAGES="test_topic"

7、启动运行

该例的包名为 test_topic,连个节点名是 test_topic_publisher_node 和 test_topic_subscriber_node

先启动节点管理器

roscore

启动发布者节点

cd ~/project/catkin_ws
source devel/setup.bash
rosrun test_topic test_topic_publisher_node

启动订阅者节点

cd ~/project/catkin_ws
source devel/setup.bash
rosrun test_topic test_topic_subscriber_node

查看效果,发布者每隔一段时间发送数据,订阅者接收到数据,打印出来

8、查看ROS网络结构图

rqt_graph

结构图如下:

ROS节点通信(一)消息发布和订阅的更多相关文章

  1. Redis的消息发布和订阅

    Redis的消息发布和订阅 Author:SimpleWu GitHub-redis 什么是消息发布和订阅? Redis 发布订阅(pub/sub)是一种进程间的消息通信模式: 发送者(pub)发送消 ...

  2. redis:消息发布与订阅频道

    1. 发布与订阅频道 消息发布与订阅像收音机与广播台的关系 1.1. publish channel message 发布频道 语法:publish channel message 作用:发布频道消息 ...

  3. vue_组件间通信:自定义事件、消息发布与订阅、槽

    自定义事件 只能用于 子组件 向 父组件 发送数据 可以取代函数类型的 props 在父组件: 给子组件@add-todo-event="addTodo" 在子组件: 相关方法中, ...

  4. redis 实现消息发布和订阅

    1,打开二个客户端机器 一个用于发布,一个用于接受 2,发布一个channel1 3,用另外一个客户端收听上面的客户端 4,当再次在发布的redis客户端 发布一个消息  其他所有订阅的客户端会自动收 ...

  5. Redis 之消息发布与订阅(publish、subscribe)

    使用办法: 订阅端: Subscribe 频道名称 发布端: publish 频道名称 发布内容 一般做群聊,聊天室,发布公告信息等.

  6. SLAM+语音机器人DIY系列:(二)ROS入门——5.编写简单的消息发布器和订阅器

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  7. ros节点启动和关闭相关

    Ros node启动与关闭 1. ros运行单位: Ros程序运行的单位是ros node. 2. ros 节点的启动: (1)初始化ros节点:通过调用ros::init()接口实现:可以通过参数指 ...

  8. Redis-消息发布与订阅

    redis的消息发布与订阅适合做在线聊天, 消息推送 使用方法: 发布端: publish +频道名称 + 发布内容 订阅端: subscribe + 频道名称 发布端例子: 127.0.0.1:63 ...

  9. ROS学习(十二)—— 编写简单的消息发布器和订阅器(C++)

    一.创建发布器节点 1 节点功能: 不断的在ROS网络中广播消息 2 创建节点 (1)打开工作空间目录 cd ~/catkin_ws/src/beginner_tutorials 创建一个发布器节点( ...

  10. ROS 消息发布器和订阅器Publisher, Subscriber

    博客参考:https://www.2cto.com/kf/201705/639776.html 1.编写发布器节点节点(Node) 是指 ROS 网络中可执行文件.接下来,将会创建一个发布器节点(“t ...

随机推荐

  1. Linux CentOS 7 离线安装.NET环境

    下载 下载.NET 例如: aspnetcore-runtime-6.0.15-linux-x64.tar.gz 复制 复制到如下目录: /usr/local/dotnet/aspnetcore-ru ...

  2. springboot+vue实现 下载服务端返回的文件功能

    开发中会遇到,通过浏览器下载服务器端返回的文件功能,本文使用springboot+vue实现该功能. 后端代码: 注:后端返回的文件名遇到中文就会乱码,一直也没得到很好的解决方案,最后就统一返回1.x ...

  3. scrollIntoView页面滑动特效

    点击左侧的菜单,页面平滑滚动:

  4. freeswitch新增模块APP

    概述 之前的文章中,我们讲解了freeswitch的源码基本结构,如何新增一个插件式模块,以及如何在模块中新增一个命令式API接口. freeswitch的架构非常适合这种业务开发模式,即以frees ...

  5. python之configparser类的使用

    一.定义配置文件格式如下:data.conf [interface] url=http://192.168.37.8:7777/api/mytest2 [switch] switch_car=on [ ...

  6. idea新建spring boot 项目右键无package及java类的选项

    新创建的spring boot项目,只有一个默认的资源目录及启动配置. 在 group 的目录下右键新建包路径时 ,发现没有package选项,也没有Java Class的选项: 解决办法: File ...

  7. Nacos源码 (2) 核心模块

    整体架构 服务管理:实现服务CRUD,域名CRUD,服务健康状态检查,服务权重管理等功能 配置管理:实现配置管CRUD,版本管理,灰度管理,监听管理,推送轨迹,聚合数据等功能 元数据管理:提供元数据C ...

  8. 国庆学go,完成了博客基本功能,迫不及待的发布上线了

    大家好,我是沙漠尽头的狼. 国庆7天,利用带娃之余的空闲时间学习了go,并做了一个不是很完善的博客前台网站. 网站发布地址:https://go.dotnet9.com 源码 边做边上传Github, ...

  9. 缓存选型:Redis or MemCache

    ★ Redis24篇集合 1 背景 互联网产品为了保证高性能和高可用性,经常会使用缓存来进行架构设计.最常用的就是使用Redis了,也有部分企业会选择使用Memcache. 所以了解 Redis 和 ...

  10. 【KEIL 】Options for File

    使用" 项目 "窗口的上下文菜单打开此对话框 :菜单选项项目.该对话框包括带有三态替代项的复选框: -已选中且呈灰色 -属性是从父对象继承的.- 选中和白色 -为对象单独设置的属性 ...