ROS基础(一):ROS通讯之话题(topic)通讯

2023-05-16

目录

  • 第一章:ROS通讯之话题(topic)通讯
    • 一、topic通讯之基础篇
      • 1. Node Master大管家
      • 2. Node节点
      • 3. message 与topic
      • 4. 小结
      • 5. 实例
    • 二、topic通讯之进阶篇
      • 1. 创建learn_ topic功能包
      • 2. 自定义message
      • 3. 创建node实现message的发布与订阅(C++版本)
        • publisher
        • subscriber
        • 运行两个node
      • 4. 创建node实现message的发布与订阅(python版本)
        • publisher
        • subscriber
        • 运行俩个node节点
    • 三、总结

第一章:ROS通讯之话题(topic)通讯

ROS提供的通讯系统分为两大类:基于TCPROS/UDPROS的Node节点间的进程通讯;基于Nodelet的进程内通讯。所有的软件功能和相关工具的实现都是基于以上通讯。

ros的底层与核心是分布式通讯机制。ROS所有的软件功能和工具都建立在这种分布式通讯机制上。ROS下最核心的三种核心通讯机制:

  • 话题通讯机制
  • 服务通讯机制
  • 参数管理机制

本章我们详解最最最常见的,做ros开发每天都会打交道的话题通讯机制

一、topic通讯之基础篇

topic通讯的具体实现是通过node之间传递message进行信息传输。

1. Node Master大管家

node master在整个通讯架构中相当于管理中心,是管理整个node通讯的大管家。node首先在master处进行注册,之后master会将该node纳入整个ROS程序中。当ROS程序启动时,第一步首先启动master,然后节点管理器处理依次启动node。

master

功能:

  • 节点间的相互查找,建立连接
  • 为系统提供参数服务器,管理全局参数

在终端启动node master的命令:

roscore

roscore

启动后可以看到对应参数与节点信息。

2. Node节点

节点就是ros中执行运算任务的进程,一个功能模块通常由多个节点组成。多个节点同时运行,之间进行信息交换与运行时,构成节点关系图。

就topic通讯而言,所对应的节点具体分为发布节点publisher和订阅节点subscriber.

publisher用于发布对应的topic话题,subscriber用于订阅publisher发布的消息。

3. message 与topic

massage是节点之间传递的信息的数据格式。ros支持标准数据类型,同样也支持数据类型的嵌套以及自定义消息类型。ros本身也定义了一整套用于表征机器人的数据格式,包括速度、位姿、轨迹、点云等等。

topic是传递信息的名称。无论node是发布者还是订阅者,他们之间相互并不了解,他们在各取所需的时候,寻找的都是topic名称。多个node可以往同一个topic话题上发布信息,同样地,多个node也可以订阅同一个topic。他们的关系如下如所示:
多个节点发布与订阅

4. 小结

在这里插入图片描述

两个node之间建立数据通讯需要经过上图所示的7步骤:

  1. talker注册:通过1234端口想master注册信息,其中包括话题名
  2. listener注册
  3. ros master信息匹配:通过listener的订阅信息,在注册列表中查找,没有找到发布者,就等待发布者的加入;找到的话,就通过RPC向listener发布talker的RPC地址信息。
  4. listener发送连接请求:根据master给的地址,通过RPC向talker发送连接请求、话题名、消息类型、通讯协议
  5. talker确认连接请求:通过RPC向listener确认连接信息,其中包含TCP地址
  6. listener尝试与talker建立网络连接
  7. talker向listener发布数据

两点需要注意

  1. 前五个步骤都是RPC通信协议,最后才用到TCP
  2. master在节点建立连接的过程中起到关键作用,但是不参与节点间最终的数据传输

5. 实例

接下来,我们通过操纵小海龟案例,具体学习日常使用topic通讯过程中常用到的几个命令:

首先roscore将大管家启动,然后分别使用rosrun命令启动两个node节点:

rosrun turtlesim turtlesim_node 
rosrun turtlesim turtle_teleop_key 

启动之后,我们通过命令rosnode list来查看所有启动的节点:

