ros2(galactic)初学者教程(上)

配置环境

使用turtlesim和rqt

Turtlesim是一款用于学习ROS 2的轻量级模拟器。
它演示了ROS 2在最基本的级别上的功能,让您了解稍后将如何使用真实的机器人或机器人模拟。

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

本教程涉及ROS2的核心概念,如节点、主题和服务的分离。
所有这些概念将在以后的教程中详细阐述;现在,您只需设置这些工具并了解它们。

  1. 安装turtlesim
    一如既往,首先在新终端中查找设置文件,如前一教程中所述。
    为ROS 2发行版安装turtlesim软件包:
    sudo apt update
    sudo apt install ros-galactic-turtlesim
    检查安装的软件包:
    ros2 pkg executables turtlesim
    上述命令应返回一个turtlesim可执行文件列表:
    turtlesim draw_square
    turtlesim mimic
    turtlesim turtle_teleop_key
    turtlesim turtlesim_node

  2. 启动turtlesim
    请在终端中输入以下命令:
    ros2 run turtlesim turtlesim_node
    模拟器窗口应该出现,中间有一只随机乌龟。

    在命令下的终端中,您将看到来自节点的消息:
    [INFO] [turtlesim]: Starting turtlesim with node name /turtlesim
    [INFO] [turtlesim]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]
    在这里,您可以看到默认的海龟名称是turtle1,以及生成它的默认坐标。

  3. 使用turtlesim
    打开一个新的终端,再次启动ROS 2。
    现在,您将运行一个新节点来控制第一个节点中的乌龟:
    ros2 run turtlesim turtle_teleop_key

    此时,您应该打开三个窗口:一个运行turlsim_node的终端、一个运行gure_teleop_key的终端和turlsim窗口。
    排列这些窗口,以便您可以看到turlsim窗口,但也可以让运行turtle_teleop_key的终端处于活动状态,以便您能够控制turlesim中的turtle。
    使用键盘上的箭头键控制乌龟。它将在屏幕上移动,使用它所附的“笔”绘制到目前为止所遵循的路径。
    您可以使用list命令查看节点及其关联的服务、主题和操作:
    ros2 node list
    ros2 topic list
    ros2 service list
    ros2 action list

    在接下来的教程中,您将了解有关这些概念的更多信息。
    由于本教程的目标只是对turlsim进行概述,因此我们将使用rqt(ROS2的图形用户界面)来更深入地了解服务。
    使用turtlesim和rqt是学习ROS2核心概念的好方法。

  4. 安装rqt
    打开新终端以安装rqt及其插件:
    sudo apt update
    sudo apt install ~nros-galactic-rqt*

    要运行rqt:
    rqt

  5. 使用rqt
    首次运行rqt后,窗口将为空。
    别担心;只需从顶部的菜单栏中选择Plugins>Services>Service Caller

    使用服务下拉列表左侧的刷新按钮,确保您的gurisim节点的所有服务都可用。
    单击服务下拉列表以查看turtlesim的服务,然后选择/spawn服务。

    1. 尝试生成服务
      让我们使用rqt调用/spawn服务。
      您可以从它的名称猜测/spawn将在turtlesim窗口中创建另一只乌龟。
      通过双击Expression列中的空单引号,为新乌龟指定一个唯一的名称,如turtle2。
      可以看到,这个表达式对应于名称值,并且是string类型。
      输入生成海龟的新坐标,如x=1.0和y=1.0。

      要生成turtle2,您必须通过单击rqt窗口右上角的call按钮来调用该服务。
      您将看到一只新海龟(同样是随机设计的)在您输入的x和y坐标处生成。
      如果刷新rqt中的服务列表,您还将看到现在除了/turtle1/…之外,还有与新的turtle/turtle2/…相关的服务…。

    2. 尝试set_pen服务
      现在,让我们使用/set_pen服务为turtle1提供一支独特的笔:

      r、g和b的值介于0和255之间,将设置画笔乌龟1绘制的颜色,宽度设置线条的粗细。
      要让turtle1用明显的红线绘制,请将r值更改为255,将width值更改为5。
      不要忘记在更新值后调用服务。
      如果返回运行turtle_teleop_key的终端并按箭头键,您将看到turtle1的笔已更改。

      您可能已经注意到,没有办法移动turtle2。
      您可以通过将turtle1的cmd_vel主题重新映射到turtle2来实现这一点。

  6. 重新映射
    在新终端中,source ROS 2,并运行:
    ros2 run turtlesim turtle_teleop_key --ros-args --remap turtle1/cmd_vel:=turtle2/cmd_vel

  7. 关闭turtlesim
    要停止模拟,可以在turtlesim_node终端中输入Ctrl+C,在teleop终端中输入q。

