ROS中创建Publisher和Subscriber

1. 创建一个工作空间

  1. 在根目录下创建一个名为catkin_ws的文件夹(也可自己定义文件夹名字,但是在后续操作中记得改成自己对应的名字),在catkin_ws文件夹下在创建一个src文件夹(必须要有这个文件夹,后续的包都放在里面),在终端中指令如下
mkdir -p ~/catkin_ws/src
  1. 通过cd指令进入src文件夹下,在终端中输入
cd ~/catkin_ws/src

3.将src文件夹创建工作空间,在终端中输入

catkin_init_workspace

4.创建完成后,回到根目录下,使用catkin_make指令进行编译整个工作空间。

cd ~/catkin_ws/
catkin_make

如果编译没有报错,工作空间就创建成功了,如果有错误请一定修改好,否则会影响后续工作,错误种类很多这里不多加赘述
5.设置环境变量

source /devel/setup.bash

如果使用的终端是zsh则把上面指令的bash改为zsh即可
注意:这里设置的环境变量只在当前终端生效,打开新的终端要重新设这相关路径的环境变量,如果想在所有终端生效,有两种方法:
(1).打开.bashrc或者 .zshrc文件,取决于你使用的哪种终端。系统默认终端是bash,这两个文件是隐藏文件,按Ctrl+H可以查看。如图是我输入Ctrl+H厚的隐藏文件列表,可以看到~ /.bashrc或和~/.zshrc
在这里插入图片描述
打开自己计算机对应的文件,在最后一行加入

source ~/catkin_ws/devel/setup.sh

(2)直接在终端输入(bash终端)

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

(zsh终端)

echo "source ~/catkin_ws/devel/setup.sh" >> ~/.zshrc
source ~/.zshrc

6.检查环境变量

echo $ROS_PACKAGE_PATH

如果看到我们刚刚设置的路径就是设置成功了
在这里插入图片描述

2.创建Publisher

Publisher作用是针对某一话题发布特定类型的消息指令,现在节点中创建一个Publisher并发布字符串“Hello World”

  1. 首先在src文件夹中新建一个名为 learning_communication的功能包
    打开终端使用cd命令进入刚刚创建的/catkin_ws/src目录下
cd ~/catkin_ws/src

使用catkin_creat_pkg命令创建功能包

 catkin_create_pkg learning_communication std_msgs rospy roscpp

后边的std_msgs rospy roscpp是相关依赖,可以根据个人需求添加其他依赖,也可以日后在CmakeList.txt里手动添加。
打开learning_communication文件夹可以看到以下目录。

打开learning_communication中的src文件夹,创建一个名为talker.cpp的cpp文件,文件代码如下(如果使用本文提供的代码,文件名请保持一致)

#include <sstream>
#include "ros/ros.h"
#include "std_msgs/String.h"

int main(int argc, char **argv)
{
  // ROS节点初始化
  ros::init(argc, argv, "talker");
  
  // 创建节点句柄
  ros::NodeHandle n;
  
  // 创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::String
  ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);

  // 设置循环的频率
  ros::Rate loop_rate(10);

  int count = 0;
  while (ros::ok())
  {
	// 初始化std_msgs::String类型的消息
    std_msgs::String msg;
    std::stringstream ss;
    ss << "hello world " << count;
    msg.data = ss.str();

	// 发布消息
    ROS_INFO("%s", msg.data.c_str());
    chatter_pub.publish(msg);

	// 循环等待回调函数
    ros::spinOnce();
	
	// 按照循环频率延时
    loop_rate.sleep();
    ++count;
  }

  return 0;
}

保存退出

3.创建Subscriber接收端

打开learning_communication中的src文件夹,创建一个名为listener.cpp的cpp文件
文件代码如下:

#include "ros/ros.h"
#include "std_msgs/String.h"

// 接收到订阅的消息后,会进入消息回调函数
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
  // 将接收到的消息打印出来
  ROS_INFO("I heard: [%s]", msg->data.c_str());
}

int main(int argc, char **argv)
{
  // 初始化ROS节点
  ros::init(argc, argv, "listener");

  // 创建节点句柄
  ros::NodeHandle n;

  // 创建一个Subscriber,订阅名为chatter的topic,注册回调函数chatterCallback
  ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);

  // 循环等待回调函数
  ros::spin();

  return 0;
}

4.编译代码设置依赖

打开learning_communication中的CMakeLists.txt文件,在后边加上

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

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

作用是将刚刚写的两个cpp文件添加到 配置文件中使其可以进行编译操作。
注:在CMakeLists.txt中找到以下代码把注释去掉。去掉后结果如下。

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

保存退出。

5.配置完成后就可以打开终端进行编译操作

首先在终端进入/catkin_ws/目录下

cd ~/catkin_ws/

进行编译

catkin_make

没有报错就是编译成功可以运行代码了。
先启动master

