ROS2极简总结-核心概念
Posted zhangrelay
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS2极简总结-核心概念相关的知识,希望对你有一定的参考价值。
参考文献:ROS2 Foundation - An introduction to core concepts
ROS2极简总结-核心概念(一)_zhangrelay的专栏-CSDN博客
纲要
- 计算图(Computation Graph)
- 节点(Node)
- 节点组成(Node Composition)
- 主题和消息(Topics and Messages)
- 执行器(Executor)
- 服务(Services)
- 行动(Actions)
- 参数(Params)
- 启动文件(Launch files)
6 服务
- 服务基于调用和响应模型
- 类似于可快速终止的远程进程调用
- 示例:将在环境中生成(新添加)机器人
服务文件结构
- 服务的数据结构
- 由一对消息定义:请求和回复。
- *.srv 是包含字段类型和名称的文件
- 请求和响应由 --- 分隔
- 使用 ros2 interface show <type_name>.srv 命令查看服务文件结构
#request
int8 a
int8 b
---
#response
int8 sum
服务器端和客户端
- 一项服务只能有一个服务器端。
- 多个客户端可以使用同一个服务器端。
- 服务器端决定如何同时处理来自多个客户端的目标。
7 行动
使用场景如下:
- 更长的执行时间
- 需要抢占
- 需要定期反馈
- 例子:导航中的路径规划
行动是采用服务和主题的组合实现
行动接口有
目标:要实现什么行动以及如何实现。
反馈:完成行动的进展
抢占:抢占正在执行的行动
结果:行动的结果
行动客户端与服务器端
- 行动客户端向行动服务器发送目标和结果请求
- 行动服务器执行目标并向行动客户端提供反馈和结果
- 反馈使用主题,而目标和结果使用服务。
行动的数据结构
- 由一组消息定义:目标、结果和反馈。
- *.action 是一个包含类型和名称的文件,字段以 --- 分隔
# Define a goal of washing all dishes
bool heavy_duty # Spend extra time cleaning
---
# Define the result that will be published after the action execution ends.
uint32 total_dishes_cleaned
---
# Define a feedback message that will be published during action execution.
float32 percent_complete
uint32 number_dishes_cleaned
行动与服务对比
Actions 行动 | Services 服务 |
---|---|
Intended for longer running tasks 适用于运行时间较长的任务 | For tasks that terminated quickly 适用于快速终止的任务 |
Preemptable 可抢占 | Not preemptable 不可抢占 |
Consists of goal, result and feedback 由目标、结果和反馈组成 | Consists of request and response 由请求和响应组成 |
Provides steady feedback 提供稳定的反馈 | Provides a single response 提供单一响应 |
8 参数
同一个算法如何适用不同类型但有原理类似的机器人呢???
调整参数即可,当然如果可以专用算法可以发挥最大效能,但是通用算法验证只需参数的匹配。
常用2种方式
第一种
- 用于在启动时或在运行时从外部配置节点,而无需重新编译节点的代码。
- 这些参数可以使用 ROS2 服务动态重新配置。
- 注意:ROS2 使用分布式参数系统。
def __init__(self):
super().__init__('test_params_rclpy')
self.declare_parameter('my_str')
self.declare_parameter('my_int')
param_str = self.get_parameter('my_str')
param_int = self.get_parameter('my_int')
self.get_logger().info("str: %s, int: %s" % (str(param_str.value), str(param_int.value)))
在命令行中设置 ros2 参数:
ros2 run ros2_tutorials test_params_rclpy --ros-args -p my_str:="Hello world" -p my_int:=5
第二种
用于 ROS2 参数的 YAML
- 当参数数量增加时管理参数变得复杂。
- 在命令行中添加参数不是一个好的选择
- YAML 更具可读性,非常适合在运行前/中加载配置文件
- 每个参数由一个键和一个值组成,其中键是一个字符串
功能包结构
将 YAML 配置加载到节点
def __init__(self):
super().__init__('your_amazing_node')
self.declare_parameters(
namespace='',
parameters=[
('bool_value', None),
('float_number', None),
('str_text', None)
])
命令行模式:
ros2 run pkg_name node_name --ros-args --params-file .~/locate_pkg/config/params.yaml
启动文件模式:
def generate_launch_description():
ld = LaunchDescription()
config = os.path.join(
get_package_share_directory('ros2_tutorials'),
'config',
'params.yaml'
)
node=Node(
package = 'ros2_tutorials',
name = 'Node_A',
executable = 'test_yaml_params',
parameters = [config]
)
ld.add_action(node)
return ld
Python功能包模式,配置”setup.py“
...
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
(os.path.join('share', package_name, 'launch'), glob('launch/.launch.py')),
(os.path.join('share', package_name, 'config'), glob('config/.yaml'))
],
...
更多细节参考ROS2参数官方文档。
9 启动文件
为啥需要启动文件(Launch)
使用场景,启动文件用于:
- 描述系统的配置并按照描述执行
- 系统配置包括
- 运行哪个程序
- 在哪里运行它们
- 传递给它们的参数
- 加载参数
- 重新映射主题名称、参数等。
启动文件位置:
- ROS2 Launch 文件是用 python 编写
- 它们由 ROS2 CLI 工具执行,即:ros2 launch
- 在功能包中创建一个启动目录,如下所示
- 在启动目录使用 <launch_filename>.py创建启动文件
理解启动文件
引用其他启动文件
使用启动文件
使用 colcon build 然后 source workspace
就可以在CLI(命令行接口)中使用:
ros2 launch package_name launch_file_name
-End-
以上是关于ROS2极简总结-核心概念的主要内容,如果未能解决你的问题,请参考以下文章