ROS订阅与发布话题

news2024/12/29 11:06:10

目录

一、新建一个ROS工作空间并创建功能包
二、创建一个msg消息
三、发布话题
四、订阅话题

前言

Ubuntu18.04
ROS Melodic

一、新建一个ROS工作空间并创建功能包

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
source ~/.bashrc 
cd  ~/catkin_ws/src/
catkin_create_pkg topic roscpp rospy std_msgs

执行完毕后建立了工作空间catkin_ws,并创建了功能包topic。
在这里插入图片描述

二、创建一个msg消息

在topic包的目录下创建msg文件夹并在msg文件中添加消息成员

cd ~/catkin_ws/src/topic
mkdir msg
cd msg
gedit example.msg

在这里插入图片描述填入以下内容:

std_msgs/Header header
float32 test1
int32 test2

header是消息头,包含了序列号,时间戳,frame_id,一般每个消息都有这个成员,其他的成员可以根据需要随便取。

编辑package.xml文件

gedit ~/catkin_ws/src/topic/package.xml

确保它包含以下两行且没有被注释。如果没有,添加进去:

  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>

在这里插入图片描述
修改topic包下面的CMakeLists.txt文件:

gedit ~/catkin_ws/src/topic/CMakeLists.txt

将message_generation添加到COMPONENTS列表中
在这里插入图片描述
添加运行时依赖关系CATKIN_DEPENDS message_runtime
在这里插入图片描述
添加msg文件

add_message_files(
  FILES
  example.msg
 )

在这里插入图片描述
确保generate_messages()函数被调用

generate_messages(
DEPENDENCIES
 std_msgs
  )

在这里插入图片描述
包含消息头文件路径

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

添加完后无需编译使用rosmsg show example即可查看是否添加成功
在这里插入图片描述
在msg中使用其他msg类型
如果在定义msg时,想用其他的包定义好的msg消息类型
例如在package1中定义消息如下:

std_msgs/Header header
package2/msg2 test

其中test的类型为package2包中的msg2消息类型。则需要确保msg2消息正确定义并生成头文件,同时在package1的CmakeLists.txt中的generate_messages中加入package2,例如:

 generate_messages(
   DEPENDENCIES
   std_msgs
   package2
 )

如果引用的是当前包package1中定义的消息,则直接定义即可,无需修改generate_messages
如:

std_msgs/Header header
package1/msg1 test

如果修改了msg文件后编译出现报错:

The dependencies of the message/service ‘XXX’ have changed.
Please rerun cmake.

原因是MSG文件通过编译后变成头文件,但是之前的头文件仍然存在导致编译不通过,使用

catkin_make_isolated --force-cmake

直接强制覆盖编译即可
使用catkin_make_isolated --force-cmake编译后会生成下面两个文件夹
在这里插入图片描述
这是如果用catkin_make编译提示找不到消息头文件,可以将devel_isolated/package1/include/package1下的几个头文件复制覆盖到devel/package1/include/package1下再用catkin_make编译即可
如果删除devel和build文件夹重新编译时提示找不到定义的msg的头文件,这是由于编译时还没来得及生成,可以多编译几次就可以了

三、发布话题

进入catkin_ws/src/topic/src中新建节点程序

cd ~/catkin_ws/src/topic/src
gedit pub.cpp

一个简单的发布节点程序如下,可以直接复制到pub.cpp中

#include <ros/ros.h>
#include <std_msgs/String.h>
#include <sstream>
#include"topic/example.h"
int main(int argc, char **argv)
{
        ros::init(argc, argv,"pub");
        ros::NodeHandle nd;
        ros::Publisher publish = nd.advertise<topic::example>("/topic/example", 10);
        ros::Rate loop_rate(10);
        while (ros::ok())
        {
                topic::example example;
                example.test1 = 1.5;
                example.test2 = 2;
                publish.publish(example);
                loop_rate.sleep();
        }

        return 0;
}

修改topic包下面的CMakeLists.txt文件:

gedit ~/catkin_ws/src/topic/CMakeLists.txt

在文件的最后加上:

add_executable(pub src/pub.cpp)
target_link_libraries(pub ${catkin_LIBRARIES})

然后编译

cd ~/catkin_ws
catkin_make
. ~/catkin_ws/devel/setup.bash

运行:

roscore
rosrun topic pub

然后执行:

rostopic echo /topic/example

出现下面的信息说明发布成功
在这里插入图片描述

四、订阅话题

进入catkin_ws/src/topic/src中新建节点程序

cd ~/catkin_ws/src/topic/src
gedit sub.cpp

