ros_入门_ch1

CLI工具

配置环境

  • 要么每次使用ros的时候source一下文件,要么将source 文件添加道shell启动脚本

    1. 获取设置文件

      # Replace ".bash" with your shell if you're not using bash
      # Possible values are: setup.bash, setup.sh, setup.zsh
      source /opt/ros/humble/setup.bash
      
    2. 将获取设置文件命令添加到shell启动脚本

      echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
      
      • 具体命令取决于安装ros的位置
    3. 检查环境变量

      printenv | grep -i ROS
      

使用turtlesimrqt

  1. 安装ros2的turtlesim包

    sudo apt update
    sudo apt install ros-humble-turtlesim
    
    • 检查软件包是否已安装

      ros2 pkg executables turtlesim
      
  2. start turtlesim

    • 启动turtlesim

      ros2 run turtlesim turtlesim_node
      

      启动了turtlesim软件包下的可执行程序turtlesim_node节点

  3. 使用turtlesim

    ros2 run turtlesim turtle_teleop_key
    

    启动turtlesim软件包下的可执行文件turtle_teleop_key,可以使用方向键控制海龟的运动

    • 使用list命令查看节点、话题、服务和行动

      ros2 node list
      ros2 topic list
      ros2 service list
      ros2 action list
      
  4. 安装rqt

    sudo apt update
    sudo apt install ~nros-humble-rqt*
    

    运行rqt:

    rqt
    
  5. 使用rqt

    第一次运行 rqt 之后,窗口将是空白的。要从顶部的菜单栏中选择 Plugins > Services > Service Caller.

    Rqt 找到所有插件本身可能需要一些时间。如果单击 Plugins,但没有看到 Services 或任何其他选项,则应该关闭 rqt,在终端中输入命令 rqt —— force-Discovery。

    1. 使用rqt调用/spawn服务,产生一只乌龟,turtlesim的默认左下角为坐标原点,产生的乌龟不能同名
    2. 使用/set_pen服务,就是一支笔,有颜色(rgb)、有线宽
  6. Remapping

    上面产生了两只龟,但是还是只能控制默认创建的那只龟,需要remapping才能控制第二只龟

    在新终端中,source一下,然后运行:

    ros2 run turtlesim turtle_teleop_key --ros-args --remap turtle1/cmd_vel:=turtle2/cmd_vel
    

    运行turtlesim软件包下的turtle_teleop_key (海龟 远程操控 按键)可执行文件,传入参数--ros-args --remap (重新映射) 将turtle1/cmd_vel:=turtle2/cmd_vel (将turtle1节点的服务_速度命令映射为turtle2节点的服务_速度命令)

    现在可以控制两只龟了(需要在各自的终端中)

  7. 关闭乌龟仿真器

    在turtlesim_node终端中输入Ctrl + C,同时在teleop(远程控制)终端中输入q

理解节点

  • ros2 graph: ros2元素同步处理数据的网络

  • Nodes: ROS 中的每个节点应该负责一个单独用途的模块。每个节点都可以通过topics, services, actions, or parameters向其他节点发送和接受数据。

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

Tasks

  • ros2 run:命令ros2 run从软件包中运行一个可执行文件

    ros2 run <package_name> <executable_name>
    
  • ros2 node list: 显示ros2节点列表

    ros2 node list
    
    • 我运行示例命令只显示了一个节点:\teleop_turtle 为啥呢?重启后显示两个节点了。?··?
  • Remapping 重映射

    重映射可以将默认节点属性(如节点名称、主题名称、服务名称等)重新分配给自定义值。

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

    将__node映射为my_turtle

  • ros2 节点信息

    已经知道了节点名称,通过下面的方式访问节点的信息

    ros2 node info <node_name>
    

    Ros2节点信息返回与该节点交互的订阅者、发布者、服务和操作(ROS 图形连接)的列表。

