目录

自定义msg简介

自定义msg实现

话题通信自定义msg调用(C++)

vscode配置

实现发布方

实现订阅方

Python实现

编写发布方

实现订阅方


自定义msg简介

在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty.... 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性。

当传输一些复杂的数据,比如: 激光雷达的信息... std_msgs 由于描述性较差而显得力不从心,这种场景下可以使用自定义的消息类型msg

msgs只是简单的文本文件,每行具有字段类型和字段名称,可以使用的字段类型有:

  • int8, int16, int32, int64 (或者无符号类型: uint*)

  • float32, float64

  • string

  • time, duration

  • other msg files

  • variable-length array[] and fixed-length array[C]

当用到别人的msg文件时可能会用到特殊类型Header

ROS中还有一种特殊类型:Header,标头包含时间戳和ROS中常用的坐标帧信息。会经常看到msg文件的第一行具有Header标头

自定义msg本质上就是一个文本文件

自定义msg实现

需求:创建自定义消息,该消息包含人的信息:姓名、身高、年龄等。

流程:

  1. 按照固定格式创建 msg 文件
  2. 编辑配置文件
  3. 编译生成可以被 Python 或 C++ 调用的中间文件

在vscode中新建文件夹和文件

添加依赖

这样修改后

编译的时候会导入

message_generation

message_runtime

然后修改CMakeLists

这样build depend 编译的时候要依赖message_generation这个功能包

find_package的用处是当编译plumbing_pub_sub功能包的时候必须依赖这里面的包

备注

ctrl + /

组合键可以在vscode里直接去掉注释

添加message文件

代表编译时依赖 std_msgs包

因为组成msg的复杂消息的都是标准消息所以需要std_msg

上面的find_pachage 又依赖于catkin_package里面的包,有层层依赖关系

然后进行编译

编译后会产生中间文件

以下是python产生的中间文件,调用的话就是用的这个文件

 话题通信自定义msg调用(C++)

需求:

编写发布订阅实现,要求发布方以10HZ(每秒10次)的频率发布自定义消息,订阅方订阅自定义消息并将消息内容打印输出。

分析:

在模型实现中,ROS master 不需要实现,而连接的建立也已经被封装了,需要关注的关键点有三个:

  1. 发布方
  2. 接收方
  3. 数据(此处为自定义消息)

vscode配置

为了方便代码提示以及避免误抛异常,需要先配置 vscode,将前面生成的 head 文件路径配置进 c_cpp_properties.json 的 includepath属性:

获取路径然后复制

复制进去然后改成**

这样做的好处是

不至于误抛异常

实现发布方

然后新建文件

复制代码

/*需求: 循环发布人的信息*/#include "ros/ros.h"
#include "plumbing_pub_sub/Person.h"int main(int argc, char *argv[])
{setlocale(LC_ALL,"");//1.初始化 ROS 节点ros::init(argc,argv,"talker_person");//2.创建 ROS 句柄ros::NodeHandle nh;//3.创建发布者对象ros::Publisher pub = nh.advertise<plumbing_pub_sub::Person>("chatter_person",1000);//4.组织被发布的消息,编写发布逻辑并发布消息plumbing_pub_sub::Person p;p.name = "sunwukong";p.age = 2000;p.height = 1.45;ros::Rate r(1);while (ros::ok()){pub.publish(p);p.age += 1;ROS_INFO("我叫:%s,今年%d岁,高%.2f米", p.name.c_str(), p.age, p.height);r.sleep();ros::spinOnce();}return 0;
}

到这里然后改成**

然后跟之前一样修改CMakeLists

这是添加可执行权限

这是初始化

添加依赖

这个的作用是防止先编译cpp文件还没编译msg文件此时就会报错

有了这个就不会出现这种原因导致的报错,即逻辑问题上的报错

然后编译功能包

Invoking"make cmake_check_build_system"failed

这个报错大概率是文件名或者节点名对应不上导致的

