ROS话题通信自定义msg实现发送接收(六)c++、python
目录
自定义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实现
需求:创建自定义消息,该消息包含人的信息:姓名、身高、年龄等。
流程:
- 按照固定格式创建 msg 文件
- 编辑配置文件
- 编译生成可以被 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 不需要实现,而连接的建立也已经被封装了,需要关注的关键点有三个:
- 发布方
- 接收方
- 数据(此处为自定义消息)
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实现
流程:
- 编写发布方实现;
- 编写订阅方实现;
- 为python文件添加可执行权限;
- 编辑配置文件;
- 编译并执行。
{"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相关推荐
- ROS话题通信c++和python实现
机器人是一种高度复杂的系统性实现,在机器人上可能集成各种传感器(雷达.摄像头.GPS...)以及运动控制实现,为了解耦合,在ROS中每一个功能点都是一个单独的进程,每一个进程都是独立运行的.更确切的讲 ...
- 【ROS话题通信】发布者和订阅者
前言 本文记录ROS话题通信的学习过程,便于后续复习.首先明确,ROS中的话题通信,在ROS通信中非常重要,实现了分布式发布接收消息,也是实现了不同编程语言间的解耦,下面记录下自己学习过程中的相关代码 ...
- 【ROS入门-4】嘴对嘴讲解ROS的核心概念——ROS话题通信机制
文章目录 前言 ROS系列文章 ROS的通信机制 话题(topic) 发布者 订阅者 消息(Message) 用C++来写话题通信的代码 发布者 订阅者 使用rqt_graph 源码附录 引用说明 参 ...
- ROS话题通信中创建自定义数据类型的两种方式
一.在同一个功能包下创建.msg文件 1.在功能包目录下创建msg文件夹 2.在文件夹中创建.msg文件 3.在该功能包的package.xml文件中加入: <build_depend>m ...
- 【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )
文章目录 I UDP 信息发送接收原理 II UDP 发送和接收端口相同 III UDP 发送信息代码示例 IV UDP 接收信息代码示例 V UDP 服务器端代码示例 VI UDP 客户端代码示例 ...
- python邮件模块_Python收发邮件模块,用,来,发送,接收
用Python来发送接收邮件模块 python实现发送和接收邮件功能主要用到poplib和smtplib模块. poplib用于接收邮件,而smtplib负责发送邮件. # -- coding :ut ...
- ROS学习之自定义srv类型
1. 创建srv文件 cd ~/catkin_ws/src/my_package mkdir srv echo "int64 a int64 b --- int64 sum" &g ...
- ROS通信机制(一) —— 话题(topic)与msg文件
文章目录 简述 特点 相关常用命令 通信模型 核心元素 通信过程 代码示例(发布者和订阅者) 发布者(talker.cpp) 订阅者(listener.cpp) 配置 CMakeLists.txt 编 ...
- ROS通信机制一---话题通信
文章目录 总述 1. 话题通信模型 2. 话题通信基本实现示例 2.1 发布者 2.1.1 创建发布者topic_pub.cpp文件 2.1.2 修改CMakeLists.txt文件 2.1.3 编译 ...
最新文章
- 全局性业务架构建模工作步骤
- dubbo学习笔记 第三章简介dubbo的工作原理
- MPEG创始人、主席:MEPG商业模式已经破裂
- 详解梯度爆炸和梯度消失
- Oracle数据库的测试用户Scott的密码为什么是Tiger?
- leetcode python3 简单题205. Isomorphic Strings
- 鸿蒙2.0手机版体验,华为鸿蒙OS 2.0手机版功能抢先曝光:体验前所未有
- Django:我是怎么做到使用django动态定义表单(form)的 .
- MyEclipse查看.class文件
- 如何在 Mac 上控制对摄像头的访问?
- 公式编辑器mathtype中插入空格与公式编号右对齐
- Access应用实例——图书借阅管理系统
- 浪涌保护器ant120_ANT120/530/1P浪涌保护器服务周到漳州
- 【算法】-8大排序算法总结-Python
- 揭露杀毒软件的那些密秘
- 鸿蒙车机系统合作,鸿蒙OS车机系统来了!华为吉利合作曝光,博越Pro或率先用上...
- 安全运维 | 八大运维监控平台及选型推荐
- 基于office三件套的一次性权限维持
- ubuntu14.04LTS下搜狗输入法问题汇总 (搜狗输入法崩溃,搜狗输入法候选区乱码,没有搜狗输入法皮肤)
- 查看域名证书到期时间