ROS话题发布和订阅节点的C++&Python实现

2023-05-16

本文将分别使用C++和Python来实现话题发布者和订阅者,首先创建一个功能包,命名为topic_pub_sub,添加roscpprospy等依赖项。

C++实现

  • 创建话题发布者

在该功能包的src目录下创建publisher.cpp文件,添加如下程序:

#include <iostream>
#include <sstream>
#include <ros/ros.h> // 该文件包含了ROS系统中大部分常用的头文件
#include <std_msgs/String.h> // 消息类型的头文件,由.msg文件自动生成

int main(int argc, char** argv){
    // 初始化ROS
    ros::init(argc, argv, "publisher");
    // 为该节点创建一个句柄,创建后将会初始化这个节点
    ros::NodeHandle nh;
    // 创建一个类型为std_msgs::String的话题发布器,话题名为"msg",最后一个参数表示话题序列的大小
    ros::Publisher pub = nh.advertise<std_msgs::String>("msg", 1000);
    // 设置循环频率,单位: Hz
    ros::Rate loop_rate(10)
    int cnt = 0;
    while(ros::ok()){
        // 准备消息内容
        std_msgs::String msg;
        std::stringstream ss;
        ss << "hello world! " << cnt;
        msg.data = ss.str();
        
        // 打印发布的消息
        ROS_INFO("%s", msg.data.c_str());
        // 发布消息
        pub.publish(msg);
        // 消息回调处理,本程序不必调用该函数
        ros::spinOnce();
        // 休眠
        loop_rate.sleep();        
    }
}
  • 创建话题订阅者

src目录下创建subscriber.cpp文件,添加如下程序:

#include <iostream>
#include <ros/ros.h>
#include <std_msgs/String.h>

/**
 * @brief 回调函数
 * @param  msg              接收到的消息
 */
void callback(std_msgs::String::ConstPtr msg){
    ROS_INFO("%s", msg->data.c_str());
}

int main(int argc, char** argv){
    ros::init(argc, argv, "subscriber");
    ros::NodeHandle nh;

    // 订阅名为"msg"的话题,最后一个参数为回调函数,当接收到新消息时会调用这个函数
    ros::Subscriber sub = nh.subscribe("msg", 10, callback);
    // 回调处理函数
    ros::spin();
}
  • 修改CMakeList.txt

编辑该功能包的CMakeLists.txt文件,如下:

cmake_minimum_required(VERSION 3.0.2)
project(topic_pub_sub)

add_compile_options(-std=c++11)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
)

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

# 生成话题发布节点
add_executable(publisher src/publisher.cpp)
target_link_libraries(publisher
  ${catkin_LIBRARIES}
)
# 生成话题订阅节点
add_executable(subscriber src/subscriber.cpp)
target_link_libraries(subscriber
  ${catkin_LIBRARIES}
)

接下来使用catkin_make进行编译即可

  • 测试

需要运行三个终端,分别运行roscore,发布节点,订阅节点

  1. 运行roscore,在第一个终端输入:
roscore
  1. 运行话题发布者,在第二个终端中输入:
source ./devel/setup.bash
rosrun topic_pub_sub publisher
  1. 运行话题订阅者,在第三个终端中输入:
source ./devel/setup.bash
rosrun topic_pub_sub subscriber

结果如下:

01-发布者
02-订阅者
  • 使用ROS自带工具查看结果

使用rqt_graph命令可以查看节点间的关系,如图

03-graph

使用rostopic可以查看当前的话题状态、内容等数据,用法如下:

命令功能
rostopic list列举所有活动中的话题
rostopic echo <topic name>实时显示指定话题的消息内容
rostopic info <topic name>显示指定话题的信息

Python实现

相较于C++,Python实现会简单很多,也不需要编译,在一些简单的、对性能要求不高的场景,可以使用Python快速完成程序原型的设计

在开始前,要先在topic_pub_sub功能包目录下新建一个scripts文件夹

  • 创建话题发布者

scripts目录下创建publisher.py文件,内容如下:

