1.Nodes
ROS 中的每个节点都应该负责一个单一的模块用途(例如,一个节点用于控制车轮电机,一个节点用于控制激光测距仪等)。 每个节点都可以通过主题、服务、动作或参数向其他节点发送和接收数据。
一个完整的机器人系统由许多协同工作的节点组成。 在 ROS 2 中,单个可执行文件(C++ 程序、Python 程序等)可以包含一个或多个节点。
1.1 ros2 run 命令
此命令可从包中启动一个可执行文件。
ros2 run <package_name> <executable_name>
要运行turtlesim,请打开一个新终端,然后输入以下命令:
ros2 run turtlesim turtlesim_node
包名是turtlesim,可执行文件名是turtlesim_node。
1.2 ros2 node list 命令
此命令将显示所有正在运行的节点的名称。当您希望与某个节点进行交互,或者当您的系统运行多个节点并需要跟踪它们时,这一点特别有用。
ros2 node list
1.3 ros2 node info 命令
当您知道了节点的名称,可以使用以下命令访问关于节点的更多信息:
ros2 node info <node_name>
要检查您的最新节点 my_turtle,请运行以下命令:
ros2 node info /my_turtle
该命令返回与该节点交互的订阅者、发布者、服务和操作(ROS图连接)的列表。
2.Topics
ROS 2将复杂的系统分解成许多模块化节点。topic是ROS图的一个重要元素,它充当节点交换消息的总线。
一个节点可以向任意数量的主题发布数据并同时订阅任意数量的主题。
主题是数据在节点之间以及系统的不同部分之间移动的主要方式之一。
首先启动turtlesim,以此为基础介绍其他命令使用。
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
2.1 rqt_graph 命令
使用 rqt_graph 来可视化不断变化的节点和主题,以及它们之间的联系。
rqt_graph
你也可以使用 rqt_graph 通过打开 rqt工具箱,然后选择 Plugins > Introspection > Node Graph.
rqt
该图描绘了 /turtlesim 节点和 /teleop_turtle 节点如何通过主题相互通信。 /teleop_turtle 节点正在向 /turtle1/cmd_vel 主题发布数据(您输入的用于移动海龟的按键),/turtlesim 节点订阅该主题以接收数据。
rqt_graph 的突出显示功能在检查具有以多种不同方式连接的许多节点和主题的更复杂系统时非常有用。
rqt_graph 是一个图形自省工具。 现在我们将看看一些用于自省主题的命令行工具。
2.2 ros2 topic list 命令
在新终端中运行 ros2 topic list 命令将返回系统中当前活动的所有主题的列表:
ros2 topic list
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
ros2 topic list -t 将返回相同的主题列表,这次将主题类型附加在括号中:
ros2 topic list -t
/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
/turtle1/cmd_vel [geometry_msgs/msg/Twist]
/turtle1/color_sensor [turtlesim/msg/Color]
/turtle1/pose [turtlesim/msg/Pose]
这些属性,特别是类型,是节点如何在跨越主题时知道它们正在讨论相同的信息。
2.3 ros2 topic echo 命令
要查看在某个主题上发布的数据,请使用:
ros2 topic echo <topic_name>
由于我们知道 /teleop_turtle 通过 /turtle1/cmd_vel 主题将数据发布到 /turtlesim,让我们使用 echo 来反省该主题:
ros2 topic echo /turtle1/cmd_vel
起初,这个命令不会返回任何数据。 那是因为它在等待 /teleop_turtle 发布一些东西。
返回到运行turtle_teleop_key 的终端并使用箭头移动海龟。 观察您的回声同时运行的终端,您将看到为您所做的每一个动作发布的位置数据:
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
–
2.3 ros2 topic info命令
话题不必只是点对点的交流; 它可以是一对多、多对一或多对多。
ros2 topic info /turtle1/cmd_vel
它将返回:
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 2
2.4 ros2 interface show命令
节点使用消息通过主题发送数据。 发布者和订阅者必须发送和接收相同类型的消息才能进行通信。
我们之前在运行 ros2 topic list -t 后看到的主题类型让我们知道每个主题使用的消息类型。 回想一下 cmd_vel 主题的类型:
geometry_msgs/msg/Twist
这意味着在包 geometry_msgs 中有一个名为 Twist 的 msg。
现在我们可以在这个类型上运行 ros2 interface show 来了解它的细节,特别是消息期望的数据结构。
ros2 interface show geometry_msgs/msg/Twist
对于上面的消息类型,它产生:
#This expresses velocity in free space broken into its linear and angular parts.
Vector3 linear
Vector3 angular
这告诉您 /turtlesim 节点需要一条消息,其中包含两个向量(线性和角度),每个向量包含三个元素。 如果你回忆一下我们看到 /teleop_turtle 使用 echo 命令传递给 /turtlesim 的数据,它的结构相同:
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
2.5 ros2 topic pub命令
现在您有了消息结构,您可以使用以下命令直接从命令行将数据发布到主题上:
ros2 topic pub <topic_name> <msg_type> '<args>'
‘<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 是一个可选参数,意思是“发布一条消息然后退出”。
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 选项,它告诉 ros2 topic pub 以 1 Hz 的稳定流发布命令。
最后,您可以在姿势主题上运行 echo 并重新检查 rqt_graph:
ros2 topic echo /turtle1/pose
2.6 ros2 topic hz命令
对于此过程的最后一次反思,您可以使用以下方法查看数据发布的速度:
ros2 topic hz /turtle1/pose
它将返回有关 /turtlesim 节点向姿势主题发布数据的速率的数据:
average rate: 59.354
min: 0.005s max: 0.027s std dev: 0.00284s window: 58
3.Services
服务是 ROS 图中节点的另一种通信方式。 服务基于调用和响应模型,而不是主题的发布者-订阅者模型。 虽然主题允许节点订阅数据流并获得持续更新,但服务仅在客户端专门调用时才提供数据。
首先启动turtlesim,以此为基础介绍其他命令使用。
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
3.1 ros2 service list 命令
在新终端中运行 ros2 service list 命令将返回系统中当前活动的所有服务的列表:
ros2 service list
返回:
/clear
/kill
/reset
/spawn
/teleop_turtle/describe_parameters
/teleop_turtle/get_parameter_types
/teleop_turtle/get_parameters
/teleop_turtle/list_parameters
/teleop_turtle/set_parameters
/teleop_turtle/set_parameters_atomically
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/describe_parameters
/turtlesim/get_parameter_types
/turtlesim/get_parameters
/turtlesim/list_parameters
/turtlesim/set_parameters
/turtlesim/set_parameters_atomically
您将看到两个节点都具有相同的六个服务,其名称中带有参数。 ROS 2 中的几乎每个节点都有这些基础设施服务,参数是基于这些服务构建的。 在下一个教程中将有更多关于参数的内容。
3.2 ros2 service type 命令
服务的类型描述了服务的请求和响应数据的结构。 服务类型的定义与主题类型类似,但服务类型有两个部分:一个用于请求的消息,另一个用于响应的消息。
要找出服务的类型,请使用以下命令:
ros2 service type <service_name>
我们来看看turtlesim的/clear服务。 在新终端中,输入命令:
ros2 service type /clear
返回:
std_srvs/srv/Empty
Empty 类型表示服务调用在发出请求时不发送数据,在接收响应时不接收数据。
3.3 ros2 service list -t命令
要同时查看所有活动服务的类型,可以在list命令后面添加——show-types选项,缩写为-t
ros2 service list -t
3.4 ros2 service find命令
如果要查找特定类型的所有服务,可以使用以下命令:
ros2 service find <type_name>
例如,您可以像这样找到所有 Empty 类型的服务:
ros2 service find std_srvs/srv/Empty
返回:
/clear
/reset
3.5 ros2 interface show命令
您可以从命令行调用服务,但首先您需要知道输入参数的结构。
ros2 interface show <type_name>.srv
要查看 /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
3.6 ros2 service call命令
现在您知道什么是服务类型、如何查找服务类型以及如何查找该类型参数的结构,您可以使用以下方法调用服务:
ros2 service call <service_name> <service_type> <arguments>
<arguments部分是可选的。 例如,您知道 Empty 类型服务没有任何参数:
ros2 service call /clear std_srvs/srv/Empty
此命令将清除乌龟绘制的任何线条的turtlesim 窗口。
现在让我们通过调用 /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’)
4.Parameters
参数是节点的配置值。 您可以将参数视为节点设置。 节点可以将参数存储为整数、浮点数、布尔值、字符串和列表。 在 ROS 2 中,每个节点维护自己的参数。 所有参数都是动态可重新配置的,并基于 ROS 2 服务构建。
首先启动turtlesim,以此为基础介绍其他命令使用。
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
4.1 ros2 param list 命令
要查看属于您的节点的参数,请打开一个新终端并输入命令:
ros2 param list
您将看到节点命名空间 /teleop_turtle 和 /turtlesim,然后是每个节点的参数:
/teleop_turtle:
scale_angular
scale_linear
use_sim_time
/turtlesim:
background_b
background_g
background_r
use_sim_time
每个节点都有参数use_sim_time; 这不是turtlesim独有的。
根据它们的名称,看起来 /turtlesim 的参数使用 RGB 颜色值确定了turtlesim 窗口的背景颜色。
要确定参数的类型,您可以使用 ros2 param get。
4.2 ros2 param get 命令
要显示参数的类型和当前值,请使用以下命令:
ros2 param get <node_name> <parameter_name>
比如:找出/turtlesim的参数background_g的当前值:
ros2 param get /turtlesim background_g
返回:
Integer value is: 86
4.3 ros2 param set 命令
要在运行时更改参数的值,请使用以下命令:
ros2 param set <node_name> <parameter_name> <value>
让我们改变 /turtlesim 的背景颜色:
ros2 param set /turtlesim background_r 150
返回:
Set parameter successful
使用 set 命令设置参数只会在您当前的会话中更改它们,而不是永久更改。 但是,您可以保存设置并在下次启动节点时重新加载它们。
4.4 ros2 param dump 命令
您可以使用以下命令将节点的所有当前参数值“转储”到文件中以供以后保存:
ros2 param dump <node_name>
要保存 /turtlesim 参数的当前配置,请输入以下命令:
ros2 param dump /turtlesim
返回:
Saving to: ./turtlesim.yaml
您将在工作区运行的目录中找到一个新文件。 如果打开此文件,您将看到以下内容:
turtlesim:
ros__parameters:
background_b: 255
background_g: 86
background_r: 150
use_sim_time: false
4.5 ros2 param load 命令
您可以使用以下命令将文件中的参数加载到当前运行的节点:
ros2 param load <node_name> <parameter_file>
要将使用 ros2 param dump 生成的 ./turtlesim.yaml 文件加载到 /turtlesim 节点的参数中,请输入命令:
ros2 param load /turtlesim ./turtlesim.yaml
返回:
Set parameter background_b successful
Set parameter background_g successful
Set parameter background_r successful
Set parameter use_sim_time successful
4.6 Load parameter file on node startup
要使用您保存的参数值启动同一个节点,请使用:
ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>
这与您总是用来启动turtlesim的命令相同,添加了标志–ros-args和–params-file,后跟要加载的文件。
停止正在运行的turtlesim节点,以便您可以尝试使用保存的参数重新加载它,使用:
ros2 run turtlesim turtlesim_node --ros-args --params-file ./turtlesim.yaml
5.Actions
动作是 ROS 2 中的一种通信类型,用于长时间运行的任务。 它们由三部分组成:目标、反馈和结果。
操作建立在主题和服务上。 它们的功能类似于服务,除了操作是可抢占的(您可以在执行时取消它们)。 它们还提供稳定的反馈,而不是返回单一响应的服务。
操作使用客户端-服务器模型,类似于发布者-订阅者模型(在主题教程中进行了描述)。 “动作客户端”节点向“动作服务器”节点发送目标,该节点确认目标并返回反馈流和结果。
首先启动turtlesim,以此为基础介绍其他命令使用。
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
5.1 ros2 action list 命令
要在ROS图中识别所有的动作,请运行该命令:
ros2 action list
返回:
/turtle1/rotate_absolute
5.2 ros2 action list -t 命令
动作有类型,类似于主题和服务。 要查找 /turtle1/rotate_absolute 的类型,请运行以下命令:
ros2 action list -t
返回:
/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]
5.2 ros2 action info 命令
您可以使用以下命令进一步内省 /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 动作的动作服务器。
5.3 ros2 interface show命令
在自己发送或执行操作目标之前,您还需要的另一条信息是操作类型的结构。
在运行命令 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
此消息的第一部分,在 — 上方,是目标请求的结构(数据类型和名称)。 下一部分是结果的结构。 最后一部分是反馈的结构。
5.4 ros2 action send_goal
现在让我们使用以下语法从命令行发送一个动作目标:
ros2 action send_goal <action_name> <action_type> <values>
注意turtlesim 窗口,然后在终端中输入以下命令:
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: f8db8f44410849eaa93d3feb747dd444
Result:
delta: -1.568000316619873
Goal finished with status: SUCCEEDED
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.57}" --feedback
使用此命令您将继续收到反馈,剩余的弧度,直到目标完成。