文章目录

  • 一、工作空间
    • 1.创建一个名称为sor_ws的工作空间
    • 2.编译工作空间
    • 3.创建功能包
  • 二、自定义话题消息
    • 1.定义msg文件
    • 2.配置package.xml和CMakeLists.txt
    • 3.再次编译
  • 三、创建cpp文件
    • 1.发布者.cpp文件
    • 2.订阅者.cpp文件
    • 2.再次配置CMakeLists.txt
  • 四、运行
  • 总结

环境:Ubuntu18.04,ROS版本:melodic

一、工作空间

工作空间包括src(代码空间)、build(编译空间)、devel(开发空间)、install(安装空间)

1.创建一个名称为sor_ws的工作空间

mkdir -p ~/sor_ws/src
cd ~/sor_ws/src
catkin_init_workspace


2.编译工作空间

cd ~/sor_ws
catkin_make


src目录下生成build和devel文件,此时还差install文件夹,再执catkin_make install指令

catkin_make install

生成install文件夹

3.创建功能包

cd ~/sor_ws/src
catkin_create_pkg learning_topic std_msgs rospy roscpp geometry_msgs


二、自定义话题消息

1.定义msg文件

在learning_topic下创建msg文件夹

进入msg文件夹,右键在终端打开,输入touch Person.msg,生Person.msg文件

双击Person.msg,输入

string name
uint8  age
uint8  sexuint8 unknown = 0
uint8 male    = 1
uint8 female  = 2

这些是我们要传输的消息。

保存退出

2.配置package.xml和CMakeLists.txt

cd ~/sor_ws/src/learning_topic
sudo gedit package.xml

输入密码

添加

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

cd ~/sor_ws/src/learning_topic
sudo gedit CMakeLists.txt

添加三个地方
(1)添加

message_generation


(2)添加

add_message_files(FILESPerson.msg
)generate_messages(DEPENDENCIESstd_msgs
)

(3)去掉CATKIN_DEPANDS前面的#,添加message_runtime

3.再次编译

cd ~/sor_ws
catkin_make

生成Person.h文件

三、创建cpp文件

1.发布者.cpp文件

cd ~/sor_ws/src/learning_topic/src
touch person_publisher.cpp
sudo gedit person_publisher.cpp

编写代码,保存退出

完整代码如下

/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程将发布/person_info话题,自定义消息类型learning_topic::Person*/#include <ros/ros.h>
#include "learning_topic/Person.h"int main(int argc, char **argv)
{// ROS节点初始化ros::init(argc, argv, "person_publisher");// 创建节点句柄ros::NodeHandle n;// 创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::Person,队列长度10ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info", 10);// 设置循环的频率ros::Rate loop_rate(1);int count = 0;while (ros::ok()){// 初始化learning_topic::Person类型的消息learning_topic::Person person_msg;person_msg.name = "Tom";person_msg.age  = 18;person_msg.sex  = learning_topic::Person::male;// 发布消息person_info_pub.publish(person_msg);ROS_INFO("Publish Person Info: name:%s  age:%d  sex:%d", person_msg.name.c_str(), person_msg.age, person_msg.sex);// 按照循环频率延时loop_rate.sleep();}return 0;
}

2.订阅者.cpp文件

cd ~/sor_ws/src/learning_topic/src
touch person_subscriber.cpp
sudo gedit person_subscriber.cpp

编写代码,保存退出
完整代码如下

/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程将订阅/person_info话题,自定义消息类型learning_topic::Person*/#include <ros/ros.h>
#include "learning_topic/Person.h"// 接收到订阅的消息后,会进入消息回调函数
void personInfoCallback(const learning_topic::Person::ConstPtr& msg)
{// 将接收到的消息打印出来ROS_INFO("Subcribe Person Info: name:%s  age:%d  sex:%d", msg->name.c_str(), msg->age, msg->sex);
}int main(int argc, char **argv)
{// 初始化ROS节点ros::init(argc, argv, "person_subscriber");// 创建节点句柄ros::NodeHandle n;// 创建一个Subscriber,订阅名为/person_info的topic,注册回调函数personInfoCallbackros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback);// 循环等待回调函数ros::spin();return 0;
}

2.再次配置CMakeLists.txt

cd ~/sor_ws/src/learning_topic
sudo gedit CMakeLists.txt

在build后面添加

add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)


保存退出
再次编译:

cd ~/sor_ws
catkin_make

四、运行

打开新终端,输入roscore
再打开一个新终端,设置环境变量,防止找不到可执行文件,再运行订阅者指令

source ~/sor_ws/devel/setup.bash
rosrun learning_topic person_subscriber


再打开一个新终端,运行发布者指令

source ~/sor_ws/devel/setup.bash
rosrun learning_topic person_publisher

回车,看到不断有信息在两个终端出现,即运行成功

总结

