【ROS入门学习05|自定义话题消息,并且编程实现publisher和subscriber】
这里是学习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】相关推荐
- ROS的学习(二十)rosserial中的Publisher和Subscriber中的编程步骤
1.在一个话题上发布消息. 可以使用ros::Publisher类创建一个句柄来在一个话题上发布消息,应该首先创建一个publisher将要使用的消息,然后在setup函数中调用advertise.整 ...
- 我的Linux与ROS的不眠不休:从入门到入土(六)——自定义话题消息类型。
ROS中,除了使用rosmsg list 列表中所展示的消息类型外,还可以通过在功能包下创建msg文件夹,添加msg文件,达成自定义消息类型的操作. ROS自定义数据类型需要一个依赖包的支持 me ...
- ROS入门学习笔记|话题发布与订阅
文章目录 一.工作空间 1.创建一个名称为sor_ws的工作空间 2.编译工作空间 3.创建功能包 二.自定义话题消息 1.定义msg文件 2.配置package.xml和CMakeLists.txt ...
- ROS中的roslaunch命令和launch文件(ROS入门学习笔记四)
ROS中的基本对象和概念学习笔记(ROS入门学习笔记一) ROS中创建工作区和包(ROS入门学习笔记二) ROS功能包中CMakeLists.txt的说明(ROS入门学习笔记三) 1.roslaunc ...
- ROS基础(四)——话题消息的定义与使用
申明:ROS学习参考了古月居老师的Blibli视频,强烈推荐大家看视频学习,本博客仅记录自己的学习经历和心得,欢迎大家一起讨论! ROS话题模型 对比上面两个话题模型可以发现,turtlesim::P ...
- 【ROS入门学习01| ROS命令行工具的使用】
ROS命令行工具的使用 -----------------可以配合古月居的ROS入门教程来学习实践. 文章目录 ROS命令行工具的使用 一.roscore 二.rosrun 三.rqt_graph 四 ...
- python 类和对象_Python零基础入门学习33:类与面向对象编程:类的继承
注:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性. 本文字数约1300,阅读时间约为3分钟. Python面向对象编程 类的继承机制 如果一个类A继承自另一个类B,就把继承者类A称 ...
- ROS入门学习(中科院ros视频笔记)
>ros工程结构 catkin工作空间:组织和管理功能包的文件夹(工作空间:管理和组织ros工程代码的地方) catkin,编译构建系统,cmake的扩展 catkin workspace,用指 ...
- ROS入门学习三——launch文件
launch作用:便于一次启动多个节点,可启动本地节点和远程节点及修改添加参数服务器参数. <launch> //<launch>是所有launch文件的根标签<node ...
最新文章
- 开发者如何赶上5G风口?
- Redis概述与Redis集群(一)
- 转:VirtualBox虚拟机网络连接设置的四种方式
- K8S集群搭建:虚拟机克隆
- MFC添加View的方法
- vue 配置跨域访问
- 怎么使用计算机扩展,如何导入扩展到慧编程PC并进行使用
- 【android】安卓高仿京东分类页
- 基于STM32(F103ZE)的LD3320语音控制系统
- Memcached缓存
- k近邻算法与kd树的创建和搜索
- 【毕业设计】46-基于单片机的智能卫浴系统设计(原理图工程+仿真工程+源代码+答辩论文+答辩PPT)
- Java编程练习之:转换罗马数字
- eclipsepython插件_Eclipse安装配置PyDev插件
- vb.net程序可以在触摸屏上运行么_台达PLC VP-PM运动控制型在大型铣镗床上的应用...
- VSCode鼠标滚轮控制字体大小
- 单键模式_购买单键或更换整个键盘是否更好?
- 骡友们推荐的各个学习英文网站的汇总。
- 企业员工入职培训怎么做?培训内容分享
- html语言简介 ppt,html课件ppt