我的报错是因为之前这里person写错了

没有仔细看报错原因

改完后编译成功

然后开终端新建

实现订阅方

新建文件

此处报错是因为还没修改include文件

无需着急

复制以下代码(对应自己文件名等做对应修改)

/*需求: 订阅人的信息*/#include "ros/ros.h"
#include "demo02_talker_listener/Person.h"void doPerson(const demo02_talker_listener::Person::ConstPtr& person_p){ROS_INFO("订阅的人信息:%s, %d, %.2f", person_p->name.c_str(), person_p->age, person_p->height);
}int main(int argc, char *argv[])
{   setlocale(LC_ALL,"");//1.初始化 ROS 节点ros::init(argc,argv,"listener_person");//2.创建 ROS 句柄ros::NodeHandle nh;//3.创建订阅对象ros::Subscriber sub = nh.subscribe<demo02_talker_listener::Person>("chatter_person",10,doPerson);//4.回调函数中处理 person//5.ros::spin();ros::spin();    return 0;
}

对应更改配置文件

打开终端

打开计算图

 Python实现

流程:

  1. 编写发布方实现;
  2. 编写订阅方实现;
  3. 为python文件添加可执行权限;
  4. 编辑配置文件;
  5. 编译并执行。

{"python.autoComplete.extraPaths": ["/opt/ros/noetic/lib/python3/dist-packages","/xxx/yyy工作空间/devel/lib/python3/dist-packages"]
}

完成vscode配置

这是为了自动补齐功能,不影响运行

编写发布方

然后复制以下代码

#! /usr/bin/env python
"""发布方:循环发送消息"""
import rospy
from demo02_talker_listener.msg import Personif __name__ == "__main__":#1.初始化 ROS 节点rospy.init_node("talker_person_p")#2.创建发布者对象pub = rospy.Publisher("chatter_person",Person,queue_size=10)#3.组织消息p = Person()p.name = "葫芦瓦"p.age = 18p.height = 0.75#4.编写消息发布逻辑rate = rospy.Rate(1)while not rospy.is_shutdown():pub.publish(p)  #发布消息rate.sleep()  #休眠rospy.loginfo("姓名:%s, 年龄:%d, 身高:%.2f",p.name, p.age, p.height)

写完后添加执行权限

接下来修改CMakeLists配置

启动终端

 实现订阅方

新建文件

复制代码

#! /usr/bin/env python
"""订阅方:订阅消息"""
import rospy
from demo02_talker_listener.msg import Persondef doPerson(p):rospy.loginfo("接收到的人的信息:%s, %d, %.2f",p.name, p.age, p.height)if __name__ == "__main__":#1.初始化节点rospy.init_node("listener_person_p")#2.创建订阅者对象sub = rospy.Subscriber("chatter_person",Person,doPerson,queue_size=10)rospy.spin() #4.循环

添加执行权限

修改CMakeLists配置

然后打开终端运行

完成

这里记住python也要source

这要才能在bash里编译否则会报错

打开计算图