理解节点

  1. ROS 2图
    在接下来的几个教程中,您将了解一系列核心ROS 2概念,这些概念构成了所谓的“ROS(2)图”。
    ROS图是一个ROS 2元素网络,同时处理数据。
    它包含所有可执行文件以及它们之间的连接,如果要将它们全部映射并可视化。

  2. ROS 2中的节点
    ROS中的每个节点应负责单个模块用途(例如一个节点用于控制车轮电机,一个节点用来控制激光测距仪等)。每个节点都可以通过主题、服务、操作或参数向其他节点发送和接收数据。

    一个完整的机器人系统由许多协同工作的节点组成。
    在ROS 2中,单个可执行文件(C++程序、Python程序等)可以包含一个或多个节点。

  3. ros2运行
    ros2 run命令从包中启动可执行文件。
    ros2 run <package_name> <executable_name>
    要运行turtlesim,请打开一个新终端,然后输入以下命令:
    ros2 run turtlesim turtlesim_node
    这里,包名为turtlesim,可执行文件名为turtlesim_node。

  4. ros2节点列表
    显示所有运行节点的名称。
    当您想要与一个节点交互时,或者当您有一个系统运行许多节点并需要跟踪它们时,这尤其有用。
    在另一个终端仍在运行的情况下,打开一个新终端,然后输入以下命令:
    ros2 node list
    打开另一个新终端,并使用以下命令启动teleop节点:
    ros2 run turtlesim turtle_teleop_key
    在这里,我们再次搜索turtlesim包,这次是搜索名为turtle_teleop_key的可执行文件。
    返回运行ros2节点列表的终端,然后再次运行它。
    现在您将看到两个活动节点的名称:

    • 重新映射
      重新映射允许您将默认节点属性(如节点名称、主题名称、服务名称等)重新分配给自定义值。
      在上一个教程中,您使用了对turtle_teleop_key的重新映射来更改被控制的默认turtle。
      现在,让我们重新分配/turtlesim节点的名称。
      在新终端中,运行以下命令:
      ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
      由于您再次调用ros2 run,另一个turtlesim窗口将打开。
      但是,现在如果您返回到运行ros2节点列表的终端,然后再次运行,您将看到三个节点名:
  5. ros2节点信息
    现在您已经知道了节点的名称,可以通过以下方式访问有关它们的更多信息:
    ros2 node info <node_name>
    要检查最新节点my_turtle,请运行以下命令:
    ros2 node info /my_turtle
    ros2节点信息返回与该节点交互的订阅者、发布者、服务和操作(ROS图形连接)的列表。
    输出应如下所示:

    现在尝试在/teleop_turtle节点上运行相同的命令,看看它的连接与my_turtele有什么不同。
    在即将到来的教程中,您将了解更多有关ROS图形连接概念的信息,包括消息类型。

节点是基本的ROS 2元件,用于机器人系统中的单一、模块化用途。
在本教程中,通过运行可执行文件turlsim_node和ture_teleop_key,您使用了从turlsim包创建的节点。
您学习了如何使用ros2节点列表查找活动节点名称,以及如何使用ros2节点信息在单个节点上进行自检。
这些工具对于理解复杂、真实的机器人系统中的数据流至关重要。

理解主题

ROS 2将复杂系统分解为多个模块化节点。
主题是ROS图的重要元素,充当节点交换消息的总线。

