尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
第122篇 自定义消息类型——rosidl与接口设计
面试被问你自定义过ROS2的消息类型吗流程是怎样的我说写过.msg文件。面试官说CMakeLists.txt里怎么配置自定义的消息怎么在Python和C之间互操作接口设计有什么原则自定义消息是ROS2开发的基本功但很多人只停留在会写.msg文件的层面。今天把整个流程和接口设计的原则讲清楚。为什么需要自定义消息ROS2的标准消息类型覆盖了大部分常见场景。但你的项目总有一些特殊需求自定义的传感器数据格式、特定的控制指令结构、业务逻辑相关的状态信息。标准类型满足不了的时候就需要自定义消息类型。创建消息类型第一步在包的msg/目录下创建.msg文件# RobotStatus.msg std_msgs/Header header string robot_name float32 battery_level bool is_charging float32[] joint_positions float32[] joint_velocities uint8 state uint8 IDLE0 uint8 MOVING1 uint8 ERROR2消息类型支持的字段基本类型bool、int8-64、uint8-64、float32/64、string、数组固定长度和可变长度、其他消息类型、常量定义。第二步在CMakeLists.txt中添加依赖和配置find_package(rosidl_default_generators REQUIRED) find_package(std_msgs REQUIRED) rosidl_generate_interfaces(${PROJECT_NAME} msg/RobotStatus.msg DEPENDENCIES std_msgs )第三步在package.xml中添加依赖build_dependrosidl_default_generators/build_depend exec_dependrosidl_default_runtime/exec_depend member_of_grouprosidl_interface_packages/member_of_group dependstd_msgs/depend编译之后ROS2会自动生成Python和C的代码。Python中通过from my_package.msg import RobotStatus使用C中通过#include my_package/msg/robot_status.hpp使用。自定义Service和Action类型同样的流程可以用于Service和Action# CalculatePath.srv geometry_msgs/Pose start geometry_msgs/Pose goal --- bool success geometry_msgs/Pose[] path float32 total_distance# PatrolRobot.action geometry_msgs/Pose[] waypoints float32 speed --- bool all_reached float32 total_time --- uint32 current_waypoint_index float32 distance_to_nextService用.srv文件Action用.action文件。格式都是请求和响应或目标、反馈、结果用---分隔。接口设计原则自定义消息不是随便定义字段就行。好的接口设计能让你的系统更易维护、更易扩展。单一职责。一个消息类型只描述一个概念。RobotStatus描述机器人状态SensorReading描述传感器读数。不要把不相关的信息塞到同一个消息里。使用标准类型。能用geometry_msgs/Pose就不要自己定义float64 x, y, z, qx, qy, qz, qw。标准类型有现成的工具支持和其他包对接也方便。包含Header。如果你的消息会通过Topic传输加上std_msgs/Header字段。Header提供时间戳和frame_id这在调试和多传感器融合时至关重要。版本号。如果消息类型可能会变化在名字或注释中标注版本。RobotStatusV2比悄悄修改RobotStatus的字段要安全得多。避免过大的消息。一个消息里塞太多数据会导致序列化开销大、传输延迟高。大数据比如图像、点云用标准类型或者考虑分块传输。跨语言使用ROS2的消息类型定义是语言无关的。rosidl工具链会自动生成Python、C甚至其他语言的绑定代码。Python中from my_package.msg import RobotStatus msg RobotStatus() msg.robot_name robot_01 msg.battery_level 85.5 msg.state RobotStatus.MOVINGC中#include my_package/msg/robot_status.hpp auto msg my_package::msg::RobotStatus(); msg.robot_name robot_01; msg.battery_level 85.5; msg.state my_package::msg::RobotStatus::MOVING;注意C中的命名转换msg文件中的RobotStatus在C中变成robot_status.hpp字段名从下划线变成驼峰。rosidl自动处理这些转换。接口版本兼容项目迭代中消息类型难免要改。加个字段、改个类型看似小事处理不好就出大问题。ROS2的消息类型兼容性有一套规则新增字段默认有初始值老代码不填这个字段也不会报错这叫向后兼容。但如果你改了已有字段的类型或者删掉了某个字段老代码就编译不过了这叫不兼容变更。实际项目中的经验是优先通过添加新字段来扩展消息避免修改或删除已有字段。如果确实需要不兼容变更就创建一个新的消息类型而不是改旧的。比如RobotStatus不够用了新建一个RobotStatusV2让老节点继续用旧版本新节点用新版本平滑过渡。在大型项目中接口变更应该走代码评审流程所有依赖方都要被通知到。ROS2提供了ros2 interface相关命令可以查看消息定义对比不同版本的差异。这种接口治理的习惯在面试中很加分。面试中怎么聊面试官问自定义消息你可以说自定义消息需要在msg目录下定义.msg文件CMakeLists.txt中配置rosidl_generate_interfacespackage.xml中添加生成器和运行时依赖。编译后自动生成Python和C绑定。接口设计遵循单一职责、使用标准类型、包含Header、避免过大消息等原则。Service和Action类型也可以用同样的方式自定义。自定义消息的版本管理在长期维护的项目中自定义消息接口的版本管理很重要。修改消息字段时要考虑到向后兼容性旧的bag文件可能用的是旧格式。一个实用的做法是只添加新字段不删除或修改已有字段新字段设置默认值在消息定义中用注释标注版本号和变更历史。这样即使消息格式演进旧数据仍然可以正确读取。给你的建议在你的项目里创建一个自定义消息类型编译通过然后在Python和C中分别使用它。跑通整个流程之后你对rosidl工具链的理解会上一个台阶。然后审视一下项目中现有的消息类型定义看看有没有违反接口设计原则的地方。这种代码审查能力在面试中很加分。最后提醒一点自定义消息类型修改之后所有依赖它的节点都要重新编译。在大型项目中消息类型的变更要谨慎提前通知团队成员。上一篇第121篇 ROS2消息类型——std_msgs/sensor_msgs/geometry_msgs详解下一篇预告第123篇 URDF建模入门——从link和joint开始描述一个机器人
RELATED