以上就是今天要讲的内容,本文简单介绍了ROS中话题的发布与订阅,关于环境变量,每次在终端运行话题时都需要设置一遍,非常麻烦,可以通过echo $ROS_PACKAGE_PATH查看当前环境变量的路径,然后在主文件夹下Ctrl+h显示.bashrc,打开文件在最后加上source /(自己的路径)/sor_ws/devel/setup.bash,保存退出,之后在任何终端中都不需再设置环境变量了。

学习资料来自:【古月居】古月·ROS入门21讲

ROS入门学习笔记|话题发布与订阅相关推荐

  1. ROS中的roslaunch命令和launch文件(ROS入门学习笔记四)

    ROS中的基本对象和概念学习笔记(ROS入门学习笔记一) ROS中创建工作区和包(ROS入门学习笔记二) ROS功能包中CMakeLists.txt的说明(ROS入门学习笔记三) 1.roslaunc ...

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

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

  3. 13.ROS编程学习:话题发布控制乌龟

    目录 准备工作 c++控制乌龟运动 python控制乌龟运动 参考学习资料:赵虚左的课程+古月的ROS机器人开发实践P56的例程. 准备工作 打开ROS乌龟仿真器 roscore rosrun tur ...

  4. 激光SLAM入门学习笔记

    激光SLAM入门学习笔记 激光SLAM入门学习笔记 一.推荐阅读书籍 二.推荐公众号.知乎.博客 1.公众号 2.知乎 3.博客 三.推荐阅读论文&代码(参考泡泡机器人) 2D激光SLAM 3 ...

  5. dubbo入门学习笔记之入门demo(基于普通maven项目)

    注:本笔记接dubbo入门学习笔记之环境准备继续记录; (四)开发服务提供者和消费者并让他们在启动时分别向注册中心注册和订阅服务 需求:订单服务中初始化订单功能需要调用用户服务的获取用户信息的接口(订 ...

  6. Qt 快速入门学习笔记

    Qt 快速入门学习笔记 环境安装 环境配置以及安装 安装包下载地址 1.windows安装 msvc编译器模块需要安装Windows软件开发工具包. MinGW是Windows平台使用GNU工具导入库 ...

  7. k8s零基础入门 (学习笔记)

    夫君子之行,静以修身,俭以养德,非淡泊无以明志,非宁静无以致远. 夫学须静也,才须学也,非学无以广才,非志无以成学.淫慢则不能励精,险躁则不能冶性. 年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐, ...

  8. 01.Java 编程入门学习笔记20210307

    Java 编程入门学习笔记-day01 第0章:编程入门 1.计算机的概述 计算机 = 硬件 + 软件 1.1硬件:冯诺依曼体系 CPU: CPU的衡量标准:速度的计量单位是赫兹(Hz),1Hz相当于 ...

  9. Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转)

    Crypto++入门学习笔记(DES.AES.RSA.SHA-256)(转) 2012-11-19 11:28:00|  分类: c++|举报|字号 订阅 背景(只是个人感想,技术上不对后面的内容构成 ...

最新文章

  1. java同步方法完成案例_Java同步代码块和同步方法原理与应用案例详解
  2. Python入门100题 | 第079题
  3. 从mysql数据库中读取二进制文件_数据库技术之在MYSQL数据库中如何存取二进制文件...
  4. 【ATT】Reverse Nodes in k-Group
  5. php 获取某个月的周一
  6. brew 安装mysql5.6_MacOS 10.14安装和brew更新后无法安装mysql gem
  7. Nmap绕过防火墙脚本的使用
  8. 苹果双卡双待是哪一款_等12 mini还是买苹果11?实体店老板给出了答案,很有道理!...
  9. 万份销量,五星好评!这门Python神作刷爆朋友圈!
  10. hadoop启动mysql服务_Hadoop MySQL 服务自启动配置
  11. Qt的下载安装全教程
  12. 十月,你好。余杭,巴比特来了!
  13. JavaEE-Mybatis知识点笔记
  14. Qpython SL4A服务调用GPS定位获取获取位置信息
  15. Ubuntu18.04 实现串口通信
  16. 你好你好你好你好你好你好
  17. JPA系列:使用原生SQL、使用JPQL查询方法简单例子
  18. 平面设计师职业技能证书有哪些?
  19. MySQL创建民族表的SQL语句
  20. x1c2017 8G版 win linux的取舍纠结记录

热门文章

  1. 分析|什么是物联网卡
  2. [Linux]常见环境开发工具
  3. 计算机安全法的发行日期,网络安全法实施时间,网络安全法是什么时候实施的?...
  4. InnoDB 离线转储工具
  5. CSDN 还是一个不错的技术社区
  6. CorelDRAW2022体验标准版
  7. 购物卷1000元买多种东西,刚好用完的解决方案(C语言实现)
  8. 如何使用QQ号来注册腾讯云新用户账号并完成实名认证?
  9. 让数据站住脚-浅谈用户研究中的信度与效度
  10. 4-8 简单阶乘计算 (10分)