ROS话题的定义和使用

2023-05-16

ROS话题的定义和使用


自定义话题消息


自定义话题消息主要包括以下步骤:

  1. 定义msg文件
  2. 在package.xml中添加功能中依赖
  3. 在CMakeList.txt中添加编译规则
  4. 编译生成语言相关文件
  • 编写.msg文件
    进入要定义.msg文件的功能包文件夹,创建新的文件夹名为msg
	$ cd ~/catkin_ws/src/learning_topic
	$ mkdir msg
	$ cd msg
	$ touch Person.msg

在这里插入图片描述打开msg文件编辑

	string name
	uint8  age
	uint8  sex
	
	uint8 unknown = 0 //宏定义
	uint8 male    = 1 //宏定义
	uint8 female  = 2 //宏定义
  • 添加依赖
    打开功能包文件夹内的package.xml文件,添加如下语句
  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>
  • 编译规则
    打开CMakeList.txt
  1. 首先在find_package中添加 message_generation
    在这里插入图片描述2. 编译目标
    首先在CMakeList.txt 锁定到以下位置
	## Generate added messages and services with any dependencies listed here
	# generate_messages(
	#   DEPENDENCIES
	#   geometry_msgs#   std_msgs
	# )
	<-------就是这儿!!!!!
	################################################
	## Declare ROS dynamic reconfigure parameters ##
	################################################

添加

	add_message_files(FILES Person.msg)
	generate_message(DEPENDENCIES std_msgs)

add_message_files(FILES Person.msg) 是用来把Person.msg 作为定义的接口针对它进行编译
generate_message(DEPENDENCIES std_msgs) 编译上面的.msg文件的时候要依赖哪些ros已有的库和包,像上面的string和uint8 都是在std_msgs中定义的。

  1. 运行依赖
    首先在CMakeList.txt 锁定到以下位置
	###################################
	## catkin specific configuration ##
	###################################
	## The catkin_package macro generates cmake config files for your package
	## Declare things to be passed to dependent projects
	## INCLUDE_DIRS: uncomment this if your package contains header files
	## LIBRARIES: libraries you create in this project that dependent projects also need
	## CATKIN_DEPENDS: catkin_packages dependent projects also need
	## DEPENDS: system dependencies of this project that dependent projects also need
	catkin_package(
	#  INCLUDE_DIRS include
	#  LIBRARIES learning_topic
	#  CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim <--就是这儿!!!!!
	#  DEPENDS system_lib
)

删去当前行的#号,然后添加msg的运行依赖库message_runtime

	###################################
	## catkin specific configuration ##
	###################################
	## The catkin_package macro generates cmake config files for your package
	## Declare things to be passed to dependent projects
	## INCLUDE_DIRS: uncomment this if your package contains header files
	## LIBRARIES: libraries you create in this project that dependent projects also need
	## CATKIN_DEPENDS: catkin_packages dependent projects also need
	## DEPENDS: system dependencies of this project that dependent projects also need
	catkin_package(
	#  INCLUDE_DIRS include
	#  LIBRARIES learning_topic
	    CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim message_runtime
	#  DEPENDS system_lib
)

到目前为止,已经完成了msg定义的准备工作,接下来就是编译

  • 编译
    回到工作空间的根目录,打开终端
	$ catkin_make

成功后的指令反馈为
在这里插入图片描述编译成功之后生成的代码文件如下
workspace_name/devel/include/package_name/???.h
???.h 文件就是???.msg编译得到的cpp头文件。
在这里插入图片描述


调用自定义的话题消息


