ROS 使用记录(3) 自定义消息格式

2023-05-16

文章目录

    • 0. 前言
    • 1. 创建 `.msg` 文件
    • 2. 构建 pkg 解析 `.msg` 文件
    • 3. 在其他 pkg 中使用自定义消息

0. 前言

  • ROS 中可通过 publisher/subscriber 和 topic 实现设计模式中的发布-订阅模式。而传递数据的基本数据结构就是message(消息)

  • ROS 中定义了很多消息格式,比如数字、字符串、图片等。然而,在实际开发过程中,往往需要自己定义消息格式。

  • 自定义消息的实际使用可分为三个部分

    • 第一步:确定数据结构,创建 .msg 文件
    • 第二步:构建一个包(pkg),解析上面的 .msg 文件,并发布该消息结构
    • 第三步:在其他包中,使用自定义消息结构
  • 参考资料:

    • 官方文档-自定义消息
    • 官方文档-创建ROS消息和服务

1. 创建 .msg 文件

  • 参考资料:官方文档-msg

  • ROS 有自己的 Message Description Language,专门用于 .msg 文件的创建。

  • 每个 .msg 文件最终都对应一个类,文件中每一行对应一个成员变量,格式如下

fieldtype1 fieldname1
fieldtype2 fieldname2
fieldtype3 fieldname3
  • fieldtype 注意事项
    • 有四种类别,分别是内置类型(如float32)、其他定义的消息类型(如geometry_msgs/PoseStamped)、数组(长度可以固定,也可以不固定,如 float32[]float32[10])、特殊类型 Header
    • 内置类型如下图所示

image-20210903105539002

  • Header 类型是 std_msgs 中定义的
#Standard metadata for higher-level flow data types
#sequence ID: consecutively increasing ID
uint32 seq
#Two-integer timestamp that is expressed as:
# * stamp.secs: seconds (stamp_secs) since epoch
# * stamp.nsecs: nanoseconds since stamp_secs
# time-handling sugar is provided by the client library
time stamp
#Frame this data is associated with
string frame_id
  • 以目标检测结果为例,定义自定义消息类型 BoxesMsg.msg
    • 每张图片的检测结果对应一个 BoxesMsg 对象
    • 内容包括:header、物体数量、x1y1x2y2形式的坐标、box置信度、box类别
Header header
int32 num_objects
float32[] coords
float32[] socres
int32[] classes

2. 构建 pkg 解析 .msg 文件

  • 本文构建 custom_msg 包来解析上面提到的 BoxesMsg.msg

  • 步骤一:修改 package.xml

    • 如果指定了其他包定义的自定义消息,则需要确保在package中引入了其他的包。
      • 例如,要使用 Header 就需要引入 std_msgs
    • build_dependbuild_export_depend 中添加 message_generation
    • exec_depend 中添加 message_runtime
  <build_depend>message_generation</build_depend>
  <build_export_depend>message_generation</build_export_depend>
  <exec_depend>message_runtime</exec_depend>
  • 步骤二:修改 CMakeLists.txt
    • find_package 中添加 message_generation
    • 添加 add_message_filesgenerate_messages,注意,前后顺序不能改变
find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
  message_generation
)

# 自定义消息相关配置
add_message_files(
  FILES
  BoxesMsg.msg
)
generate_messages(
  DEPENDENCIES
  std_msgs
)

3. 在其他 pkg 中使用自定义消息

  • 本质就是 引用同一工作区中pkg,这个本文就不介绍了。
  • 现在主要看一下在源码中如何使用
    • 前提:在 custom_msgs 包中添加了 BoxesMsg.msg 文件。
  • 在其他包中使用 BoxesMsg.msg 主要包括
    • 添加头文件:#include "custom_msgs/BoxesMsg.h",即 <包名/文件名.h>
    • 可使用对象:BoxesMsgBoxesMsgPtrBoxesMsgConstPtr,顾名思义,第一个是普通类,第二个和第三个都是第一个对象的指针。
    • 对象中成员变量对应数据类型:
      • msg中内置类型对应C++类型的关系表,在第一章中有截图
      • 数组类型对应C++中的 std::vector
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS 使用记录(3) 自定义消息格式 的相关文章

