#创建自定义topic

2023-05-16

#创建自定义topic

前面我们学了用C++和Python创建发布者与订阅者,这次我们创建自定义的话题,其实同C++实现topic差不多,都是编写.cpp文件。步骤有点多且繁琐,务必耐心跟上。

1、创建topic工作包

第一步仍然是在工作空间里的src文件夹下新建工作包,同样,没有工作空间则新建。

新建工作空间的方法:
在这里插入图片描述
有工作空间的跳过上图那步,直接进入src文件夹

lzw08@ubuntu:~$ cd ros_ws/src
lzw08@ubuntu:~/ros_ws/src$ catkin_create_pkg custom_message roscpp rospy std_msgs

在这里插入图片描述
这次我们创建的工作包的包名是“custom_message”,旁边的topic和turtle是我之前创建的另外两个工作包。同样,我们这次创建的工作包的依赖依旧是roscpp、rospy、std_msgs。

2、进入工作包创建msg文件

首先创建msg文件夹,用来存放我们自定义消息的相关代码:

lzw08@ubuntu:~/ros_ws/src$ cd custom_message/
lzw08@ubuntu:~/ros_ws/src/custom_message$ mkdir msg

然后在msg文件夹中创建.msg文件

lzw08@ubuntu:~/ros_ws/src/custom_message$ cd msg 
lzw08@ubuntu:~/ros_ws/src/custom_message/msg$ touch custom.msg
lzw08@ubuntu:~/ros_ws/src/custom_message/msg$ gedit custom.msg 

gedit是打开文件的命令,将下列代码粘贴到.msg文件中:

string name 
int32 age 
int32 num 
bool handsome 
float32 Price

粘贴之后字体颜色无变化,保存然后关闭即可。

3、回到上级目录,第一次修改编译规则

lzw08@ubuntu:~/ros_ws/src/custom_message/msg$ cd ..
lzw08@ubuntu:~/ros_ws/src/custom_message$ gedit CMakeLists.txt

右下角把“显示行号”打开,具体修改见下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
具体我改了 第5行、第14行、第51~55行(除了54)、第109行。
改完之后保存然后关闭即可。

4、回到工作空间第一次编译

这次编译目的是产生.h文件,最好是打开工作空间看着.h文件生成,体会这个过程。在工作空间里面的devel文件夹里面,原来是没有“include”这个文件夹的,编译完就会出现,然后一直点进去,会发现生成了一个.h文件,我们仅需观察“include”文件夹的生成,然后进去查看.h文件是否有生成即可。

lzw08@ubuntu:~/ros_ws/src/custom_message$ cd ../..
lzw08@ubuntu:~/ros_ws$ catkin_make

在这里插入图片描述
在这里插入图片描述

5、编写话题的发布者与订阅者

进入工作包里面的src(注意不是工作空间那个),创建.cpp文件

1)创建pcustom.cpp并粘贴代码

lzw08@ubuntu:~/ros_ws$ cd src/custom_message/src
lzw08@ubuntu:~/ros_ws/src/custom_message/src$ touch pcustom.cpp
lzw08@ubuntu:~/ros_ws/src/custom_message/src$ gedit pcustom.cpp
#include <custom_message/custom.h> 
#include <iostream> 
#include <ros/ros.h> 
#include <std_msgs/Int32.h> 

int main(int argc, char **argv) 
{ 
	ros::init(argc, argv,"pcustom"); 

	ros::NodeHandle n; 

	ros::Publisher topic_publisher=n.advertise<custom_message::custom> ("topic_msg",1000);

	ros::Rate loop_rate(1); 
	setlocale(LC_ALL,"");
	int count=0; 
	while(ros::ok())
	{ 
		custom_message::custom msg; 
		msg.name="XQ"; 
		msg.age=10; 
		msg.num=count;
		msg.handsome=true; 
		msg.Price=1123.05+count; 

		ROS_INFO("发布⾃定义消息 name:%s,age:%d,num:%d,ishandsome:%d,Price:%f",msg.name.c_str(), msg.age, msg.num, msg.handsome,msg.Price); 

		topic_publisher.publish(msg); 
		ros::spinOnce();
		loop_rate.sleep(); 
		++count;
	}
	return 0;
}

粘贴完成后保存关闭

2)创建scustom.cpp并粘贴代码