理解topics

  • ROS2将复杂系统分解为许多模块化节点。主题是 ROS 图的一个重要元素,它充当节点交换消息的总线。
  • 节点可以将数据发布到任意数量的主题,并同时订阅任意数量的主题。
  • 主题是数据在节点之间以及系统不同部分之间移动的主要方式之一。

rqt_graph

  • 使用rqt_graph可视化节点和话题

  • 运行rat_graph

    rqt_graph
    
    • 也可以先打开rqt,然后选择Plugins > Introspection > Node Graph的方式来打开rqt_graph
  • 将鼠标悬停在中间的话题上,会高亮显示

  • 该图描述了/turtlesim 节点和/teleop_turtle节点如何在一个主题上彼此通信。teleop_turtle 节点正在向/turtle1/cmd _ vel 主题发布数据(用于移动 Turtle 的按键) ,/turtlesim 节点订阅该主题以接收数据。

ros2 topic list

ros2 topic list #返回系统中当前活动的所有主题列表
ros2 topic list -t #返回相同的主题列表,主题类型附加在中括号中(主题的message类型)

这些属性,特别是类型,是节点在移动到主题上时如何知道它们所谈论的信息相同的。

如果想知道 rqt _ graph 中所有这些主题的位置,您可以取消选中 Hide 下面的所有框

ros2 topic echo

需要看某个主题的发布 数据:

ros2 topic echo <topic_name>

起初,这个命令不会返回任何数据,这是因为它在等待/teleop _ turtle 节点发布一些内容。

在rqt_graph中取消Debug框

/_ ros2cli _ 26646是我们刚才运行的 echo 创建的节点(数字可能不同)。现在可以看到发布者(/teleop_turtle)正在往/turtle1/cmd _ vel 主题上发布数据,并且同时有两个订阅者(/_ ros2cli _ 26646和/turtlesim)订阅了该主题。

  • 注:订阅者和发布者都是节点。

ros2 topic info

  • 主题可以一对多、多对一或多对对。

查看topic的详细信息

ros2 topic info <topic_name>

这个命令可以看到topic的发布者和订阅者个数。

ros2 inerface show

节点使用messages在topics上发送数据。发布服务器(publishers)和订阅服务器(subscribers)必须发送和接收相同类型的消息才能进行通信。

