当前位置: 首页 > news >正文

详细介绍:【ROS2】 从通信接口文件到头文件的转换

在这里插入图片描述

ROS 系列学习教程(总目录)
ROS2 系列学习教程(总目录)

目录

  • 一、命名校验
  • 二、文件解析与转换流程
  • 三、编写接口文件并配置CMake
  • 四、执行colcon build
  • 五、rosidl_adapter进行IDL解析
  • 六、命名转换
  • 七、rosidl_parser语法分析
  • 八、模版引擎渲染

在ROS2中,接口文件命名和生成的头文件命名有自己的转换机制。

一、命名校验

这一部分ROS1到ROS2有比较大的变化,单独拿出来介绍一下。

ROS1对命名校验比较宽松甚至没有校验,而且校验比较分散,ROS2中有了比较严格的命名校验,集中放在 rosidl_adapter 包的 parser.py 中,源码路径如下:

/opt/ros/jazzy/lib/python3.12/site-packages/rosidl_adapter/parser.py

校验类型与规则:

校验类型规则符合规则的常用命名法有效示例无效示例
功能包名称(VALID_PACKAGE_NAME_PATTERN)
接口变量字段名称(VALID_FIELD_NAME_PATTERN)
必须以小写字母开头
只能包含小写字母、数字和下划线
不允许连续两个下划线
不允许以下划线结尾
长度至少为1个字符
(小)蛇形命名法user_name
test123
variable
userName
username_

user__name
接口文件名称(VALID_MESSAGE_NAME_PATTERN)必须以大写字母开头
只能包含:大写字母、小写字母、数字
不允许包含下划线
不允许以下划线结尾
不允许连续特殊字符
长度至少为1个字符
大驼峰命名法UserName
Test123
XML
userName
user_name
UserTest_
接口常量字段名称(VALID_CONSTANT_NAME_PATTERN)必须以大写字母开头
只能包含:大写字母、数字、下划线
不允许以下划线结尾
不允许连续两个下划线
长度至少为1个字符
大蛇形命名法USER
MAX_SIZE
API_KEY_123
MixedCase
user
1ST_PLACE

对于 接口变量字段名称 和 接口文件名称,ROS2比ROS1的校验更严格了。对于从ROS1迁移到ROS2的工程,官方还提供了ROS1兼容的校验选项,如下 VALID_FIELD_NAME_PATTERNVALID_MESSAGE_NAME_PATTERN

请添加图片描述

二、文件解析与转换流程

模板引擎渲染
变量替换
资源模板加载
生成头文件
rosidl_parser 语法分析
语法分析
词法分析
语义分析
转换为AST抽象语法树
rosidl_adapter IDL解析
命名校验
.msg文件读取
转换为标准IDL
编写接口文件并配置CMake
执行colcon build
生成对应语言的接口生成器的配置文件
rosidl_generator_xxx__arguments.json
包名/消息名转换: 大驼峰->下划线
sensor_data.h
sensor_data.c
编译系统集成
头文件安装

三、编写接口文件并配置CMake

编写接口文件后,我们需要在CMakeLists.txt中的rosidl_generate_interfaces宏配置接口文件。

# 设置接口文件
set(msg_files"msg/RobotStatus.msg""msg/MotorCommand.msg"
)
set(srv_files"srv/CalculatePath.srv""srv/SetLED.srv"
)
set(action_files"action/NavigateToGoal.action"
)
# 生成接口
rosidl_generate_interfaces(${PROJECT_NAME}${msg_files}${srv_files}${action_files}DEPENDENCIESstd_msgsgeometry_msgsaction_msgs
)

这是我们使用ROS接口,需要用户操作的为数不多的步骤。

四、执行colcon build

当我们触发编译,CMake宏 rosidl_generate_interfaces 会读取用户定义的 .msg.srv.action 接口文件,并将他们交给 rosidl_adapter 包做下一步处理。

该宏位于:

/opt/ros/jazzy/share/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake

五、rosidl_adapter进行IDL解析

IDL即 Interface Definition Language(接口定义语言),ROS2 底层使用 OMG IDL(Object Management Group Interface Definition Language)作为其标准的、与编程语言无关的接口描述格式。

在这一步我们直接编写的 .msg.srv.action 文件会在构建过程中被转换为等价的 .idl 文件,用于后续的语法分析。

这个转换过程由 rosidl_adapter 包处理,命名校验也是在这一步进行的。

生成的 .idl 文件一般存放在 build/<接口功能包名称>/rosidl_adapter 路径下,

RobotStatus.msg的内容如下:

# 机器人状态信息
std_msgs/Header header
string robot_name
uint8 battery_level  # 电池电量百分比
bool is_connected    # 连接状态
float32 temperature  # 温度摄氏度
geometry_msgs/Pose2D current_pose  # 使用现有的geometry_msgs

生成的RobotStatus.idl如下:

// generated from rosidl_adapter/resource/msg.idl.em
// with input from hello_world_interface/msg/RobotStatus.msg
// generated code does not contain a copyright notice
#include "geometry_msgs/msg/Pose2D.idl"
#include "std_msgs/msg/Header.idl"
module hello_world_interface {module msg {@verbatim (language="comment", text="机器人状态信息")struct RobotStatus {std_msgs::msg::Header header;string robot_name;@verbatim (language="comment", text="电池电量百分比")uint8 battery_level;@verbatim (language="comment", text="连接状态")boolean is_connected;@verbatim (language="comment", text="温度摄氏度")float temperature;@verbatim (language="comment", text="使用现有的geometry_msgs")geometry_msgs::msg::Pose2D current_pose;};};
};