在这里插入图片描述
可以看到其中除了master大管家负责的/rosout节点外,我们依次启动了另外的两个节点:
分别名为**/turtlesim节点和/teleop_turtle**节点,第一个节点作用是启动小海龟仿真,第二个节点作用是通过发布对应topic控制小海龟移动,效果如下:

在这里插入图片描述
到底是怎么实现的控制呢,我们来详细分析。

首先输入rosrun rqt_graph rqt_graph查看节点连接图:
node_connect
如上图所示,很清晰表明,第二个节点**/teleop_turtle通过发布名为/turtle1/cmd_vel的topic来给到订阅者/tuetlesim**.

其中关键topic的名字是/turtle1/cmd_vel,通过命令rostopic info /turtle1/cmd_vel具体查看该topic的相关信息:

在这里插入图片描述
上图具体说明了,该topic的数据类型为geometry_msgs/Twist,对应的publisher和subscribers也和节点流通图一一对应。

如果我们想知道具体数据类型中包括那些信息,可以通过如下命令查询:

rosmsg show geometry_msgs/Twist

在这里插入图片描述该命令输出结果如上,数据中具体包括三轴线速度和三轴角速度,以此用来控制小乌龟行动。

到现在为止,我想我已经说清楚ros话题通讯模式了,同样,我们学习了几个非常有用的命令,来启动node,查询node节点图,查看topic和msg等。

最后,我们通过命令来实现往对应的topic上pub消息控制机器人运动。

键入如下命令让小乌龟持续转起来,最后-r 1的参数含义是,按照1hz的频率pub这条topic:

rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear:
  x: 1.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 1.0" -r 1

那最终实现的样子如下:

在这里插入图片描述

二、topic通讯之进阶篇

本部分,我们自定义一个message格式,然后使用ros提供的python和c++接口分别创建两个node节点作为publisher和listener,用来学习python接口下和c++接口下,如何创建node节点,如何订阅和发布topic

1. 创建learn_ topic功能包

首先需要创建对应的功能包,在home目录下输入如下命令:

mkdir -p catkin_ws/src
cd catkin_ws/src
catkin_create_pkg learn_topic std_msgs rospy roscpp
cd ..
catkin_make

我们建立了名为catkin_ws的工作空间,其中包含名为learn_topic的功能包,功能包依赖std_msgsrospyroscpp三个功能包。

最后我们使用catkin_make命令编译环境,自动在工作空间目录下生成develbuild两个文件夹。

创建好功能包之后,如果想运行,需要设置环境变量

 source devel/setup.bash

为测试是否已经添加环境变量,使用如下命令查询:

rospack find learn_topic

在这里插入图片描述
如果出现上述对应路径,说明环境变量设置成功。

上述设置环境变量的方法,仅仅在当前终端环境下有效,当我们重开新的terminal就需要重新source

为实现一劳永逸的配置,我们可以使用如下命令将之写道bashrc文件中:

 echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc

2. 自定义message

我们来构建一个名称为person.msg的message文件,其中包括两个信息:

string	name
uint8	age

然后在工作空间下的src文件夹中新建msg文件夹,专门来放我们的自定义message. 当前空间目录如下:

在这里插入图片描述要想使自定义的msg工作起来,还需要修改CMakeLists.txt文件和package.xml文件。

package.xml文件的文件末尾添加如下语句,实现对应功能包的编译和运行的相关依赖:

  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>

CMakeLists.txt文件中,需要进行如下修改:

第一块:修改find_package部分,确保编译时找到对应文件


find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

第二块:设置msg文件

 add_message_files(
   FILES
   person.msg
 )

 generate_messages(
   DEPENDENCIES
   std_msgs
 )

第三块:catkin依赖部分

如果我们编写的ros程序不打算给别人使用,这块就无所谓。

catkin_package(
...
  CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
...
)

上述修改完成之后,回到工作空间下,再次运行命令catkin_make进行编译

最后查询是否成功,可以使用如下命令:

rosmsg show learn_topic/person 

一切正常的话,应该会出现下图:

在这里插入图片描述

关于ros中cmakelists文件中内容的具体含义,建议参考我之前的这篇博文:

https://blog.csdn.net/allenhsu6/article/details/112345029

3. 创建node实现message的发布与订阅(C++版本)