相关推荐

家庭万圣节恐怖屋搭建指南:从氛围营造到互动机关全解析

家庭万圣节恐怖屋搭建指南:从氛围营造到互动机关全解析

1. 项目概述:打造一座令人难忘的万圣节恐怖屋 每年万圣节,除了讨糖和装扮,最能点燃节日氛围的莫过于一座精心布置的恐怖屋。它不仅仅是一个装饰品,更是一个沉浸式的叙事空间,一个能让家人朋友尖叫与欢笑交织的社交中心…

📅 2026/10/6 3:50:57
第121篇 ROS2消息类型——std_msgs/sensor_msgs/geometry_msgs详解

第121篇 ROS2消息类型——std_msgs/sensor_msgs/geometry_msgs详解

面试被问:"ROS2里常用的消息类型有哪些?geometry_msgs里的Pose和PoseStamped有什么区别?" 我说"Pose是位置加姿态,PoseStamped多了个时间戳"。面试官说:"那Header里除了时间戳还有什么&…

📅 2026/10/10 3:53:14
大模型驱动的人形机器人持续学习:从感知到执行的智能家居任务实践

大模型驱动的人形机器人持续学习:从感知到执行的智能家居任务实践

如果你以为人形机器人还只是实验室里笨拙地走两步的“玩具”,那第二届世界人形机器人运动会(World Humanoid Robot Games, WHRG)的家政赛项目,可能会颠覆你的认知。想象一下,一个机器人走进一个凌乱的房间,…

📅 2026/9/27 17:23:18
MORE NEWS

更多资讯

📰

从无标题文档到正式发布:先定内核再取标题的创作流程

很多人打开文档软件时,都会看到一个小尴尬:新文档默认名不是“未命名”,就是“无标题”。我自己电脑里,这种文件常年躺了一排,里面有的是灵感碎片,有的是写到一半的草稿,还有的干脆就是空白。但…

📰

斯纳克图书馆管理系统PHP版v6.0实战部署与优化指南

简介:斯纳克图书馆管理系统PHP版v6.0是一套面向中小型图书馆、高校院系资料室及数字资源管理场景的成熟Web应用系统,专为具备PHPMySQL开发基础的IT人员或信息化管理员设计,用于快速部署图书编目、借阅流通、标签打印与多终端认证一体化管理。…

📰

易支付运营版源码部署与支付通道轮询、投诉进件实战解析

简介:面向需要自建聚合支付平台的开发者与站长,这份运营版易支付系统源码提供支付宝、微信、QQ钱包、银联等多渠道免签约接入能力,支持PC扫码、H5、公众号等多种支付场景。系统基于PHP 7.4与MySQL开发,内置轮询投诉、进件管理等运…

📰

基于调频能力裕度的风电场一次调频策略解析

风电场参与电网一次调频这件事,这几年已经从不做不行,变成了怎么做得更稳、更准的问题。早些年并网要求宽松,风电场的态度基本是“有功发满就行,频率的事交给同步机”。现在新能源占比上来以后,电网对风电场调频能力的…

📰

HDFS存储优化实战:纠删码、压缩与小文件治理策略

大数据项目的存储层里,HDFS 通常是最先被塞满、却最后一个被优化的组件。大多数团队在容量告警触发之前,并不会认真考虑副本数、文件格式、冷数据沉降这些事,等磁盘真的快满了,第一反应往往是再加节点。这篇文章是我在生产环境里做…

📰

Oracle 12c SQL查询实战:从v$session到AWR追溯历史执行记录

刚接手一个Oracle 12c库,最常被问到的问题就是:“你帮我看看现在数据库里在跑什么SQL?”或者“这个SQL昨天跑了多少次?”说实话,这类需求我处理过太多回了,但每次在技术群里看到答案还是有人只会贴一个v$se…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