使用ros2 topic list -t 查看主题类型,知道每个主题使用的message类型(方括号中的就是该topic的message类型。

cmd_evl主题的类型是

geometry_msgs/msg/Twist

含义:在包geometry_msgs中有一个名为Twistmsg.

可以在这个类型上运行ros2 interface show 来了解数据类型的详细信息,特别是message所期望的数据结构。

ros2 interface show geometry_msgs/msg/Twist

返回的消息类型为:

# This expresses velocity in free space broken into its linear and angular parts.

Vector3  linear
	float64 x
	float64 y
	float64 z
Vector3  angular
	float64 x
	float64 y
	float64 z

这表明turtlesim节点期望的message数据类型为两个向量(linearangular),每个向量有三个元素。这个数据结构与使用ros2 topic echo 命令查看topic发布的数据结构相同。

ros2 topic pub 发布主题

知道了message的数据结构后,可以使用下面的命令直接从命令行将数据发布道topic:

ros2 topic pub <topic_name> <msg_type> ''

‘ < args >’参数是您将传递给主题的实际数据,结构就是使用ros2 interface show 查看得到的数据结构。

==注意:==这个参数需要在YAML语法中输入(就是参数的输入数据格式为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表示发布一条消息然后退出。

  • 海龟(通常是它要模仿的真正的机器人)需要一个稳定的指令流来持续操作。所以,为了让乌龟继续前进,可以下面的指令:

    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然后添加了--rate 1参数(表示:发布该message的频率为1 Hz,一直发一直发)

    刷新rqt_graph后,可以看到topic /turtle1/cmd_vel多了一个订阅者/_ros2cli_30358 (这个就是上面的指令产生的一个新的节点)

    最后可以对pose运行echo并重新检查rat_graph

    ros2 topic echo /turtle1/pose
    

    注:打印topic /turtle1/pose发布的message,会产生一个新的节点来订阅/turtle1/psoe主题

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

ros2 topic hz

使用下面的命令查看节点数据发布的速率:

ros2 topic hz <topic_name>

返回某个节点向该主题发布数据的速率。

使用 ros2 topic pub --rate 1turtle1/cmd_vel 的发布速率设置为稳定的1Hz。然后查看该topic的发布数据频率将看到一个反映该速率的平均值1Hz。(查看设置了稳定发布速率的topic的发布message速率时,得到的是该topic的平均发送速率(设置的稳定发布速率))

Clean up

当有许多节点在运行,需要退出ros。不要忘记在每个终端中输入 Ctrl + C 来停止它们。

Understanding services

services是ros图中的另外一种通信方式。services属于call-and-response模型(topics通信方式是publisher-subscriber模型)。

topics允许节点订阅数据流并获得持续更新,但services只有在客户机特定调用时才提供数据(你问我才答,不问我不答)。

Tasks

启动两个 Turtlesim 节点/turtlesim/teleop _ turtle

ros2 service list

使用ros2 service list 返回系统中当前活动的所有service列表(所有的service_name)。

ros2 service type

service具有描述服务的请求响应数据结构的类型。服务类型的定义与主题类型类似,只不过服务类型有两部分: 一部分用于请求,另一部分用于响应

查找某个service的数据类型(数据类型名字),使用如下命令:

ros2 service type <service_name>

Empty服务类型表示:服务调用在发出请求时不发送数据,在接收响应时不接收数据。

rose2 service list -t

要同时查看所有活动服务以及它们的数据类型,可以在 list 命令后面添加--show-types 选项(缩写为-t) :

ros2 service list -t

返回所有的服务已经他们的service的数据类型(在中括号中)。

要查找特定的类型所有服务

ros2 service find <type_name>

ros2 interface show

同topcis一样可以从命令行call 请求 service,但是同样需要知道输入参数的数据结构。

ros2 interface show <type_name>

会返回一个用---上下分隔开的数据结构,上面是call的数据结构,下面是response的数据结构。对于Empty类型的service,它不发送或接受任何数据,它的结构是空白的。

ros2 srvice call 服务请求

通过命令行请求(call)服务(跟topic的发布消息相似):

ros2 service call <service_name> <service_type> <arguments>
  • 其中:部分是可选的,例如Empty类型的service是没有任何参数的:
ros2 service call /clear std_srvs/srv/Empty
  • 清楚turtlesim窗口中turtle所绘制的线。

同理,的输入格式也要符合YAML语法

如,请求/spawn 服务来产生一只新的乌龟。

ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"

请求的服务会立马更新

注:topic是一种单向通信模式,service是一种双向的通信模式。

Understanding parameters

参数是节点的配置值,可以将参数视为节点设置。节点可以将参数存储为正式、浮点数、布尔值、字符创和列表。在ros2中每个节点维护自己的参数。

Tasks

1 Setup

打开turtlesim_nodeturtle_teleop_key两个节点。

2 ros2 param list

要查看属于节点的参数列表,使用如下的命令:

ros2 param list

该命令返回当前运行的每个节点的参数。

(base) t@Tpc:~$ ros2 param list 
/teleop_turtle:
  qos_overrides./parameter_events.publisher.depth
  qos_overrides./parameter_events.publisher.durability
  qos_overrides./parameter_events.publisher.history
  qos_overrides./parameter_events.publisher.reliability
  scale_angular
  scale_linear
  use_sim_time
/turtlesim:
  background_b
  background_g
  background_r
  qos_overrides./parameter_events.publisher.depth
  qos_overrides./parameter_events.publisher.durability
  qos_overrides./parameter_events.publisher.history
  qos_overrides./parameter_events.publisher.reliability
  use_sim_time

可以看到每个节点都有use_sim_time参数,这个参数不是turtlesim的唯一参数。

基于参数的名字,可以得知/turtlesim节点使用BGR颜色值来决定Turtlesim窗口的背景颜色。

3 ros2 param get 获取节点的参数值

要显示参数的类型和当前值,使用下列命令:

ros2 param get <node_name> <parameter_name>

4 ros2 param set 设置节点的参数值

在运行时更改节点参数的值:

ros2 param set <node_name> <parameter_name> <value>
  • 参数设置成功后会返回Set parameter successful
  • 使用set命令设置节点参数只会在当前会话中更改它们,而不是永久设置。但是可以保存设置,并在下次启动节点时重新加载它们。

5 ros2 param dump 参数转储

可以使用以下命令查看节点的所有当前参数值

ros2 param dump <node_name>

该命令默然打印道标准输出(stdout),也可以将参数值重定向到一个文件中,以便保存。要将 节点 参数的当前值保存道.yaml 文件中:

ros2 param dump <node_name> > <name.yaml>

若想用相同的参数来重新加载节点,转储参数非常方便。

6 ros2 param load 加载节点参数

可以使用以下命令将参数从文件加载到当前运行的节点:

ros2 param load <node_name> <parameter_file>
  • 对于只读参数只能在启动时是修改,而不能在启动后修改,否则会返回qos_overrides的警告。

7 Load parameter file on node startup 启动时加载节点参数

使用保存的参数在启动节点时加载参数:

ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>

停止正在运行的节点,这样可以尝试使用保存的参数重新加载它.

这样可以更改只读参数。

Understanding actions

  • actions 是ROS2中的通信类型之一,用于长时间运行的任务。它们由三部分组成:一个目标、反馈和一个结果。
  • actions 是基于topics和services构建的。功能上类似与services,只是actions可以被取消。它们还提供稳定的反馈,而不是只返回一个响应的服务。
  • actions使用client-server模型,类似与topis中的publisher-subscriber模型。”action client”节点向“ action server”节点发送目标,该节点确认目标并返回反馈流和结果。

Tasks

1 Setup

  • 启动/turtlesim/teleop_turtle节点。

2 Use actions

在启动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 键周围形成一个“盒子”。每个按键在 F 周围的位置,都对应着海龟的方向。例如,E 会将海龟的方向旋转到左上角。(控制乌龟的朝向) F 键会在执行过程中取消一个目标(旋转)(在/tuetlesim_node窗口返回一个结果和反馈。

  • 取消actions 目标(停止旋转)会返回.... gole canceled
  • actions 目标完成 会返回....goal comleted successfully)
  • 当一个actions 目标还没有完成,这时启动了另一个actions 的目标会给出一个警告.... goal received before a previous goal finished. previous goal 会终止未完成的目标,转而去执行新给出的目标。
  • ==注意:==action server 可能选择放弃第一个目标,因为它有了一个新的目标。它也可以选择其他的东西,比如拒绝新的目标或者在第一个目标完成后执行第二个目标。不要认为每个action server 在获得一个新目标时都会选择放弃当前目标。

ros2 node info

使用ros2 node info 查看节点的actions.

返回这个节点的Publishers, Service Servers, Service Clients, Action Servers, Action Clients的所有信息。

注意,/turtlesim的/turtle1/rotle1 _ Absolalaction 位于 Action Servers 之下。这意味着/turtlesim 响应并为/turtle1/rotle1 action提供反馈。(server响应和反馈)

在 /telop _ turtle 节点的Action Clients 下面的有名称为/turtle1/rotle_ absolute,这意味着它为该action发送目标。(client发送goals)

ros2 action list

查看当前运行的所有节点的action

ros2 action list

返回当前ROS图中的action

  • action也是一种通信机制。
4.1 ros2 action -t

action也有类型,类似与topic和service,查看当前运行的所有action 列表及每个action的类型:

ros2 action list -t

返回action以及它们的类型(在方括号中)

  • 当需要从命令行或代码执行某个action时,需要action的类型。

5 ros2 action info

使用如下命令查看action的详细信息:

ros2 action info <action_name>
ros2 action info /turtle1/rotate_absolute

返回:

Action: /turtle1/rotate_absolute
Action clients: 1
    /teleop_turtle
Action servers: 1
    /turtlesim

会返回该actionaction clients数量以及名称,和action servers的数量和名称。

6 ros2 interface show

从命令行或文件发送或执行action目标之前,还需要action类型的数据结构。

ros2 interface show <type_name>

运行下边的命令:

ros2 interface show turtlesim/action/RotateAbsolute 

返回该action的数据类型格式:

# 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
  • 最上边的是目标请求的结构(数据类型和名称),中间是结果的结构,最后的一部分是反馈的结构。

ros2 action send_goal action通信发送目标

使用以下语法从命令行发送一个action目标:

ros2 action send_goal <action_name> <action_type> <value>
  • 需要采用YAML格式,跟service和topic很相似

  • ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"
    

    乌龟会旋转

  • Waiting for an action server to become available...
    Sending goal:
         theta: 1.57
    
    Goal accepted with ID: 64fc8c8b4798454c96ef3c98f9d033fc
    
    Result:
        delta: 0.0
    
    Goal finished with status: SUCCEEDED
    
  • 所有的goals都有一个唯一的ID。上边的delta表示相对于其实位置的偏移(增量)

要查看此目标的反馈,要向ros2 action send_goal命令后添加--feedback

ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.57}" --feedback

在机器人导航中使用的就是actions

机器人系统很可能使用操作来导航。一个动作目标可以告诉机器人前进到一个位置。当机器人导航到目的地时,它可以一路发送更新(即反馈) ,然后在到达目的地后发送最终结果消息。

Using rqt_console to view logs

  • rqt_console是一个用于检查日志消息的工具。
  • rqt_console是一个 GUI 工具,用于在 ROS2中查看日志消息。通常,日志消息显示在终端中。使用 rqt_console,可以随着时间的推移收集这些消息,以更有组织的方式仔细地查看它们,过滤它们,保存它们,甚至重新加载保存的文件,以便在不同的时间进行查阅。
  • 节点使用日志以各种方式输出关于事件和状态的消息。

Tasks

1 Setup

启动rqt_consoleturtlesim两个节点

ros2 run rqt_console rqt_console
  • 控制台的第一部分是显示来自系统的日志消息的位置。
  • 在中间,可以选择通过排除严重级别来过滤消息。也可以使用右边的加号按钮添加更多的排除过滤器。
  • 底部用于突出显示包含输入的字符串的消息。也可以向本节添加更多的过滤器。

Message on rqt_console显示日志

  • rqt_console会自动收集系统日志。

Logger levels 日志等级

Fatal # 最严重
Error
Warn
Info
Debug # 最轻微
  • Fatal:致命的信息表明系统将终止以保护自己免受损害。
  • Error:错误消息指示不一定会损害系统的重大问题,但会阻碍系统正常运行。
  • Warn:警告消息表示意外活动或非理想结果,这些活动或非理想结果可能代表更深层次的问题,但不会彻底损害功能。
  • Info:信息消息指示事件和状态更新,用于直观验证系统是否按预期运行。
  • Debug:调试消息详细描述了系统执行的整个逐步过程。
  • 默认级别是Info,只会看到默认严重级别或更严重级别的log信息
3.1 Set the default logger level

日志是某个节点的日志 设置log等级设置的是某个节点的log等级

可以在第一次使用Remapping运行/turtlesim 节点时设置默认的日志记录器级别。在终端机中输入以下命令:

ros2 run turtlesim turtlesim_node --ros-args --log-level WARN
ros2 run <package_name> <executable_name> --ros-args --log-level <log_level>

Launching nodes 启动节点

  • 使用命令行工具一次启动多个节点。
  • 随着构建的系统越来越大,需要有非常多的节点同事运行,打开终端和重新输入配置都会非常繁琐。
  • 启动文件(launch files)可以同时启动和配置多个包含ROS2节点的可执行文件。
  • Launch files可以同时启动和配置多个包含ROS2节点的可执行文件。
  • 使用ros2 launch命令运行一个launch file文件将立即启动整个系统–所有节点及其配置。
ros2 launch turtlesim multisim.launch.py
ros2 launch <package_name> <launch_file>

该命令将会运行以下启动文件:

# 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'),
    ])