一个节点可以向任意数量的主题发布数据,同时订阅任意数量的标题。

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

  1. 设置
    到目前为止,您应该可以轻松启动turtlesim了。
    打开新终端并运行:
    ros2 run turtlesim turtlesim_node
    打开另一个终端并运行:
    ros2 run turtlesim turtle_teleop_key

  2. rqt_graph
    我们将使用rqt_graph可视化不断变化的节点和主题,以及它们之间的连接。
    turtlesim教程告诉您如何安装rqt及其所有插件,包括rqt_graph。
    要运行rqt_graph,请打开新终端并输入命令:
    rqt_graph
    您还可以打开rqt并选择Plugins>Introspection>Node graph方法,打开rqt_graph。

    您应该会看到上面的节点和主题,以及围绕图形外围的两个动作(我们暂时忽略这些动作)。
    如果将鼠标悬停在中心的主题上,您将看到如上图所示的颜色高亮显示。
    该图描述了/turtlesim节点和/teleop_turtle节点如何通过主题相互通信。
    /teleop_turtle节点将数据(您输入以移动龟的击键)发布到/turtle1/cmd_vel主题,/turtlesim节点订阅该主题以接收数据。
    rqt_graph的突出显示功能在检查以多种不同方式连接的多个节点和主题的更复杂系统时非常有用。
    rqt_graph是一个图形化的自省工具。
    现在我们来看一些用于内省主题的命令行工具。

  3. ros2主题列表
    在新终端中运行ros2 topic list命令将返回系统中当前活动的所有主题的列表
    ros2 topic list -t将返回相同的主题列表,这次主题类型附加在括号中

    这些属性,特别是类型,是节点在主题上移动时,如何知道自己在谈论相同的信息。
    如果您想知道所有这些主题在rqt_graph中的位置,可以取消选中隐藏下的所有框:

    但现在,请选中这些选项以避免混淆。

  4. ros2主题回声
    要查看主题上发布的数据,请使用:
    ros2 topic echo <topic_name>
    既然我们知道/teleop_turtle通过/turtle1/cmd_vel主题将数据发布到/turtlesim,那么让我们使用echo来反思这个主题:
    ros2 topic echo /turtle1/cmd_vel
    起初,该命令不会返回任何数据。
    这是因为它正在等待/teleop_turtle发布一些内容。
    返回运行turtle_teleop_key的终端,使用箭头移动乌龟。
    观察您的回波同时运行的终端,您将看到针对您所做的每个移动发布的位置数据:

    现在返回到rqt_graph并取消选中Debug框。

    /_ros2cli_5894是我们刚才运行的echo创建的节点(数字可能不同)。
    现在您可以看到发布者正在通过cmd_vel主题发布数据,并且订阅了两个订户。

  5. ros2主题信息
    话题不必只是点对点的交流;它可以是一对多、多对一或多对多。
    另一种方法是运行:
    ros2 topic info /turtle1/cmd_vel
    这将返回:

  6. ros2界面显示
    节点使用消息通过主题发送数据。
    发布者和订阅者必须发送和接收相同类型的消息才能进行通信。
    在运行ros2 topic list-t之后,我们前面看到的主题类型让我们知道每个主题上使用的消息类型。
    回想一下,cmd_vel主题的类型是:
    geometry_msgs/msg/Twist
    这意味着在geometry_msgs包中有一个名为Twist的消息。
    现在,我们可以对该类型运行ros2 interface show <msg type>来了解其详细信息,特别是消息所需的数据结构。
    ros2 interface show geometry_msgs/msg/Twist
    对于上面的消息类型,它将生成:

    这告诉您,/turtlesim节点需要一条消息,其中包含两个矢量,线性矢量和角度矢量,每个矢量包含三个元素。
    如果您还记得我们使用echo命令看到/teleop_turtle传递给/turtlesim的数据,它的结构是相同的.

  7. ros2主题发布
    既然您有了消息结构,就可以使用以下命令从命令行直接将数据发布到主题:
    ros2 topic pub <topic_name> <msg_type> '<args>'
    参数是您将传递给主题的实际数据,位于您在上一节中刚刚发现的结构中。
    需要注意的是,这个参数需要以YAML语法输入。
    像这样输入完整命令:
    ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
    --once是一个可选参数,表示“发布一条消息然后退出”。
    您将在终端中收到以下消息:
    publisher: beginning loop
    publishing #1: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))
    你会看到你的乌龟这样移动:

    海龟(通常是它要模仿的真实机器人)需要稳定的指令流才能连续操作。
    所以,要让乌龟继续移动,你可以跑:
    ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
    这里的区别是删除了--once选项,增加了--rate1选项,它告诉ros 2 topic pub以1Hz的稳定流发布命令。
    您可以刷新rqt_graph以图形化方式查看发生了什么。
    您将看到ros 2 topic pub…节点(/_ros2cli_8868)正在/turtle1/cmd_vel主题上发布,现在ros2 topic echo ...节点(/_ros2cl_5894)和/turtlesim节点都在接收它。

    最后,可以在姿势主题上运行echo并重新检查rqt_graph:
    ros2 topic echo /turtle1/pose

    可以看到,/turlsim节点也发布到了pose主题,新的echo节点订阅了该主题。

  8. ros2主题速率
    对于这个进程的最后一次自省,您可以使用以下命令查看数据发布的速率:
    ros2 topic hz /turtle1/pose
    它将返回/turtlesim节点向姿势主题发布数据的速率数据。
    average rate: 59.354
    min: 0.005s max: 0.027s std dev: 0.00284s window: 58
    回想一下,您使用ros2 topic pub--rate 1turtle1/cmd_vel的速率设置为稳定的1 Hz。
    如果您使用turtle1/cm d_evel而不是turtle1/pose运行上述命令,您将看到一个反映该速率的平均值。

节点通过主题发布信息,允许任意数量的其他节点订阅和访问该信息。
在本教程中,您使用rqt_graph和命令行工具检查了主题上几个节点之间的连接。
现在,您应该对数据在ROS 2系统中的移动有了很好的了解。

理解服务

背景资料

服务是ROS图中节点的另一种通信方法。
服务基于呼叫和响应模型,而不是主题的发布者-订阅者模型。
虽然主题允许节点订阅数据流并获得持续更新,但服务仅在客户机专门调用时才提供数据。

