ROS2极简总结-核心概念

Posted zhangrelay

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS2极简总结-核心概念相关的知识,希望对你有一定的参考价值。

参考文献:ROS2 Foundation - An introduction to core concepts


ROS2极简总结-核心概念(一)_zhangrelay的专栏-CSDN博客 


纲要

  1. 计算图(Computation Graph)
  2. 节点(Node)
  3. 节点组成(Node Composition)
  4. 主题和消息(Topics and Messages)
  5. 执行器(Executor)
  6. 服务(Services)
  7. 行动(Actions)
  8. 参数(Params)
  9. 启动文件(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极简总结-核心概念的主要内容,如果未能解决你的问题,请参考以下文章

ROS2极简总结-新增概念

ROS2极简总结-Nav2-行为树

ROS2极简总结-坐标变换-TF

ROS2极简总结-导航简介-自定位

ROS2极简总结-命令行接口基础

Nav2极简笔记02-导航概念