一个简单的发布节点程序如下,可以直接复制到sub.cpp中

#include <ros/ros.h>
#include <std_msgs/String.h>
#include <sstream>
#include"topic/example.h"

void subscriberCallback(const topic::example::ConstPtr& msg)
{
printf("test1=%f,test2=%d\n",msg->test1,msg->test2);
}
int main(int argc, char **argv)
{
        ros::Subscriber subscriber;
        ros::init(argc, argv,"sub");
        ros::NodeHandle nd;
        subscriber = nd.subscribe("topic/example", 5, &subscriberCallback);
        ros::Rate loop_rate(10);
        while (ros::ok())
        {
               loop_rate.sleep();
                ros::spinOnce();
        }

        return 0;
}

修改topic包下面的CMakeLists.txt文件:

gedit ~/catkin_ws/src/topic/CMakeLists.txt

在文件的最后加上:

add_executable(sub src/sub.cpp)
target_link_libraries(sub ${catkin_LIBRARIES})

然后编译

cd ~/catkin_ws
catkin_make
. ~/catkin_ws/devel/setup.bash

运行:

rosrun sub sub

可以看到打印出了订阅到的话题
在这里插入图片描述
运行rqt_graph结果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/614890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

USB接口的演变与升级

USB接口是计算机与外部设备之间传输数据的重要接口之一&#xff0c;它的演变和升级经历了多年的发展。本文将详细介绍USB接口的发展历程、应用领域、标准化进程以及未来趋势。 USB接口最早出现在1994年&#xff0c;当时是由英特尔公司、微软公司和惠普公司共同开发的。这个接口…

React中useEffect的源码解读

对源码的解读有利于搞清楚Hooks到底做了什么&#xff0c;如果您觉得useEffect很“魔法”&#xff0c;这篇文章也许对您有些帮助。 本篇博客篇幅有限&#xff0c;只看useEffect&#xff0c;力求简单明了&#xff0c;带您到React Hooks的深处看看 按图索骥找到Hook相关源码&…

JavaWeb之Servlet

1、什么是JavaWeb&#xff1f; Servlet 是 JavaEE 规范之一。规范就是接口 Servlet 就 JavaWeb 三大组件之一。三大组件分别是&#xff1a;Servlet 程序、Filter 过滤器、Listener 监听器。 Servlet 是运行在服务器上的一个 java 小程序&#xff0c;它可以接收客户端发送过来的…

Python plt; ax 设置tick

Python中绘图可以基于plt&#xff1b;也可基于ax 在 Matplotlib 中&#xff0c;Axes 对象&#xff08;常简写为 ax&#xff09;是在图&#xff08;Figure&#xff09;中进行大部分的绘图操作的地方。一个 Axes 对象代表了一个具体的绘图区域。 利用 plt 绘图 简单的图像测试…

继续探索Roop(单张图视频换脸)的各方面:比如喜闻乐见的“加速”

文章目录 &#xff08;一&#xff09;Roop项目的特点&#xff08;二&#xff09;Roop也能加速***&#xff08;三&#xff09;Roop更新和依赖&#xff08;3.1&#xff09;飞速更新&#xff08;3.2&#xff09;依赖问题&#xff08;3.3&#xff09;需要CUDA么 前两天写了&#x1…

如何修复vcruntime140.dll文件?多种解决vcruntime140.dll的方法分享

在使用Windows操作系统时&#xff0c;经常会遇到一些错误提示&#xff0c;比如缺少vcruntime140.dll文件。这个文件是Visual C Redistributable Package的一部分&#xff0c;它负责运行C程序。如果你在运行某些软件或游戏时收到了“缺少vcruntime140.dll文件”的错误提示&#…

电子科技大学计算机系统结构半期考试参考答案

2023 答案-半期试题&#xff08;15分&#xff09; 1、试分析采用哪种设计方案实现求浮点数乘法FPMUL对系统性能提高更大。假定FPMUL操作占整个测试程序执行时间的10%。 一种设计方案是增加专门的FPMUL硬件&#xff0c;可以将FPMUL操作的速度加快到10倍&#…

IP协议与ethernet协议

一、IP协议 1.IP协议作用和意义 &#xff08;1&#xff09;计算机网络体系结构 &#xff08;2&#xff09;网络互联使用路由器 &#xff08;3&#xff09;IP网的意义 当互联网上的主机进行通信时&#xff0c;就好像在一个网络上通信一样&#xff0c;看不见互连的各具体的网络…

Vue.js 中的渲染函数是什么?如何使用渲染函数?

