ROS2学习——(ROS2主题topic)

主题(topic)是各节点之间的信息交流媒介,可以实现一对一,一对多,多对一,多对多的信息交流,如图所示

(1)打开rqt_graph(注意其中:椭圆形框框是节点(node),方形框框是主题(topic)、动作(action)

通过命令:rqt_graph打开,也可以通过rqt打开后,选择Plugins>Introspection>Node Graph,打开后的界面如图(信息显示不全的可以刷新一下);

上图中,/turtlesim和/teleop_turtle是节点(node)

将鼠标移至某个框后将会高亮显示,如图,红色为鼠标所处位置,蓝色是输入,绿色输出。

节点/teleop_turtle和t/turtlesim通过主题(topic)/turtle1/cmd_vel交流信息,其中节点/teleop_turtle是信息发布者(publisher),节点/turtlesim是信息订阅者(subscriber)

(2)ros2 topic list

通过运行:ros2 topic list查看主题列表,通过运行:ros2 topic list -t查看带有主题类型信息的主题列表,如图所示

这些属性信息,尤其是类型信息,是节点如何知道他们在讨论相同的信息。

如果想要知道所有主题在rqt_graph中的位置,可以取消选中hide的选项,并点击刷新,如图:

 (3)ros2 topic echo(汉语待定)

查看某个主题上发布的信息,可以使用命令:ros2 topic echo <topic_name>

如:ros2 topic echo /turtle1/cmd_vel

此时终端暂时不会有任何信息显示,因为此主题未发布任何信息,如图:

切换至teleop_turtle节点,同过箭头操作小海龟运行,可以在echo终端看到主题发布的信息,如图:

 现在取消rqt_graph的debug隐藏(echo属于调试命令,因此只有再取消debug隐藏后才可以看到),可以看到新增/_ros2cll_2659,接收来自主题/turtle1/cmd_vel发布的信息(同时此信息也会发布到/turtlesim节点进行执行操作

(4)ros2 topic info

通过命令:ros2 topic info <topic_name>查看主题信息;

如运行:ros2 topic info /turtle1/cmd_vel

可得到主题/turtle1/cmd_vel的信息,其中可以看到从此主题(topic)订阅信息的账户(Subscription count)有2个,而向此主题发布信息的账户(Publisher count)有1个,如图:

(5)ros2 interface show(ROS2界面展示)

节点(node)通过主题(topic)发送数据(使用消息(messages)),发布者和订阅者必须发送和接受同样类型的消息来进行通讯。

主题(topic)类型可以在ros2 topic list -t 中获取,例如/turtle1/cmd_vel的类型(type)是:

Type: geometry_msgs/msg/Twist

这个类型信息的意思是:在 geometry_msgs这个包中,有一个msg叫做Twist

可以通过运行:ros2 interface show <msg type>获取更多细节,尤其是消息数据的结构,如

ros2 interface show geometry_msgs/msg/Twist

结果如下(这表示自由空间中的速度,分为线速度和角速度部分):

 上述信息表示,节点/tuetlesim正在等待一条包含两个向量(线和角)的消息,每个向量包含3个元素,这与我们echo主题/turtle1/cmd_vel中的数据结构一致

 (6)ros2 topic pub(ros2 主题发布<pub = publish>)

之前获取了信息的结构,就可以使用下述命令通过命令行将数据发布到主题(即不使用/teleop_turtle节点发布信息,而使用命令行直接输入信息):

ros2 topic pub <topic_name> <msg_type> '<args>'

其中‘<args>是‘arguments参数’是你传递给主题(topic)的真实数据,采用在interface show中看到的数据结构,需要注意的是,此参数需要以 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}}"

注意:在linear:后、angular:后、x:,y:,z:后面都要有空格。

--once 是一个可选参数,意思是“发布一条消息然后退出”。

将在终端中收到以下消息:

publisher: beginning loop
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))

然后会看到:

 海龟(通常是它要模拟的真实机器人)需要稳定的命令流才能连续运行。 所以,要让乌龟继续移动,你可以运行:

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以1HZ的频率稳定的发布命令。

此时刷新rqt_graph(保持pub命令和echo命令激活状态),可以看到ros2 topic pub 节点(/_ros2cli_4536)通过主题(/turtle/cmd_vel)发布信息,这些信息同时被/turtlesim和/_ros2cli_4293(ros2 topic echo节点)接受。

 还可以尝试运行 echo在pose主题,命令如下:

ros2 topic echo /turtle1/pose

此时,再次刷新rqt_graph,可以看到/turtlesim节点通过主题/turtle1/pose向echo节点发布信息。

(7)ros2 topic hz

通过 ros2 topic hz /turtle1/pose 可以查看turtle/pose发布信息的频率。

节点通过主题发布信息,这允许任意数量的其他节点订阅和访问该信息。 在本教程中,您使用 rqt_graph 和命令行工具检查了多个节点之间关于主题的连接。 您现在应该对数据如何在 ROS 2 系统中移动有了一个很好的了解。

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值