上面的启动文件是用 Python 编写的,但是也可以使用 XML 和 YAML 来创建启动文件。可以在ROS2 Launch Files 中看到使用 Python、 XML 和 YAML 的 ROS2启动格式的不同点。

上边那个命令将会运行两个turtlesim节点

(Optional) Control the Turtlesim Nodes

可以像控制其他ROS2节点一样控制有lauch file启动的节点。例如,可以通过打开另外两个终端并运行以下命令,让海龟朝相反的方向行驶:

第二个终端:

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}}"

For more tutorials on ROS 2 launch files, see the main launch file tutorial page.

Recording and playing back data 记录和回放数据

  • ros2 bag 是一个命令行工具,用于记录系统中发布的topics数据。它累积了在任意数量的topics上传递的数据并将其保存在数据库中。然后,可以replay数据以重现测试和实验的结果。记录topic也是一个很好的方式来分享工作,并允许其他人重新创建它。

  • 安装ros2 bag

    sudo apt-get install ros-humble-ros2bag \
                         ros-humble-rosbag2-storage-default-plugins
    

Tasks

将在turtlesim系统中记录键盘输入,以便稍后进行保存和重播,首先启动turtlesimteleop_turtle节点。

  • 创建一个新的目录来存储需要保存的记录:

    mkdir bag_files
    cd bag_files
    

