ROS 发布及订阅消息

本文详细介绍了在ROS环境中搭建发布及订阅消息系统的过程,包括安装配置ROS环境、创建catkin工作空间、构建程序包,以及如何编译和执行ROS程序包。通过实际操作指导读者掌握ROS消息通信的核心技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ROS之 发布及订阅消息理论知识

大目标:学会使用ROS发布及订阅消息。
小目标:
(1)CMakeLists.txt的建立
(2)package.xml的建立
原因:在理解、实现 ROS中发布及订阅消息程序时,发现头文件单纯包含#include<ros/ros.h>是不可行的,通过查阅资料发现需要首先包含CMakeLists.txt及package.xml。

1. 安装和配置ROS环境

按照官网教程一步一步安装即可。

针对Linux16.04
Kinetic版本

2. ROS环境管理

2.1 确保环境变量被配置

在Linux终端输入:

$ printenv | grep ROS

此时显示:

ROS_ROOT=/opt/ros/kinetic/share/ros
ROS_PACKAGE_PATH=/opt/ros/kinetic/share
ROS_MASTER_URI=http://localhost:11311
ROS_VERSION=1
ROSLISP_PACKAGE_DIRECTORIES=
ROS_DISTRO=kinetic
ROS_ETC_DIR=/opt/ros/kinetic/etc/ros

通过该命令查看是否配置了ROS_ROOT和ROS_PACKAGE_PATH这样的环境变量。

2.2 创建一个catkin 工作空间:

在终端输入:

$ mkdir -p ~/catkin_ws/src                   #递归创建目录  
$ cd ~/catkin_ws                             #切换至创建的工作空间中
$ catkin_make

查看当前目录可看到’build’和’devel’和‘src’三个文件夹。
在工作空间中首次运行catkin_make命令后, 它会在‘src’文件夹下创建一个CMakeLists.txt。在’devel’文件夹里可以看到setup.sh文件。
source这些文件中的任何一个都可以将当前工作空间设置在ROS工作环境的最顶层。此时source一下新生成的setup.sh文件:

$ source devel/setup.bash

要想保证工作空间已配置正确,需确保ROS_PACKAGE_PATH环境变量包含你的工作空间目录,采用以下命令查看:

$ echo $ROS_PACKAGE_PATH

可得输出:

/home/你的用户名/catkin_ws/src:/opt/ros/kinetic/share:/opt/ros/kinetic/stacks

此时,ros的工作环境已完全搭建完成。

A 基础知识(可略过)

A.1 安装ros-kinetic-ros-turorials

$ sudo apt-get install ros-kinetic-ros-tutorials(可将kinetic更换为自己的Ubuntu版本名称)

A.2 文件系统的基本概念

1.Packages: 软件包,是ROS中软件组织的单元,可以包含ROS运行的进程(节点)、配置文件、程序库、可执行文件、脚本或者其它手动创建的东西。
2.Manifest (package.xml): 清单,是对于’软件包’相关信息的描述,用于定义软件包相关元信息之间的依赖关系,这些信息包括版本、维护者和许可协议等。

A.3 文件系统的基本工具

针对catkin方式

rospack = ros + package // $ rospack find [package_name] 获取packages软件包的信息。
roscd = ros + cd //roscd [本地包名称[/子目录]] 直接切换工作目录到某个软件包或软件包集中。
rosls = ros + ls // 允许直接按软件包的名称而不是绝对路径执行ls命令。

3. 创建ROS 程序包(Package)

针对catkin方式

主要介绍:
(1)如何使用roscreate-pkg或catkin创建一个新程序包;
(2)使用rospack查看程序包的依赖关系。

3.1 程序包的构成

(1)必须包含catkin兼容的package.xml文件,这个package.xml文件提供有关程序包的元信息。
(2)必须包含一个catkin 版本的CMakeLists.txt文件。
(3)每个目录下只能有一个程序包。

3.2 一个简单的程序包结构

一个普通的工作空间大致为:

workspace_folder/        -- WORKSPACE
  src/                   -- SOURCE SPACE
    CMakeLists.txt       -- 'Toplevel' CMake file, provided by catkin
    package_1/
      CMakeLists.txt     -- CMakeLists.txt file for package_1
      package.xml        -- Package manifest for package_1
    ...
    package_n/
      CMakeLists.txt     -- CMakeLists.txt file for package_n
      package.xml        -- Package manifest for package_n

3.3 创建一个catkin程序包

目的:使用catkin_create_pkg命令创建一个新的catkin程序包;
关键程序:catkin_create_pkg <package_name> [depend1][depend2] [depend3]
步骤:
(1)创建工作空间。如2.2 所介绍方式。
(2)切换到所创建的工作空间中。

$ cd ~/catkin_ws/src

(3)创建一个名为“beginner_tutorials’的新程序包,其依赖于std_msgs、roscpp和rospy:

$ catkin_create_pkg  beginner_tutorials  std_msgs roscpp rospy