活动

  1. 设置
    启动两个turtlesim节点,/turtlesim/teleop_turtle
    打开新终端并运行:
    ros2 run turtlesim turtlesim_node
    打开另一个终端并运行:
    ros2 run turtlesim turtle_teleop_key

  2. ros2服务列表
    在新终端中运行ros2 service list命令将返回系统中当前活动的所有服务的列表:

    您将看到这两个节点都有相同的六个服务,名称中有参数。
    ROS 2中的几乎每个节点都有这些基础设施服务,这些服务是参数构建的基础。
    在下一个教程中将有更多关于参数的内容。
    在本教程中,讨论中将省略参数服务。
    现在,让我们重点关注特定于turtlesim的服务,/clear/kill/reset/spawn/turtle1/set_pen/turtle1/teleport_absolute/turtle1/teleport_relative

  3. ros2服务类型
    服务具有描述服务的请求和响应数据的结构的类型。
    服务类型的定义与主题类型类似,只是服务类型有两个部分:一个用于请求的消息,另一个用于响应。
    要查找服务类型,请使用以下命令:
    ros2 service type <service_name>
    让我们看看turtlesim的/clear服务。
    在新终端中,输入命令:
    ros2 service type /clear
    std_srvs/srv/Empty
    Empty类型表示服务调用在发出请求时不发送数据,在接收响应时不接收数据。

    • ros2服务列表-t
      要同时查看所有活动服务的类型,可以将--show types选项(缩写为-t)附加到list命令:
      ros2 service list -t
      这将返回:
  4. ros2服务查找
    如果要查找特定类型的所有服务,可以使用以下命令:
    ros2 service find <type_name>
    例如,您可以找到所有Empty类型的服务,如下所示:
    ros2 service find std_srvs/srv/Empty
    这将返回:
    /clear
    /reset

  5. ros2界面显示
    您可以从命令行调用服务,但首先需要知道输入参数的结构。
    ros2 interface show <type_name>
    要对/clear服务的Empty类型运行此命令,请执行以下操作:
    ros2 interface show std_srvs/srv/Empty
    这将返回:
    ---
    ---将请求结构(上面)与响应结构(下面)分开。
    但是,正如您前面所了解的,Empty类型不发送或接收任何数据。
    所以,自然,它的结构是空白的。
    让我们回顾一个具有发送和接收数据类型的服务,如/spawn
    从ros2服务列表的结果来看,我们知道/spawn的类型是turtlesim/srv/spawn
    要查看/spawn调用和请求中的参数,请运行命令:
    ros2 interface show turtlesim/srv/Spawn
    这将返回:
    float32 x
    float32 y
    float32 theta
    string name # Optional. A unique name will be created and returned if this is empty
    ---
    string name
    ---行上方的信息告诉我们调用/Spawn所需的参数。
    x、 yθ决定了产卵海龟的位置,名称显然是可选的。
    在这种情况下,行下面的信息不是您需要知道的,但它可以帮助您了解从呼叫中获得的响应的数据类型。

  6. ros2服务呼叫
    现在您已经知道了服务类型是什么,如何查找服务类型,以及如何查找该类型参数的结构,您可以使用以下命令调用服务:
    ros2 service call <service_name> <service_type> <arguments>
    部分是可选的。
    例如,您知道Empty类型化服务没有任何参数:
    ros2 service call /clear std_srvs/srv/Empty
    此命令将清除海龟窗口中绘制的任何线条。
    现在,让我们通过调用/spawn并输入参数来生成一个新的龟。
    来自命令行的服务调用中的输入需要使用YAML语法。
    输入命令:
    ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"
    您将得到发生了什么的方法样式视图,然后是服务响应:
    requester: making request: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.2, name='')
    response:
    turtlesim.srv.Spawn_Response(name='turtle2')
    您的海龟窗口将立即更新新生成的海龟:

总结

节点可以使用ROS 2中的服务进行通信。
与主题(节点发布可供一个或多个订阅者使用的信息的单向通信模式)不同,服务是一种请求/响应模式,其中客户端向提供服务的节点发出请求,服务处理请求并生成响应。
您通常不想使用服务进行连续通话;主题甚至行动会更适合。
在本教程中,您使用命令行工具来识别、详细说明和调用服务。

理解参数

背景信息

参数是节点的配置值。
可以将参数视为节点设置。
节点可以将参数存储为整数、浮点、布尔、字符串和列表。
在ROS 2中,每个节点都维护自己的参数。
有关参数的更多背景信息,请参阅概念文档。

