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 库来定义:- 包的基本信息(名称、版本等)
- 哪些文件需要安装
- 如何安装(安装位置、脚本等)
- 入口点(让 ROS2 能找到你的节点)
话题
编写第一个节点
发布者和订阅者代码编写
首先我们来看一下一个发布者和订阅者的代码编写步骤。
实例分析
为了让我们更好的了解发布者和订阅者,这里我们给出了一个简单的代码示例用作对比。
现在,作为一个新手小白,我们对代码产生了一些疑问。
- class MinimalSubscriber(Node):这里为什么要加上Node?
- 几乎不增加复杂度
- 为未来扩展留有余地
- 符合ROS2最佳实践
- 代码更专业、更易维护
声明MinimalSubscriber 是一个 Node(节点),python需要显式声明节点。
当然可以参考我们编写的第一个节点,我们可以直接使用node基类,而不创建自定义类。
建议:即使是简单的节点,也使用自定义类方式,因为:
- super().init('minimal_publisher')什么意思?
- 初始化父类:让 Node 完成基础设置
- 设置节点名:给节点起名为 'minimal_publisher'
- 启用功能:解锁 create_publisher、get_logger 等方法
- 遵守规则:Python 继承的标准做法
- 订阅者和发布者的创建格式
- 订阅者
- 发布者
- self.publisher_.publish下划线是什么?
self.publisher_ 中的下划线 _ 是 Python 的命名约定,表示这是一个"内部使用的"或"受保护的"实例变量。创建和运行
1. 创建Python文件
2. 配置package.xml
3. 配置setup.py
4. 构建和运行
服务
服务通信流程
- 服务端:创建服务→定义回调→等待调用
- 客户端:连接服务→填充请求→发送→等待响应
服务端和客户端代码示例
现在,同样作为一个新手小白,我们提出几个问题。
- 为什么客户端要加上import sys
用于获取命令行参数,让客户端能灵活接收外部输入。
- 服务端和客户端创建格式
- 服务端
- 客户端
- 调用方式
- 两者响应方式
创建和运行
1. 修改package.xml
2. 修改setup.py
3. 构建和运行
自定义文件
消息(.msg文件)
消息是 ROS 2 中的单向数据通信机制,用于发布者(publisher)和订阅者(subscriber)之间的数据传输。
消息文件包含什么?
.msg 文件定义了数据结构,只包含字段定义:支持的数据类型:
- 基本类型:
bool:布尔值int8,int16,int32,int64:有符号整数uint8,uint16,uint32,uint64:无符号整数float32,float64:浮点数string:字符串wstring:宽字符串(用于多语言)
- 数组类型:
int32[]:动态长度数组float64[10]:固定长度数组(10个元素)
- 特殊类型:
time:时间(ROS 2 中通常用builtin_interfaces/Time)duration:时长
- 嵌套类型:
- 其他消息类型:
geometry_msgs/Point - 内置接口:
builtin_interfaces/Time
服务(.srv文件)
服务是 ROS 2 中的请求-响应双向通信机制,客户端发送请求,服务器处理并返回响应。
服务文件包含什么?
.srv 文件包含请求和响应两部分,用 --- 分隔:自定义接口
文件结构
核心概念
自定义接口 = 自定义数据结构 + 通信协议定义
在 ROS 2 中,接口分为三种:
- 消息 (Messages):单向数据流,用于发布/订阅
- 服务 (Services):请求-响应模式,同步通信
- 动作 (Actions):长时间任务,带反馈和取消
接口规划设计
我们以下述需求分析表为例说明。
通信类型 | 场景 | 接口名 | 关键字段 |
消息 | 机器人状态 | RobotStatus | battery, mode, position |
消息 | 传感器数据 | SensorData | temperature, humidity, timestamp |
服务 | 计算服务 | CalculateSum | numbers[], result |
服务 | 控制服务 | MoveRobot | target_x, target_y, success |
- 创建接口包
- 创建消息、服务文件(一个文件存储一种消息类型)
- 消息文件
- 服务文件
- 配置构建系统
- 修改package.xml
- 修改CMakeLists.txt
- 编译和测试
- 编译命令
- 测试接口
- 在其他包中使用
补充对应配置文件的对应关系
package.xml配置文件
依赖类型 | 作用时机 | 使用场景 | 示例 |
buildtool_depend | 编译时 | 构建工具 | ament_cmake |
depend | 编译时+运行时 | 常用库 | rclcpp, std_msgs |
exec_depend | 运行时 | 执行依赖 | rosidl_default_runtime |
test_depend | 测试时 | 测试工具 | ament_lint_auto |
build_depend | 编译时 | 仅编译需要 | 已弃用,用 depend代替 |
为了更好的理解,我们详细的分析每一条配置文件。
- 基本信息区
- 构建依赖区
- 接口生成依赖
- 运行依赖
- 消息类型依赖
- 测试依赖
- 导出配置区
CMakeLists.txt配置文件
您可以在``CMakeLists.txt``中使用``set``来整洁地列出所有接口:
然后一次生成所有列表,如下所示:
主要包含两个部分
注意:ament_package()必须要放到最后!!!
- 依赖查找区
- 接口生成区
参数 | 是否可以删除 | 作用 |
${PROJECT_NAME} | 绝对不能删 | 指定生成的接口的命名空间/包名 |
${msg_files} | 可以(但需替换为具体文件名) | 要处理的接口文件列表 |
DEPENDENCIES | 可以(如果没使用外部类型) | 声明外部依赖 |
参数
1. 参数声明和初始化
- 声明一个名为
my_parameter的字符串参数
- 默认值为
'world'
- 这是ROS 2参数系统的标准声明方式
2. 获取参数值
3. 参数修改与更新
批量设置参数:一次通信、原子操作、保持一致性、高效处理,特别适合需要同时更新多个相关参数的场景。
有关问题,欢迎您在底部评论区留言,一起交流~
- Author:Koreyoshi
- URL:https://tangly1024.com/article/2cec7b13-c6a7-8088-b97c-c8dd0e5db529
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!







