ROS机器人入门第五课:话题通信自定义msg

文章目录

  • ROS机器人入门第五课:话题通信自定义msg
    • 一、介绍
    • 二、流程
      • (一)定义msg文件
      • (二)编辑配置文件
      • (三)编译
    • 三、话题通信自定义msg调用
      • (一)调用流程
        • 0.vscode配置
        • 1.发布方
        • 2.订阅方
        • 3.权限设置
        • 4.配置 CMakeLists.txt
        • 5.执行

ROS机器人入门第五课:话题通信自定义msg

一、介绍

在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如: 激光雷达的信息… std_msgs 由于描述性较差而显得力不从心,这种场景下可以使用自定义的消息类型

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

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

  • float32, float64

  • string

  • time, duration

  • other msg files

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

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

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

二、流程

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

(一)定义msg文件

功能包下新建 msg 目录,添加文件 person.msg

string name
uint16 age
float64 height

(二)编辑配置文件

  1. package.xml中添加编译依赖与执行依赖
  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>
  <!-- 
  exce_depend 以前对应的是 run_depend 现在非法
  -->

在这里插入图片描述
2. CMakeLists.txt编辑 msg 相关配置

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)
# 需要加入 message_generation,必须有 std_msgs

在这里插入图片描述

## 配置 msg 源文件
add_message_files(
  FILES
  Person.msg
)

在这里插入图片描述

# 生成消息时依赖于 std_msgs
generate_messages(
  DEPENDENCIES
  std_msgs
)

在这里插入图片描述

#执行时依赖
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES demo02_talker_listener
  CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

在这里插入图片描述

(三)编译

ctrl + shift + B

编译后的中间文件查看:
Python 需要调用的中间文件(…/工作空间/devel/lib/python3/dist-packages/包名/msg)

在这里插入图片描述
后续调用相关 msg 时,是从这些中间文件调用的

三、话题通信自定义msg调用

需求:

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

分析:

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

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

(一)调用流程

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

为了方便代码提示以及误抛异常,需要先配置 vscode,将前面生成的 python 文件路径配置进 settings.json

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

这段代码是一个ROS(Robot Operating System)的Python节点,用于发布包含个人信息的消息。它导入了ROS的python库rospy和自定义的消息类型person。接下来,我会逐行提供详细的注释:

#! /usr/bin/env python
# - coding: utf-8 -*-

# 导入 rospy,这是编写 ROS 节点的python库。
import rospy
# 导入自定义的消息类型,person 是我们自定义的消息类型,它应该已经在 ROS 的 msg 包中定义。
from msg.msg import person

# __name__ == "__main__" 确保当这个脚本被执行而不是被导入时,以下代码块将被运行。
if __name__ == "__main__":
    # 1. 初始化 ROS 节点,名为 "talker_person_p"。
    rospy.init_node("talker_person_p")
    
    # 2. 创建发布者对象,它将发布 person 类型的消息到 "chatter_person" 话题,队列大小设置为 10。
    pub = rospy.Publisher("chatter_person", person, queue_size=10)
    
    # 3. 组织要发布的消息,创建一个 person 类型的实例 p,并设置其属性。
    p = person()
    p.name = "zhangsan"  # 设置人的名字为 "zhangsan"。
    p.age = 18           # 设置年龄为 18。
    p.height = 0.75      # 设置身高为 0.75 米。

    # 4. 编写消息发布逻辑。
    rate = rospy.Rate(1)  # 设置一个发布频率,1Hz,每秒发布一次。
    rospy.sleep(3)        # 休眠3秒,给ROS系统一些启动时间。
    
    # while 循环会在 ROS 节点没有被关闭的情况下持续运行。
    while not rospy.is_shutdown():
        pub.publish(p)  # 发布消息,将 person 实例 p 发布到 "chatter_person" 话题。
        rate.sleep()    # 使用前面设置的频率来休眠,确保以 1Hz 的频率发布消息。
        
        # rospy.loginfo 用于输出日志信息,这里输出了 person 实例 p 的所有信息。
        rospy.loginfo("姓名:%s, 年龄:%d, 身高:%.2f", p.name, p.age, p.height)

