ROS2 学习笔记

202 阅读5分钟

基本概念

ROS是一个用于不同进程间匿名发布、订阅、出纳地信息的中间件。ROS2系统的核心部分是ROS图(ROS Graph)。ROS图是指在ROS系统中不同节点间相互通信的链接关系。

配置ROS2环境

ROS2依赖于使用shell环境组合工作空间的概念,“worksapce”表示在系统中使用ROS2进行开发的位置。核心ROS2工作空间被称为underlay,后续哦工作空间被称为overlays。

source命令

使用ROS2时,每个新打开的终端都需要先执行source命令。这是由于开机或者新建终端是,系统环境变量未包含ROS2相关路径,而ROS2允许同时存在多个工作空间,需通过source命令告知系统当前使用的工作空间。环境变量主要包括:

  • ROS_DISTRO:指定ROS2版本(如humble、galactic)。
  • CMAKE_PREFIX_PATH:指向ROS2安装路径和用户工作空间的install目录。
  • PATH:包含ROS2可执行文件路径(如ROS2命令)
  • LD_LIBRARY_PATH:包含ROS2库文件路径

每个终端都是一个独立的会话,环境变量不会跨会话继承,即使前一个终端执行过source,新终端的环境变量仍然为系统默认值,需重新配置。

如果同时维护多个ROS2工作空间,每次切换工作空间时需通过source指向新的路径,如:

source /opt/ros/humble/setup.bash        # 激活系统默认安装的 ROS2 Humble
source ~/myworkspace/install/setup.bash  # 激活用户自定义工作空间

为了避免环境变量污染,ROS2通过setup.bash脚本动态清理旧环境变量,避免不同工作空间路径冲突。若不执行source,可能导致命令找不到(如 ros2 topic list 报错)或者链接报错(库文件路径错误)。

setup.bash脚本

ROS2的setup.bash脚本位于工作空间的install目录或系统安装目录(如 /opt/ros/(echo(echo ROS_DISTRO)/setup.bash,其核心功能包括:

  • 向CMAKE_PREFIX_PATH添加当前工作空间路径。
  • 向PATH添加可执行文件路径(如ros命令)。
  • 导出ROS2相关环境变量(如ROS_DISTRO)。
  • 清除旧工作空间环境变量(避免残留)。

ROS图(ROS Graph)

  • 节点(Nodes):一个节点是一个利用ROS系统和其他节点通信的实体
  • 消息(Messages):ROS中订阅和发布主题是所用到的数据结构
  • 主题(Topic):节点可以发布信息到一个主题,同样也可以订阅主题来接收消息
  • 发现(Discovery):一个自动运行的进程,通过这个进程不同的节点相互发现,建立连接

介绍turtlesim和rqt

背景

turtlesim 是学习ROS2的轻量级模拟器。它说明了ROS2在最基本的层面上做了什么。

rqt 是ROS2的GUI工具。在rqt中完成所有操作都可以在命令行上完成,但他提供了一种更简单、用户友好的方式操作ROS2基本模块。

ROS2节点

ROS中的每个节点应负责单个模块目的,可以通过话题、服务、动作或其他参数想其他节点发送和接受数据。

ROS2中,单个可执行文件(c程序、python程序等)可以包含一个或多个节点。

ROS2话题

ROS2将复杂的系统分解成许多模块化节点,话题是充当节点间交换消息的总线。

节点可以将数据发布到任意数量的话题,同时订阅任意数量的话题。

话题是数据在节点之间移动,从而在系统的不同部分之间移动的主要方式之一。

ROS2服务

服务是ROS图中节点的另一种通讯方式,服务基于调用和响应模型,而不是话题的发布者-订阅者模型。而话题允许节点订阅数据流得到不断更新,服务对于具体调用的客户端提供数据。

节点可以使用ROS2中的服务进行通信。与话题不同,话题是一种单向的通讯模式,其中一个节点发布可以被另一个或多个订阅者使用的信息。服务是一种请求/响应模式,其中客户端向提供服务的节点和服务处理请求并生成响应。

ROS2动作

Action是ROS2中的通讯类型之一,用于长期运行的任务。它们由三部分组成:目标、反馈和结果。Action是建立在话题和服务之上的,它们的功能与服务类似

Remap 重映射

ROS2允许通过重映射修改节点、话题、服务的名称,而无需修改代码,通常用于避免命名冲突(同时运行多个相同类型的节点,如多个海龟,需要不同的名称),解决兼容性问题(在不同的环境中使用相同的代码,但是需要不同的命名)。常见的重映射类型如下:

  • __node:=新节点名:修改节点名称。
  • 原话题名:=新话题名:修改话题名称。
  • 原服务名:=新服务名:修改服务名称

这里以节点的重映射展开

ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtl 

基础命令框架

ros run <包名> <可执行文件名> [参数...]
  • ros2 run: ROS2中用于运行特定包内可执行文件的命令
  • turtlesim: 包名,即海归仿真器软件包
  • turtlesim_node:可执行文件名,是turtlesim包中的主节点程序

参数部分

  • --ros-args:专门用于ROS2节点传递参数的标志位,表示后续参数是传递给ROS2节点本身的(而非传递给shell或其他工具,python my_script.py --input data.txt直接在命令后添加参数即可)。
  • --remap:重映射参数,用于修改节点、话题、服务等默认名称。
  • __node:=myturtle:具体的重映射规则,将节点名称从默认的turtlesim_node改为my_turtle。