(4)以后将在beginner_tutorials/src文件夹下编写.cpp文件,在“beginner_tutorials’的文件夹下修改配置文件,才能编译Packages包。

3.4 查看依赖关系

(1)一级依赖
使用使用rospack命令工具来查看一级依赖包。这些依赖吧被保存在package.xml中。

$ rospack depends1 beginner_tutorials 

(2)间接依赖
一般的,一个依赖包还依赖其他的包,可用下面的命令查找。

$ rospack depends1 rospy

但是,一个程序包还可以有好几个间接的依赖包,使用rospack可以递归检测出所有的依赖包。// 即:依赖包的其他依赖包。

$ rospack depends beginner_tutorials

4.编译ROS程序包

4.1 编译Packages

使用方法:

(1)如果源码在catkin工作空间下,在当前工作空间(如本文在~/catkin_ws/中)下输入:

$ catkin_make                               #catkin_make命令将编译src目录下的所有工程。

(2)如果源码不在catkin工作空间下,比如存放在了my_src中,那么可以这样来使用catkin_make:

$ catkin_make --source my_src                       #必须回到根目录下,source 源文件所在的目录       

5.执行ROS程序包

(1)roscore
作用:roscore是在运行所有ROS程序前首先要运行的命令。
打开一个终端,输入:

$ roscore

(2)

source 工作空间/devel/setup.bash      #必不可少

(3)rosrun
作用:允许使用包名直接运行一个包内的节点(不需要知道这个包的路径)。
打开一个终端,输入:

$ rosrun [package_name] [node_name]                         #将此处的第二三项分别换做包名、节点名

tips:改变节点名称
如:$ rosrun turtlesim turtlesim_node __name:=my_turtle
可将原来的节点名( turtlesim)改为my_turtle。

(3)可使用rosnode ping [node_name] 测试程序是否运行
总结:
roscore = ros+core : master (提供为名称服务) + rosout (stdout/stderr) + parameter server (参数服务器)
rosnode = ros+node : 获取节点信息的ROS工具
rosrun = ros+run : 运行节点工具

根据本文的提示,将其整理为:
建立好的工作空间:
工作空间在这里插入图片描述

转载自:
https://blog.youkuaiyun.com/q_z_r_s
https://www.ncnynl.com/archives/201608/502.html

### ROS2 中消息发布的实现 在 ROS2 的架构下,消息发布订阅是一个核心功能。通过定义 `Publisher` 和 `Subscriber` 节点,可以实现在不同节点之间传递数据的功能。 以下是基于 Python 实现的一个简单示例代码: #### 示例代码:发布者 (Publisher) ```python import rclpy from rclpy.node import Node from std_msgs.msg import String class MinimalPublisher(Node): def __init__(self): super().__init__('minimal_publisher') self.publisher_ = self.create_publisher(String, 'topic', 10) timer_period = 0.5 # seconds self.timer = self.create_timer(timer_period, self.timer_callback) self.i = 0 def timer_callback(self): msg = String() msg.data = f'Hello World: {self.i}' self.publisher_.publish(msg) self.get_logger().info(f'Publishing: "{msg.data}"') self.i += 1 def main(args=None): rclpy.init(args=args) minimal_publisher = MinimalPublisher() rclpy.spin(minimal_publisher) minimal_publisher.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 这段代码创建了一个名为 `minimal_publisher` 的节点,并向主题 `topic` 发布字符串消息[^1]。 --- ### 订阅者的实现 下面是一段用于接收上述发布者所发送消息订阅者代码: #### 示例代码:订阅者 (Subscriber) ```python import rclpy from rclpy.node import Node from std_msgs.msg import String class MinimalSubscriber(Node): def __init__(self): super().__init__('minimal_subscriber') self.subscription = self.create_subscription( String, 'topic', self.listener_callback, 10) self.subscription # prevent unused variable warning def listener_callback(self, msg): self.get_logger().info('I heard: "%s"' % msg.data) def main(args=None): rclpy.init(args=args) minimal_subscriber = MinimalSubscriber() rclpy.spin(minimal_subscriber) minimal_subscriber.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 此代码片段实现了对主题 `topic` 上的消息监听并打印接收到的内容[^2]。 --- ### 关键概念解析 - **发布者 (`Publisher`)** - 定义了要发布到的主题名称以及该主题的数据类型。 - 使用 `create_publisher()` 方法来初始化发布器对象。 - **订阅者 (`Subscriber`)** - 需要知道它希望订阅哪个主题及其对应的数据类型。 - 利用回调函数处理来自指定主题的新消息。 - **话题名称与类型** - 主题名应唯一标识通信通道;而其关联的消息类型则决定了传输的具体结构化数据形式。 --- ### 运行说明 为了测试以上两个脚本,请按照如下顺序操作: 1. 启动第一个终端运行 Publisher 程序; 2. 打开第二个终端执行 Subscriber 应用程序; 3. 查看日志输出确认双方交互正常工作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值