【ROS实践入门(五)自定义节点功能包使用与消息传递】

2023-05-16

【ROS实践学习入门系列(五)自定义节点功能包使用与消息传递】

本内容经官网实例以及一些参考书总结而成,欢迎留言评论交流~

联系方式:ziyuanw#foxmail.com(#换成@)

 一、回顾小海龟案例:

在小海龟的案例中我们知道有两个节点的终端窗口,在一个终端窗口中输入键盘消息,另外一个终端窗口接收消息,最后才使得小海龟的图像按照键盘方向移动。

rostopic发布器节点(红色)正在与rostopic 输出海龟动作节点(绿色),通过键盘/turtle1/cmd_vel控制方向的输入消息,进行通信:

那么问题来了我想自己定义两个类似的节点然后让他们完成类似的工作也是可行的,或者说,ROS系统的节点之间通信的基础就是:一个节点发布数据,另外一个节点接收数据,同时操作数据并使用这些数据来完成一些任务和工作。

二、自定义功能包:

1.创建catkin工作空间:

我这里就在用户家目录下直接创建名为catkin_ws的catkin工作空间。(创建功能包的目录可自行选择)

$mkdir -p ~/catkin_ws/src
$cd ~/catkin_ws
$catkin_make

回顾之前博客中的catkin工作空间相关文件说明。ROS的任务都是在自己的工作空间完成的。因此为了保证自己创建的两个节点能够顺利完成任务,我需要自定义一个catkin工作空间来将这两个节点放入。而这两个节点所完成的任务即构成了第二篇博客中所说的功能包。如果在自己的工作空间有多个这种类似任务的功能包,即组成了元功能包

具有元功能包集合的catkin工作空间目录结构如下:

catkin_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

2.创建功能包

有了工作空间还只是第一步基础,在之前博客中所说到的,一个功能包要想完成一个功能,一定要有功能包清单即package.xml文件进行管理,以及CMakeLists.txt文件对功能包中的实现节点功能的源程序进行编译,进而建立其与工作空间的联系才行。

一个catkin功能包必须包含:

  • CMakeLists.txt
  • package.xml

最简单的程序包看起来就像这样:

my_package/
  CMakeLists.txt
  package.xml

ROS创建功能包的命令:

catkin_create_pkg [packagename] [dependency1] .... [dependencyN]

第一个参数为自定义功能名称,后面为建立功能包所需要的依赖包。

  • (注意,功能包都是在catkin_ws的src目录下创建。)

这里我创建一个名为test的功能包:

catkin_create_pkg test std_msgs roscpp

参数说明:

  • catkin_create_pkg 命令创建了一个名为test的功能包。
  • std_msgs:包含了创建消息类型,表示基本数据类型和其他基本的消息构建,如多维数组。
  • roscpp:使用C++实现ROS的功能,它提供了一个客户端库,能够让开发者使用这些接口快速完成与ROS主题,服务,参数相关开发工作。

最后完成创建可发现在~/catkin_ws/src下面多出了一个test文件夹,我的功能包节点源程序就需要放在其下src目录中。其中文件结构如下:由于其为一个功能包,因此可使用rospack命令对其进行查找路径和查看依赖关系:

创建完功能包记得进入工作空间更新一下环境变量配置,不然会出现找不到功能包。

3.创建节点

本例我创建一个名为example1_a的节点用于发送消息,一个名为example1_b用于接收消息并将消息输出在屏幕。两个节点的源程序分别为example1_a.cpp和example1_b.cpp放在~/catkin_ws/src/test/src目录下:

example1_a.cpp源程序如下:

#include<ros/ros.h>			//包含ROS节点所有必要的文件
#include<std_msgs/String.h>	        //包含要使用的消息类型
#include<sstream>			//字符串流输入输出

int main(int argc,char **argv)
{	//初始化节点并设置名称(该名称唯一)
	ros::init(argc,argv,"example1_a");
	//进程的处理程序,允许我们与环境交互
	ros::NodeHandle n;
	//将节点实例化为发布者,将发布主题和名称告知节点管理器,名为message,第二个参数为缓冲区大小,若主题发布数据速度较快,缓冲区至少设置为存放1000条消息
	ros::Publisher chatter_pub=n.advertise<std_msgs::String>("message",1000);
	//发送数据的频率为10HZ
	ros::Rate loop_rate(10);
	//按下Crtl+C组合或ROS停止所有节点,ros::ok()停止
	while(ros::ok())
	{	//创建一个消息变量,变量类型必须符合发送数据要求
		std_msgs::String msg;
		//定义字符串流
		std::stringstream ss;
		ss<<"I am the example1_a node";
		msg.data=ss.str();
		//ROS_INFO("%s",msg.data.c_str());
		//继续发布消息,使用之前发布器的定义发布消息
		chatter_pub.publish(msg);
		//spinOnce()函数负责处理所有ROS内部时间和操作,例如读取订阅的消息。
		ros::spinOnce();
		//按照10HZ频率将程序挂起
		loop_rate.sleep();
	}
	return 0;
}