活动

  1. 设置
    启动两个turtlesim节点,/turtlesim/teleop_turtle
    打开新终端并运行:
    ros2 run turtlesim turtlesim_node
    打开另一个终端并运行:
    ros2 run turtlesim turtle_teleop_key

  2. ros2参数列表
    要查看属于节点的参数,请打开新终端并输入命令:
    ros2 param list
    您将看到节点命名空间/teleop_turtle/turtlesim,后面是每个节点的参数:

    每个节点都有参数use_sim_time
    这并不是/turtlesim独有的。
    根据它们的名称,看起来/turtlesim的参数使用RGB颜色值决定了turtlesim窗口的背景色。

  3. ros2参数获取
    要显示参数的类型和当前值,请使用以下命令:
    ros2 param get <node_name> <parameter_name>
    让我们找出turtlesim参数background_g的当前值:
    ros2 param get /turtlesim background_g
    它将返回值:
    Integer value is: 86
    现在您知道background_g包含一个整数值。
    如果在background_rbackground_b上运行相同的命令,将分别获得值69和255。

  4. ros2参数设置
    要在运行时更改参数的值,请使用以下命令:
    ros2 param set <node_name> <parameter_name> <value>
    让我们更改/turtlesim的背景颜色:
    ros2 param set /turtlesim background_r 150
    您的终端应返回消息:
    Set parameter successful
    而你的turtlesim窗口的背景应该会改变颜色:

    使用set命令设置参数只会在当前会话中更改,而不会永久更改。
    但是,您可以保存设置并在下次启动节点时重新加载它们。

  5. ros2参数转储
    您可以使用以下命令将节点的所有当前参数值“转储”到一个文件中,以便以后保存:
    ros2参数转储<node_name>
    要保存/turtlesim参数的当前配置,请输入以下命令:
    ros2 param dump /turtlesim
    您的终端将返回消息:
    Saving to: ./turtlesim.yaml
    您将在工作区运行的目录中找到一个新文件。如果打开此文件,您将看到以下内容:

    如果您想在将来用相同的参数重新加载节点,转储参数很有用。

  6. ros2参数加载
    可以使用以下命令将参数从文件加载到当前运行的节点:
    ros2 param load <node_name> <parameter_file>
    加载/turtlesim
    使用ros2 param dump/turtlesim节点的参数生成的yaml文件,输入命令:
    ros2 param load /turtlesim ./turtlesim.yaml
    您的终端将返回消息:

  7. 节点启动时加载参数文件
    要使用保存的参数值启动同一节点,请使用:
    ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>
    这与启动turtlesim时总是使用的命令相同,添加了标记--ros-args--params文件,然后是要加载的文件。
    停止运行的turtlesim节点,以便尝试使用保存的参数重新加载它,方法是:
    ros2 run turtlesim turtlesim_node --ros-args --params-file ./turtlesim.yaml
    turtlesim窗口应该像往常一样出现,但背景是您之前设置的紫色。

总结

节点具有用于定义其默认配置值的参数。
可以从命令行获取和设置参数值。
还可以将参数设置保存到文件中,以便在以后的会话中重新加载它们。

理解动作

背景

动作是ROS 2中的通信类型之一,用于长时间运行的任务。
它们由三部分组成:目标、反馈和结果。
动作基于主题和服务。
它们的功能与服务类似,只是操作可以取消。
它们还提供稳定的反馈,而不是返回单个响应的服务。
动作使用客户端-服务器模型,类似于发布者-订阅者模型(在主题教程中描述)。
“动作客户端”节点将目标发送到“动作服务器”节点,该节点确认目标并返回反馈流和结果。