#!/usr/bin/env python3
# #-*- coding: UTF-8 -*- 

import rospy
from std_msgs.msg import String

# 初始化ROS节点
rospy.init_node("publisher")
# 创建话题发布器,话题名称为"msg",类型为String
pub = rospy.Publisher("msg", String, queue_size=1000)
# 设置循环频率,单位: Hz
loop_rate = rospy.Rate(10)
cnt = 0
while not rospy.is_shutdown():
    msg = String()
    cnt += 1
    msg.data = "hello python! " + str(cnt)
    # 打印发布的消息
    rospy.loginfo(msg.data)
    # 发布消息
    pub.publish(msg)
    # 休眠
    loop_rate.sleep()

编写完成后,需要给这个文件执行权限,使用如下命令

sudo chmod 777 publisher.py
  • 创建话题订阅者

scripts目录下创建subscriber.py文件,内容如下:

#!/usr/bin/env python3
# #-*- coding: UTF-8 -*- 

import rospy
from std_msgs.msg import String

# 消息回调函数
def callback(msg):
    rospy.loginfo(msg.data)

# 初始化ROS节点
rospy.init_node("subscriber")
# 订阅名为"msg"的话题,最后一个参数为回调函数,当接收到新消息时会调用这个函数
sub = rospy.Subscriber("msg", String, callback)
# 回调处理
rospy.spin()

同样需要提高它的执行权限:

sudo chmod 777 subscriber.py
  • 测试

操作流程基本和C++实现一节基本一致,运行节点时可以直接使用rosrun topic_pub_sub xxxx.py来运行

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

ROS话题发布和订阅节点的C++&Python实现 的相关文章