example1_b.cpp源程序如下:

#include<ros/ros.h>			//包含ROS节点所有必要的文件
#include<std_msgs/String.h>		//包含要使用的消息类型

//设置回调函数messageCallback,每次该节点收到一条消息时都会调用此函数。该函数可以处理数据。
void messageCallback(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,"example1_b");
	//进程的处理程序,允许我们与环境交互
	ros::NodeHandle n; 
	//将节点实例化为订阅者,并将所发布的主题类型的名称告知节点管理器。名为message。处理消息的函数为messageCallback
	ros::Subscriber sub = n.subscribe("message",1000,messageCallback);
	//spin()函数负责处理节点开始读取主题和在消息到达时,回调函数messageCallback被调用的主循环。Ctrl+C组合建,节点退出消息循环,于是结束循环
	ros::spin();
	return 0;
}

4.编译节点

①修改CMakeLists.txt文件:

rosed工作空间内跳转并以文本方式(默认编辑器为:vim) 打开CMakeLists.txt文件,并添加可执行文件,依赖,目标链接库:

在最后一行添加如下内容:

## Build the example1_a and example1_b

include_directories(
include
  ${catkin_INCLUDE_DIRS}
)


add_executable(example1_a src/example1_a.cpp)
add_dependencies(example1_a test_generate_messages_cpp)
target_link_libraries(example1_a ${catkin_LIBRARIES})

add_executable(example1_b src/example1_b.cpp)
add_dependencies(example1_b test_generate_messages_cpp)
target_link_libraries(example1_b ${catkin_LIBRARIES})

②catkin_make编译节点:

$cd ~/catkin_ws
$catkin_make
  • (PS:后面参数可选为编译指定功能包,若缺省则默认编译全部功能包的全部节点。)
catkin_make --pkg [packagename]

编译完成可看到输出成功两个可执行节点。

5.运行节点

还是之前博客中所提到的步骤:

在~/catkin_ws工作空间中:

1.打开第一个终端窗口输入:roscore

2.打开第二个终端输入:rosrun test example1_a

3.打开第三个终端输入:rosrun test example1_b

  • 此时不要先急于执行,一定要先在终端中更新一下环境配置,不然可能找不到该节点:

效果如下:

6.rqt_graph查看节点消息传递

在上面两个节点传递消息同时,CTRL+Shift+T打开第四个终端:

可以看到节点example1_a发布message主题,节点example1_b订阅该主题。

至此,一个简单的两个节点功能包test已经完成,后面将会用到新的功能用于节点通信:消息和服务。

 

 

上一篇:【ROS实践入门(四)使用服务与参数服务器】

下一篇:【ROS实践入门(六)消息msg和服务srv文件创建与使用】

 

 

参考资料:

【1】ROS官网:http://wiki.ros.org/cn

【2】ROS机器人高效编程

 

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