任务

  1. 设置
    启动两个turtlesim节点,/turtlesim/teleop_turtle
    打开新终端并运行:
    ros2 run turtlesim turtlesim_node
    打开另一个终端并运行:
    ros2 run turtlesim turtle_teleop_key

  2. 使用动作
    启动/teleop_turtle节点时,您将在终端中看到以下消息:
    Use arrow keys to move the turtle.
    Use G|B|V|C|D|E|R|T keys to rotate to absolute orientations. 'F' to cancel a rotation.
    让我们关注第二行,它对应于一个动作。(第一条指令对应于主题教程前面讨论的“cmd_vel”主题。)
    请注意,字母键G|B|V|C|D|E|R|T在美国QWERTY键盘上的F键周围形成了一个“框”(如果您没有使用QWERTY键盘,请参阅此链接)。
    每个关键点在F周围的位置对应于turtlesim中的方向。
    例如,E会将乌龟的方向旋转到左上角。
    请注意运行/turtlesim节点的终端。
    每次按下其中一个键,都会将目标发送到作为/turtlesim节点一部分的动作服务器。
    目标是旋转海龟以面向特定方向。
    乌龟完成旋转后,应显示一条信息,传达目标结果:
    [INFO] [turtlesim]: Rotation goal completed successfully
    F键将在执行过程中取消目标。
    尝试按C键,然后按F键,乌龟才能完成旋转。
    在运行/turtlesim节点的终端中,您将看到以下消息:
    [INFO] [turtlesim]: Rotation goal canceled
    不仅客户端(您在teleop中的输入)可以阻止目标,服务器端(/turtlesim节点)也可以。
    当服务器端选择停止处理目标时,称为“中止”目标。
    尝试按D键,然后按G键,第一次旋转才能完成。
    在运行/turtlesim节点的终端中,您将看到以下消息:
    [WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal
    此动作服务器选择中止第一个目标,因为它有一个新目标。
    它可以选择其他的东西,比如拒绝新目标或在第一个目标完成后执行第二个目标。
    不要以为每个动作服务器都会在获得新目标时选择放弃当前目标。

  3. ros2节点信息
    要查看/turtlesim节点的动作,请打开一个新终端并运行命令:
    ros2 node info /turtlesim
    它将返回/turtlesim的订阅者、发布者、服务、操作服务器和动作客户端的列表:

    请注意,/turtlesim/turtle1/rotate_absolute动作位于action Servers下。
    这意味着/turtlesim的响应并为/turtle1/rotate_absolute操作提供反馈。
    /teleop_turtle节点在Action Clients下的名称为/turtle1/rotate_absolute,这意味着它为该操作名称发送目标。
    ros2 node info /teleop_turtle
    这将返回:

  4. ros2动作列表
    要识别ROS图中的所有动作,请运行以下命令:
    ros2 action list
    这将返回:
    /turtle1/rotate_absolute
    这是目前ROS图中的唯一动作。
    它控制海龟的旋转,正如你前面看到的。
    通过使用ros2 node info<node_name>命令,您还知道该动作有一个动作客户端(/teleop_turtle的一部分)和一个动作服务器(/turtelsim的一部份)。

    • ros2动作列表类型
      动作有类型,类似于主题和服务。
      要查找/turtle1/rotate_absolute的类型,请运行命令:
      ros2 action list -t
      这将返回:
      /turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]
      在每个动作名称右侧的括号中(在本例中仅为turtlesim/action/RotateAbsolute)是动作类型turtlesim/action/RotateAbsolute
      当您想从命令行或代码执行动作时,您将需要它。
  5. ros2动作信息
    您可以使用以下命令进一步检查/turtle1/rotate_absolute动作:
    ros2 action info /turtle1/rotate_absolute
    它将返回:
    Action: /turtle1/rotate_absolute
    Action clients: 1
    /teleop_turtle
    Action servers: 1
    /turtlesim
    这告诉了我们前面从在每个节点上运行ros2节点信息中学到了什么:
    /teleop_turtle节点有一个动作客户端,而/turtlesim节点有用于/turtle1/rotate_absolute动作的动作服务器。

  6. ros2界面显示
    在发送或执行动作目标之前,您还需要一条信息,那就是动作类型的结构。
    回想一下,您在运行命令ros2 action list -t时确定了/turtle1/rotate_absolute的类型。
    在终端中输入具有动作类型的以下命令:
    ros2 interface show turtlesim/action/RotateAbsolute
    这将返回:
    # The desired heading in radians
    float32 theta
    ---
    # The angular displacement in radians to the starting position
    float32 delta
    ---
    # The remaining rotation in radians
    float32 remaining
    此消息的第一部分位于---之上,是目标请求的结构(数据类型和名称)。
    下一部分是结果的结构。
    最后一部分是反馈的结构。

  7. ros2发送动作目标
    现在,让我们使用以下语法从命令行发送一个动作目标:
    ros2 action send_goal <action_name> <action_type> <values>
    需要采用YAML格式。
    密切关注turtlesim窗口,并在终端中输入以下命令:
    ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"
    您应该会看到海龟在旋转,并在终端中显示以下消息:

    所有目标都有一个唯一的ID,显示在返回消息中。
    您还可以看到结果,一个名为delta的字段,它是到起始位置的位移。
    要查看此目标的反馈,请将--feedback添加到ros2 action send_goal命令:
    ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.57}" --feedback
    您的终端将返回消息:

    您将继续收到反馈,剩余弧度,直到目标完成。

总结

动作就像服务一样,允许您执行长时间运行的任务,提供定期反馈,并且可以取消。
机器人系统可能会使用动作进行导航。
动作目标可以告诉机器人移动到某个位置。
当机器人导航到该位置时,它可以沿途发送更新(即反馈),然后在到达目的地后发送最终结果消息。
Turtlesim有一个动作服务器,动作客户端可以向其发送旋转乌龟的目标。
在本教程中,您反思了该动作/turtle1/rotate_absolute,以便更好地了解动作是什么以及它们是如何工作的。

使用rqt_console查看日志

背景信息

