ROS
ROS
ROS包中src文件夹结构解析
CMakeLists.txt
# package的编译规则(必须)package.xml
# package的描述信息(必须)src/
# 源代码文件include/
# C++头文件scripts/
# 可执行脚本msg/
# 自定义消息srv/
# 自定义服务models/
# 3D模型文件urdf/
# urdf文件launch/
# launch文件
📁 核心配置文件
CMakeLists.txt
- 作用:定义包的编译规则和构建流程
- 关键功能:
- 声明依赖的库/包 (
find_package()
) - 配置可执行文件/库的编译 (
add_executable()
/add_library()
) - 指定安装规则 (
install()
)
- 声明依赖的库/包 (
package.xml
- 作用:描述包的元数据信息
- 包含内容:
- 包名/版本/描述
- 维护者/作者信息
- 依赖项 (
build_depend
/exec_depend
) - 软件许可协议
📁 代码与资源目录
src/
- 作用:存储源码文件
- 典型内容:
- C++源文件 (
.cpp
) - Python脚本 (
.py
) - 节点实现代码
- C++源文件 (
include/
- 作用:存放C++头文件
- 规范要求:
- 头文件与源文件同名但扩展名为
.hpp
/.h
- 采用
命名空间/包名
的目录结构 (如my_pkg/include/my_pkg/
)
- 头文件与源文件同名但扩展名为
📁 通信定义
msg/
- 作用:定义自定义消息类型
- 工作流程:
- 创建
.msg
文件 (如MyMessage.msg
) - 在
package.xml
中添加message_generation
依赖 - 在
CMakeLists.txt
中配置消息生成
- 创建
srv/
- 作用:定义服务请求与响应格式
- 文件结构:
# Request部分 int32 a int32 b --- # 分隔线 # Response部分 int32 sum
📁 系统配置
launch/
- 作用:存储启动配置文件
- 典型应用:
- 批量启动节点
- 设置ROS参数
- 加载命名空间
- 包含其他launch文件
urdf/
- 作用:存放URDF(Unified Robot Description Format)模型
- 包含内容:
- 机器人本体描述文件
- 传感器安装配置
- 运动学参数定义
📁 仿真资源
models/
- 作用:存储Gazebo仿真模型
- 文件结构:
model_name/ ├── model.config # 模型元数据 └── model.sdf # 模型实体定义
📁 脚本工具
scripts/
- 作用:存放可执行脚本
- 典型类型:
- Python节点 (需添加执行权限
chmod +x
) - Bash启动脚本
- 自动化测试脚本
- Python节点 (需添加执行权限
🛠 最佳实践建议
-
命名规范:
- 包名使用小写和下划线
- C++头文件采用
.hpp
扩展名
-
编译优化:
add_compile_options(-Wall -Wextra -Wpedantic) # 启用严格编译检查
-
消息版本控制:
# 在消息定义中加入版本标记 uint32 MSG_VER = 1 # [v1.0] Initial version
-
launch文件调试:
<node pkg="my_pkg" type="node" name="debug_node" output="screen" launch-prefix="xterm -e gdb --args"/>
ROS运行时的核心组件
以下是ROS运行时核心组件的关系解析及图示:
ROS运行时架构图解
+----------------+ Topic (异步) +----------------+
| Publisher | ----------------------> | Subscriber |
| (Node A) | <---------------------- | (Node B) |
+----------------+ 单向数据流 +----------------+
/image_raw
/odometry
/cmd_vel
+----------------+ Service (同步) +----------------+
| Service | <------------------------ | Service |
| Client | ------------------------> | Server |
| (Node C) | 请求/响应模型 | (Node D) |
+----------------+ /add_two_ints +----------------+
核心关系解析
1. 节点(Node) • 角色:独立进程,功能执行单元
• 交互方式:
• 通过话题发布/订阅消息
• 通过服务请求/响应
• 通过参数服务器读写配置
2. 话题(Topic) • 通信模式:发布-订阅(Pub-Sub)
• 数据流向:单向异步
• 典型场景:
# 发布者(激光雷达驱动节点)
pub = rospy.Publisher('/scan', LaserScan, queue_size=10)
# 订阅者(导航节点)
rospy.Subscriber('/scan', LaserScan, scan_callback)
3. 服务(Service) • 通信模式:客户端-服务端(Client-Server)
• 数据流向:双向同步
• 典型场景:
# 服务端(加法计算节点)
srv = rospy.Service('/add_two_ints', AddTwoInts, handle_add)
# 客户端(调用方节点)
client = rospy.ServiceProxy('/add_two_ints', AddTwoInts)
res = client(2, 3) # 返回5
数据流细节对比
特性 | 话题(Topic) | 服务(Service) |
---|---|---|
通信方向 | 单向 | 双向(请求+响应) |
时效性 | 异步 | 同步 |
数据持久化 | 最新数据覆盖 | 每次请求独立处理 |
多对多支持 | ✔️ | ❌ (1对1) |
典型QoS策略 | 队列缓存 | 超时重试 |
适用场景 | 传感器数据流 | 即时控制指令 |