当前位置: 首页 > news >正文

ROS2学习——节点话题通信(2)

目录

一、ROS2节点

1.概念

2.实例

(1)ros2 run

(2)ros2 node list

(3)remapping重映射

(4)ros2 node info

二、话题

(1) ros2 topic list

(2) ros2 topic echo

 (3) ros2 topic info

(4)ros2 inerface show

 (5) ros2 topic pub

(6)ros2 topic hz

三、服务

(1) ros2 service list 

(2)ros2 services type

(3)ros2 service find

 (4)ros2 service call


一、ROS2节点

1.概念

        在ROS2中,每个节点都负责单一模块,不比如轮子的电机或者是传感器的数据等。每个节点都可以接受和发送信息,这些信息通过话题,服务,动作或者是参数服务器进行传递。

         所有的机器人系统都由许都节点组成。在ROS2中每个可执行文件(C++程序或者python文件)可以保护多个或者单个节点。

2.实例

(1)ros2 run

ros2 run <package_name> <executable_name>

比如我们打开小海龟的功能包:

ros2 run turtlesim turtlesim_node

 其中turtlesim为功能包名称,可执行程序的名称为turtlesim_node。

(2)ros2 node list

如果我需要查询目前运动的节点,可以直接使用该语句进行查找。

在终端中则会显示:

(3)remapping重映射

        节点重映射运行修改节点原始的属性(名字,话题名,服务属性等)

这里我们测试修改turtle_teleop_key 的属性。

ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle

这里将节点名称修改为了:

/my_turtle

可以使用ros2 node list进行查看。

(4)ros2 node info

将刚刚重映射的话题,查看节点信息:

ros2 node info /my_turtle

有兴趣的读者可以查看一下原始节点的信息发现那里做出了更改。

二、话题

        ROS2将复杂的系统分解为多个模块的节点,话题则是充当节点之间信息交换的总线。

节点可以将数据发布到任意数量的话题,并同时订阅任意数量的话题。

使用rqt_graph我们可以清晰的看见节点和话题之间的关系。

打开小海龟和控制小海龟键盘的节点:

 /teleop_turtle节点发布数据给/turtle1/cmd_vel话题,这个话题将数据传递给/my_turtle节点。对于一个比较复杂的系统可以使用rqt很方便的看清楚程序内部话题节点信息接收关系。

(1) ros2 topic list

        该语句可现实当前的话题,如果在指令的后面带上-t选项则可以显示出话题的类型

(2) ros2 topic echo

如果已知话题的名字,可以使用该语句输出话题的信息在终端当中。

ros2 topic echo <topic_name>ros2 topic echo /turtle1/cmd_vel

如果此时你移动键盘方向键:

 (3) ros2 topic info

ros2 topic info /turtle1/cmd_vel

这个语句和node info类似,终端会输出话题的类型发送和接受者的相关信息。

(4)ros2 inerface show

如果我们需要查询一个话题使用的类型是有那些信息可以使用该语句,话题的类型可以通过

ros2 topic list -t
ros2 interface show geometry_msgs/msg/Twist

 (5) ros2 topic pub

同时我们也可以在终端中发布和修改话题,该语句的使用格式:

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

我们需呀知道话题的名称,话题发布信息的类型,args则是按照话题的类型输入的信息(ROS2中规定要以yaml的格式进行输入)。

比如我希望小海龟x轴移动2,z轴旋转1.8弧度。

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表示发布出这个信息后就退出。

可以看见小海龟转动了1/4圈,当然如果你希望它一直旋转则可以设置发布的频率:

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表示这个话题以1HZ的形式进行发布,这样我们可以看见小海龟一直在花圈运动。

当然最后你也可以去rqt_graph中查看话题和节点的变换。

(6)ros2 topic hz

 改语句在终端中输出需要查询话题的频率。

ros2 topic hz /turtle1/pose

三、服务

        服务通信是是ROS中的另一种通信方式。这种方式不同于发布于订阅的方式,服务通讯可以理解为呼叫和响应的模型。多个节点使用同一个服务通信,只能是一个进行。

(1) ros2 service list 

运行该语句会再终端中输出目前运行的服务通信:

可以看出一个节点中带有6个参数的名字,在ROS2中几乎大部分的服务都是这样的结构。

同样的如果在最后加上-t 则可以显示出服务的类型

(2)ros2 services type

该语句的作用是查看服务的类型。服务的类型类似于话题。服务有两个部分组成:

信息的请求+响应

ros2 service type <service_name>
ros2 service type /clear

 Empty类型表示的是这个服务没有发送任何请求和响应。

 

(3)ros2 service find

如果你知道服务使用的类型,想找到服务的名字则可以使用:

ros2 service find std_srvs/srv/Empty

 (4)ros2 service call

如果你知道服务的名字和类型,则可以调用这个服务:

#ros2 service call <service_name> <service_type> <arguments>
ros2 service call /clear std_srvs/srv/Empty

 如果你打开了小海龟的节点,并且使用键盘控制运行了一段轨迹。启动这个服务会发现小海龟走的路径都被清除了。

同时我们可以再对/spawn进行操作

ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"

 我们再次调用/spawn这个服务,并且在小海龟串口中再生成一只,同时指定了小海龟的位姿。

服务的小总结:

对比话题:话题可以一对多,一个发布者多个订阅者。服务式一种请求/响应模式,客户端提出请求,服务段生成响应。是只能单独进行的。


未完待更新...

http://www.lryc.cn/news/352769.html

相关文章:

  • 【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理,以及遇到的困难和总结
  • 配置docker阿里云镜像地址
  • ICML 2024 Mamba 论文总结
  • Sass详解
  • 如何实现一个高效的排序算法?
  • Linux--10---安装JDK、MySQL
  • 【大数据】MapReduce JAVA API编程实践及适用场景介绍
  • 图像分类和文本分类(传统机器学习和深度学习)
  • 基于SpringBoot和Hutool工具包实现的验证码案例
  • python-找出四位数中的玫瑰花数
  • Linux-命令上
  • 青鸟云报修系统:实现高效、便捷的维修申请处理
  • Python解析网页
  • IDEA连接MySQL后如何管理数据库
  • linux新机快速配置ssh
  • 使用elementUI的form表单校验时,错误提示位置异常解决方法
  • Android面试题之Kotlin常见集合操作技巧
  • 网络拓扑—DNS服务搭建
  • Mybatis-Plus笔记
  • “高考钉子户”唐尚珺决定再战2024年高考
  • Hive安装教程
  • 使用Python Tkinter创建GUI应用程序
  • 使用 RT 矩阵进行 3D 点云变换详解(基于 PCL 和 Eigen 库)
  • CTFHUB技能树——SSRF(二)
  • Vue3实现简单的瀑布流效果,可抽离成组件直接使用
  • 【已解决】C#如何消除Halcon上一次显示窗口的涂层
  • XShell-连接-Centos 7
  • vue3 组件刷新
  • Java进阶学习笔记14——模板方法设计模式
  • Centos7静态路由和动态路由