CLI工具
配置环境
-
要么每次使用ros的时候source一下文件,要么将source 文件添加道shell启动脚本
-
获取设置文件
# 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
-
将获取设置文件命令添加到shell启动脚本
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
- 具体命令取决于安装ros的位置
-
检查环境变量
printenv | grep -i ROS
-
使用turtlesim
和rqt
-
安装ros2的turtlesim包
sudo apt update sudo apt install ros-humble-turtlesim
-
检查软件包是否已安装
ros2 pkg executables turtlesim
-
-
start turtlesim
-
启动turtlesim
ros2 run turtlesim turtlesim_node
启动了turtlesim软件包下的可执行程序turtlesim_node节点
-
-
使用turtlesim
ros2 run turtlesim turtle_teleop_key
启动turtlesim软件包下的可执行文件turtle_teleop_key,可以使用方向键控制海龟的运动
-
使用list命令查看节点、话题、服务和行动
ros2 node list ros2 topic list ros2 service list ros2 action list
-
-
安装rqt
sudo apt update sudo apt install ~nros-humble-rqt*
运行rqt:
rqt
-
使用rqt
第一次运行 rqt 之后,窗口将是空白的。要从顶部的菜单栏中选择 Plugins > Services > Service Caller.
Rqt 找到所有插件本身可能需要一些时间。如果单击 Plugins,但没有看到 Services 或任何其他选项,则应该关闭 rqt,在终端中输入命令 rqt —— force-Discovery。
- 使用rqt调用/spawn服务,产生一只乌龟,turtlesim的默认左下角为坐标原点,产生的乌龟不能同名
- 使用/set_pen服务,就是一支笔,有颜色(rgb)、有线宽
-
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节点的服务_速度命令)现在可以控制两只龟了(需要在各自的终端中)
-
关闭乌龟仿真器
在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
中有一个名为Twist
的msg
.
可以在这个类型上运行ros2 interface show <msg_type>
来了解数据类型的详细信息,特别是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数据类型为两个向量(linear
和angular
),每个向量有三个元素。这个数据结构与使用ros2 topic echo <topic_name>
命令查看topic发布的数据结构相同。
ros2 topic pub 发布主题
知道了message的数据结构后,可以使用下面的命令直接从命令行将数据发布道topic:
ros2 topic pub <topic_name> <msg_type> '<args>'
‘ < args >’参数是您将传递给主题的实际数据,结构就是使用ros2 interface show <msg_type>
查看得到的数据结构。
==注意:==这个参数需要在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 1
将 turtle1/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>
- 其中:
<arguments>
部分是可选的,例如Empty
类型的service是没有任何参数的:
ros2 service call /clear std_srvs/srv/Empty
- 清楚turtlesim窗口中turtle所绘制的线。
同理,<arguments>
的输入格式也要符合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_node
和turtle_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 <node_name>
查看节点的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
会返回该action
的action 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>
-
<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_console
和turtlesim
两个节点
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
系统中记录键盘输入,以便稍后进行保存和重播,首先启动turtlesim
和teleop_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/pose
的 Count
值超过3928; 当我们记录时,关于该主题的数据发布了3928次。
要了解 topic 位置数据发布的频率,可以运行以下命令:
ros2 topic hz /turtle1/pose
链接
[1] https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools.html#