ROS订阅与发布话题

news/2025/1/12 12:16:11/

目录

一、新建一个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(FILESexample.msg)

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

generate_messages(
DEPENDENCIESstd_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(DEPENDENCIESstd_msgspackage2)

如果引用的是当前包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.ppmy.cn/news/240164.html

相关文章

小米8 小米9 红米小米改串 高通处理器 硬改 参数改机演示视频工具

小米8 小米9 红米小米改串 高通处理器 硬改 参数改机演示视频工具 小米8 小米9 红米小米改串 高通处理器 硬改 参数改机演示视频工具

【基于STM32F103C8T6的智能风扇控制】

基于STM32F103C8T6的智能风扇控制 前言一、功能介绍二、硬件介绍三、部分源码 前言 本次分享的是基于STM32F103的智能风扇的制作&#xff0c;相关的硬件和部分源码可看下面哦&#xff0c;需要成品的可私&#xff08;创作不易&#xff0c;拒绝白嫖&#xff09; 喜欢就给小殷一个…

从《小米超神》案例精讲,MOBA手游的性能优化

今天我们为大家带来由福州朱雀网络研发的MOBA手游《小米超神》的UWA测评报告分析。该游戏在不同配置的移动终端设备上&#xff0c;无论是画面表现力&#xff0c;还是性能开销都非常优异。在此&#xff0c;我们将对该款游戏的性能数据进行深度剖析&#xff0c;希望通过这篇文章可…

基于stm32c8t6的两轮平衡小车 第二篇——原理图及CubeMx配置

目录 1.原理图 2.CubeMx配置 &#xff08;1&#xff09;创建工程 &#xff08;2&#xff09;配置时钟树 &#xff08;3&#xff09;仿真模式选择 &#xff08;4&#xff09;TIM2配置为PWM输出模式 &#xff08;5&#xff09;定时器TIM3,TIM4设置为编码器模式 &#xff08;6&a…

python+selenium 抢小米mix 2s手机

小米手机的确太难抢了&#xff0c;所以试着写了个程序玩下&#xff0c;还不知道行不行&#xff0c;明天试试&#xff01;不过&#xff0c;还是要增加多个帐号一起抢&#xff0c;概率还是要大些&#xff0c;黄牛就是使用多帐号抢的&#xff01;先附上源代码&#xff0c;有什么不…

104、基于51单片机智能风扇pwm调速红外遥控无线遥控风扇温控风扇系统设计

毕设帮助、开题指导、技术解答&#xff08;有偿&#xff09;见文末。 目录 摘要 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、Protues仿真 六、流程图 七、程序源码 八、资料包括 摘要 随着气温的逐渐上升&#xff0c;风扇的需求量也逐渐扩大。传统风扇不能…

小米2s手机刷机开发版本

主要依照&#xff1a;http://www.miui.com/thread-3367802-1-1.html进行 但是有几点要说明&#xff1a; 开启开发者选项 设置->关于手机->连点三下MIUI版本&#xff0c;即开启了开发者选项 设置->更多设置->开发者选项 由于小米2没有(设置 -> 开发者选项 -…

小米电视3 android,小米电视系列ROOT教程(含4A,4S,4X等Android6.0.1版机型)

本帖最后由 MozhiTX 于 2020-6-11 09:55 编辑 首先,根据小米电视4A 65寸ROOT方法帖子的方法,本人尝试了不下20次,一直启动到小米自带的Recovery,无法进入到Twry Recovery。就FQ出去看了看,发现4pda上也有不少遇到相同问题的人,不过好在找到了解决问题的方法!原因在与:进…