前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ROS2极简总结-核心概念(二)

ROS2极简总结-核心概念(二)

作者头像
zhangrelay
发布2021-12-02 12:53:25
5960
发布2021-12-02 12:53:25
举报

参考文献: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 命令查看服务文件结构
代码语言:javascript
复制
  #request
  int8 a
  int8 b
  ---
  #response 
  int8 sum 

服务器端和客户端

  • 一项服务只能有一个服务器端。
  • 多个客户端可以使用同一个服务器端。
  • 服务器端决定如何同时处理来自多个客户端的目标。

7 行动

使用场景如下:

  • 更长的执行时间
  • 需要抢占
  • 需要定期反馈
    • 例子:导航中的路径规划

行动是采用服务和主题的组合实现

行动接口有

目标:要实现什么行动以及如何实现。

反馈:完成行动的进展

抢占:抢占正在执行的行动

结果:行动的结果

行动客户端与服务器端

  • 行动客户端向行动服务器发送目标和结果请求
  • 行动服务器执行目标并向行动客户端提供反馈和结果
  • 反馈使用主题,而目标和结果使用服务。

行动的数据结构

  • 由一组消息定义:目标、结果和反馈。
  • *.action 是一个包含类型和名称的文件,字段以 --- 分隔
代码语言:javascript
复制
  # 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 使用分布式参数系统
代码语言:javascript
复制
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 参数:

代码语言:javascript
复制
  ros2 run ros2_tutorials test_params_rclpy --ros-args -p my_str:="Hello world" -p my_int:=5

第二种

用于 ROS2 参数的 YAML

  • 当参数数量增加时管理参数变得复杂。
  • 在命令行中添加参数不是一个好的选择
  • YAML 更具可读性,非常适合在运行前/中加载配置文件
  • 每个参数由一个键和一个值组成,其中键是一个字符串

功能包结构

将 YAML 配置加载到节点

代码语言:javascript
复制
  def __init__(self):
    super().__init__('your_amazing_node')
    self.declare_parameters(
        namespace='',
        parameters=[
            ('bool_value', None),
            ('float_number', None),
            ('str_text', None)
        ])

命令行模式:

代码语言:javascript
复制
ros2 run pkg_name node_name --ros-args --params-file .~/locate_pkg/config/params.yaml

启动文件模式:

代码语言:javascript
复制
  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“

代码语言:javascript
复制
  ...
  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(命令行接口)中使用:

代码语言:javascript
复制
ros2 launch package_name launch_file_name

-End-

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 纲要
    • 6 服务
      • 服务文件结构
      • 服务器端和客户端
      • 行动的数据结构
      • 行动与服务对比
      • 第一种
      • 第二种
    • 9 启动文件
      • 理解启动文件
      • 引用其他启动文件
      • 使用启动文件
相关产品与服务
云开发 CLI 工具
云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档