type
status
date
slug
summary
tags
category
icon
password
💡
本文主要是工作空间、包的创建以及话题、服务、动作三种通信方式的代码编写。
主要采用python编写,两者区别在于python修改setup.py文件,而c++修改CMakeLists.txt文件。
 

工作空间


基础知识

ROS工作空间是一个具有特定结构的目录。通常有一个 src 子目录。在该子目录下是ROS软件包的源代码所在位置。通常该目录开始时为空。
colcon进行外部构建。默认情况下,它会创建以下目录作为 src 目录的同级目录:
  • build 目录将用于存储中间文件。对于每个软件包,将在其中创建一个子文件夹,例如在该子文件夹中调用 CMake。
  • install 目录是每个软件包将要安装到的位置。默认情况下,每个软件包将被安装到单独的子目录中。
  • log 目录包含有关每个 colcon 调用的各种日志信息。
注解
与 catkin (ROS)相比,没有 devel 目录。
 

工作区目录结构

在工作空间的根目录(ros2_ws)下运行colcon build --symlink-install 在您调整Python脚本时,无需每次重新构建命令来构建工作空间。
 

ROS2 软件包

一个工作空间可以包含任意多个软件包,每个软件包位于自己的文件夹中。您还可以在一个工作空间中拥有不同构建类型的软件包(如CMake、Python等)。但不能嵌套软件包。
  • 包运行指令:ros2 run my_package my_node
一个简单的工作空间可能如下所示:
 

工作空间创建包步骤

步骤1:创建工作空间目录
步骤2:克隆或创建包(Package)
参数
作用
常用值
是否必须
--build-type
指定构建系统
ament_cmake (C++)ament_python (Python)
--dependencies
指定包依赖
rclcpp/rclpy + 消息包
推荐指定
步骤3:安装依赖(可忽略)
步骤4:编译工作空间
步骤5:配置环境变量
包清理指令
查看包
包导航
 

package.xml

它是每个 ROS2 包必须有的文件,定义了包的所有元数据和依赖关系。
 

setup.py

setup.py 是 Python包的安装配置文件,对于 ROS2 的 Python 包来说,它告诉构建系统如何安装你的 Python 代码和资源。
它使用 Python 的 setuptools 库来定义:
  1. 包的基本信息(名称、版本等)
  1. 哪些文件需要安装
  1. 如何安装(安装位置、脚本等)
  1. 入口点(让 ROS2 能找到你的节点)
 

话题


编写第一个节点

 

发布者和订阅者代码编写

首先我们来看一下一个发布者和订阅者的代码编写步骤。
 

实例分析

