ROS使用自定义的msg发送topic

2023-05-16

1 新建工作空间

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

2 新建功能包

cd ~/catkin_ws/src
# catkin_create_pkg 功能包名 [依赖功能包1] [依赖功能包2]...
catkin_create_pkg msgtest std_msgs roscpp

3 新建msg文件

cd ~/catkin_ws/src/msgtest/
mkdir msg
cd msg/
vim msg1.msg

在msg1.msg中写入以下内容:

int32 num
string str

4 新建发布文件pub.cpp

cd ~/catkin_ws/src/msgtest/src
vim pub.cpp

写入以下内容:

#include "ros/ros.h"
// msgtest是功能包名,msg1是msg文件名,编译成功后会在devel/include自动生成一个头文件
#include "msgtest/msg1.h"

int main(int argc, char **argv)
{
	ros::init(argc, argv, "msgpub");  // msgpub为节点的名字

	// 创建一个句柄
  	ros::NodeHandle n;

	 // 新建一个pub对象,<>中是自定义的msg文件,pub_msg为topic的名字
  	ros::Publisher msg_pub = n.advertise<msgtest::msg1>("mymsg", 1000);
	
	// 发送频率
  	ros::Rate loop_rate(10);
  	while (ros::ok())
  	{
		// 自定义的msg类的一个新变量,并赋值
    	msgtest::msg1 msg;
    	msg.num = 1024;
		msg.str = "hello slam";
		
		// 发送msg
    	msg_pub.publish(msg);
		//ROS的printf
    	ROS_INFO("Publish : number = %d string = %s", msg.num, msg.str.c_str());
		//循环刷新
    	ros::spinOnce();

    	loop_rate.sleep();
  }
  return 0;
}

5 新建订阅文件sub.cpp

cd ~/catkin_ws/src/msgtest/src
vim sub.cpp

写入以下内容:

#include "ros/ros.h"
#include "msgtest/msg1.h"

// 回调函数
void chatterCallback(const msgtest::msg1::ConstPtr& msg)
{
 	ROS_INFO("I heard: [num = %d, string = %s]", msg->num, msg->str.c_str());
}

int main(int argc, char **argv)
{
 	ros::init(argc, argv, "msgsub");
 	ros::NodeHandle n;

	//新建一个sub,chatterCallback是回调函数名
 	ros::Subscriber sub = n.subscribe("mymsg", 1000, chatterCallback);

 	ros::spin();
 	return 0;
}

6 修改配置文件

CMakelists.txt

cd ~/catkin_ws/src/msgtest/
vim CMakeLists.txt

在文件中第13行处添加上message_generation:

find_package(catkin REQUIRED COMPONENTS
  std_msgs
	roscpp
  message_generation
)

将50行处注释取消掉, 并且按照下面代码修改:

 add_message_files(
   FILES
   msg1.msg
 )

将70行处注释取消掉,如下:

generate_messages(
   DEPENDENCIES
   std_msgs  
 )

在文件最后添加如下代码:

# msgpub是自定义节点名,pub.cpp是文件名
add_executable(msgpub src/pub.cpp)
# msgpub是节点名
target_link_libraries(msgpub ${catkin_LIBRARIES})
# msgsub是自定义节点名,sub.cpp是文件名
add_executable(msgsub src/sub.cpp)
# msgsub是节点名
target_link_libraries(msgsub ${catkin_LIBRARIES})

package.xml

cd ~/catkin_ws/src/msgtest/
vim package.xml

在58行之后加入:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

7 编译并运行

cd ~/catkin_ws/
catkin_make
roscore

新建一个终端:

source ~/catkin_ws/devel/setup.bash
rosrun msgtest msgpub

再新建一个终端:

source ~/catkin_ws/devel/setup.bash
rosrun msgtest msgsub

大功告成:
在这里插入图片描述

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

ROS使用自定义的msg发送topic 的相关文章

  • linux把进程或线程绑定到特定cpu核上

    绑定进程到cpu核上运行 查看cpu有几个核 使用cat proc cpuinfo 查看cpu信息 xff0c 如下两个信息 xff1a processor xff0c 指明第几个cpu处理器cpu cores xff0c 指明每个处理器的