接下来,我们依赖上述定义好的person.msg来实现一个简单的publisher和subscriber

在功能包中src文件下分别建立两个cpp文件,如图所示:
在这里插入图片描述

publisher

编辑cpp_talker.cpp文件:


#include <ros/ros.h>
#include <learn_topic/person.h>

int main(int argc, char **argv){

    ros::init(argc, argv, "cpp_talker");
    ros::NodeHandle nh;

    ros::Publisher pub = nh.advertise<learn_topic::person>("/person_topic", 1);

    ros::Rate loop_rate(1);

    learn_topic::person man;
    man.age = 0;
    man.name = "allen";
    ROS_INFO("pub: Here's a man named, how old is he? %s", man.name.data());
    while (ros::ok()){
        man.age++;
        pub.publish(man);
        loop_rate.sleep();
    }
    return 0;
}

subscriber

编辑cpp_listener.cpp文件:

#include <ros/ros.h>
#include "learn_topic/person.h"

void getAgeCallback(const learn_topic::personConstPtr &person){

    ROS_INFO("answer: %s's age is %d", person->name.data(), person->age);
}

int main(int argc, char **argv){

    ros::init(argc, argv, "cpp_listener");
    ros::NodeHandle nh;

    ros::Subscriber sub = nh.subscribe("/person_topic",1, getAgeCallback);
    ros::spin();
    return 0;
}

运行两个node

首先在cmakelists文件中输入如下内容:

 add_executable(cpptalker_node src/cpp_talker.cpp)
target_link_libraries(cpptalker_node
        ${catkin_LIBRARIES}
        )

add_executable(cpplistener_node src/cpp_listener.cpp)
target_link_libraries(cpplistener_node
        ${catkin_LIBRARIES}
        )

然后先在工作空间catkin_make, 再在两个终端分别启动talker和listener节点:

rosrun learn_topic cpptalker_node
rosrun learn_topic cpplistener_node 

终端输出对应结果:

在这里插入图片描述

查看node节点图,没有问题
在这里插入图片描述

4. 创建node实现message的发布与订阅(python版本)

ros同样提供了python接口,我们用python再将上述实验实现一次,方便大家学习用python实现node节点的时候应该注意的事项

首先,在scripts文件夹中新建两个文件,分别命名为python_talker.pypython_listener.py,之后的整个功能包文件目录如下:

在这里插入图片描述

publisher

#!/usr/bin/env python
#coding=utf-8
import rospy
#倒入自定义的数据类型
from learn_topic.msg import person

def talker():
    pub = rospy.Publisher('person_topic', person, queue_size=10)
    rospy.init_node('pytalker', anonymous=True)
    rate = rospy.Rate(1)
    name='allen'
    rospy.loginfo('Talker: this man named %s', name)
    i = 0
    while not rospy.is_shutdown():
            pub.publish(person('allen',i))
            i = i+1
            rate.sleep()

if __name__ == '__main__':
    talker()

subscriber

#!/usr/bin/env python
#coding=utf-8
import rospy
#倒入自定义的数据类型
from learn_topic.msg import person

def callback(person):
    rospy.loginfo('Listener: %s''s age is %d', person.name, person.age)

def listener():
    rospy.init_node('pylistener', anonymous=True)
    rospy.Subscriber('person_topic', person, callback)
    rospy.spin()

if __name__ == '__main__':
    listener()


运行俩个node节点

python是脚本语言不需要编译,运行前将scripts文件夹下的py文件都给执行权限:

sudo chmod +x *.py

然后分别运行两个node节点:

rosrun lea_topic python_talker.py 

 rosrun learn_topic python_listener.py 

运行结果:

在这里插入图片描述

查看node节点图,没有问题
在这里插入图片描述

三、总结

关于topic通讯的学习,我们告一段落,基本能够涉及到的都已经覆盖,接下来,我们会进入第二章service通讯的学习。

ROS基础(二):ros通讯之服务(service)机制

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS基础(一):ROS通讯之话题(topic)通讯 的相关文章

  • ROS:开机自启动

    Ubuntu14 04 网上很多资料说在 etc rc local中添加脚本 实验之后完全没用 可能是系统版本不对 解决 Ubuntu14 04 开机项命令 gnome session properties 点击 add name 名字 c
  • kinova-jaco2使用Moveit!控制真实机械臂抓取固定点物体

    kinova jaco2使用Moveit 控制真实机械臂抓取固定点物体 一 机械臂坐标系 坐标系方向 位姿方向 轴的起始点 二 启动机械臂和Moveit 三 实现抓取 python代码 python文件建议直接用python启动 四 遇到的
  • Python 实现 Dijkstar 路径规划算法

    Dijstar 最短路径算法 用于计算起始点到最终点的最短路径 一般采用的是贪心算法策略 原理可以参考 图解 Open list 和 close list 环境 Terminal 需要预先安装两个库 matplotlib 和 math pi
  • 使用WTGAHRS2(JY-GPSIMU)在ROS中读取数据并发布话题

    目录 IMU简介 驱动程序 IMU串口通信协议 程序 效果 IMU简介 十轴惯性导航传感器WTGAHRS2传感器集成高精度的陀螺仪 加速度计 地磁场传感器 GPS 模块 采用高性能的微处理器和先进的动力学解算与卡尔曼动态滤波算法 能够快速求
  • SLAM-hector_slam 简介与使用

    hector slam功能包使用高斯牛顿方法 不需要里程计数据 只根据激光信息便可构建地图 所以他的总体框架如下 hector slam功能包 hector slam的核心节点是hector mapping 它订阅 scan 话题以获取SL
  • 无人飞行器智能感知竞赛--模拟器安装

    开发环境 win11 wsl2 注意事项 请配合视频使用 如果不看视频会对下面的配置过程迷惑 因为一开始我是想安装在ubuntu18 04的 中途发现ubuntu18 04没有ros noetic 所以转入ubuntu20 04配置 视频链
  • ROS诸多调试工具总结1

    ROS有许多调试工具来为ROS调试你的工具 1 rosnode 参数 用法 作用 list rosnode list 查看当前运行了哪些节点 info rosnode info node name 查看该节点发布 接受哪些话题以及服务 ki
  • Ubuntu下vscode配置ROS环境

    摘要 最近准备放弃用clion开发ROS使用更主流的vscode 整理一下在ubuntu18 04下的VSCode安装和ROS环境配置流程 安装 方法一 软件商店安装 个人还是推荐使用ubuntu软件下载vscode 简单不容易出错 方法二
  • ROS rosdep update 出错方法 不需要翻墙切换之类的解决方法 ‘https://raw.githubusercontent.com/ros/rosdistro/master/inde

    系统 ubuntu18 rosdep update参考的这篇文章 https blog csdn net weixin 43311920 article details 114796748 utm source app app versio
  • Ubuntu18.04配置Seetaface6

    目录 一 下载安装Qt软件 1 安装包下载 2 安装Qt 3 配置 二 下载源码 三 编译工具 四 编译 1 编译OpenRoleZoo 2 编译SeetaAuthorize 3 编译TenniS 五 运行 1 修改lib路径 2 buil
  • 最快实现一个自己的扫地机

    作者 良知犹存 转载授权以及围观 欢迎关注微信公众号 羽林君 或者添加作者个人微信 become me 扫地机介绍 扫地机器人行业本质是技术驱动型行业 产品围绕导航系统的升级成为行业发展的主旋律 按功能划分 扫地机器人分为四大系统 即导航系
  • 局域网下ROS多机通信的网络连接配置

    1 在路由器设置中固定各机器IP地址 在浏览器中输入路由器的IP地址 例如TP LINK路由器的IP为 192 168 1 1 进入登录页面后 输入用户名和密码登录 用户名一般为admin 密码为自定义 在 基本设置 gt LAN设置 gt
  • 【ROS】usb_cam相机标定

    1 唠叨两句 当我们要用相机做测量用途时 就需要做相机标定了 不然得到的计算结果会有很大误差 标定的内容包括三部分 内参 外参还有畸变参数 所以标定的过程就是要求得上面这些参数 以前弄这个事估计挺麻烦 需要做实验和计算才能得到 现在通过ro
  • 《机器人操作系统入门》课程代码示例安装出错解决方法

    问题描述 学习 机器人操作系统入门 课程时 在Ubuntu 16 04 上安装了kinetic 安装ROS Academy for Beginners时依赖总是报错 如下所示 rosdep install from paths src ig
  • 如何将曲面拟合到一组数据点并获得曲面方程

    乌班图 ROS 思维 Python程序 我正在尝试获取适合点云数据中的一组点的表面方程 数据来自激光雷达扫描仪 我在 rviz 中选择整个扫描的一部分 并获得该选择的坐标选定表面的图片 所选曲面并不总是如此线性 因为材质中可能存在轻微的曲线
  • 错误状态:平台不允许不安全的 HTTP:http://0.0.0.0:9090

    我正在尝试从我的 flutter 应用程序连接到 ws local host 9090 使用 rosbridge 运行 的 Ros WebSocket 服务 但我在 Flutter 中收到以下错误 错误状态 平台不允许不安全的 HTTP h
  • 如何访问 Heroku 中的 docker 容器?

    我已按照此处构建图像的说明进行操作 https devcenter heroku com articles container registry and runtime getting started https devcenter her
  • ROS安装错误(Ubuntu 16.04中的ROS Kinetic)

    中列出的步骤顺序http wiki ros org kinetic Installat 已被关注 尝试在Ubuntu 16 04中安装ROSkinetic 输入以下命令时出错 sudo apt get install ros kinetic
  • 如何订阅“/scan”主题、修改消息并发布到新主题?

    我想通过订阅message ranges来改进turtlebot3的LDS 01传感器 通过应用一些算法修改messange ranges并将其发布到新主题 如下所示 但是当我运行编码时出现错误 错误是 遇到溢出的情况 错误是 运行时警告
  • ROS 问题:libQt5Core.so.5:无法打开共享对象文件:没有这样的文件或目录

    当我跑步时 rosrun turtlesim turtlesim node 在 Ubuntu 上 我收到以下消息 opt ros noetic lib turtlesim turtlesim node 加载共享库时出错 libQt5Core

随机推荐

  • 国内人脸识别公司哪家强,人脸比对跑个分比较下!

    前不久 最强大脑 第四季第一期的舞台上 xff0c 王峰对阵小度机器人进行了 人机大战 xff0c 其中最精彩和有趣的是第一场pk 从小时候照片判别长大后对应的人 xff0c 而她有个姐姐 xff0c 这对姐妹恰恰是双胞胎 xff01 百度
  • 2011年终总结

    2011年终总结 4月8日 xff0c 研究生面试 xff0c 和同学第一次来到上海 xff0c 当时的我又经受一次失败 xff0c 也许说我本该走这条路 也经常听到很多人说 xff0c 自己考得烂了 xff0c 最后到这个学校上学 从高中
  • 永久音乐外链

    使用skydrive上传速度变慢了 xff01 2013 2 14 文摘 xff1a http tieba baidu com p 1735575571 被删掉了 xff0c 2013 2 14 一直在申请吧主 xff0c 估计申请不上了
  • Apache2.2+MySql5.5+PHP5.4的安装和配置(windows)

    Apache2 2 43 MySql5 5 43 PHP5 4的安装和配置 phpMyAdmin的安装和配置 安装 Apache2 2 http httpd apache org download cgi apache24 Win32 Bi
  • 反思了一下过去几年的程序员之路

    最近回忆起一年前的找工作时的面试时的题目 xff0c 很多基础题都没做好 xff0c 很多概念也混淆不清 虽然自己这几年写的代码不少 xff0c 但都使用自己熟悉的东西写 xff0c 而已经有很多新的技术新的方法却没有使用过 一方面公司自己
  • 怎样使用OpenCV进行人脸识别 [停止更新]

    唯一持续维护地址 xff1a http guoming me face recognition with opencv 更新 2013 6 27 停止人脸识别的研究 xff0c 具体人脸识别系统可以参见文章 使用Kinect进行人脸识别 K
  • OpenCV矩阵运算

    一 矩阵 Mat I img I1 I2 dst A B double k alpha Scalar s 1 加法 I 61 I1 43 I2 等同add I1 I2 I add I1 I2 dst mask dtype scaleAdd
  • OpenCV官方学习文档[2013-7-4更新][最新版本2.4.6]

    最新的OpenCV2 4 6文档更新参见 xff1a http guoming me opencv OpenCV配置视频 OpenCV2 4 6 2013 7 3更新 http opencv org opencv 2 4 6 is out
  • ANSI与UNICODE字符函数对照表

    宽字符处理函数函数与普通函数对照表 字符分类 xff1a 宽字符函数普通 C 函数描述 iswalnum xff08 xff09 isalnum xff08 xff09 测试字符是否为数字或字母 iswalpha xff08 xff09 i
  • 做 LeetCode 有感

    今天周六 xff0c 公司一个人也没有 xff0c 下午花了5个半小时 xff0c 安安静静的再看 xff0c 再做了4道 LeetCode 的题目 看完之后 xff0c 现在仔细回想 xff0c 获得了什么 xff0c 好像什么也没有 但
  • 知识点滴 - 关于头文件的重复包含问题

    使用Include guard的目的 C Language Tutorial 61 gt Header Include Guards 2 12 Header guards Learn C 43 43 C C 43 43 中 xff0c in
  • 编程参考 - 编程中给变量起名时如何选择前缀,以及匈牙利命名法等

    我最开始当程序员用C语言写代码 xff0c 公司里推行编码规范 xff0c 变量的前缀都是有规定的 比如整型变量 xff0c 前面都是 u8Name i8Name u16Name i16Name之类的 尤其是嵌入式编程 xff0c 涉及到代
  • 【数据结构与算法 9】谁发明的八皇后,本宫赐你一丈红

    一 八皇后问题 八皇后问题 xff0c 一个古老而著名的问题 xff0c 是回溯算法的经典案例 该问题由国际西洋棋棋手马克斯 贝瑟尔于1848年提出 xff1a 在8 8格的国际象棋上摆放八个皇后 xff0c 使其不能互相攻击 xff0c
  • Linux常用命令

    nbsp nbsp 作者简介 哪吒 CSDN2022博客之星Top1 CSDN2021博客之星Top2 多届新星计划导师 博客专家 专注Java硬核干货分享 立志做到Java赛道全网Top N 本文收录于 Java基础教程系列 目前已经70
  • 读《Java编程思想第五版》心得体会

    x1f345 Java学习路线 xff1a 搬砖工逆袭Java架构师 x1f345 简介 xff1a Java领域优质创作者 x1f3c6 CSDN哪吒公众号作者 Java架构师奋斗者 x1f4aa x1f345 扫描主页左侧二维码 xff
  • 那些优秀的程序员都在看哪些书?

    目录 一 Java 27岁生日啦1995年5月23日2004年2015年2019年2022年 二 Java核心技术 卷1 基础知识 原书第11版 xff09 Core Java 三 Java核心技术 卷2 高级特性 原书第11版 xff09
  • c++ 判断文件是否存在的几种方法

    一般方法 一般而言 xff0c 下述方法都可以检查文件是否存在 xff1a 使用ifstream打开文件流 xff0c 成功则存在 xff0c 失败则不存在以fopen读方式打开文件 xff0c 成功则存在 xff0c 否则不存在使用acc
  • Linux下c/c++头文件和库文件的查找路径

    简介 这是个相当基础的话题 xff0c 平时也觉得知道一点 如头文件会先在当前目录查找 xff0c 如果未找到会查找系统目录 但当问题出现时 xff0c 还是有点不知所措 xff0c 对所谓的 系统目录 一知半解 xff0c 很难把它们的清
  • Tars框架在windows10下安装

    依赖环境 windows版本 xff1a win7以上cmake xff1a 3 2以上mysql 4 1 17以上nvm xff1a 0 35 1以上node 12 13 0以上 分别安装vs2019 xff0c nodejs git m
  • ROS基础(一):ROS通讯之话题(topic)通讯

    目录 第一章 xff1a ROS通讯之话题 topic 通讯一 topic通讯之基础篇1 Node Master大管家2 Node节点3 message 与topic4 小结5 实例 二 topic通讯之进阶篇1 创建learn topic