当前位置: 首页 > 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这个服务,并且在小海龟串口中再生成一只,同时指定了小海龟的位姿。

服务的小总结:

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


未完待更新...

相关文章:

  • 【MySQL精通之路】SQL优化(1)-查询优化(10)-外部联接简化
  • Python代码:十七、生成列表
  • 2005-2022年各省全体居民人均可支配收入数据(无缺失)
  • C++核心编程——4.7 多态
  • HttpClient cookie爬虫记录
  • 46. 全排列 - 力扣(LeetCode)
  • SpringJDBC
  • ubuntu24.04LVM扩容问题
  • 【强化学习04】Q学习时序差分法
  • 操作系统 - 输入/输出(I/O)管理
  • 【PHP小课堂】学习了解PHP中Memcached扩展的使用
  • 26计算机操作系统408考研--操作系统处理机调度篇章(五)
  • 每天一个数据分析题(三百三十五)
  • 【软件工程】【23.04】p1
  • 关于我转生从零开始学C++这件事:升级Lv.25
  • bearychat的java client
  • EOS是什么
  • ESLint简单操作
  • flask接收请求并推入栈
  • gcc介绍及安装
  • JAVA并发编程--1.基础概念
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • yii2权限控制rbac之rule详细讲解
  • 从PHP迁移至Golang - 基础篇
  • 复杂数据处理
  • 如何优雅地使用 Sublime Text
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (二)换源+apt-get基础配置+搜狗拼音
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (十五)、把自己的镜像推送到 DockerHub
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • *Django中的Ajax 纯js的书写样式1
  • .DFS.
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET Framework杂记
  • .NET/C# 使用反射注册事件
  • .Net语言中的StringBuilder:入门到精通
  • /boot 内存空间不够
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • @SentinelResource详解
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [AIGC] 深入浅出 Python中的`enumerate`函数
  • [BJDCTF2020]The mystery of ip1
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [C#][opencvsharp]opencvsharp sift和surf特征点匹配
  • [C++] 模拟实现list(二)
  • [Docker]当下实测可用Docker镜像源
  • [GN] Vue3快速上手1
  • [luogu2165 AHOI2009] 飞行棋 (枚举)
  • [one_demo_11]二分查找法