先运行乌龟程序
用如下命令查看例程节点关系图

$ rqt_graph

1.创建Publisher
Publisher主要作用是针对指定话题发布特定数据类型消息。接下来使用代码实现一个节点,节点中创建一个Publisher并发布字符串“Hello World”,源码learning_communication/src/talker.cpp如下
(源码的分析可以从其他博主空间里查找)

#include <sstream>
#include"ros/ros.h"
#include"std_msgs/String.h"
int main(int argc, char **argv)
{ros::init(argc, argv, "Talker");ros::NodeHandle n;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 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;
}
  1. 建立Subscriber
    创建一个Subscriber以订阅Publisher节点发布的“Hello World”字符串,实现源码learning_communication/src/listener.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::init(argc, argv, "Listener");ros::NodeHandle n;ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);ros::spin();return 0;
}
  1. 编译代码包
    打开CMakelLists.txt文件去掉注释,进行如下配置
include_directories(
include${catkin_INCLUDE_DIRS}
)
add_executable(Talker src/Talker.cpp)
target_link_libraries(Talker   ${catkin_LIBRARIES} )
add_dependencies(Talker ${PROJECT_NAME}_generate_messages_cpp)
add_executable(Listener src/Listener.cpp)
target_link_libraries(Listener   ${catkin_LIBRARIES} )
add_dependencies(Listener ${PROJECT_NAME}_generate_messages_cpp)

然后进行编译,编译会生成两个Talker、Listener,放在工作空间的~/catkin_ws/devel/lib/
修改完成后,进行编译

$ cd ~/catkin_ws
$ catkin_make

3.出现的问题

编译时会出现以下问题(笔者 出现的问题,但解决了)



出现这些问题时也找了一些办法但是都未解决,后来发现是同一工作空间目录下的文件夹中的文件有同名的“talker、listener”文件,因此去到learning_communication/src目录下,将talker与listener文件重命名,我就改成了“Talker、Listener”,但是也要记住要去,.cpp文件中把大小写改过来,同时CMakeLists.txt文件中也要改过来。
然后就行了。当然还可能遇到其他问题,这只是我遇到的问题解决方法。

  1. 运行Publisher与Subscriber
    在运行前,先要进行环境变量的设置
$ cd ~/catkin_ws
$ source ./devel/setup.bash

环境变量设置成功后
先启动roscore

$ roscore

再启动Publisher

$ rosrun learning_communication Talker

然后启动Subscriber

$ rosrun learning_communication Listener


5.自定义话题服务消息
在learning_communication/msg目录下建立Person.msg文件
源码如下

string name
uint8 sex
uint8 ageuint8 unknown = 0
uint8 male    = 1
uint8 female  = 2

此时打开learning_communication的package.xml确保文件中设置了以下编译与运行依赖
(此处或许有两种运行依赖)我的如下:

<exec_depend>std_msgs</exec_depend>
<exec_depend>message_runtime</exec_depend>

很多的博文和教材里显示的第二句代码是

<run_depend>message_runtime</run_depend>

但是我运行时产生了报错,让我把exec代替了run 所以我的是这样。
完成添加后,再打开CMakelLists.txt文件,在find_package中添加消息生成依赖功能包message——generation。

find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)

catkin依赖设置如下:

catkin_package(
INCLUDE_DIRS include
LIBRARIES learning_communication
CATKIN_DEPENDS  roscpp rospy std_msgs message_runtime
DEPENDS system_lib
)

最后设置编译的.msg文件

add_service_files(
FILES
AddTwoInts.srv
)
generate_messages(
DEPENDENCIES
std_msgs
)

完成以上配置后,回到工作空间路径下用catkin_make进行编译,再用如下命令看Person消息

$ rosmsg show Person

