背景
1、ROS2图
ROS图是由同时处理数据的ROS2各个元素组成的网络。如果你把ROS图映射出来,并做可视化的话,可以看到其所有的可执行文件以及它们之间的连接。
2、ROS2中的节点
ROS中的每个节点应该专注于单一模块化功能,例如控制轮毂电机或发布激光测距仪的传感器数据。节点之间可通过话题(topics)、服务(services)、动作(actions)或参数(parameters)向其他节点发送和接收数据。
一个完整的机器人系统通常由许多协同工作的节点组成。在ROS2中,单个可执行文件(c++程序、Python程序等)可以包含一个或多个节点。
准备
如果您看过之前的教程,应该还记得安装ROS2完成后需要配置环境变量。
这一节中,同样不要忘记在使用ROS2前需要先设置环境:- # Replace ".bash" with your shell if you're not using bash
- # Possible values are: setup.bash, setup.sh, setup.zsh
- source /opt/ros/jazzy/setup.bash
复制代码 任务
1、ros2 run
ros2 run命令用于起动一个ROS2包中的可执行程序- ros2 run <package_name> <executable_name>
复制代码 比如运行turtlesim,您需要首先打开一个新的终端,然后输入以下命令:- ros2 run turtlesim turtlesim_node
复制代码 一个模拟窗口会出现,窗口中间会有一个随机海龟:
在这里, 包名是turtlesim,可执行程序是turtlesim_node。但是我们仍然还不知道节点名称。您可以通过命令“ros2 node list”找到节点名。
2、ros2 node list
ros2 node list会显示所有正在运行的节点名。当您想要与某个节点进行交互时,或者当您的系统运行了许多节点,并想要跟踪它们时,这将非常有用。
保持上一个终端中turtlesim运行,然后打开一个新的终端,输入以下命令:新的终端会返回当前正在运行的节点名:接着,再打开另一个新的终端,打开接受键盘输入的teleop节点:- ros2 run turtlesim turtle_teleop_key
复制代码 在这里,我们又一次用到了turtlesim包,但是这次我们的执行的程序是turtle_teleop_key。
返回到您运行ros2 node list终端,并重新运行一次,您将会看到两个正在运行的节点:2.1、重映射
重映射功能允许您将节点的默认属性(如节点名称、话题名称、服务名称等)重新分配为自定义值。
现在,让我们重新分配/turtlesim节点的名称。在一个新的终端中,运行如下命令:- ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
复制代码 由于您再次调用ros2 run运行一个新的turtlesim包里的turtlesim_node,这将打开另一个turtlesim窗口。现在如果您返回到运行ros2 node list的终端,并再次运行它,您将看到三个节点名称,其中有一个是您刚刚重新分配的节点,名字是my_turtle:- /my_turtle/turtlesim
- /teleop_turtle
复制代码 3、ros2 node info
现在您已经知道了节点的名称,您可以使用以下命令访问节点的更多信息:- ros2 node info <node_name>
复制代码 比如,检查您最后一个节点my_turtle,运行以下命令:- ros2 node info <node_name>/my_turtle
复制代码 ros2 node info会返回一个列表,其中包含了定阅者、服务、动作等等。也就是说与该节点交互的ROS图连接。输出应该是这样的:- /my_turtle
- Subscribers:
- /parameter_events: rcl_interfaces/msg/ParameterEvent
- /turtle1/cmd_vel: geometry_msgs/msg/Twist
- Publishers:
- /parameter_events: rcl_interfaces/msg/ParameterEvent
- /rosout: rcl_interfaces/msg/Log
- /turtle1/color_sensor: turtlesim/msg/Color
- /turtle1/pose: turtlesim/msg/Pose
- Service Servers:
- /clear: std_srvs/srv/Empty
- /kill: turtlesim/srv/Kill
- /my_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters
- /my_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
- /my_turtle/get_parameters: rcl_interfaces/srv/GetParameters
- /my_turtle/list_parameters: rcl_interfaces/srv/ListParameters
- /my_turtle/set_parameters: rcl_interfaces/srv/SetParameters
- /my_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
- /reset: std_srvs/srv/Empty
- /spawn: turtlesim/srv/Spawn
- /turtle1/set_pen: turtlesim/srv/SetPen
- /turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
- /turtle1/teleport_relative: turtlesim/srv/TeleportRelative
- Service Clients:
- Action Servers:
- /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
- Action Clients:
复制代码 现在尝试在/teleop_turtle节点上运行相同的命令,看看它的连接与my_turtle有什么不同。
总结
节点是ROS2的一个基本元素,在机器人系统中服务于单一的、模块化的目的。
您通过运行可执行文件turtlesim_node和turtle_teleop_key,使用了turtlesim功能包中的节点。
您学会了如何使用ros2 node list查看运行中的节点名称,以及通过ros2 node info来查看单个节点的详细信息。这些工具对于理解复杂真实机器人系统中的数据流至关重要。
关注【智践行】公众号,发送 【机器人】 获得机器人经典学习资料
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |