山西做网站的,郑州网站建设培训短期班,wordpress分页伪静态,电商网站开发fd概念 主题是一种节点间的通信方式#xff0c;某个节点充当发布特定#xff08;主题#xff09;消息#xff08;数据#xff09;的角色#xff0c;另外一些节点则可以订阅接收该特定#xff08;主题#xff09;消息#xff08;数据#xff09;。两者#xff0…概念 主题是一种节点间的通信方式某个节点充当发布特定主题消息数据的角色另外一些节点则可以订阅接收该特定主题消息数据。两者发布者和订阅者间可以一对一一个订阅该主题的节点 一个发布该主题的节点也可以一对多一个发布多个订阅也可以多对一更可以多对多理论上并没有节点数量的限制但可能会受到到某些平台环境资源的限制此处不表下面两张图分别代表了一对一和一对多及多对多的情况。 一对一 一对多多对多 主题这种通信方式比较适合一些[不断更新的数据传输相关]的场景比如不断更新的雷达数据就适合用这种方式。
动动手
启动小海龟 分别执行如下命令启动海龟节点及控制节点(不熟悉的出口在右手边)
$ros2 run turtlesim turtlesim_node
$ros2 run turtlesim turtle_teleop_key
新工具rqt_graph 下面我们介绍个新朋友rqt_graph这个其实已经集成在之前安装的rqt工具中了通过它可以看到节点与主题之间的微妙关系可视化在复杂的系统中我们可以利用它理清各自的逻辑关系。 有两种方式可以打开其一直接执行rqt_graph其二在rqt窗口中选择Plugins Introspection Node Graph这两种方法都行我们试试第一种打开的界面如下所示将鼠标挪动到图形上面会变色 左边是节点/turtlesim右边是节点/teleop_turtle,中间的三条箭头连线上面两个是动作本篇不提最下面的是主题/turtle1/cmd_vel箭头是从节点/teleop_turtle指向节点/turtlesim代表的是数据流向/teleop_turtle节点负责发布主题/turtle1/cmd_vel数据该数据是通过键盘产生的而节点/turtlesim订阅了该主题数据所以数据从主题发布者流向主题订阅者。
主题列表
$ros2 topic list 通过上面的命令会列出当前活动节点的主题信息非常简单概括如下图所示咱们开启了两个节点一共产生了5个主题 我们再查看各个主题详细的信息返回了各个主题对应的数据类型可类比成结构体只有相同的数据类型才能正常进行通信。
$ros2 topic list -t 在rqt_graph中我们Hide那一行所有的勾选后我们会看到一幅包含所有主题信息的完整图此刻不必深究。 主题数据 大家好不好奇从发布者节点发出的主题数据是怎样的呢该怎么查看呢? 别急往下瞧
$ros2 topic echo topic_name
我们通过上面的初步摸索已经了解到小海龟例子中/teleop_turtle节点通过/turtle1/cmd_vel主题发布位姿数据到/turtle_sim节点我们就来看看/turtle1/cmd_vel这个主题数据到底是何方神圣执行如下命令进行查看
$ros2 topic echo /turtle1/cmd_vel
输入为命令后你会发现咋啥都没有不是骗人嘛还是别急接着往下瞧。我们切换到启动了/teleop_turtle节点的终端鼠标点击一下这个终端使得焦点在这里随便摁下之前说过的那些键F周遭,确认小海龟游动了之后大家再切换回echo那个终端看看它返回了什么如下所示 我们再来瞅瞅rqt_graph里面会相应发生些什么打开后我们会看到下面的图形 里面比之前多了一个节点/_ros2cli_43366而主题/turtle1/cmd_vel也有个箭头连线指向了这个节点目前为止一共有两个订阅者节点和一个发布者节点发布者节点会通过主题/turtle1/cmd_vel实时将键盘产生的位姿数据发布给两个订阅者。
主题信息 如果我们想要了解某个活动的主题的相关信息如主题数据类型、该主题对应的发布者和订阅者各自数量我们可以通过下面的命令得到
$ros2 topic info topic_name
来看看/turtle1/cmd_vel这个活动主题的信息ros2 topic info /turtle1/cmd_vel结果如下 主题数据消息类型 订阅者和发布者之间通过消息通信二者会共用同样数据结构类型的消息否则牛头对马嘴胡拉乱扯。之前我们通过ros2 topic list -t命令获取到当前活动的一些主题的概括信息对于主题/turtle1/cmd_vel我们查看得知它的消息类型是geometry_msgs/msg/Twistgeometry_msgs功能包下消息类型Twist那这个Twist类型到底长的啥样我们可以直接找到geometry_msgs/msg/Twist文件打开查看文本文件当然我们要做符合身份的事通过命令看
$ros2 interface show msg_type
对于geometry_msgs/msg/Twist我们这样输入
$ros2 interface show geometry_msgs/msg/Twist
结果来了 可以看见Twist数据类型为两个向量线性及角度构成如果你要主动发布主题消息控制小海龟你必须得按照这个格式来。
发布主题消息 我们来试试上个小标题最后提到的发布主题消息它的命令是这样的
$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表示只发生一次主题消息就退出看看效果 如果要让它自动一定频率发布下去呢我们可以将--once变为--rate 1,表示按1Hz的频率1次/秒周期发布消息来试试
$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}} 我们再来看看rqt_graph又变成啥样了 又多了一个发布者节点/_ros2cli_43523它通过/turtle1/cmd_vel主题发布Twist消息数据/turtlesim和/_ros2cli_43366作为订阅者节点不断接收消息数据。 最后我们可以尝试echo一下pose主题并查看一下rqt_graph,
$ros2 topic echo /turtle1/pose 可以看到/turtlesim节点发布了一个/turtle1/pose主题/_ros2cli_43706节点刚刚echo pose的那个终端订阅了该主题。 如果我们想在发布主题消息里面加入时间戳呢我们有下面这个主题该主题消息包含了时间戳字段geometry_msgs/msg/PoseStamped我们来看看这个主题的详细信息还记得查看命令吧ros2 interface show geometry_msgs/msg/PoseStamped 如上该主题消息由两部分组成第一部分为标准消息头结构std_msgs/msg/Headerstamp字段我们可以用auto填充我们再来试试
$ros2 topic pub /pose geometry_msgs/msg/PoseStamped {header: auto, pose: {position: {x: 1.0, y: 2.0, z: 3.0}}} 时间戳有啦(小海龟此时此刻会有什么反应呢思考一下如果将命令行中的/pose变成/turtle1/pose呢)。 还有一种带时间的主题sensor_msgs/msg/TimeReference,看它的消息结构有点头大吧其中builtin_interfaces/Time消息类型变量time_ref我们可以填充now(先暂时留个印象吧)。 主题消息发布频率
当我们想要知道某些主题消息的发布频率时我们可以通过hz查询如下
$ros2 topic hz /turtle1/pose 通过键盘控制小海龟再来查看/turtle1/cmd_vel主题消息频率大家可以试试上面讲的--rate 1方式发布主题看看打印出来个啥。 本篇完。