为了让我们更好的了解发布者和订阅者,这里我们给出了一个简单的代码示例用作对比。
 
 
现在,作为一个新手小白,我们对代码产生了一些疑问。
  1. class MinimalSubscriber(Node):这里为什么要加上Node?
    1. 声明MinimalSubscriber 是一个 Node(节点),python需要显式声明节点。
      当然可以参考我们编写的第一个节点,我们可以直接使用node基类,而不创建自定义类。
      建议:即使是简单的节点,也使用自定义类方式,因为:
    2. 几乎不增加复杂度
    3. 为未来扩展留有余地
    4. 符合ROS2最佳实践
    5. 代码更专业、更易维护
  1. super().init('minimal_publisher')什么意思?
    1. 初始化父类:让 Node 完成基础设置
    2. 设置节点名:给节点起名为 'minimal_publisher'
    3. 启用功能:解锁 create_publisher、get_logger 等方法
    4. 遵守规则:Python 继承的标准做法
  1. 订阅者和发布者的创建格式
    1. 订阅者
      1. 发布者
      1. self.publisher_.publish下划线是什么?
        1. self.publisher_ 中的下划线 _ 是 Python 的命名约定,表示这是一个"内部使用的"或"受保护的"实例变量。
       

      创建和运行

      1. 创建Python文件
      2. 配置package.xml
      3. 配置setup.py
      4. 构建和运行
       

      服务


      服务通信流程

      • 服务端:创建服务→定义回调→等待调用
      • 客户端:连接服务→填充请求→发送→等待响应
       

      服务端和客户端代码示例

      现在,同样作为一个新手小白,我们提出几个问题。
      1. 为什么客户端要加上import sys
        1. 用于获取命令行参数,让客户端能灵活接收外部输入。
      1. 服务端和客户端创建格式
        1. 服务端
          1. 客户端
          1. 调用方式
            1. 两者响应方式
             
             

            创建和运行

            1. 修改package.xml
            2. 修改setup.py
            3. 构建和运行
             

            自定义文件


            消息(.msg文件

            消息是 ROS 2 中的单向数据通信机制,用于发布者(publisher)和订阅者(subscriber)之间的数据传输。

            消息文件包含什么?

            .msg 文件定义了数据结构,只包含字段定义

            支持的数据类型:

            1. 基本类型
                • bool:布尔值
                • int8int16int32int64:有符号整数
                • uint8uint16uint32uint64:无符号整数
                • float32float64:浮点数
                • string:字符串
                • wstring:宽字符串(用于多语言)
            1. 数组类型
                • int32[]:动态长度数组
                • float64[10]:固定长度数组(10个元素)
            1. 特殊类型
                • time:时间(ROS 2 中通常用 builtin_interfaces/Time
                • duration:时长
            1. 嵌套类型
                • 其他消息类型:geometry_msgs/Point
                • 内置接口:builtin_interfaces/Time
             

            服务(.srv文件

            服务是 ROS 2 中的请求-响应双向通信机制,客户端发送请求,服务器处理并返回响应。

            服务文件包含什么?

            .srv 文件包含请求和响应两部分,用 --- 分隔:
             

            自定义接口

            文件结构

             

            核心概念

            自定义接口 = 自定义数据结构 + 通信协议定义
            在 ROS 2 中,接口分为三种:
            1. 消息 (Messages):单向数据流,用于发布/订阅
            1. 服务 (Services):请求-响应模式,同步通信
            1. 动作 (Actions):长时间任务,带反馈和取消
             

            接口规划设计

            我们以下述需求分析表为例说明。
            通信类型
            场景
            接口名
            关键字段
            消息
            机器人状态
            RobotStatus
            batterymodeposition
            消息
            传感器数据
            SensorData
            temperaturehumiditytimestamp
            服务
            计算服务
            CalculateSum
            numbers[]result
            服务
            控制服务
            MoveRobot
            target_xtarget_ysuccess
            1. 创建接口包
              1. 创建消息、服务文件(一个文件存储一种消息类型)
                1. 消息文件
                  1. 服务文件
                  1. 配置构建系统
                    1. 修改package.xml
                      1. 修改CMakeLists.txt
                      1. 编译和测试
                        1. 编译命令
                          1. 测试接口
                          1. 在其他包中使用
                          补充对应配置文件的对应关系
                           

                          package.xml配置文件

                          依赖类型
                          作用时机
                          使用场景
                          示例
                          buildtool_depend
                          编译时
                          构建工具
                          ament_cmake
                          depend
                          编译时+运行时
                          常用库
                          rclcppstd_msgs
                          exec_depend
                          运行时
                          执行依赖
                          rosidl_default_runtime
                          test_depend
                          测试时
                          测试工具
                          ament_lint_auto
                          build_depend
                          编译时
                          仅编译需要
                          已弃用,用depend代替
                          为了更好的理解,我们详细的分析每一条配置文件。
                          1. 基本信息区
                            1. 构建依赖区
                              1. 接口生成依赖
                                1. 运行依赖
                                  1. 消息类型依赖
                                    1. 测试依赖
                                      1. 导出配置区
                                         

                                        CMakeLists.txt配置文件

                                        💡
                                        您可以在``CMakeLists.txt``中使用``set``来整洁地列出所有接口:
                                        然后一次生成所有列表,如下所示:
                                         
                                        主要包含两个部分
                                        注意:ament_package()必须要放到最后!!!
                                        1. 依赖查找区
                                          1. 接口生成区
                                            1. 参数
                                              是否可以删除
                                              作用
                                              ${PROJECT_NAME}
                                              绝对不能删
                                              指定生成的接口的命名空间/包名
                                              ${msg_files}
                                              可以(但需替换为具体文件名)
                                              要处理的接口文件列表
                                              DEPENDENCIES
                                              可以(如果没使用外部类型)
                                              声明外部依赖
                                           
                                           
                                           

                                          参数


                                          1. 参数声明和初始化

                                          • 声明一个名为 my_parameter 的字符串参数
                                          • 默认值为 'world'
                                          • 这是ROS 2参数系统的标准声明方式

                                          2. 获取参数值

                                          3. 参数修改与更新

                                          批量设置参数:一次通信、原子操作、保持一致性、高效处理,特别适合需要同时更新多个相关参数的场景。
                                           
                                           
                                          💡
                                          有关问题,欢迎您在底部评论区留言,一起交流~
                                          gazeboROS2:CLI工具
                                          Loading...