rqt_console是一个GUI工具,用于检查ROS 2中的日志消息。
通常,日志消息会显示在终端中。
使用rqt_console,您可以随着时间的推移收集这些消息,以更有序的方式仔细查看它们,过滤它们,保存它们,甚至在不同的时间重新加载保存的文件以进行自检。
节点使用日志以多种方式输出有关事件和状态的消息。
为了用户的利益,他们的内容通常是信息性的。

任务

  1. 设置
    使用以下命令在新终端中启动rqt_console
    ros2 run rqt_console rqt_console
    rqt_console窗口将打开:

    控制台的第一部分显示来自系统的日志消息。
    在中间,您可以选择通过排除严重性级别来过滤消息。
    您还可以使用右侧的加号按钮添加更多排除筛选器。
    底部部分用于突出显示包含您输入的字符串的消息。
    您也可以向此部分添加更多筛选器。
    现在,使用以下命令在新终端中启动turlsim:
    ros2 run turtlesim turtlesim_node

  2. rqt_console上的消息
    为了生成rqt_console要显示的日志消息,让乌龟撞到墙上。
    在新终端中,输入以下ros2 topic pub命令(在主题教程中详细讨论):
    ros2 topic pub -r 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0,y: 0.0,z: 0.0}}"
    由于上述命令以稳定的速度发布主题,乌龟不断地撞到墙上。
    rqt_console中,您将看到同一条消息,其中反复显示警告严重级别,如下所示:

    在运行ros2 topic pub命令的终端中按Ctrl+C,以防止乌龟撞到墙上。

  3. 记录器级别
    ROS 2的记录器级别按严重程度排序:
    Fatal
    Error
    Warn
    Info
    Debug
    对于每个级别所表示的内容没有确切的标准,但可以放心地假设:
    致命消息表明系统将终止以保护自身免受损害。
    错误消息表示不一定会损坏系统的重大问题,但会阻止系统正常运行。
    警告消息表示意外的活动或不理想的结果,这可能表示更深层的问题,但不会彻底损害功能。
    信息消息指示事件和状态更新,用于直观验证系统是否按预期运行。
    调试消息详细说明了系统执行的整个逐步过程。
    默认级别为“信息”。您将只看到默认严重级别和更严重级别的消息。
    通常,只有Debug消息被隐藏,因为它们是唯一比Info低的级别。
    例如,如果将默认级别设置为Warn,则只能看到严重级别为WarnErrorFatal的消息。

    • 设置默认记录器级别
      首次使用重新映射运行/turtlesim节点时,可以设置默认记录器级别。
      在终端中输入以下命令:
      ros2 run turtlesim turtlesim_node --ros-args --log-level WARN
      现在,您不会看到上次启动turtlesim时控制台中出现的初始信息级别警告。
      这是因为信息消息的优先级低于新的默认严重性Warn

总结

如果需要仔细检查来自系统的日志消息,
rqt_console会非常有用。
您可能会出于各种原因检查日志消息,通常是为了找出哪里出错了,以及导致出错的一系列事件。

启动节点

背景信息

在大多数入门教程中,您一直在为运行的每个新节点打开新终端。
当您创建具有越来越多同时运行的节点的更复杂系统时,打开终端并重新输入配置详细信息会变得很乏味。
启动文件允许您同时启动和配置包含ROS 2节点的多个可执行文件。
使用ros2 launch命令运行单个启动文件将立即启动整个系统—所有节点及其配置。

任务

运行启动文件

打开新终端并运行:
ros2 launch turtlesim multisim.launch.py
此命令将运行以下启动文件:

# turtlesim/launch/multisim.launch.py

from launch import LaunchDescription
import launch_ros.actions

def generate_launch_description():
    return LaunchDescription([
        launch_ros.actions.Node(
            namespace= "turtlesim1", package='turtlesim', executable='turtlesim_node', output='screen'),
        launch_ros.actions.Node(
            namespace= "turtlesim2", package='turtlesim', executable='turtlesim_node', output='screen'),
    ])

这将运行两个Turtlesim节点:


现在,不要担心这个启动文件的内容。您可以在ROS 2发布教程中找到有关ROS 2启动的更多信息。

(可选)控制Turtlesim节点

现在这些节点正在运行,您可以像控制任何其他ROS 2节点一样控制它们。
例如,您可以打开另外两个终端并运行以下命令,让乌龟朝相反的方向行驶:
在第二个终端:
ros2 topic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
在第三个终端:
ros2 topic pub /turtlesim2/turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: -1.8}}"
运行这些命令后,您应该会看到如下内容:

总结

到目前为止,您所做的工作的意义在于,您已经用一个命令运行了两个Turtlesim节点。
一旦您学会了编写自己的启动文件,就可以使用ros2启动命令以类似的方式运行多个节点并设置其配置。
有关ROS 2启动文件的更多教程,请参阅主启动文件教程页面。