随机推荐

  • 【实战】物联网安防监控项目【5】———把模拟数据传输到web网页、web显示mjpeg-streamer视频图像

    1 模拟数据传输到web 为了把硬件传感器上的数据上传到web网页 xff0c 我们需要在跑linux服务器的开发板上写一个应用程序 xff0c 并创建出几个线程来收集传感器检测到的数据 xff0c 通过进程 线程间通信 boa与cgic库
  • HttpGet Digest授权认证

    工具类 xff1a compile com burgstaller okhttp digest 1 13 import android span class hljs preprocessor content span span class
  • ubuntu下git push失败error: 无法推送一些引用到 ‘xxx ‘解决方法

    如果你在Ubuntu下使用git push上传你的代码到gitee xff0c 突然出现一行报错 xff1a To git 64 gitee com imysy twenty two thread pool test git rejecte
  • 【Linux驱动开发】并发控制机制:原子操作、自旋锁、信号量、互斥锁详解

    并发控制机制 首先我们来了解一下 操作系统的并发性 这个概念 xff1a 操作系统的并发性 concurrence xff1a 指的是两个或者两个以上事件在同一时间间隔内发生 xff0c 即这个设备一会执行这个事件一会执行那个事件 xff0
  • STM32F051K8U6按键中断实例

    引言 最近要开始做毕设了 xff0c 准备用STM32做一个平衡小车 xff0c 好久没做过STM32的裸机项目了 xff0c 做几个项目练练手 xff0c 复习一下 本例程使用STM32CubeMX配套hal库来实现按键中断和串口中断 芯
  • STM32库函数笔记分享

    之前刚开始自学的部分STM32笔记放出 xff0c 希望对新入门STM32和想要复习库函数的小伙伴们起到帮助 建立工程 1 寄存器操作方式 需要不断地查手册来了解每一位是干什么用的 优点 xff1a 代码简介 xff1b 缺点 xff1a
  • rc.exe not found.(完美解决,亲测有效)

    完美解决rc exe not found 报错出错原因解决方法完美解决 报错 这两天安装了vs2015和IVF2016 xff0c 安装完之后在运行程序的时候一直会出现rc exe not found xff0c 重新生成解决方案后还是一样
  • 单片机与上位机通过串口通信--笔记

    定义 先说什么是串口 xff1f xff08 1 xff09 他是一种通信接口 xff0c 单片机 IO 口上的复用功能 xff0c 上位机 xff08 电脑 xff09 和下位机 xff08 开发板 xff09 之间的数据传输 xff08
  • Qt 的Cmake方式如何创建资源文件

    传统的qmake创建的工程有pro qrc xff0c 但是如果使用cmake方式创建的工程就没有这两个东西 xff0c 我们公司就是在linux下使用cmake创建的Qt工程 xff0c 没有pro也看不到qrc xff0c 想在ui界面
  • 理解ROS Topic 通信频率背后的机制

    Topic是ROS的三种通信方式中最为基本 也是常用的一种 本文对于ROS的Topic通信背后的数据吞吐机制做一个较为详细 深入的介绍 Publisher ROS中发布一个topic的函数是这样的 ros span class token
  • Linux应用层例程4 串口应用编程

    本小节我们来学习 Linux 下串口应用编程 xff0c 串口 xff08 UART xff09 是一种非常常见的外设 xff0c 串口在嵌入式开发领域当中一般作为一种调试手段 xff0c 通过串口输出调试打印信息 xff0c 或者通过串口
  • Linux应用层例程7 CAN 应用编程基础

    CAN 是一种多主方式的串行通讯总线 xff0c 基本设计规范要求有高的位速率 xff0c 高抗电磁干扰性 xff0c 而且能够检测出产生的任何错误 经过几十年的发展 xff0c 现在 xff0c CAN 的高性能 高可靠性以及高实时性已被
  • 使用Socket方式调用HttpWebApi获取数据

    背景 xff1a 最近有一个需求 xff0c 单片机需要调用服务端Api获取数据 xff0c 因为一些原因单片机只能使用TCP方式 xff1b 作为服务端开发人员提供Demo 代码如下 xff08 这里用C 语言演示 xff09 using
  • git branch 和 tag的区别

    1 git branch 和 tag的区别 xff1f 1 git branch 上的修改可以保留 xff0c 例如在某个branch上commit一个新的节点 checkout到其它branch后commit的节点不会丢 2 git ta
  • 测线仪正确使用方法图解1

    测线仪正确使用方法图解1 测线仪正确使用方法图解2 测线仪正确使用方法图解3 测线仪正确使用方法图解 xff0c 我们来使用莱视威测试仪YN891 xff0c 先说说第一个功能 xff0c 测线 xff0c 首先 xff0c 我们打开旁边的
  • Git仓库分支(Branch)和标签(Tag)

    仓库的分支 Branch 规范 xff0c 影响到每个团队的工作流的一致性 xff1b 标签 Tag 便于开发团队 测 试团队和其他团队识别每个项目的版本 xff0c 特别是在协同处理线上问题的时候 xff0c 大家可以非常清楚 地知道线上
  • printf如何按二进制格式打印

    printf函数 xff1a int printf const char format format 这是字符串 xff0c 包含了要被写入到标准输出 stdout 的文本 它可以包含嵌入的 format 标签 xff0c format 标
  • QAV250四轴穿越机安装全程详解(多图)

    QAV250四轴穿越机安装全程详解 最近团队准备使用轻型穿越机QAV250做实验 xff0c 本文记录了QAV250的安装过程 xff0c 整理了开箱后较合理的安装顺序 xff0c 以及各个步骤的注意事项 xff0c 希望对有需要的朋友有所
  • 【C语言】进度条实现

    模拟电脑程序安装的进度条 提供两种方式 代码如下 xff1a include lt stdio h gt include lt string h gt include lt windows h gt void proc int i 61 0
  • ROS 使用记录(3) 自定义消息格式

    文章目录 0 前言1 创建 96 msg 96 文件2 构建 pkg 解析 96 msg 96 文件3 在其他 pkg 中使用自定义消息 0 前言 ROS 中可通过 publisher subscriber 和 topic 实现设计模式中的