随机推荐

  • Suse重启samba指令

    重启前先查看后台进程 linux jzp3 home w210412 ps aux grep smbd root 4400 0 0 1 2 308428 22372 Ss 18 23 0 00 usr sbin smbd D F root
  • uIP和LwIP背后的那个牛逼男人

    在公众号给大家介绍过Uip和LwIP xff0c 如果使用过这两种TCP IP协议栈 xff0c 那么你一定会熟悉一个人Adam Dunkels亚当 邓克尔 瑞典计算机科学院的教授 xff0c 这两种开源的协议栈都出自他手 xff0c 现在
  • 一张表看懂uIP和lwIP的区别

    我们给大家介绍过目前比较流行的开源TCP IP开源协议栈uIP和lwIP 这两种都是由瑞典计算机科学研究院开发的 xff0c 广泛应用于嵌入式系统中 因为全功能的TCP IP协议是很庞大的 xff0c 在资源紧张的嵌入式上是很难实现的 xf
  • 小猿助你freeRTOS驱动开发

    主要介绍在移植好的基于NXP之kinetis K64 43 freeRTOS平台上添加Modbus驱动 对freeRTOS不懂或者移植不懂的可以看看之前公众号的文章 准备工作 xff1a 1 xff0c 基于之前移植好的K64 43 fre
  • 告诉过你PID很重要,你不听

    曾经在公众号 xff0c 多次提到在控制系统中经常用到的PID控制 xff0c 也在培训中讲过PID的应用和在软件中的实现以及调试 xff0c 但是现实中还是有很多工程师对PID很陌生 xff0c 如果你是搞电力电子 xff0c 电力变换
  • Windows 使用 VNC 远程连接 Ubuntu 桌面版

    前言 工作需要使用 Windows 远程桌面版的 Ubuntu xff0c 原来使用的 TeamViewer 现在经常被检测为商业用途 xff0c 就很麻烦 因此 xff0c 现在转战使用 VNC 进行远程 使用步骤参考地址 xff1a 法
  • IP第十天笔记 - - - BGP

    BGP 边界网关协议 AS 自治系统 由单一机构或组织管理的一系列IP网络及其设备的集合 1 网络范围太大 xff0c 协议跑不过来 xff0c 需要进行划分 xff1b 2 自治管理 为了方便区分和标定不同的AS xff0c 我们给每一个
  • Makefile(1)

    1 前言 有幸拜读了http blog csdn net haoel article details 2888 http www cnblogs com Anker p 3242207 html http www groad net bbs
  • 解决vnc客户端不能拷贝粘贴

    在vnc窗口里输入如下命令 vncconfig nowin amp 在一个node的vnc里发现vncconfig nowin amp 不工作 xff0c 但是vncconfig amp 工作 https blog csdn net qq
  • shell的等号两边不能有空格

    shell的等号在赋值的时候两边不能有空格 xff0c 在比较的时候两边必须有空格
  • uCOS上下文切换,PendSV中断函数

    摘自 xff1a http www stmcu org module forum thread 384142 1 1 html 介绍一 xff1a 移植详解1和2中主要讲了移植需要用到的基础知识 xff0c 本文则对具体的移植过程进行介绍
  • Eigen稀疏线性求解

    在 Eigen 中 xff0c 当系数矩阵稀疏时 xff0c 有多种方法可用于求解线性系统 由于此类矩阵的特殊表示 xff0c 应特别注意以获得良好的性能 有关 Eigen 中稀疏矩阵的详细介绍 xff0c 请参阅稀疏矩阵操作 此页面列出了
  • Eigen关于稀疏矩阵

    处理和解决稀疏问题涉及各种模块 xff0c 总结如下 xff1a 模块 头文件 内容 SparseCore include lt Eigen SparseCore gt SparseMatrix 和 SparseVector 类 矩阵组装
  • Eigen构造稀疏矩阵

    Eigen构造稀疏矩阵 xff0c 这里我们对稀疏矩阵采用三元组的存储方式 xff0c 即用 i j value i j 这样的组合把非零元的位置和值表示出来 废话不多说 xff0c 我们直接上例子 include 34 iostream
  • cmake CMakeLists.txt 命令 add_compile_options、add_definitions、target_compile_definitions、build_command

    add compile options 增加源文件的编译选项 add compile options lt option gt 为当前路径和下层路径的目标增加编译器命令行选项 xff0c 选项在此命令被调用后添加 查看文档中关于路径和目标的
  • linux curl编译 arm交叉编译

    虚拟机环境 ubuntu12 04 开发板 EasyARM i MX280A xff1a 64m sdram 128M nandflash 运行官方提供的Linux 2 6 35 3内核linux 首先 xff0c 如果需要使用curl解析
  • c++中 双冒号作用

    1 作用域符号 的前面一般是类名称 xff0c 后面一般是该类的成员名称 xff0c C 43 43 为例避免不同的类有名称相同的成员而采用作用域的方式进行区分 如 xff1a A B表示两个类 xff0c 在A B中都有成员member
  • 解决:CUDA安装程序不成功

    解决 xff1a CUDA安装程序不成功 报错如下分析原因解决方法 报错如下 分析原因 由于电脑里的原版本是11 2 xff0c 可能降到11 0会出现错误 xff0c 因此安装不成功 xff01 解决方法 在 Driver compone
  • linux shell awk BEGIN END 处理文本之前之后执行操作 简介

    目录 简介 1 最简单的action 既没有pattern 有没有options 2 awk是逐行处理 2 1 输出整行 2 2 输出最后一列 2 3 输出倒数第二列 3 pattern 3 1 begin 简单语法 3 2 不添加输入文件
  • ROS使用自定义的msg发送topic

    1 新建工作空间 span class token function mkdir span p catkin ws src span class token function cd span catkin ws catkin make 2