记录和播放数据

出身背景

ros2 bag是一个命令行工具,用于记录系统中发布的主题数据。
它会累积传递给任意数量主题的数据,并将其保存在数据库中。
然后,您可以重放数据以重现测试和实验的结果。
录制主题也是分享您的作品并允许他人重新创作的好方法。

任务

  1. 设置
    您将在turtlesim系统中记录键盘输入,以便稍后保存和回放,因此首先启动/turtlesim/teleop_turtle节点。
    打开新终端并运行:
    ros2 run turtlesim turtlesim_node
    打开另一个终端并运行:
    ros2 run turtlesim turtle_teleop_key
    我们还可以创建一个新目录来存储保存的录音,这也是一个好做法:
    mkdir bag_files
    cd bag_files

  2. 选择主题
    ros2 bag只能记录在主题上发布的数据。
    要查看系统主题列表,请打开新终端并运行命令:
    ros2 topic list
    这将返回:
    /parameter_events
    /rosout
    /turtle1/cmd_vel
    /turtle1/color_sensor
    /turtle1/pose
    在主题教程中,您了解到/turl_teleop节点发布/curl1/cmd_vel主题上的命令,以使乌龟在turlsim中移动。
    要查看/curl1/cmd_vel正在发布的数据,请运行命令:
    ros2 topic echo /turtle1/cmd_vel
    最初什么也不会出现,因为远程操作没有发布任何数据。
    返回运行teleop的终端,选择它使其处于活动状态。
    使用箭头键移动海龟,您将看到终端上发布的数据运行ros2 topic echo
    linear:
    x: 2.0
    y: 0.0
    z: 0.0
    angular:
    x: 0.0
    y: 0.0
    z: 0.0
    ---

  3. ros2 bag record
    要记录发布到主题的数据,请使用命令语法:
    ros2 bag record <topic_name>
    在您选择的主题上运行此命令之前,请打开一个新终端并移动到您之前创建的bag_files目录中,因为rosbag文件将保存在您运行它的目录中。
    运行命令:
    ros2 bag record /turtle1/cmd_vel
    您将在终端中看到以下消息(日期和时间将不同):
    现在,ros2 bag正在记录/curtle1/cmd_vel主题上发布的数据。
    返回远程终端,再次移动海龟。
    动作无关紧要,但试着做出一个可识别的模式,以便稍后回放数据时查看。

    按Ctrl+C停止录制。
    数据将以rosbag2_year_month_day-hour_minute_second的格式累积到一个包文件中

    • 录制多个主题
      您还可以录制多个主题,以及将文件ros2 bag保存的名称更改为。
      运行以下命令:
      ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose
      -o选项允许您为bag文件选择唯一的名称。
      以下字符串(在本例中为subset)是文件名。
      要一次录制多个主题,只需列出用空格分隔的每个主题。
      您将看到以下消息,确认正在录制这两个主题。

      您可以移动乌龟,完成后按Ctrl+C
  4. ros2 bag info
    您可以通过运行以下命令查看有关录制的详细信息:
    ros2 bag info <bag_file_name>
    subset bag file上运行此命令将返回文件信息列表:

    要查看单个消息,您必须打开数据库(在本例中为sqlite3)来检查它,这超出了ROS2的范围。

  5. ros2 bag play
    在重放bag file之前,在运行远程操作的终端中输入Ctrl+C。
    然后确保您的turtlesim窗口可见,以便您可以看到正在运行的包文件。
    输入命令:
    ros2 bag play subset
    终端将返回消息:
    [INFO] [1666060385.070463236] [rosbag2_storage]: Opened database 'subset/subset_0.db3' for READ_ONLY.
    您的海龟将遵循您在录制时输入的相同路径(虽然不是100%准确;海龟对系统计时的微小变化很敏感)。
    因为subset文件记录了/turtle1/pose主题,所以只要您运行了turtlesimros2 bag play命令就不会退出,即使您没有移动。
    这是因为只要/turtlesim节点处于活动状态,它就会定期发布/turtle1/pose主题上的数据。
    您可能已经注意到,在上面的ros2 bag info示例结果中,/turtle1/cmd_vel主题的计数信息只有9;这就是我们在录制时按箭头键的次数。
    请注意,/turtle1/pose的“计数”值超过3000;在我们录音的时候,关于这个话题的数据发表了3000次。
    ros2 topic hz /turtle1/pose

总结

您可以使用ros2 bag命令记录在ROS 2系统中传递的主题数据。
无论你是与他人分享你的工作还是对自己的实验进行反思,这都是一个很好的了解工具。
要了解位置数据的发布频率,可以运行以下命令:

posted @ 2022-10-11 22:10  杨孝乾  阅读(1358)  评论(0编辑  收藏  举报