lzw08@ubuntu:~/ros_ws/src/custom_message/src$ touch scustom.cpp
lzw08@ubuntu:~/ros_ws/src/custom_message/src$ gedit scustom.cpp
#include <custom_message/custom.h> 
#include <iostream>
#include <ros/ros.h>
#include <std_msgs/Int32.h> 

void number_callback(const custom_message::custom::ConstPtr& msg) 
{
	ROS_INFO("接收⾃定义消息 name:%s,age:%d,num:%d,ishandsome:%d,Price:%f",msg->name.c_str(), msg->age, msg->num, msg->handsome,msg->Price); 
}

int main(int argc, char **argv)
{
	ros::init(argc,argv,"scustom");
	ros::NodeHandle n;
	setlocale(LC_ALL,"");
	ros::Subscriber talk_subscribe=n.subscribe("topic_msg",10, number_callback);
	ros::spin();
	return 0;
}

粘贴完成后保存关闭

6、回到上级目录第二次修改编译规则

lzw08@ubuntu:~/ros_ws/src/custom_message/src$ cd ..
lzw08@ubuntu:~/ros_ws/src/custom_message$ gedit CMakeLists.txt

在这里插入图片描述
在这里插入图片描述
同样地,因为有两个.cpp文件,所以就有两个add_executable和两个target_link_libraries。打开行号跟着改就行了。

7、回到工作空间第二次编译

lzw08@ubuntu:~/ros_ws/src/custom_message$ cd ../..
lzw08@ubuntu:~/ros_ws$ catkin_make

编译完成后进度条显示100%,没有错误就可以运行了。

8、运行

同理,运行C++节点前要先把主节点运行起来(主节点都需要打开一个新终端让它单独运行)
在这里插入图片描述
运行pcustom.cpp,运行前需要先进行环境配置

lzw08@ubuntu:~/ros_ws source devel/setup.bash
lzw08@ubuntu:~/ros_ws$ rosrun custom_message pcustom 

在这里插入图片描述
打开另外一个新的终端进入工作空间,进行环境配置后运行scustom.cpp

lzw08@ubuntu:~$ cd ros_ws
lzw08@ubuntu:~/ros_ws$ source devel/setup.bash
lzw08@ubuntu:~/ros_ws$ rosrun custom_message scustom 

在这里插入图片描述

9、相关说明

到此,今天的工作就算是做完了,需要说明的是,如果有些同学想张扬个性,建一个他自己喜欢的工作包名,然后按照我这篇文章操作,不可避免的应该会出现一些错误。就是.msg文件的名字决定了生成的.h文件的名字,而.cpp文件的头文件中又包含了工作包名和.h文件名,如果你想修改的话,就得一视同仁的全部改了,编译提示没有错误,那也行~
还有,pcustom.cpp里面的name和age等变量是可以修改(如果你想的话),修改完回到工作空间下再编译一次,没问题就行。

10、下课下课 ~

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

