Logo

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)
    • 节点实现代码

include/

  • 作用:存放C++头文件
  • 规范要求
    • 头文件与源文件同名但扩展名为.hpp/.h
    • 采用命名空间/包名的目录结构 (如my_pkg/include/my_pkg/)

📁 通信定义

msg/

  • 作用:定义自定义消息类型
  • 工作流程
    1. 创建.msg文件 (如MyMessage.msg)
    2. package.xml中添加message_generation依赖
    3. 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启动脚本
    • 自动化测试脚本

🛠 最佳实践建议

  1. 命名规范

    • 包名使用小写和下划线
    • C++头文件采用.hpp扩展名
  2. 编译优化

    add_compile_options(-Wall -Wextra -Wpedantic)  # 启用严格编译检查
    
  3. 消息版本控制

    # 在消息定义中加入版本标记
    uint32 MSG_VER = 1  # [v1.0] Initial version
    
  4. 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策略队列缓存超时重试
适用场景传感器数据流即时控制指令

© 2025 All rights reservedBuilt with Flowershow Cloud

Built with LogoFlowershow Cloud