ROS话题通信自定义msg实现发送接收(六)c++、python相关推荐

  1. ROS话题通信c++和python实现

    机器人是一种高度复杂的系统性实现,在机器人上可能集成各种传感器(雷达.摄像头.GPS...)以及运动控制实现,为了解耦合,在ROS中每一个功能点都是一个单独的进程,每一个进程都是独立运行的.更确切的讲 ...

  2. 【ROS话题通信】发布者和订阅者

    前言 本文记录ROS话题通信的学习过程,便于后续复习.首先明确,ROS中的话题通信,在ROS通信中非常重要,实现了分布式发布接收消息,也是实现了不同编程语言间的解耦,下面记录下自己学习过程中的相关代码 ...

  3. 【ROS入门-4】嘴对嘴讲解ROS的核心概念——ROS话题通信机制

    文章目录 前言 ROS系列文章 ROS的通信机制 话题(topic) 发布者 订阅者 消息(Message) 用C++来写话题通信的代码 发布者 订阅者 使用rqt_graph 源码附录 引用说明 参 ...

  4. ROS话题通信中创建自定义数据类型的两种方式

    一.在同一个功能包下创建.msg文件 1.在功能包目录下创建msg文件夹 2.在文件夹中创建.msg文件 3.在该功能包的package.xml文件中加入: <build_depend>m ...

  5. 【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )

    文章目录 I UDP 信息发送接收原理 II UDP 发送和接收端口相同 III UDP 发送信息代码示例 IV UDP 接收信息代码示例 V UDP 服务器端代码示例 VI UDP 客户端代码示例 ...

  6. python邮件模块_Python收发邮件模块,用,来,发送,接收

    用Python来发送接收邮件模块 python实现发送和接收邮件功能主要用到poplib和smtplib模块. poplib用于接收邮件,而smtplib负责发送邮件. # -- coding :ut ...

  7. ROS学习之自定义srv类型

    1. 创建srv文件 cd ~/catkin_ws/src/my_package mkdir srv echo "int64 a int64 b --- int64 sum" &g ...

  8. ROS通信机制(一) —— 话题(topic)与msg文件

    文章目录 简述 特点 相关常用命令 通信模型 核心元素 通信过程 代码示例(发布者和订阅者) 发布者(talker.cpp) 订阅者(listener.cpp) 配置 CMakeLists.txt 编 ...

  9. ROS通信机制一---话题通信

    文章目录 总述 1. 话题通信模型 2. 话题通信基本实现示例 2.1 发布者 2.1.1 创建发布者topic_pub.cpp文件 2.1.2 修改CMakeLists.txt文件 2.1.3 编译 ...

最新文章

  1. 全局性业务架构建模工作步骤
  2. dubbo学习笔记 第三章简介dubbo的工作原理
  3. MPEG创始人、主席:MEPG商业模式已经破裂
  4. 详解梯度爆炸和梯度消失
  5. Oracle数据库的测试用户Scott的密码为什么是Tiger?
  6. leetcode python3 简单题205. Isomorphic Strings
  7. 鸿蒙2.0手机版体验,华为鸿蒙OS 2.0手机版功能抢先曝光:体验前所未有
  8. Django:我是怎么做到使用django动态定义表单(form)的 .
  9. MyEclipse查看.class文件
  10. 如何在 Mac 上控制对摄像头的访问?
  11. 公式编辑器mathtype中插入空格与公式编号右对齐
  12. Access应用实例——图书借阅管理系统
  13. 浪涌保护器ant120_ANT120/530/1P浪涌保护器服务周到漳州
  14. 【算法】-8大排序算法总结-Python
  15. 揭露杀毒软件的那些密秘
  16. 鸿蒙车机系统合作,鸿蒙OS车机系统来了!华为吉利合作曝光,博越Pro或率先用上...
  17. 安全运维 | 八大运维监控平台及选型推荐
  18. 基于office三件套的一次性权限维持
  19. ubuntu14.04LTS下搜狗输入法问题汇总 (搜狗输入法崩溃,搜狗输入法候选区乱码,没有搜狗输入法皮肤)
  20. 查看域名证书到期时间

热门文章

  1. HTC One V卡刷RUU准备工作 图文教程详解
  2. 微信公众号开发-网页授权——配置测试账号
  3. 新能源汽车800V电机驱动技术分析
  4. 数据恢复软件BadCopy ProV4.10
  5. DAESUNG控制器维修振动盘控制器维修DSC-300-2
  6. 从DDPM到GLIDE:基于扩散模型的图像生成算法进展
  7. BT网站被关后 最大电驴下载网陷“故障门”
  8. SAE J2534介绍
  9. python开发网页视频播放器_暴风影音没了,我们就用Python做个播放器吧
  10. iOS设置主题颜色方便使用