@@ -452,3 +452,319 @@ rqt是ROS2的GUI工具。
452452
453453
454454
455+
456+ # 理解ROS2主题
457+
458+
459+
460+ ** 目标** :使用rqt_graph和命令行工具来内检ROS2的主题。
461+
462+ ** 教程等级** :初学者
463+
464+ ** 用时** :20分钟
465+
466+ ** 内容** :
467+
468+
469+
470+ - # # 背景
471+
472+ ROS2将复杂系统分解为许多模块化节点。
473+ 主题是ROS图的重要元素,充当节点交换消息的总线。
474+
475+ ! [图片alt](http://docs.ros.org/en/galactic/_images/Topic-SinglePublisherandSingleSubscriber.gif)
476+
477+ 一个节点可以向任意数量的主题发布数据并同时订阅任意数量的主题。
478+
479+ ! [图片alt](http://docs.ros.org/en/galactic/_images/Topic-MultiplePublisherandMultipleSubscriber.gif)
480+
481+ 主题是数据在节点之间移动的主要方式之一,因此在系统的不同部分之间移动。
482+
483+ - # # 先决条件
484+
485+ 上一个教程提供了一些关于在此处构建的节点的有用背景信息。
486+
487+ 与往常一样,不要忘记在你打开的每个新终端中读取并执行ROS2设置文件中的shell命令。
488+
489+
490+ - # # 任务
491+
492+ 1. # ## 设置
493+
494+ 到现在为止,你应该可以轻松启动海龟模拟器了。
495+
496+ 打开一个新终端并运行:
497+
498+ ` ` ` bash
499+ ros2 run turtlesim turtlesim_node
500+ ` ` `
501+
502+ 打开另一个终端并运行:
503+
504+ ` ` ` bash
505+ ros2 run turtlesim turtle_teleop_key
506+ ` ` `
507+
508+ 回想一下之前的教程,这些节点的名称默认为/turtlesim和/teleop_turtle。
509+
510+
511+ 2. # ## rqt_graph
512+
513+ 在本教程中,我们将使用rqt_graph来可视化不断变化的节点和主题,以及它们之间的联系。
514+
515+ [海龟模拟器教程]告诉你如何安装rqt及其所有插件,包括rqt_graph。
516+
517+ 要运行rqt_graph,请打开一个新终端并输入命令:
518+
519+ ` ` ` bash
520+ rqt_graph
521+ ` ` `
522+
523+ 你还可以通过打开rqt并选择Plugins> Introspection> Node Graph来打开rqt_graph。
524+
525+ ! [图片alt](http://docs.ros.org/en/galactic/_images/rqt_graph.png)
526+
527+ 你应该会看到上面的节点和主题,以及围绕图外围的两个动作(让我们暂时忽略它们)。
528+
529+ 如果你将鼠标悬停在中心的主题上,你将看到如上图所示的颜色突出显示。
530+
531+ 该图描绘了/turtlesim节点和/teleop_turtle节点如何通过主题相互通信。
532+ /teleop_turtle节点正在向/turtle1/cmd_vel主题发布数据(你输入的用于移动海龟的按键),/turtlesim节点订阅该主题以接收数据。
533+
534+ rqt_graph的突出显示功能在检查具有以多种不同方式连接的许多节点和主题的更复杂系统时非常有用。
535+
536+ rqt_graph是一个图形化自检工具。
537+ 现在我们将看看一些用于自检主题的命令行工具。
538+
539+
540+
541+ 3. # ## ros2主题列表
542+
543+ 在新终端中运行` ` ` ros2 topic list` ` ` 命令将返回系统中当前活动的所有主题的列表:
544+
545+ ```
546+ /parameter_events
547+ /rosout
548+ /turtle1/cmd_vel
549+ /turtle1/color_sensor
550+ /turtle1/pose
551+ ```
552+
553+ ` ` ` ros2 topic list -t` ` ` 将返回相同的主题列表,这次将主题类型附加在括号中:
554+
555+ ```
556+ /parameter_events [rcl_interfaces/msg/ParameterEvent]
557+ /rosout [rcl_interfaces/msg/Log]
558+ /turtle1/cmd_vel [geometry_msgs/msg/Twist]
559+ /turtle1/color_sensor [turtlesim/msg/Color]
560+ /turtle1/pose [turtlesim/msg/Pose]
561+ ```
562+
563+ 这些属性,尤其是类型,是节点如何知道他们在讨论相同的信息,因为它在主题上移动。
564+
565+ 如果你想知道rqt_graph中所有这些主题的位置,你可以取消选中隐藏下的所有框:
566+
567+ ! [image alt](http://docs.ros.org/en/galactic/_images/unhide.png)
568+
569+ 不过,就目前而言,请选中这些选项以避免混淆。
570+
571+
572+
573+ 4. # ## ROS2主题应答
574+
575+ 要查看关于某个主题发布的数据,请使用:
576+
577+ ` ` ` bash
578+ ros2 topic echo < topic_name>
579+ ` ` `
580+
581+ 由于我们知道/teleop_turtle通过/turtle1/cmd_vel主题将数据发布到/turtlesim,让我们使用echo来自省该主题:
582+
583+ ` ` ` bash
584+ ros2 topic echo /turtle1/cmd_vel
585+ ` ` `
586+
587+ 起初,这个命令不会返回任何数据。
588+ 那是因为它在等待/teleop_turtle发布一些东西。
589+
590+ 返回到运行turtle_teleop_key的终端并使用箭头移动海龟。
591+ 观察你运行echo的终端,你将看到为你所做的每一个动作发布的位置数据:
592+
593+ ```
594+ linear:
595+ x: 2.0
596+ y: 0.0
597+ z: 0.0
598+ angular:
599+ x: 0.0
600+ y: 0.0
601+ z: 0.0
602+ ---
603+ ```
604+
605+ 现在返回到rqt_graph并取消选中调试框。
606+
607+ ! [图片alt](http://docs.ros.org/en/galactic/_images/debug.png)
608+
609+ /_ros2cli_26646是我们刚刚运行的 echo 创建的节点(数字可能不同)。
610+ 现在可以看到发布者正在通过cmd_vel主题发布数据,并且有两个订阅者订阅了。
611+
612+
613+
614+ 5. # ## ROS2主题信息
615+
616+ 话题不只是点对点的通讯;它可以是一对多、多对一或多对多。
617+
618+ 另一种看待它的方法是运行:
619+
620+ ` ` ` bash
621+ ros2 topic info /turtle1/cmd_vel
622+ ` ` `
623+
624+ 将返回:
625+
626+ ```
627+ Type: geometry_msgs/msg/Twist
628+ Publisher count: 1
629+ Subscription count: 2
630+ ```
631+
632+
633+
634+ 6. # ## ROS2接口展示
635+
636+ 节点使用消息在主题上发送数据。
637+ 发布者和订阅者必须发送和接收相同类型的消息才能进行通信。
638+
639+ 我们之前在运行` ` ` ros2 topic list -t` ` ` 后看到的主题类型让我们知道每个主题使用的消息类型。
640+ 回想一下cmd_vel主题的类型:
641+
642+ ```
643+ geometry_msgs/msg/Twist
644+ ```
645+
646+ 这意味着在包geometry_msgs中有一个名为Twist的msg。
647+
648+ 现在我们可以在这个类型上运行` ` ` ros2 interface show < msg type> ` ` ` 来了解它的细节,特别是消息预设的数据结构。
649+
650+ ` ` ` bash
651+ ros2 interface show geometry_msgs/msg/Twist
652+ ` ` `
653+
654+ 对于上面的消息类型,它产生:
655+
656+ ```
657+ # This expresses velocity in free space broken into its linear and angular parts.
658+
659+ Vector3 linear
660+ float64 x
661+ float64 y
662+ float64 z
663+ Vector3 angular
664+ float64 x
665+ float64 y
666+ float64 z
667+ ```
668+
669+ 这告诉你/turtlesim节点需要一条消息,其中包含两个向量(线性和角度),每个向量包含三个元素。
670+ 如果你回忆一下我们看到/teleop_turtle使用echo命令传递给/turtlesim 的数据,它的结构相同:
671+
672+ ```
673+ linear:
674+ x: 2.0
675+ y: 0.0
676+ z: 0.0
677+ angular:
678+ x: 0.0
679+ y: 0.0
680+ z: 0.0
681+ ---
682+ ```
683+
684+
685+ 7. # ## ROS2主题发布
686+
687+ 现在你有了消息结构,你可以使用以下命令直接从命令行将数据发布到主题上:
688+
689+ ` ` ` bash
690+ ros2 topic pub < topic_name> < msg_type> ' <args>'
691+ ` ` `
692+
693+ ` ` ` < args> ` ` ` 参数是你将传递给主题的实际数据,在你刚刚在上一节中发现的结构中。
694+
695+ 需要注意的是,此参数需要以YAML语法输入。
696+ 像这样输入完整的命令:
697+
698+ ` ` ` bash
699+ 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}}"
700+ ` ` `
701+
702+ ` ` ` --once` ` ` 是一个可选参数,意思是“发布一条消息然后退出”。
703+
704+ 你将在终端中收到以下消息:
705+
706+ ```
707+ publisher: beginning loop
708+ 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))
709+ ```
710+
711+ 你会看到你的乌龟像这样移动:
712+
713+ ! [图像alt](http://docs.ros.org/en/galactic/_images/pub_once.png)
714+
715+ 海龟(通常是它要模拟的真实机器人)需要稳定的命令流才能连续运行。
716+ 所以,为了让海龟继续移动,你可以运行:
717+
718+ ` ` ` bash
719+ 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}}"
720+ ` ` `
721+
722+ 你可以刷新rqt_graph以图形方式查看发生的情况。
723+ 你将看到ros2主题发布... 节点 (/_ros2cli_30358)正在/turtle1/cmd_vel主题上发布,并且现在正在被ros2主题应答...节点 (/_ros2cli_26646)和/turtlesim节点接收 。
724+
725+ ! [图片alt](http://docs.ros.org/en/galactic/_images/rqt_graph2.png)
726+
727+ 最后,你可以在` ` ` pose` ` ` 主题上运行` ` ` echo` ` ` 并重新检查rqt_graph:
728+
729+ ` ` ` bash
730+ ros2 topic echo /turtle1/pose
731+ ` ` `
732+
733+ ! [图片alt](http://docs.ros.org/en/galactic/_images/rqt_graph3.png)
734+
735+ 你可以看到/turtlesim节点也在发布新的` ` ` echo` ` ` 节点订阅的` ` ` pose` ` ` 主题。
736+
737+
738+
739+ 8. # ## ROS2主题速度
740+
741+ 对于此过程的最后一次反思,你可以使用以下方法查看数据发布的速度:
742+
743+ ` ` ` bash
744+ ros2 topic hz /turtle1/pose
745+ ` ` `
746+
747+ 它将返回有关/turtlesim节点向` ` ` pose` ` ` 主题发布数据的速率的数据。
748+
749+ ```
750+ average rate: 59.354
751+ min: 0.005s max: 0.027s std dev: 0.00284s window: 58
752+ ```
753+
754+ 回想一下,你使用` ` ` ros2 topic pub --rate 1` ` ` 将` ` ` turtle1/cmd_vel` ` ` 的发布速率设置为稳定的1Hz。
755+ 如果使用` ` ` turtle1/cmd_vel` ` ` 而不是` ` ` turtle1/pose` ` ` 运行上述命令,您将看到反映该速率的平均值。
756+
757+
758+
759+ 9. # ## 清理
760+ 此时,您将有很多节点在运行。 不要忘记通过在每个终端中输入 Ctrl+C 来停止它们。
761+
762+
763+
764+ - # # 总结
765+ 节点通过主题发布信息,这允许任意数量的其他节点订阅和访问该信息。
766+ 在本教程中,你使用rqt_graph和命令行工具检查了多个节点之间关于主题的联系。
767+ 你现在应该很好地了解数据如何在ROS2系统中移动。
768+
769+ - # # 下一步
770+ 接下来,你将通过教程[理解ROS2服务]了解ROS图中的另一种通信类型。
0 commit comments