话题中的Publisher和Subscriber相关推荐

  1. ROS1学习笔记:话题中的Publisher与Subscriber(ubuntu20.04)

    参考B站古月居ROS入门21讲: 发布者Publisher的编程实现 订阅者Subscriber的编程实现 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录 一.乌龟例程中 ...

  2. ROS的学习(二十)rosserial中的Publisher和Subscriber中的编程步骤

    1.在一个话题上发布消息. 可以使用ros::Publisher类创建一个句柄来在一个话题上发布消息,应该首先创建一个publisher将要使用的消息,然后在setup函数中调用advertise.整 ...

  3. 【ROS入门学习05|自定义话题消息,并且编程实现publisher和subscriber】

    这里是学习ROS第一次涉及到代码的部分.主要根据古月居视频教程整理出来的干货.本人是干货爱好者. 文章目录 前言 一.话题模型 二.自定义话题消息 1.定义msg文件 2.在功能包(learning_ ...

  4. ROS教程中Publisher和Subscriber (Python)的说明

    Publisher和Subscriber[Python]的说明 1.编写发布节点 2.编写订阅节点 3.编译现在的节点 1.编写发布节点 $ roscd beginner_tutorials #切换到 ...

  5. ROS学习----Publisher与Subscriber

    1.Publisher(发布者)与subscriber(订阅者)关系. Publisher的主要作用是对于指定话题发布特定数据类型的消息. 下面是利用代码实现一个节点,节点创建一个Publisher并 ...

  6. 小白学习ROS(3)创建Publisher和Subscriber节点

    创建Publisher和Subscriber节点进行通讯 1.前言 在创建Publisher和Subscriber节点之前,先给介绍一个创建ROS包以及程序编写非常方便的一个ide,真的特别方便,尤其 ...

  7. (三)工作空间与功能包、Publisher、Subscriber

    目录 一.创建工作空间与功能包 1.工作空间 2.创建功能包 3.编译新的功能包 4. 环境变量 5.功能包中的两个重要文件 二.发布者Publisher的编程实现 (一)C++版本 (二)Pytho ...

  8. ROS: Publisher and Subscriber

    通过上一节编写ROS的第一个程序hello_world,我们对ROS的整个编程开发过程有了基本的了解,现在我们就来编写真正意义上的使用ROS进行节点间通信的程序.由于之前已经建好了catkin_ws这 ...

  9. Reactor的Publisher与Subscriber

    Project Reactor介绍 在计算机中,响应式变成或者反应式编程(Reactive Programming)是一种面向数据流和变化传播的编程范式.这意味着可以在编程语言中很方便地变大静态或动态 ...

最新文章

  1. 个人管理:简单,我微博中的一句话,总有你喜欢的
  2. 一个DirectX使用的例子
  3. C++ 版本ORM访问数据库之ODB访问oracle的Demo(三)
  4. opencv之retina滤波器---Retina_create
  5. 中控考勤软件sqlserver数据库建立办法
  6. Solidworks CAM入门教程,简单生成雕刻机刀路,经验分享
  7. ETL开发工具Kettle下载安装环境搭建及使用教程
  8. matlab实现单峰物体复原--光栅投影-多频外差
  9. 南师大GIS考研数据库2019年第五题
  10. 基于GIS的二次开发
  11. loss下降auc下降_从基本原理到梯度下降算法:零基础也能看懂的神经网络教程...
  12. 高次osu(重邮第13届ACM程序设计大赛-网络赛)
  13. office2016专业增强版语言包 VOL
  14. Linux mint 双硬盘,记一次装机——笔记本UEFI双硬盘(SSD+机械)双系统(Win10+Linux Mint)...
  15. 关于学程序需不需要学习英语的忠告
  16. 《云计算核心技术剖析》迷你书连载三 – 云计算的商业模式
  17. C#程序崩溃捕获与自动重启方法(简洁有效)
  18. 中序表达式转其他顺序 - 表达式加括号法
  19. 02 推荐算法-(01) Model-Based 协同过滤算法
  20. 关于正定矩阵和非正定矩阵

热门文章

  1. 自然语言处理中的Character Embedding技术
  2. xcode打包mac桌面程序
  3. 解决photoshop cs5每次打开都输入序列号的问题 (至少我好用 win7 64位)
  4. wangyi3-数据挖掘研究员
  5. Ubuntu还需要做什么才能替代Windows
  6. 【高中数学】频率分布表和频率分布直方图
  7. 单片机 STM32 HAL IO扩展 PCA9555
  8. 用duilib制作仿QQ2013动态背景登录器
  9. 【CXY】JAVA应用 之 快捷工具托盘
  10. 极路由b70路由器虚拟服务器,极路由B70刷固件详细步骤说明(整合其它坛友经验)-少走弯路,造福坛友...