这里是学习ROS第一次涉及到代码的部分。主要根据古月居视频教程整理出来的干货。本人是干货爱好者。

文章目录

  • 前言
  • 一、话题模型
  • 二、自定义话题消息
    • 1.定义msg文件
    • 2.在功能包(learning_topic)的package.xml中添加功能包依赖
    • 3.在CMakeList.txt添加编译选项
    • 4.编译
  • 三、创建publisher代码(C++)
    • 代码解读
  • 四、创建subscriber代码(C++)
    • 代码解读
  • 五.配置编译规则和编译运行
    • 1.配置编译规则
    • 2.编译并运行publisher和subscriber
  • 六.贴一下python的publisher和subscriber的代码
  • 总结

前言

订阅和发布是ROS非常重要的通信机制之一,其中的消息是通信的核心,接下来就以一个具体的例子来学习是如何实现的吧。


一、话题模型


二、自定义话题消息

1.定义msg文件

在功能包中创建一个文件夹msg

cd ~/caktin_ws/src/learning_topic/msg
touch Person.msg

Person.msg (针对person的宏定义)

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

2.在功能包(learning_topic)的package.xml中添加功能包依赖

编译依赖:动态产生message的功能包
运行依赖:运行时的动态runtime功能包

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

3.在CMakeList.txt添加编译选项

1.把依赖的功能包message_generation放在find_package里

2.添加person.msg编译的接口,以及编译msg需要的依赖

3.把运行时的依赖message_runtime 添加到catkin_package里

4.编译

编译完在devel的include里的文件夹learning_topic中就会有Person.h,也就是c++的头文件

cd ~/catkin_ws
catkin_make

三、创建publisher代码(C++)

放在工作空间,src, learning_topic功能包的src中。

代码解读

//头文件
#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;//调用msg中宏定义好的值maleperson_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;
}

四、创建subscriber代码(C++)

放在工作空间,src, learning_topic功能包的src中。

代码解读

//头文件
#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;
}

五.配置编译规则和编译运行

1.配置编译规则

放在CMakeLists.txt文件中。


将需要编译的代码生成可执行文件

设置代码和ROS的库做链接

可执行文件和动态生成的消息产生依赖关系

2.编译并运行publisher和subscriber

编译

cd ~/catkin_ws
catkin_make
source devel/setup.bash

运行(不同的新终端)

roscore
rosrun learning_topic person_subscriber
rosrun learning_topic person_publisher

六.贴一下python的publisher和subscriber的代码

最好放在功能包的scripts的文件夹下

总结

了解如何自定义消息,消息的定义是话题模型的关键。

【ROS入门学习05|自定义话题消息,并且编程实现publisher和subscriber】相关推荐

  1. ROS的学习(二十)rosserial中的Publisher和Subscriber中的编程步骤

    1.在一个话题上发布消息. 可以使用ros::Publisher类创建一个句柄来在一个话题上发布消息,应该首先创建一个publisher将要使用的消息,然后在setup函数中调用advertise.整 ...

  2. 我的Linux与ROS的不眠不休:从入门到入土(六)——自定义话题消息类型。

    ROS中,除了使用rosmsg list 列表中所展示的消息类型外,还可以通过在功能包下创建msg文件夹,添加msg文件,达成自定义消息类型的操作.   ROS自定义数据类型需要一个依赖包的支持 me ...

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

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

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

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

  5. ROS基础(四)——话题消息的定义与使用

    申明:ROS学习参考了古月居老师的Blibli视频,强烈推荐大家看视频学习,本博客仅记录自己的学习经历和心得,欢迎大家一起讨论! ROS话题模型 对比上面两个话题模型可以发现,turtlesim::P ...

  6. 【ROS入门学习01| ROS命令行工具的使用】

    ROS命令行工具的使用 -----------------可以配合古月居的ROS入门教程来学习实践. 文章目录 ROS命令行工具的使用 一.roscore 二.rosrun 三.rqt_graph 四 ...

  7. python 类和对象_Python零基础入门学习33:类与面向对象编程:类的继承

    注:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性. 本文字数约1300,阅读时间约为3分钟. Python面向对象编程 类的继承机制 如果一个类A继承自另一个类B,就把继承者类A称 ...

  8. ROS入门学习(中科院ros视频笔记)

    >ros工程结构 catkin工作空间:组织和管理功能包的文件夹(工作空间:管理和组织ros工程代码的地方) catkin,编译构建系统,cmake的扩展 catkin workspace,用指 ...

  9. ROS入门学习三——launch文件

    launch作用:便于一次启动多个节点,可启动本地节点和远程节点及修改添加参数服务器参数. <launch> //<launch>是所有launch文件的根标签<node ...

最新文章

  1. 开发者如何赶上5G风口?
  2. Redis概述与Redis集群(一)
  3. 转:VirtualBox虚拟机网络连接设置的四种方式
  4. K8S集群搭建:虚拟机克隆
  5. MFC添加View的方法
  6. vue 配置跨域访问
  7. 怎么使用计算机扩展,如何导入扩展到慧编程PC并进行使用
  8. 【android】安卓高仿京东分类页
  9. 基于STM32(F103ZE)的LD3320语音控制系统
  10. Memcached缓存
  11. k近邻算法与kd树的创建和搜索
  12. 【毕业设计】46-基于单片机的智能卫浴系统设计(原理图工程+仿真工程+源代码+答辩论文+答辩PPT)
  13. Java编程练习之:转换罗马数字
  14. eclipsepython插件_Eclipse安装配置PyDev插件
  15. vb.net程序可以在触摸屏上运行么_台达PLC VP-PM运动控制型在大型铣镗床上的应用...
  16. VSCode鼠标滚轮控制字体大小
  17. 单键模式_购买单键或更换整个键盘是否更好?
  18. 骡友们推荐的各个学习英文网站的汇总。
  19. 企业员工入职培训怎么做?培训内容分享
  20. html语言简介 ppt,html课件ppt

热门文章

  1. 拥抱国产化,推动产业互联网,拍乐云做了什么?
  2. 关于小白如何查看自己的文章是否被EI检索
  3. Java实现宿舍管理系统、基于java、JDBC、GUI(含源文件/综合项目)
  4. 什么叫单稳态,双稳态
  5. qnx挂死恢复脚本简易写法
  6. ffmpeg 结构体分析
  7. [VB.NET]单元四 窗体编程
  8. 【37】警告gyroscope bias initial calibration -nan -nan -nan
  9. 维克森林大学计算机科学专业好不好,2017年维克森林大学计算机科学
  10. 华为鸿蒙开源网址,华为鸿蒙开源