接下来定义两个文件,分别注册两个节点,由第二个节点订阅第一个节点的话题消息

  • 注册节点
  1. 注册发布者节点
    程序来自古月居ROS21讲
	
	/**	 * 该例程将发布/person_info话题,自定义消息类型learning_topic::Person*/
	 
	#include <ros/ros.h>
	#include "learning_topic/Person.h"
	
	int main(int argc, char **argv)
	{
	    // ROS节点初始化
	    ros::init(argc, argv, "person_publisher");
	
	    // 创建节点句柄
	    ros::NodeHandle n;
	
	    // 创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::Person,队列长度10
	    ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info", 10);
	
	    // 设置循环的频率
	    ros::Rate loop_rate(1);
	
	    int count = 0;
	    while (ros::ok())
	    {
	        // 初始化learning_topic::Person类型的消息
	    	learning_topic::Person person_msg;
			person_msg.name = "Tom";
			person_msg.age  = 18;
			person_msg.sex  = learning_topic::Person::male;
	
	        // 发布消息
			person_info_pub.publish(person_msg);
	
	       	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();
	    }
	
	    return 0;
	}
  1. 注册订阅者节点
    程序来自古月居ROS21讲
	/**
	 * 该例程将订阅/person_info话题,自定义消息类型learning_topic::Person
	 */
	 
	#include <ros/ros.h>
	#include "learning_topic/Person.h"
	
	// 接收到订阅的消息后,会进入消息回调函数
	void personInfoCallback(const learning_topic::Person::ConstPtr& msg)
	{
	    // 将接收到的消息打印出来
	    ROS_INFO("Subcribe Person Info: name:%s  age:%d  sex:%d", 
				 msg->name.c_str(), msg->age, msg->sex);
	}
	
	int main(int argc, char **argv)
	{
	    // 初始化ROS节点
	    ros::init(argc, argv, "person_subscriber");
	
	    // 创建节点句柄
	    ros::NodeHandle n;
	
	    // 创建一个Subscriber,订阅名为/person_info的topic,注册回调函数personInfoCallback
	    ros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback);
	
	    // 循环等待回调函数
	    ros::spin();
	
	    return 0;
	}
  1. 修改CMakeList.txt编译规则
	add_executable(person_publisher src/person_publisher.cpp)
	target_link_libraries(person_publisher ${catkin_LIBRARIES})
	add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)
	
	add_executable(person_subscriber src/person_subscriber.cpp)
	target_link_libraries(person_subscriber ${catkin_LIBRARIES})
	add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)

这里增加了一行add_dependencies,这是因为有些代码是动态生成的,所以需要我们的可执行文件和动态生成的一些程序建立依赖关系

  • 编译
    回到工作空间根目录执行编译指令

  • 设置环境变量

  • 检查环境变量

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

ROS话题的定义和使用 的相关文章