2 Choose a topic

ros2 bag只能从发布的 topic上记录数据。若想要查看系统topics 列表,使用下面的命令:

ros2 topic list

返回

/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

在主题教程中,了解到/turtle_teleop节点在/turtle1/cmd_vel 主题上发布命令,以使海龟在 Turtlesim 中移动。

要查看/turtle1/cmd_vel1话题正在发布的数据,使用下面的命令:

ros2 topic echo /turtle1/cmd_vel

ros2 bag record

要记录发布到topic的数据,使用下面的命令语法:

ros2 bag record <topic_name>
  • 在要选择要记录的主题上运行上面的这个命令之前,打开一个新的终端并移动到之前创建的bag_files目录,因为rosbag文件将保存在运行它的目录中。

  • ros2 bag record /turtle1/cmd_vel
    
  • 然后在终端中出现这些信息:

  • [INFO] [1659535570.441830742] [rosbag2_recorder]: Press SPACE for pausing/resuming
    [INFO] [1659535570.442882095] [rosbag2_storage]: Opened database 'rosbag2_2022_08_03-22_06_10/rosbag2_2022_08_03-22_06_10_0.db3' for READ_WRITE.
    [INFO] [1659535570.442943327] [rosbag2_recorder]: Listening for topics...
    [WARN] [1659535570.443076627] [ROSBAG2_TRANSPORT]: Hidden topics are not recorded. Enable them with --include-hidden-topics
    [WARN] [1659535570.443093818] [ROSBAG2_TRANSPORT]: Hidden topics are not recorded. Enable them with --include-hidden-topics
    [INFO] [1659535570.443834654] [rosbag2_recorder]: Subscribed to topic '/turtle1/cmd_vel'
    [WARN] [1659535570.444006076] [ROSBAG2_TRANSPORT]: Hidden topics are not recorded. Enable them with --include-hidden-topics
    [WARN] [1659535570.444032466] [ROSBAG2_TRANSPORT]: Hidden topics are not recorded. Enable them with --include-hidden-topics
    [INFO] [1659535570.444048982] [rosbag2_recorder]: All requested topics are subscribed. Stopping discovery...
    
  • 现在ros2 bag正在记录/turtle1/cmd_vel主题上发布的数据。

    • 回到teleop 终端,移动小海龟,记录操作。
  • Ctrl + c 停止录制

  • 数据将累积在一个bag文件中,该包文件的名称为:rosbag2_years_mouth_day_hours_minutes_second

