c语言topic函数,ROS学习笔记(一) 话题topic的定义与使用(publisher 和 subscriber)
ROS学习笔记(一) 话题topic的定义与使用(publisher 和 subscriber)
最近由于项目所需刚开始学习ros,学习自b站的古月 ROS入门21讲,做一个总结,仅为自己学习使用,可供参考。
topic的组成
《ROS机器人开发实践》一书中讲的十分清楚,这里只是我自己的一个通俗的理解。
实现一个publisher发送消息topic,subscriber从topic中接收消息。其中包含了四个部分:
1 . 发布者(publisher)。
2. 订阅者(subscriber)。
3. 话题(topic): 发布者发布消息给话题,订阅者从指定话题订阅消息。
4. 消息(message):发送或接收的消息类型可以使用已有的消息类型,也可以自己定义消息类型。
消息
消息
发布者节点
话题topic
订阅者节点
以小乌龟程序为例,利用键盘对乌龟进行操作的指令如下
rosrun turtlesim turtle_teleop_key
节点关系如下:
/turtle1/cmd_vel
/teleop_turtle
/turtlesim
这里有两个节点/teleop_turtle和 /turtlesim,和一个话题/turtle1/cmd_vel组成。/teleop_turtle创建了一个发布者,用于发布键盘控制的指令;/turtlesim创建了一个订阅者,用于订阅速度指令,实现乌龟的运动;/turtle1/cmd_vel是话题。
建立topic通信
topic一共由发布者、订阅者、话题、消息组成。其中的发布者和订阅者是节点,需要通过C++或python来分别进行定义,话题和消息则是在这两个代码文件中进行调用,步骤如下:
1、创建功能包。一切的程序调用都需要在功能包中完成。
2、自定义话题消息。若使用已有的消息类型则不需要定义。
3、publisher源文件的创建。(C++或python)
4、subscriber源文件的创建。(C++或python)
5、编译生成可执行文件(python可省略该步骤)。
(6、测试执行)
详细步骤:
下面以一个发布和订阅人员信息的例子详细介绍每一个步骤:
learning_topic::person
learning_topic::person
person_publisher
/person_info
person_subscriber
一、创建功能包
(一)、没有工作空间先创建工作空间
1、创建工作空间
(1) 递归创建文件夹 mkdir -p ~/catkin_ws/src
(2) 进入/src路径 cd ~/catkin_ws/src
(3) 初始化工作空间 catkin_init_workspace
2、编译工作空间
(1) 进入工作空间根目录cd ~/catkin_ws
(2) 编译工作空间 catkin_make
3、设置环境变量
source devel/setup.bash
(二)、创建功能包:
1、cd ~/catkin_ws/src在src文件夹路径下建立功能包
2、catkin_create_pkg learning_topic roscpp rospy std_msgs创建功能包,其中learning_topic是功能包名称,roscpp、rospy、std_msgs是相关依赖。
二、自定义话题消息
(一)、定义msg文件(这里为Person.msg)
1、learning_topic功能包中建立名为“msg”文件夹,用以保存Person.msg文件。
2、在msg文件夹中用touch或gedit指令建立一个名为“Person.msg”文件,其文件内容如下:
string name
uint8 age
uint8 sex
uint8 unknown = 0
uint8 male = 1
uint8 female = 2
(二)、在package.xml中添加功能包依赖用以动态产生message
1、添加编译依赖:message_generation
2、添加执行依赖:message_runtime
(三)、修改CMakeLisk.txt文件
1、在“find_package”中添加
message_generation
2、将定义的Person.msg文件作为定义的消息接口,针对定义编译。
在“Declare ROS message, service and actions”中添加
add_message_files(FILES Person.msg)
3、说明编译Person.msg时所依赖的包。
在“Declare ROS message, service and actions”中添加
generate_messages(DEPENDENCIES std_msgs)
4、添加message运行的依赖。
在“catkin_package”中添加
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
(四)、编译产生消息Person.h
进入工作空间根目录进行编译
cd ~/catkin_ws
catkin_make
在路径~/catkin_ws/devel/include中会产生Person.h文件,里面就是定义的消息类型
三、publisher源文件的创建
在~/catkin_ws/src/learning_topic/src路径下创建publisher源文件:person_publisher.cpp
其源代码如下:
//添加所依赖的头文件
#include
#include
//主函数
int main(int argc,char **argv)
{
//初始化节点,"person_publisher"为发布者节点
ros::init(argc,argv,"person_publisher");
//设置句柄
ros::NodeHandle n;
//创建发布者,发布者名字为person_info_pub;消息类型为learning_topic::Person;话题节点为/person_info;10代表缓冲队列大小
ros::Publisher person_info_pub = n.advertise<:person>("/person_info",10);
//设置循环频率,单位是HZ
ros::Rate loop_rate(1);
//进入循环
int count = 0;
while(ros::ok())
{
//初始化learning_topic::Person类型消息
learning_topic::Person person_msg; //声明Person类的一个对象person_msg
person_msg.name = "Tom";
person_msg.age = 18;
person_msg.sex = learning_topic::Person::male; //调用预定义的宏
//发布消息
person_info_pub.publish(person_msg); //发布者person_info_pub发布消息
//显示发布信息
ROS_INFO("publish Person Info:name:%s,age:%d,sex:%d",person_msg.name.c_str(),person_msg.age,person_msg.sex);
loop_rate.sleep();
}
}
四、subscriber源文件的创建
在~/catkin_ws/src/learning_topic/src路径下创建subscriber源文件:person_sbscriber.cpp
其源代码如下:
//添加所依赖的头文件
#include
#include
//回调函数
void PersonInfoCallback(const learning_topic::Person::ConstPtr& msg)
{
//显示接收到的信息
ROS_INFO("subscribe Person Info:name:%s,age:%d,sex:%d",msg->name.c_str(),msg->age,msg->sex);
}
//主函数
int main(int argc,char **argv)
{
//初始化节点,"person_subscriber"为订阅节点
ros::init(argc,argv,"person_subscriber");
//设置句柄
ros::NodeHandle n;
//创建订阅者,person_info_sub是订阅者,从话题“/person_info”订阅
ros::Subscriber person_info_sub = n.subscribe("/person_info",10,PersonInfoCallback);
//循环等待
ros::spin();
return 0;
}
五、修改CMakeList.txt,编译生成可执行文件
(一)、在CMakeList.txt文件添加以下内容
1、生成可执行文件
add_executable (person_publisher src/person_publisher.cpp)
add_executable (person_subscriber src/person_subscriber.cpp)
2、设置链接
target_link_libraries(person_publisher ${catkin_LIBRARIES})
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
3、添加依赖
add_dependencies(person_publisher ${PROJECT_NAME}_generate_message_cpp)
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_message_cpp)
(二)、编译
在~/catkin_ws路径下执行
catkin_make
六、测试
测试之前记得先要source devel/setup.bash,创建环境变量。
打开三个终端分别输入以下命令:
roscore
rosrun learning_topic person_publisher
rosrun learning_topic person_subscriber
执行成功后打开新的终端执行rqt_graph查看节点关系如下:
其中/person_publisher是发布者节点,发送消息给/person_info话题,/person_subscriber是订阅者节点,从person_info话题订阅消息。消息类型为learning_topic::Person。
c语言topic函数,ROS学习笔记(一) 话题topic的定义与使用(publisher 和 subscriber)相关推荐
- R语言与函数估计学习笔记(函数模型的参数估计)
R语言与函数估计学习笔记 毫无疑问,函数估计是一个比参数估计要复杂得多的问题,当然也是一个有趣的多的问题.这个问题在模型未知的实验设计的建模中十分的常见,也是我正在学习的内容的一部分. 关于函数估计我 ...
- 【ROS入门学习05|自定义话题消息,并且编程实现publisher和subscriber】
这里是学习ROS第一次涉及到代码的部分.主要根据古月居视频教程整理出来的干货.本人是干货爱好者. 文章目录 前言 一.话题模型 二.自定义话题消息 1.定义msg文件 2.在功能包(learning_ ...
- ros学习笔记12——python实现发布和接收ros topic
ros学习笔记12--python实现发布和接收ros topic 一.简单demo 1.工作空间是存放工程开发的相关文件的文件夹 2.创作工作空间指令 3 .创建功能包 4. 创建Topic的订阅发 ...
- ROS学习笔记(八): ROS通信架构
ROS学习笔记(八): ROS通信架构 文章目录 01 Node & Master 1.1 Node 1.2 Master 1.3 启动master和node 1.4 rosrun和rosno ...
- ROS学习笔记(1):发布者和订阅者
ROS学习笔记(1):publishers and subscribers 1.ros通信简介 2.C++中的类与对象 3.publishers/subscribers 4.常用指令 1.ros通信简 ...
- ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行
ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行 一.自定义消息: 1.新建msg文件夹,创建定义Person.msg 文件 mkdir -p ~/catk ...
- ROS学习笔记基础2(基础知识和ROS架构)
ROS学习笔记1(基础知识和ROS架构) 文章目录 ROS学习笔记1(基础知识和ROS架构) 1. 什么是ROS 2. ROS和其他机器人平台有什么不同 3. ROS架构组成 3.1 文件系统级别 3 ...
- ROS学习笔记九:用C++编写ROS发布与订阅
ROS学习笔记九:用C++编写ROS发布与订阅 本节主要介绍如何用C++编写一个简单的ROS发布与订阅. 编写发布节点 在之前创建的例子beginner_tutorials软件包中,在其目录下的src ...
- ROS学习笔记八:创建ROS msg和srv
ROS学习笔记八:创建ROS msg和srv 本节主要讲述了如何创建和建立ROS msg和srv,同时使用命令行工具rosmsg.rossrv和roscp. msg和srv简介 msg:描述ROS m ...
- 【ROS学习笔记】(四)订阅者Subscriber的实现
一.目标功能 订阅者订阅海龟的位姿信息. 二.创建功能包 首先创建工作空间,参考[ROS学习笔记](二)工作空间与功能包的创建 然后创建一个功能包 cd ~/catkin_ws/src catkin_ ...
最新文章
- java属于高级语言_以下哪种语言属于高级语言________________。A、JavaB、C++C、VisualBa...
- LeetCode_字符串类
- React Native实例
- Java8学习笔记(七)--Collectors
- html下拉嵌套只读,html组件不可输入(只读)同时任何组件都有效
- 数据结构 队列Queue
- serve注解是加在哪个类_PHP 8新特性之Attributes(注解)
- IIS7 大文件上传下载限制设置
- 有哪些软件堪称「神器」,却不被大众所知?
- 【程序员如何买股票 二】 A股证券账户开户
- githug关卡小游戏,练习git
- Excel中提取单元格数字
- Linux第七章相关代码
- 【VRP问题】基于NSGA算法求解多中心VRP问题matlab源码
- JS 获取当前时间及当天零点,当月零点,往前1小时,7天,1个月,1年
- 旧版奥维 用 新地图 gmap 谷歌卫星图层
- 电信重组奠定中国通信产业新格局
- 跟我学JAVA -- 什么是面向对象的程序设计
- 2的n次方计算,支持大整数,nodejs代码
- 成长一夏 挑战赛|跟大佬学习 / 创作,得CSDN大礼包、专属荣誉证书、纪念T恤和勋章!
热门文章
- 一般熟练盲打需要多久_练习拼音打字练到[盲打]的境界一般需要多久(时间)?...
- [Android O] [RK3399] -- Vendor Storage 功能探究
- java 分隔符_Java分隔符的使用
- python构造方法的方法名_构造方法是类的一个特殊方法,Python中它的名称为()。
- 怎样启动模拟器模拟鸿蒙系统,鸿蒙OS 模拟器运行
- MYSQL简单题目和知识点
- ubuntu下载BT种子安装qBittorrent
- 怎么学好html5和css3,如何提高你的CSS水平
- 3GPP Release简介
- 懒人神器,IDEA插件之EasyCode,自动生成CRUD代码