Vue.js 中的渲染函数是什么&#xff1f;如何使用渲染函数&#xff1f; Vue.js 是一款流行的前端框架&#xff0c;它提供了许多方便的工具和 API&#xff0c;用于构建交互式的用户界面。其中&#xff0c;渲染函数是 Vue.js 中一个强大的工具&#xff0c;它可以让我们以编程的方…

深度解析java异步多线程优化版

快速使用需求&#xff1a;我不要理解一堆理论想直接用 操作说明 ITask.java PutEsTask.java TaskExecutor.java TaskQueue.java TestMain.java请把这几个类文件复制下去&#xff0c;运行testMain的方法&#xff0c;根据TestMain的运行日志&#xff0c;【1】-> 【8】不同需求…

2.3 网络设计与redis、memcached、nginx组件

目录 一、网络模块需要处理哪些事情二、reactor网络设计模型三、网络模块与业务的关系四、redis、memcached、nginx1、redis2、memcached3、ngnix4、总结 一、网络模块需要处理哪些事情 网络编程主要关注客户端与服务端交互的四个问题&#xff1a; 1、连接建立 2、消息到达 3、…

《不要挑战人性》笔记(一)

恒河猴实验 代母实验 将刚出生的小猴子与母亲分开&#xff0c;让它与绒布妈妈跟铁丝妈妈生活在一起。铁丝妈妈身上有食物&#xff0c;绒布没有食物&#xff0c;小猴子更喜欢绒布妈妈&#xff0c;即使它在铁丝妈妈那里得到了食物。绒布妈妈身上设置机关&#xff0c;攻击小猴子&a…

OAuth2 工作流程详解

我们之前谈到了使用saml作为SSO单点登录认证。本文讲解oauth2.0协议&#xff0c;oauth2.0协议避免了客户端直接访问受保护资源 什么是OAuth OAuth是一种安全的开放协议&#xff0c;用于在不相关的服务之间授权用户。换句话说&#xff0c;它使一个服务能够访问托管在其他服务上…

Flutter 笔记 | GetX

官网&#xff1a;https://pub.dev/packages/get 中文文档&#xff1a;https://github.com/jonataslaw/getx/blob/master/README.zh-cn.md 关于 GetX 现在Flutter的状态管理方案很多&#xff0c;redux、bloc、state、provider、Getx。 provider是官方提供的状态管理解决方案&…

小程序分包详解

一&#xff1a;什么是小程序分包 分包指的是把一个完整的小程序项目&#xff0c;按照需求划分为不同的子包&#xff0c;在构建时打包成不同的分包&#xff0c;用户在使用时按需进行加载。 二&#xff1a;为什么使用分包 小程序第一版 推出 小程序代码包不能超过1MB 大小&…

java SSM 教代会审批管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 教代会管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码 和数据库&#xff0c;系统主要采用…

计算机网络开荒2-应用层

文章目录 一、网络应用体系结构2.1 客户机/服务器结构(Client-Server,C/S)2.2 点对点结构(Peer-to-peer,P2P)2.3 混合结构(Hybrid) 二、网路应用的进程通信2.1 套接字Socket2.2 应用层协议的内容 三、网络应用的需求与传输层服务四、Web4.1 HTTP4.1.1 HTTP连接类型4.1.1.1 非持…

mysql慢sql优化实战:in order by优化处理

背景 线上查询慢的问题日益突出,专门写一个帖子记录一下处理过程,会定期更新优化处理方案 套餐余量统计查询菜单,数据库查询时间一分钟五十秒,优化之后耗时109毫秒,性能提升很大.所有时间统计均以数据库层面进行统计.用户使用层面因为有数据传输、带宽、业务逻辑处理等因素…

只要7分钟,教你从0-1搭建BI系统,这份大佬整理的指南免费送!

在BI行业干了快十年了&#xff0c;做过制造业供应链的BI项目&#xff0c;也跟过零售电商、房地产、银行的BI建设&#xff0c;经常有朋友咨询关于BI建设的内容&#xff0c;今天总结了一套BI项目建设指南&#xff0c;直接分享给大家&#xff0c;觉得不错记得点赞收藏。 通常情况…

实战【金融评分卡】

金融评分卡 网站&#xff1a;百融、同盾 1.导入 信贷评分卡是一种用于评估个人或企业申请贷款的工具&#xff0c;就像-个评分表-样。我们可以把它看作是银行或金融机构用来判断某人是否有资格获得贷款的一-种方式。 想象一下,你是一个银行家,有很多人向你申请贷款,比如个人贷…