六、命名转换

ROS2除了对包名、接口文件名、变量名和常量名加强了校验,还强制定义了接口头文件命名规则为(小)蛇形命名法。在这一步,ROS2会将接口文件名根据该规则生成对应的头文件名。

该转换实现接口 convert_camel_case_to_lower_case_underscore() 位于:

/opt/ros/jazzy/lib/python3.12/site-packages/rosidl_pycommon/__init__.py

七、rosidl_parser语法分析

生成与编程语言无关的 idl 文件后,rosidl_parser包将读取 idl 文件,根据给定的语法规则对其进行语法分析,并生成抽象语法树(Abstract Syntax Tree, AST),用于后续不同编程语言生成各自的依赖文件。

给定的语法规则在:

/opt/ros/jazzy/lib/python3.12/site-packages/rosidl_parser/grammar.lark

语法分析部分在:

/opt/ros/jazzy/lib/python3.12/site-packages/rosidl_parser/parser.py

AST是一个树形结构,记录了输入文本是如何根据给定的语法规则被解析出来的。它没有保存到文件,只是在内存中的中间产物,要查看它需要修改ROS2源码或自己编写调试代码,示例调试代码如下:

#!/usr/bin/env python3
"""
get_ast.py - 调试 AST 生成的脚本
"""
import sys
from pathlib import Path
from rosidl_parser.definition import IdlLocator
from rosidl_parser.parser import get_ast_from_idl_string
def debug_single_idl(idl_path):
print(f"解析: {idl_path}")
path = Path(idl_path)
locator = IdlLocator(
basepath = path.parent,
relative_path = path.name
)
# 解析 AST
idl_string = locator.get_absolute_path().read_text(encoding='utf-8')
tree = get_ast_from_idl_string(idl_string)
return tree
if __name__ == "__main__":
if len(sys.argv) > 1:
idl_path = sys.argv[1]
ast = debug_single_idl(idl_path)
print()
print(type(ast))
print(ast)
else:
print("用法: python get_ast.py <idl文件路径>")

由 RobotStatus.idl 生成的AST为:

在这里插入图片描述

可以看到,RobotStatus.msg 内容只有几行,生成的AST已经非常复杂。

由于AST在这里不是重点,不再赘述,感兴趣的同学可以自行查阅。

八、模版引擎渲染

生成抽象语法树后,各语言的接口生成器便根据给定的语法规则生成对应的头文件。

该过程中的语法规则使用使用 Lark 语法定位,保存在如下文件中:

/opt/ros/jazzy/lib/python3.12/site-packages/rosidl_parser/grammar.lark

Lark 是一个现代化的 Python 解析库,用于处理上下文无关的文法。关于Lark更详细的信息,感兴趣的同学可自行查阅。

该渲染过程的实现位于如下文件中:

/opt/ros/jazzy/lib/python3.12/site-packages/rosidl_parser/parser.py

最终头文件生成目录位于:

./build/<package_name>/rosidl_generator_xx

头文件安装目录一般位于:

./install/<package_name>/include


欢迎大家加QQ群,一起讨论学习:894013891


http://www.zskr.cn/news/48366.html

相关文章:

  • 网络串流 —— 地址
  • 计算机毕业设计:Python农业数据可视化分析系统 气象数据 农业生产 粮食素材 播种数据 爬虫 Django框架 天气数据 降水量(源码+文档)✅
  • P9433 [NAPC-#1] Stage5 - Conveyors
  • P11038 【MX-X3-T5】「RiOI-4」Countless J-Light Decomposition
  • P9638 「yyOI R1」youyou 的军训
  • P1012 [NOIP 1998 提高组] 拼数
  • 同步/异步和阻塞/非阻塞学习笔记
  • 在基于FastAPI的Python开发框架后端,增加阿里云短信和邮件发送通知处理
  • 2025-11-11 PQ v.Next日志记录
  • MATLAB离群点检测与删除
  • C#标签批量打印程序开发
  • 2025年PP多功能废气净化塔生产厂家权威推荐榜单:聚丙烯多功能废气净化塔/PPH多功能废气净化塔/PPH尾气吸收塔源头厂家精选
  • 2025年新疆初三复读班权威推荐榜单:中考复读快速提分/初三补习班/初三集训班源头服务商精选
  • 2025 WMS仓库管理系统推荐排名
  • 2025年新疆初三复读班权威推荐榜单:初三补习班/初三集训班/本地中考复读学校精选
  • 基于隐语SecretFlow——TrustFlow的数据要素跨域管控
  • H3C/华三配置远程登录(SSH、Telnet)
  • 2025年三一集团战略深度解析:全球化、数智化与低碳化路径权威推荐
  • 2025年五个女博士口服美容产品深度解析:科技内核市场口碑权威测评
  • 2025年质量好的电加热导热油炉厂家最新推荐排行榜
  • 2025年热门的岫岩托玛琳床垫厂家最新TOP排行榜
  • 英飞凌TC1782微控制器实现SPI接口EEPROM读写
  • 软件分享
  • 什么是 WMS 仓库管理系统?为何当下重要?
  • IP Hash Sticky Cookie
  • 2025年11月北京继承律师排行:家事继承案件高胜率数据对比
  • 2025年11月防腐木凉亭厂家推荐榜:五强口碑评测与对比排行
  • 2025年靠谱的生态红茶厂家最新权威推荐榜
  • 2025年火力发电教学模型生产厂家权威推荐榜单:教学发电模型/核电厂模型/港口动态沙盘模型源头厂家精选
  • 2025年中国十大WMS仓库管理系统权威排名