【ROS实践入门(五)自定义节点功能包使用与消息传递】 的相关文章

  • Protobuf生成Go代码指南

    这个教程中将会描述protocol buffer编译器通过给定的 proto会编译生成什么Go代码 教程针对的是proto3版本的protobuf 在阅读之前确保你已经阅读过Protobuf语言指南 编译器调用 Protobuf核心的工具集
  • ROS sensor_msgs/LaserScan Message简单说明

    std msgs Header header float32 angle min 开始扫描角度 float32 angle max 结束扫描角度 float32 angle increment 每次扫描增加的角度 xff08 角度分辨率 x
  • 双系统Ubuntu分区

    假设整个空闲空间有200G xff0c 主要分4个区 xff1a 1 给系统分区EFI xff1a 在唯一的一个空闲分区上添加 xff0c 大小200M xff0c 逻辑分区 xff0c 空间起始位置 xff0c 用于efi xff1b 这
  • 2 用D435i运行VINS-fusion

    文章目录 1 VINS fusion的安装1 1 环境和依赖的安装1 2 编译VINS Fusion1 3 编译错误解决方法 2 VINS Fusion跑数据集3 用相机运行VINS Fusion 环境 xff1a Ubuntu20 04
  • Python每日一个小程序

    前几天上网 xff0c 收集了20多道Python练习题 这些练习题还是很有价值的 xff0c 正好最近忙着复习准备校招 xff0c 可以用来练手 我会把每道题都写一篇博客详细阐述解题思路和源代码 xff0c 在每道题目后面附上博客地址 希
  • 数分下(第1讲):一阶微分方程的三类模型求解

    第1 1讲 xff1a 一阶微分方程的解法 第一周第一讲将用3个小时时间 xff0c 完整讲解一阶微分方程y 61 f x y 的三种典型模型求解方法 掌握以下知识点 xff0c 并熟练做题训练 对应同济高数教材第七章1 4节 知识点脑图如
  • 非常详细的 Linux C/C++ 学习路线总结!助我拿下腾讯offer

    点击关注上方 五分钟学算法 xff0c 设为 置顶或星标 xff0c 第一时间送达干货 转自后端技术学堂 正文 我的另一篇文章 腾讯 C 43 43 后台开发面试笔试知识点参考笔记 整理了 C 43 43 后台开发知识点 xff0c 本文尝
  • 一线互联网公司程序员技术面试的流程以及注意事项

    先来了解面试的流程是什么 xff0c 然后再一一做准备 xff01 企业一般通过几轮技术面试来考察大家的各项能力 xff0c 一般流程如下 xff1a 一面机试 xff1a 一般会考选择题和编程题 二面基础算法面 xff1a 就是基础的算法
  • 为什么C++永不过时?

    Linus曾说过 xff1a C 43 43 是一门很恐怖的语言 xff0c 而比它更恐怖的是很多不合格的程序员在使用着它 xff01 这足以说明C 43 43 有多难 xff01 不过 xff0c 你也要明白 难度越高意味着含金量与竞争力
  • STM32 USB学习笔记6

    主机环境 xff1a Windows 7 SP1 开发环境 xff1a MDK5 14 目标板 xff1a STM32F103C8T6 开发库 xff1a STM32F1Cube库和STM32 USB Device Library 现在来分
  • Invalid bound statement (not found)

    目录 一 遇到的问题 二 分析思路 1 映射文件 2 测试类 三 解决方案 一 遇到的问题 前几日 xff0c 有个工作不久的同事找我帮他解决一个 Mybatis 的问题 他写了一个增删改查 xff0c 但是在启动程序的时候报错 xff1a
  • ThinkPHP6 解决小程序调用接口返回错误是网页的尴尬

    背景 早在开始了解ThinkPHP时就一直记得一段话 xff1a 在一开始无知的我以为出现错误后能在调试阶段优雅的了解错误信息 xff0c 但结果大家试一下便知道 xff0c 十分尴尬 尤其是当在小程序里请求api xff0c 在过程中发生
  • 大数据技术Canal总结和详细案例

    0 Canal介绍 Canal 是用 Java 开发的基于数据库增量日志解析 xff0c 提供增量数据订阅 amp 消费的中间件 目前Canal 主要支持了 MySQL 的 Binlog 解析 xff0c 解析完成后才利用 Canal Cl
  • T507 Ubuntu18.04 LXDE桌面汉化

    本文硬件平台采用飞凌T507开发板 xff0c 主要讲解Ubuntu图形桌面LXDE如何修改为中文界面 xff0c 本文使用的思路和方法仅供参考使用 xff0c 其它arm开发板虽然芯片不同 xff0c 但思路和方法有很多的共性 xff0c
  • 工作站和台式机的区别

    转自 xff1a 微点阅读 xff08 www weidianyuedu com xff09 微点阅读 范文大全 免费学习网站 工作站电脑非常高配 xff0c 那么它和台式机有什么区别呢 下面由小编给你做出详细的工作站和台式机区别介绍 希望
  • 分布式锁-简单入门

    状态不是很好 xff0c 记一下以前学过的分布式锁吧 样例简介 不谈大概念 xff0c 就是简单入门以及使用 为什么要用分布式锁呢 xff1f 假设我需要一个定时操作 xff0c 每天在某个点 xff0c 我要处理一批数据 xff0c 要先
  • 深度神经网络的成功应用,深度神经网络发展历程

    深度学习与神经网络有什么区别 深度学习与神经网络关系2017 01 10最近开始学习深度学习 xff0c 基本上都是zouxy09博主的文章 xff0c 写的蛮好 xff0c 很全面 xff0c 也会根据自己的思路 xff0c 做下删减 x
  • Ubuntu22.04启用root账户 2208120941

    Ubuntu22 04启用root账户 2208120941 Ubuntu是有root账户的 只是没有密码 所以无法切换 所以启用的方法是 管理员账户用 sudo passwd root 给 root 设置密码 span class tok
  • WARNING: CLOCK SKEW DETECTED. YOUR BUILD MAY BE INCOMPLETE

    make时遇到这个问题几次了 xff0c 就记录一下吧 WARNING CLOCK SKEW DETECTED YOUR BUILD MAY BE INCOMPLETE 警告 xff1a 检测到时钟偏移 您的构建可能不完整 xff08 来自
  • ROS学习(五):构建系统

    ROS的构建系统默认使用CMake xff08 Cross Platform Make xff09 xff0c 其构建环境在功能 包目录中的CMakeLists txt文件中描述 在ROS中 xff0c CMake被修改为适合于ROS的 c

随机推荐