现在,让我详细解释一下你提问中的ros函数:

  • rospy.init_node("talker_person_p"): 这个函数初始化一个ROS节点,节点的名称是 "talker_person_p"。在ROS中,节点是运行的基本单元,每个节点都有自己的名字。
  • rospy.Publisher("chatter_person",person,queue_size=10): 这个函数创建一个Publisher对象,用于发布消息。它告诉ROS你想要发布“chatter_person”这个话题上的person类型消息。queue_size参数指定了消息队列的大小,这里设置为10,意味着如果数据处理不过来,它将缓存10条消息。
  • rospy.Rate(1): 这个函数设置了一个频率(1Hz),用于定时发布消息。
  • rospy.sleep(3): 使得节点休眠3秒钟。
  • rospy.is_shutdown(): 这个函数会检查你的ROS节点是否应该被关闭(例如,如果有人按下Ctrl+C或者如果ROS核心已经关闭)。
  • pub.publish(p): 通过前面创建的pub发布者对象,发布消息p
  • rate.sleep(): 根据之前定义的rate来使程序休眠,以保持1Hz的发布频率。
  • rospy.loginfo(...): 输出日志信息到命令行和ROS日志文件,便于调试和记录状态。

代码中需要改的地方:

  • from msg.msg import person :from 包名.msg import 自定义msg文件名
  • pub = rospy.Publisher("chatter_person", person, queue_size=10):pub = rospy.Publisher(“chatter_person”, 自定义msg文件名, queue_size=10)
  • p = person():p = 自定义msg文件名()
2.订阅方

这段代码定义了一个ROS(Robot Operating System)的Python订阅节点,用于订阅包含个人信息的消息。它同样使用了rospy库以及自定义的消息类型person。让我为你逐行提供注释:

#! /usr/bin/env python
# - coding: utf-8 -*-
"""
    订阅方:
        订阅消息
"""

# 导入ROS的Python库rospy。
import rospy
# 从msg包导入自定义的消息类型,person必须已经在ROS的msg包中定义了。
from msg.msg import person

# 定义回调函数doPerson,它将在接收到消息时被调用。
def doPerson(p):
    # 输出接收到的消息内容:人的名字、年龄和身高。
    rospy.loginfo("接收到的人的信息:%s, %d, %.2f", p.name, p.age, p.height)

# 确保当脚本被直接执行时,下面的代码块会运行。
if __name__ == "__main__":
    # 1. 初始化ROS节点,名称为"listener_person_p"。
    rospy.init_node("listener_person_p")
    
    # 2. 创建订阅者对象,订阅名为"chatter_person"的话题,消息类型为person。
    # doPerson是收到消息时要调用的回调函数。queue_size=10指定了消息队列的大小。
    sub = rospy.Subscriber("chatter_person", person, doPerson, queue_size=10)
    
    # 4. 调用rospy.spin()使得节点保持运行直到节点被显式地关闭或者Ctrl+C被按下。
    # 它让程序停留在一个循环中,等待和处理回调函数。
    rospy.spin()

现在,让我解释一下代码中使用的ROS函数及其功能:

  • rospy.init_node("listener_person_p"): 这个函数初始化一个ROS节点,节点的名称是"listener_person_p"。每个ROS节点都需要一个唯一的名字,这样它们就可以在ROS网络中被识别和通信。
  • rospy.Subscriber("chatter_person", person, doPerson, queue_size=10): 这个函数创建一个订阅者对象,用于订阅名为"chatter_person"的话题上的消息。这里指定消息类型为person,并且指定了一个回调函数doPerson,该函数会在接收到消息时被自动调用。queue_size参数用于控制消息队列的大小,防止处理速度跟不上接收速度导致的内存溢出。
  • rospy.spin(): 这个函数使得你的节点保持运行,等待消息的到来。它不会占用大量CPU资源,因为它会在没有消息到来时阻塞。这使得节点能够在接收到新消息时立即响应,同时也保持了低资源消耗。