roscore

打开新的终端,运行talker.cpp

rosrun learning_communication talker

输出结果如下
在这里插入图片描述
再打开新的终端,运行listener.cpp

rosrun learning_communication listener

在这里插入图片描述
这样Subscriber就可以接收发布者发布的指令,并输出出来。

### 回答1: ROSpublishersubscriber是用于实现节点之间通信的两个重要概念。 publisher是一个节点,它可以将数据发布到一个特定的主题(topic)上。其他节点可以订阅这个主题,以接收该节点发布的数据。publishersubscriber之间的通信是异步的,即publisher不需要等待subscriber的响应。 subscriber是一个节点,它可以订阅一个特定的主题(topic),以接收其他节点发布的数据。当有新的数据发布到该主题上时,subscriber会自动接收并处理这些数据。subscriber可以订阅多个主题,以接收来自不同节点的数据。 通过使用publishersubscriber,ROS节点可以实现分布式计算,从而更好地完成各种任务。 ### 回答2: ROS (Robot Operating System)是一个开源机器人操作系统,它提供了一系列工具和库,使得机器人的开发、测试和部署更加简单、高效。ROS的核心概念之一就是发布/订阅模式(Publisher-Subscriber),这是ROS实现消息传递机制的基础。 ROS Publisher(发布者)是指向ROS消息总线发布消息的节点。节点可以向一个或者多个主题(Topic)发布消息。主题是让多个节点之间进行通信的一种机制。当一个Publisher节点发布了一条消息后,所有订阅了该主题的Subscriber就会接收到这条消息。发布者将消息发布到主题上时,需要指定主题的名称和消息类型。ROS提供了各种不同类型的消息,如字符串、数组、图像等。发布者节点用于发布消息会向主题发送一个消息头(Header),包含时间戳(Stamp)、FRAME_ID等信息,并在这个消息头注册一些回调函数,以便接收机制可以使用这些信息来更优雅、有效的处理消息。 ROS Subscriber(订阅者)是指向ROS消息总线订阅消息的节点。Subscriber将使用主题的名称和消息类型来订阅特定的主题。当主题被发布者发布消息时,所有订阅主题的Subscriber节点都将接收到这条消息。Subscriber节点使用回调函数处理消息。回调函数是将由节点执行的函数,这些函数会在消息到达时被调用。当Subscriber节点收到一条消息时,它会触发回调函数,并将接收到的消息作为参数传递给回调函数。回调函数然后处理消息,并根据需要执行其他操作。Subscriber节点的实现可以是同步的,也可以是异步的。同步的Subscriber节点会在每次接收到消息后立即处理,异步的Subscriber节点可能会在更长的时间内缓冲消息,以便将消息打包成一组或仅处理特定类别的消息。 总之,ROS PublisherSubscriber是ROS非常重要的概念,它们允许节点之间通过主题交换消息,实现ROS系统的消息传递机制。通过发布/订阅模式,节点之间可以共享数据,实现对机器人各个部分的控制和监视。同时,发布/订阅模式提供了一种透明的、分布式的、去心化的消息通信机制,允许ROS系统在各种硬件和操作系统平台上运行,并与外部系统长期保持稳定连接。 ### 回答3: ROS PublisherSubscriber是ROBOT OPERATING SYSTEM(ROS经常使用的两种通信方式,用于在ROS系统的不同模块之间进行信息传递和数据共享。 PublisherROS的一种发布者,它可以将数据发布到指定话题(topic)上。发布者可以是一个传感器,比如激光雷达,也可能是某个算法模块,比如机器人路径规划。发布者将数据发送到话题,然后该话题上的所有订阅者都可以接收到该数据。 Subscriber是ROS的一种订阅者,它可以订阅某个话题上的数据。一旦订阅者订阅了某个话题,它就可以在该话题上接收该话题上所有的数据。订阅者可能是一个控制模块,用于接收激光雷达数据,并控制机器人的行动。当订阅者收到数据后,它会进行特定的处理,如执行行动或更新机器人的状态等。 ROS PublisherSubscriber的优点在于它们提供了一种分布式系统的通信方式,这使得多个系统之间的数据共享变得更加容易和方便。在ROS系统,一个发布者可以同时向多个话题发布数据,而订阅者也可以订阅多个话题上的数据。这使得ROS在机器人控制和其他领域都具有广泛的应用。 在ROSPublisherSubscriber的使用非常简单。开发人员只需要在ROS节点定义一个发布者和一个订阅者即可。ROS提供了许多现成的库和工具,可以帮助开发人员轻松创建发布者和订阅者,使得开发过程更加简单和快速。 总之,ROS PublisherSubscriber是ROS系统非常重要的两个组件,它们可以方便地完成机器人控制、感知和决策等任务。这些组件的优点在于可以实现分布式通信,从而促进信息的共享和机器人系统的自主性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值