3.1 Record multiple topics

可以同时记录多个主题,以及更改ros2 bag文件的名字。

ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose

记录/turtle1/cmd_vel主题和/turtle1/pose主题,记录的文件名为subset

这个-o选项可以为我们的bag文件选择一个唯一的名称,subset是上面的命令更改后的文件名,

要一次记录多个topic,只需使用空格分隔每个topic即可。

然后移动乌龟,完成后按下Ctrl + c

可以向命令添加另一个选项,-a , 该选项记录系统上的所有主题

4 ros2 bag info

可以运行以下命令查看有关recording的的详细信息:

ros2 bag info <bag_file_name>

查看subset包,以及返回的结果:

(base) t@Tpc:~/learn/ros2/ros_learn/BLI/bag_files$ ros2 bag info subset/

Files:             subset_0.db3
Bag size:          257.4 KiB
Storage id:        sqlite3
Duration:          62.831s
Start:             Aug  3 2022 22:37:50.325 (1659537470.325)
End:               Aug  3 2022 22:38:53.157 (1659537533.157)
Messages:          3967
Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 39 | Serialization Format: cdr
                   Topic: /turtle1/pose | Type: turtlesim/msg/Pose | Count: 3928 | Serialization Format: cdr

要查看各个消息,必须打开数据可来检查它。(不明白)