随机推荐

  • 将无符号的10进制的数转换为16进制,并打印输出

    将一个数转换成相应的进制 xff0c 一般是除这个数并取它的余数 若转换成16进制 xff0c 则除16取余 第一种方法是直接取余将得到的值存入数组中 相应代码如下 xff1a include lt stdio h gt include l
  • ROS指令集1(设置ROS_PACKAGE_PATH)

    ROS指令集 添加环境变量 局部环境变量 xff0c 添加后立即生效 xff0c 终端关闭后实效 span class token builtin class name echo span span class token environm
  • 字符串查找函数strstr

    函数结构 xff1a char strstr const char str1 const char str2 功能 xff1a 在字符串str1中查找是否存在str2字符串 返回值 xff1a 该函数返回str2在str1中首次出现的地址
  • 内存操作函数(memcpy,memmove,memset)

    前言 xff1a C 语言中对字符和字符串的处理很是频繁 xff0c 但是 C 语言本身是没有字符串类型的 xff0c 字符串通常放在 常量字符串 中或者字符数组 中 字符串常量 适用于那些对它不做修改的字符串函数 memcpy 函数 me
  • matlab关于GPU警告报错

    电脑配置 xff1a RTX3050 xff0c i5十二代 xff0c CUDA11 6 matlab2020a 报错信息 运行神经网络训练时 xff0c 显示警告信息 xff1a Warning The CUDA driver must
  • 错误使用 network/subsasgn>network_subsasgn net.b{2} must be a 2-by-1 matrix.解决方法

    使用生物算法优化bp时出现以下报错 1 错误使用 network subsasgn gt network subsasgn net b 2 must be a 2 by 1 matrix 2 出错 索引 第 14 行 net 61 netw
  • 网络基础(网络发展背景(IP地址,端口,协议,字节序))

    了解网络发展背景 对局域网 广域网的概念有基本认识 了解网络协议的意义 重点理解 TCP IP 五层结构模型 学习网络传输的基本流程 理解封装和分用 在 IP 数据包头部中 有两个 IP 地址 分别叫做源 IP 地址 和目的 IP 地址 端
  • 网络编程套接字

    能够实现一个简单的 udp 客户端 服务器 实现一个简单的 tcp 客户端 服务器 单连接版本 多进程版本 多线程版本 套接字编程 主要讲解的就是如何编写一个网络通信程序 1 网络通信的数据中都会包含一个完整的五元组 sipsportdip
  • 网络基础2

    网络基础2 应用层 amp 传输层典型协议 应用层 自定制协议 私有协议 xff0c HTTP协议 传输层 UDP amp TCP协议 应用层 负责应用程序之间的数据沟通 应用层协议其实是面向程序员的协议 xff0c 因为应用程序是程序员写
  • ubuntu服务器通过iso进行系统升级

    ubuntu服务器通过iso进行系统升级 1 添加iso文件源 xff1a sudo mount t iso9660 o loop ubuntu 18 04 6 live server amd64 iso media cdrom 挂在镜像文
  • ROS学习(1):gazebo保存加载世界

    roslaunch文件分析 xff08 古月居大神提供 xff0c 来源于ROS机器人开发实践视频 xff09 96 view mbot gazebo play ground launch lt launch gt lt 设置launch文
  • connect to host port 22: Connection refused

    Windows 使用SSH连接树莓派 xff1a 提示 xff1a 这里简述项目相关背景 xff1a 今天练习发现使用MobaXterm可以正常连接到树莓派 xff0c 但是使用windows终端就不可以连接 xff0c 显示connect
  • 8本游戏开发书籍推荐

    很多刚刚接触游戏开发的朋友经常问我 xff1a 如何开始学习游戏开发 xff1f 我从事游戏开发行业很多年了 xff0c 坦率地讲 xff0c 开发游戏充满挑战性 xff0c 需要开发人员具备大量的技能与积极的创新精神 希望这篇小文能帮助朋
  • windows通过SSH控制树莓派

    windows通过SSH控制树莓派 xff1a 因学习需要在windows系统下对树莓派进行SSH连接 xff0c 包括SSH密钥生成 密钥传输及公钥保存等 Windows下密钥的产生 在Windows下使用 ssh keygen生成公钥和
  • raspistill command not found

    raspistill command not found xff1a 提示 xff1a 这里简述项目相关背景 xff1a 今天使用树莓派来调用摄像头 xff0c 摄像头为树莓派官方摄像头 xff0c 在升级系统和配置后发现使用raspist
  • 树莓派I2C基本用法

    文章目录 一 I2C二 I2C配置1 I2C02 I2C13 I2C34 I2C45 I2C56 I2C6 三 I2C工具总结 一 I2C 树莓派默认打开I2C功能 xff0c 如果I2C没有打开 xff0c 可以使用命令sudo rasp
  • 树莓派RTC

    文章目录 一 RTC准备二 RTC芯片三 为什么使用hwclock显示找不到硬件总结 一 RTC准备 在使能树莓派RTC之前 xff0c 需要先为树莓派RTC模块安装电池 xff08 一般为纽扣电池 xff09 二 RTC芯片 树莓派4B使
  • 树莓派debian11更换国内源

    更换国内源 修改文件 etc apt sources list deb https mirrors tuna tsinghua edu cn debian bullseye main contrib non free span class
  • cpptools占用率过高

    问题描述 使用vscode发现在系统中cpptools CPU占用率达到百分百 电脑发生严重卡顿 解决方案 xff1a 此问题的出现是因为使用了C C 43 43 这个插件 xff0c 如果直接禁用此插件就可以解决这个问题 如果希望使用这个
  • ROS话题的定义和使用

    ROS话题的定义和使用 自定义话题消息 自定义话题消息主要包括以下步骤 xff1a 定义msg文件在package xml中添加功能中依赖在CMakeList txt中添加编译规则编译生成语言相关文件 编写 msg文件 进入要定义 msg文