简而言之,这段代码实现了一个ROS节点,它订阅了一个名为"chatter_person"的话题,用于接收包含个人信息的消息,并在接收到消息时通过日志输出这些信息。

3.权限设置

终端下进入 scripts 执行:chmod +x *.py

4.配置 CMakeLists.txt
catkin_install_python(PROGRAMS
  scripts/pub.py
  scripts/sub.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

在这里插入图片描述

5.执行

1.启动 roscore;

2.启动发布节点;

3.启动订阅节点。
在这里插入图片描述
4. 运行结果
在这里插入图片描述
PS:可以使用 rqt_graph 查看节点关系。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/505213.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文笔记 - :MonoLSS: Learnable Sample Selection For Monocular 3D Detection

论文笔记✍MonoLSS: Learnable Sample Selection For Monocular 3D Detection &#x1f4dc; Abstract &#x1f528; 主流做法限制 &#xff1a; 以前的工作以启发式的方式使用特征来学习 3D 属性&#xff0c;没有考虑到不适当的特征可能会产生不利影响。 &#x1f528; 本…

基于java+SpringBoot+Vue的网上书城管理系统设计与实现

基于javaSpringBootVue的网上书城管理系统设计与实现 开发语言: Java 数据库: MySQL技术: SpringBoot MyBatis工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 后台展示 系统简介 整体功能包含&#xff1a; 网上书城管理系统是一个基于互联网的在线购书平台&#…

基于springboot实现旅游网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现旅游网站系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c;旅游网站当然也不能排除在外&#xff0c;随着旅游网站的不断成熟&#xff0c;它彻底改变了过去传统的旅游…

CI/CD实战-jenkins结合ansible 7

配置主机环境 在jenkins上断开并删除docker1节点 重新给master添加构建任务 将server3&#xff0c;server4作为测试主机&#xff0c;停掉其上后面的docker 在server2&#xff08;jenkins&#xff09;主机上安装ansible 设置jenkins用户到目标主机的免密 给测试主机创建用户并…

windows操作系统本地部署开源语言模型ChatGLM3-6b,超详细

前言 首先感谢智谱AI和清华大学 KEG 实验室联合开源的ChatGLM3对话预训练模型&#xff0c;让我们国人有属于自己的AI聊天机器人。 ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、数学、推理、代码、知识等不…

mysql 用户管理-权限管理

学习了用户管理&#xff0c;再学习下权限管理。 3&#xff0c;权限管理 权限管理主要是对登录到MySQL的用户进行权限验证。所有用户的权限都存储在MySQL的权限表中&#xff0c;不合理的权限规划会给MySQL服务器带来安全隐患。数据库管理员要对所有用户的权限进行合理规…

C++练级之路——C++入门

1、命名空间 在C/C中会出现大量的变量&#xff0c;函数&#xff0c;起名字是一个很大的问题&#xff0c;为了防止命名重复&#xff0c;就出现了命名空间的概念&#xff0c;使用命名空间的目的是对标识符的名称进行本地化&#xff0c;以避免命名冲突和名字污染 #include <st…

黄金涨是商品牛市的领先信号

自2022年11月以来&#xff0c;黄金价格持续上涨&#xff0c;目前已经突破历史新高&#xff0c;历史上黄金上涨&#xff0c;大多是商品全面牛市的领先信号。在2008年Q4、2019年也出现过&#xff0c;黄金比其他商品更强&#xff0c;但随后的2009年和2020年均是商品的全面牛市。同…

AI副业拆解:使用Suno生成你的专属歌曲

大家好我是在看&#xff0c;记录普通人学习探索AI之路。 今天和大家拆解Suno的定制个性化音乐&#xff0c;Suno应用程序热度非凡&#xff0c;其独特之处在于&#xff0c;用户仅需提供歌词内容与期望的歌曲风格&#xff0c;即可一键生成专属曲目。 Suno的诞生&#xff0c;无疑…

考研数学|零基础张宇全年复习规划+资料分享

可以全程张宇老师的高等数学&#xff0c;张宇老师的拿手绝活是 但是其他科目&#xff0c;还有更好的选择&#xff0c;比如线性代数&#xff0c;汤家凤老师还有李永乐老师讲的都不错&#xff0c;概率论&#xff0c;余丙森老师还有方浩老师讲的很好。下面我就讲清楚&#xff0c;…

FPGA时序优化之Reduce MUXF Mapping

我们都知道&#xff0c;FPGA中的拥塞有&#xff1a;全局拥塞&#xff0c;短线拥塞和长线拥塞。 今天我们就来看短线拥塞的一种解决方案&#xff1a;Reduce MUXF Mapping。 UltraScale的CLB资源 在介绍Reduce MUXF Mapping&#xff0c;我们需要知道什么是MUXF&#xff0c;这就…

MongoDB Atlas维护指南:常见类型、注意事项与窗口设置

为了给Atlas用户更好的产品体验&#xff0c;MongoDB产品团队会进行定期维护。 本文将会介绍&#xff1a; 常见维护项目种类及频率&#xff0c;注意事项维护期间的影响及建议维护窗口设置说明维护告警设置和邮件通知范例 维护窗口常见项目 定期SSL证书轮换软件升级&#xff…

内网渗透-(黄金票据和白银票据)详解(一)

目录 一、Kerberos协议 二、下面我们来具体分析Kerberos认证流程的每个步骤&#xff1a; 1、KRB_AS-REQ请求包分析 PA-ENC-TIMESTAMP PA_PAC_REQUEST 2、 KRB_AS_REP回复包分析&#xff1a; TGT认购权证 Logon Session Key ticket 3、然后继续来讲相关的TGS的认证过程…

基于springboot+vue+Mysql的篮球论坛系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

【最全详细解读】Sora都有哪些不足与缺陷?

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型&#xff0c;由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”&#xff08;そら sora&#xff09;&#xff0c;即天空之意&#xff0c;以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

win11运行vmware报错“此平台不支持虚拟化的 amd-v/rvi”问题(已解决)

背景&#xff1a; Windows11 安装vmware17 player运行eve需要打开there &#xff08;reference:https://docs.vmware.com/cn/VMware-Workstation-Player-for-Windows/17.0/com.vmware.player.win.using.doc/GUID-3140DF1F-A105-4EED-B9E8-D99B3D3F0447.html&#xff09; 但是…

Java数据结构链表

物理上不一定连续&#xff0c;但逻辑上连续 链表是由一个一个的节点组织起来的&#xff0c;整体就叫做链表。 public class MySingleLinkedList {//将节点定义为内部类class ListNode{//节点有两个域public int val;public ListNode next;//next为引用类型public ListNode(int…

【C++入门】输入输出、命名空间、缺省参数、函数重载、引用、内联函数、auto、基于范围的for循环

目录 命名空间 命名空间的定义 命名空间的使用 输入输出 缺省参数 函数重载 引用 常引用 引用的使用场景 内联函数 auto 基于范围的for循环 命名空间 请看一段C语言的代码&#xff1a; #include <stdio.h> #include <stdlib.h>int rand 10;int main…

机器学习-关联规则算法Apriori及编码实现

一、前置知识 在了解关联规则之前首先了解一些相关概念&#xff0c;包含项集、频繁项集、支持度、置信度、提升度等基础概念。假如我们在经营一家商品超市&#xff0c;顾客进行购买商品的订单信息如下&#xff1a; TID ItemsT1 {耳机&#xff0c;背包}T2{背包&#xff0c;手…

实践笔记-harbor仓库镜像上传与拉取

harbor仓库镜像上传与拉取 1.上传镜像修改 daemon.json 配置文件上传镜像至harbor 2.拉取镜像登录账号&#xff08;跟上传镜像那里一样操作登录步骤就可以了&#xff09;拉取镜像 环境&#xff1a;centos7 1.上传镜像 修改 daemon.json 配置文件 # 编辑daemon.json文件&#…