#创建自定义topic 的相关文章

  • Linux环境下的c语言编程

    vim编辑器编辑hello c vim编辑器中输入相应代码 编译 运行代码 运行结果 使用GDB函数调用 编译生成可执行文件 启动gdb 第十行设置断点并运行 gcc过程改为makefile管理 编写makefile文件 启动makefil
  • ubuntu下关于ssh远程和scp远程复制文件以及nfs搭建

    SSH远程 在Linux系统中 xff0c 通过客户端连接到远程服务器中 xff0c 方便代码地编写运行 xff0c ssh是一种安全协议 xff0c 主要用于给远程登录信息数据进行加密 1 安装ssh 2 启动ssh 3 创建要发送的文件
  • Linux环境下的多线程&多进程编程

    1 线程的创建与终止 创建一个 c文件 xff0c 使用vi编辑器进行多线程的创建 编译文件 在编译文件时会出现对 pthread create 未定义的引用 xff0c 这是由于pthread 库不是Linux系统默认的库 xff0c 连
  • 东北天坐标系转载体坐标系

    文章目录 1 基本概念1 1欧拉角1 2左乘右乘1 3东北天坐标系1 4载体坐标系1 5捷联惯性导航系统 2 通过ECEF转换到参考点附近的ENU坐标系上3 东北天坐标系到载体坐标系 1 基本概念 1 1欧拉角 欧拉旋转定理指出 xff1a
  • I2C驱动App

    1 查看eeprog c源代码 copyright C by 2009 Guangzhou FriendlyaRM in China email capbily 64 163 com website arm9 net include lt
  • Qt5.14.2 编程应用

    Qt5 14 2 编程应用 什么是Qt Qt 是一个跨平台的 C 43 43 图形用户界面库 xff0c 由挪威 TrollTech 公司于 1995 年底出品 xff0c 并于 2008年6月17日被NOKIA公司收购 xff0c 以增强
  • L298N电机驱动的使用

    L298N电机驱动的使用 前言一 介绍L298N模块简介接口介绍 二 使用步骤硬件连接软件部分1 声明部分2 代码部分 总结 前言 博主为某大学电气专业大学生 xff0c 以学习为目的写下该文 xff0c 内容主要为以51单片机为例简单介绍
  • Authorization头的作用

    Authorization头的主要用作http协议的认证 Authorization的作用是当客户端访问受口令保护时 xff0c 服务器端会发送401状态码和WWW Authenticate响应头 xff0c 要求客户机使用Authoriz
  • vscode中常用的快捷键

    分享一些本人在学习前端过程中用到的一些快捷键 xff0c 需要强调的是 xff0c 这些快捷键适用的软件是VScode 因为自己初学前端用的是这个软件 其中有一些在idea中也是适用的 xff0c 已经在括号内标注 1 alt 43 W 将
  • PID算法原理及基本实现

    自动控制中 xff0c PID及其衍生出来的算法是应用最广的算法之一 各个做自动控制的厂家基本都有会实现这一经典算法 我们在做项目的过程中 xff0c 也时常会遇到类似的需求 xff0c 所以就想实现这一算法以适用于更多的应用场景 1 PI
  • Spring Boot基础学习之(六):前后端交互实现用户登录界面

    本次项目所有能够使用的静态资源可以免费进行下载 静态资源 本篇博客写的内容 xff0c 是一个系列 xff0c 内容都是关于spring boot架构的学习 xff0c 实现前后端交互 xff0c 极大的解放双手spring boot学习系
  • USMART调试组件

    什么是USMART USMART是正点原子团队为其STM32开发平台开发的一种类似linux的shell的调试工具 具体工作过程是通过串口发送命令给单片机 然后单片机收到命令之后调用单片机里面对应的相关函数 并执行 同时支持返回结果 USM
  • 内部温度传感器

    STM32有一个内部的温度传感器 可以用来测量CPU及周围的温度 TA 该温度传感器在内部和ADCX IN16输入通道相连接 此通道把传感器输出的电压转换成数字值 温度传感器模拟输入推荐采样时间是17 1us STM32的内部温度传感器支持
  • 光敏传感器

    光敏传感器是利用光敏元件将光信号转换为电信号的传感器 它的敏感波长在可见光波长附近 包括红外线波长和紫外线波长 光传感器不只局限于对光的探测 它还可以作为探测元件组成其他传感器 对许多非电量进行检测 只要将这些非电量转换为光信号的变化即可
  • 网络基础应用层--HTTP协议

    网络基础应用层 HTTP协议 一 应用层协议 xff08 一 xff09 应用层协议概念 xff08 二 xff09 自定义协议概念 xff08 三 xff09 数据格式如何定义最优 xff08 四 xff09 结构体的二进制序列化 二 H
  • SPI接口原理与配置

    SPI接口简介 SPI是英语Serial Peripheral interface的缩写 顾名思义就是串行外围设备接口 是Motorola首先在其MC68HCXX系列处理器上定义的 SPI是一种高速的 全双工 同步的通信总线 并且在芯片的管
  • DHT11温湿度传感器实验

    DHT11 是一款湿温度一体化的数字传感器 该传感器包括一个电阻式测湿元件和一个 NTC 测温元件 xff0c 并与一个高性能 8 位单片机相连接 通过单片机等微处理器简单的电路连接就能够 实时的采集本地湿度和温度 DHT11 与单片机之间
  • 串口通讯的配置

    串口以及中断的配置 xff1a if EN USART1 RX 如果使能了接收 串口1中断服务程序 注意 读取USARTx gt SR能避免莫名其妙的错误 u8 USART RX BUF USART REC LEN 接收缓冲 最大USART
  • 485代码分析

    rs485 h ifndef RS485 H define RS485 H include 34 sys h 34 extern u8 RS485 RX BUF 64 接收缓冲 最大64个字节 extern u8 RS485 RX CNT
  • 【数据结构】手把手教你利用栈实现二进制转换成十进制(C语言)

    1 第一步创建一个栈 span class token macro property span class token directive keyword include span span class token string lt st

随机推荐