5 ros2 bag play

在重播bag文件之前,在teleop终端正在运行的终端中输入Ctrl + c. 然后确保turtlesim窗口可见,以便可以看到bag文件真的动作。

ros2 bag play <bag_file_name>

输入命令:

ros2 bag play subset

终端会返回信息:

[INFO] [1659538446.802414765] [rosbag2_storage]: Opened database 'subset/subset_0.db3' for READ_ONLY.
[INFO] [1659538446.802492081] [rosbag2_player]: Set rate to 1
[INFO] [1659538446.805817265] [rosbag2_player]: Adding keyboard callbacks.
[INFO] [1659538446.805853441] [rosbag2_player]: Press SPACE for Pause/Resume
[INFO] [1659538446.805864392] [rosbag2_player]: Press CURSOR_RIGHT for Play Next Message
[INFO] [1659538446.805873202] [rosbag2_player]: Press CURSOR_UP for Increase Rate 10%
[INFO] [1659538446.805881393] [rosbag2_player]: Press CURSOR_DOWN for Decrease Rate 10%
[INFO] [1659538446.806084604] [rosbag2_storage]: Opened database 'subset/subset_0.db3' for READ_ONLY.

:操作是记录的操作,但是由于起始小乌龟的方向不同,和位置不同,最终的结果整体相差了个旋转和平移。

因为subset文件记录了/turtle1/pose主题,所以 ros2 bag play 命令不会在运行了 turtlesim 的情况下退出,即使没有移动。**运行了ros2 bag play subset**的终端自动退出。

这是因为只要/turtlesim 节点处于活动状态,它就会定期发布关于turtle1/pose 主题的数据。在上面的 ros2 bag info示例结果中,/turtle1/cmd _ vel 主题的 Count 信息仅为39; 这是我们在记录时按下箭头键的次数。

注意,/turtle1/poseCount 值超过3928; 当我们记录时,关于该主题的数据发布了3928次。

要了解 topic 位置数据发布的频率,可以运行以下命令:

ros2 topic hz /turtle1/pose

链接

[1] https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools.html#

你可能感兴趣的:(ROS2,其他)