随机推荐

  • 视觉SLAM | RealsenseD435i相机标定

    在运行VINS MONO VINS Fusion等SLAM方案的时候 xff0c 需要很准确的相机参数 xff0c 否则很容易漂移 本文是RealsenseD435i相机标定过程的记录 xff0c 标定主要有三个步骤 IMU标定相机标定IM
  • 视觉SLAM | 使用RealsenseD435i运行VINS-Fusion

    使用RealsenseD435i运行VINS Fusion VINS Fusion是基于双目的视觉惯导方案 xff0c 不太符合我目前的需求 xff0c 但这是我使用的第一个视觉SLAM方案 xff0c 接下来还是简单记录下 运行环境 硬件
  • 视觉SLAM | 在ROS上运行ORB-SLAM2

    本文直接使用的github上的orb slam 2 ros实现在ROS上运行ORB SLAM2 xff0c 这个ros包能够得到相机的位姿以及稀疏点云 xff0c 而且删掉了对Pangolin的依赖 xff0c 进行可视化时要用RViz 运
  • ROS报错记录及解决方法(不定期更新)

    ROS下载缓慢 如果是在国内安装 xff0c 建议在安装之前先配置国内的镜像源 xff0c 在软件和更新进行更改即可 参考 xff1a Ubuntu18 04下安装ROS 由于没有公钥 xff0c 无法验证下列签名 安装ROS时报错 xff
  • ROS与STM32通信

    ROS与STM32是用串口进行通信的 xff0c 主要有两种方式 xff0c 一是将STM32作为一个节点 xff0c 二是制作一个上位机节点 负责与STM32进行串口通信 xff0e 第一种方式需要专门的硬件 xff0c 所以我选择第二种
  • 使用VScode搭建ROS开发环境

    俗话说 xff02 工欲善其事必先利其器 xff02 xff0c 之前在Ubuntu上运行的ROS项目都是用vim或者gedit编写和修改代码 xff0c 然后在终端编译运行 xff0c 很不方便 xff0c 函数跳转查看都没办法实现 所以
  • TCP实时图像传输

    之前尝试过使用UDP进行图像传输 xff0c 而UDP协议要求包小于64K xff0c 对于较大的图像 xff0c 需要使用分片压缩的方式进行传输 xff0c 操作较复杂 xff0c 同时不能保证图片的每一部分都能够正确传输 详见 xff1
  • STM32部分BUG及解决方法记录(不定期更新)

    1 编译使用CubeMX生成的代码时报错 Error L6218E Undefined symbol HAL PWREx DisableUCPDDeadBattery referred from stm32g4xx hal msp o 解决
  • 语音信号处理 | Python实现端点检测

    由于项目需要 xff0c 我要使用Python对语音进行端点检测 xff0c 在之前的博客使用短时能量和谱质心特征进行端点检测中 xff0c 我使用MATLAB实现了一个语音端点检测算法 xff0c 下面我将使用Python重新实现这个这个
  • 进程,线程,应用程序。概念理解

    简单的说 xff0c 进程 可以承载一组相关的 NET 程序集 xff0c 而 应用程序域 xff08 简称AppDomain xff09 是对该进程的逻辑细分 一个应用程序域进一步被细分成多个 上下文边界 xff0c 这些边界用来分组目的
  • 搭建STM32开发环境

    安装keil 点击这里下载安装最新版的keil 破解 以管理员身份运行keil xff0c 打开File gt License Management 复制CID xff0c 如下 xff1a 运行keygen2032 exe xff0c 修
  • 路径规划 | 图搜索算法:DFS、BFS、GBFS、Dijkstra、A*

    地图数据常常可以用图 Graph 这类数据结构表示 xff0c 那么在图结构中常用的搜索算法也可以应用到路径规划中 本文将从图搜索算法的基本流程入手 xff0c 层层递进地介绍几种图搜索算法 首先是两种针对无权图的基本图搜索算法 xff1a
  • 移动机器人中地图的表示

    在学习算法之前 xff0c 首先要做的是理解数据 xff0c 所以本专栏在开始介绍运动规划算法前 xff0c 首先介绍一下地图的数据形式 地图有很多种表示形式 xff0c 在移动机器人中比较常用的是尺度地图 拓扑地图 语义地图 尺度地图 x
  • 路径规划 | 随机采样算法:PRM、RRT、RRT-Connect、RRT*

    基于图搜索的路径规划算法主要用于低维度空间上的路径规划问题 xff0c 它在这类问题中往往具有较好的完备性 xff0c 但是需要对环境进行完整的建模工作 xff0c 在高维度空间中往往会出现维数灾难 为了解决这些问题 xff0c 本文将介绍
  • ROS多机通信

    配置主从机IP地址 分别使用sudo vi etc hosts在主从机的 etc hosts文件中添加下面的代码 xff0c 其中pi是主机的用户名 xff0c esdc是从机的用户名 ip要相应的进行更改 xff0c 可以使用ifconf
  • 路径规划 | 图搜索算法:JPS

    JPS算法全称为Jump Point Search xff0c 也就是跳点算法 xff0c 可以视为A 算法的一种改进算法 xff0c 它保留了A 算法的主体框架 xff0c 区别在于 xff1a A 算法是将当前节点的所有未访问邻居节点加
  • 路径规划 | 随机采样算法:Informed-RRT*

    在文章路径规划 随机采样算法 xff1a PRM RRT RRT Connect RRT 中 xff0c 介绍了具备渐近最优性的RRT 算法 随着采样点数的增多 xff0c RRT 算法的规划结果会逐渐收敛到最优 但是可以观察到 xff0c
  • Ubuntu20安装ROS noetic

    Ubuntu20对应的ROS版本为ROS noetic xff0c 安装过程如下 xff1a 1 打开Software amp Updates xff0c 勾选main universe restricted multiverse这四项 2
  • 使用VSCode进行远程C++开发

    本文以Windows连接Ubuntu子系统 WSL 为例来介绍VSCode的远程开发流程 首先在VSCode中安装Remote WSL插件 xff0c 重启VSCode xff0c 如下图所示 xff0c 连接WSL 如果是其他远程 xff
  • ROS话题发布和订阅节点的C++&Python实现

    本文将分别使用C 43 43 和Python来实现话题发布者和订阅者 xff0c 首先创建一个功能包 xff0c 命名为topic pub sub xff0c 添加roscpp xff0c rospy等依赖项 C 43 43 实现 创建话题