当前位置: 首页 > news >正文

【自动驾驶】自定义消息格式的话题通信(C++版本)

目录

  • 新建消息文件
  • 更改包xml文件中的依赖关系
  • 更改cmakelist文件中的配置
  • 执行时依赖
  • 改变cmakelist
  • 编译顺序
  • 发布者程序
  • 调用者程序
  • 新建launch文件
  • 程序测试

新建消息文件

在功能包目录下,新建msg文件夹,下面新建mymsg.msg文件,其内容为

string name
float64 value

发布者包含该消息,生成头文件,由发布者publisher包含该消息头文件即可

更改包xml文件中的依赖关系

  <build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend><!-- exce_depend 以前对应的是 run_depend 现在非法-->

更改cmakelist文件中的配置

新增了message_generation

find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)

配置 msg 源文件

add_message_files(FILESmymsg.msg
)

执行时依赖

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES demo02_talker_listenerCATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

改变cmakelist

新生成的.h文件位于devel/include文件夹下,在订阅及发布方的cmakelist中添加:

include_directories(
# include${catkin_INCLUDE_DIRS}"/root/work/ws/devel/include/"
)

这样工程才能找到生成的消息文件

编译顺序

编译时先编译带有自定义消息mymsg.msg的功能包,再编译整体的功能,其顺序不能出错,不然可能生成不了头文件

catkin_make --pkg publisher
catkin_make

发布者程序

// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h" //普通文本类型的消息
#include <sstream>
#include "publisher/mymsg.h"
int main(int argc, char  *argv[])
{   //设置编码setlocale(LC_ALL,"");//2.初始化 ROS 节点:命名(唯一)// 参数1和参数2 后期为节点传值会使用// 参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一ros::init(argc,argv,"talker");//3.实例化 ROS 句柄ros::NodeHandle nh;//该类封装了 ROS 中的一些常用功能//4.实例化 发布者 对象//泛型: 发布的消息类型//参数1: 要发布到的话题//参数2: 队列中最大保存的消息数,超出此阀值时,先进的先销毁(时间早的先销毁)ros::Publisher pub = nh.advertise<publisher::mymsg>("test",10);int count = 0; //消息计数器ros::Duration(0.5).sleep();//这里是每秒通过一次,剩余时间则阻塞在下面的r.sleepros::Rate r(1);//节点不死while (ros::ok()){//使用 stringstream 拼接字符串与编号publisher::mymsg msg;msg.name="liu";msg.value=count;//发布消息pub.publish(msg);//加入调试,打印发送的消息// ROS_INFO("发送的消息:%s",msg.data.c_str());//根据前面制定的发送贫频率自动休眠 休眠时间 = 1/频率;r.sleep();count++;//循环结束前,让 count 自增//暂无应用ros::spinOnce();}return 0;
}

调用者程序


// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "publisher/mymsg.h"
//这里创建了回调函数,接收信息后传递的是std_msgs::String类型的常指针
void doMsg(const publisher::mymsg::ConstPtr& msg_p){ROS_INFO("订阅信息:%s,%.2f", msg_p->name.c_str(), msg_p->value);
}int main(int argc, char  *argv[])
{setlocale(LC_ALL,"");//2.初始化 ROS 节点:命名(唯一)ros::init(argc,argv,"listener");//3.实例化 ROS 句柄ros::NodeHandle nh;//4.实例化 订阅者 对象ros::Subscriber sub = nh.subscribe<publisher::mymsg>("test",10,doMsg);//5.处理订阅的消息(回调函数)ros::spin();//循环读取接收的数据,并调用回调函数处理return 0;
}

新建launch文件

两个包文件夹下新建launch目录,下有launch文件,以subscriber包为例

<launch><!-- screen表示输出到屏幕上 --><node pkg="subscriber" type="subscriber_node" name="listener" output="screen" />
</launch>

默认生成的cmakelist,节点可执行程序名为包名__node

程序测试

source ./devel/setup.bash
roslaunch subscriber start.launch
roslaunch publisher start.launch

在这里插入图片描述

相关文章:

【自动驾驶】自定义消息格式的话题通信(C++版本)

目录 新建消息文件更改包xml文件中的依赖关系更改cmakelist文件中的配置执行时依赖改变cmakelist编译顺序发布者程序调用者程序新建launch文件程序测试 新建消息文件 在功能包目录下&#xff0c;新建msg文件夹&#xff0c;下面新建mymsg.msg文件&#xff0c;其内容为 string …...

提升前端性能的JavaScript技巧

1. 前端JavaScript性能问题 前端JavaScript的性能问题可以显著影响Web应用的用户体验和整体性能。以下是一些常见的前端JavaScript性能问题: 1.1. 频繁的DOM操作 问题描述:JavaScript经常需要与DOM(文档对象模型)交互来更新页面内容。然而,每次DOM操作都可能触发浏览器的…...

“服务之巅:Spring Cloud中SLA监控与管理的艺术“

标题&#xff1a;“服务之巅&#xff1a;Spring Cloud中SLA监控与管理的艺术” 在微服务架构中&#xff0c;服务调用的可靠性和性能是至关重要的。服务级别协议&#xff08;Service Level Agreement&#xff0c;简称SLA&#xff09;是衡量服务性能的关键指标&#xff0c;它定义…...

ChatGPT角色定位提问提示词和指令完整版

角色定位提问 在与ChatGPT的对话中&#xff0c;角色定位提问是一种有效的策略&#xff0c;通过为ChatGPT和自己设定特定的角色或身份&#xff0c;可以引导对话朝着更加具体、有针对性的方向发展。这种提问方式不仅有助于ChatGPT更好地理解问题的背景和需求&#xff0c;还能使回…...

docker之我不会的命令

docker命令之我不会的 保存镜像&#xff08;打包&#xff09; docker save 镜像名或镜像id -o 保存路径和镜像名字例子&#xff1a; docker save tomcat -o /home/my_tomcat.tar加载保存的镜像 docker load -i 镜像保存的位置例子 在/home/路径下 docker load -i my_tomca…...

Together规则引擎 金融解决方案

目录 1.金融法规和期望正在发生变化,快速跟踪您的金融数字化变革&#xff01;2.抵押贷款功能集&#xff08;MFS&#xff09;3.MFS 示例模型4.MFS 知识特点5.MFS特定功能 1.金融法规和期望正在发生变化,快速跟踪您的金融数字化变革&#xff01; ogether规则引擎使金融机构能够简…...

【PyQt5】PyQt5 主要类

1.经常使用的模块 Sr.No.模块描述1QtCore其他模块使用的核心非GUI类2QtGui图形用户界面组件3QtMultimedia低级多媒体编程的类4QtNetwork网络编程的类5QtOpenGLOpenGL支持类6QtScript用于评估Qt脚本的类7QtSql使用SQL进行数据库集成的类8QtSvg用于显示SVG文件内容的类9QtWebKit…...

渗透测试实战-HFS远程RCE漏洞利用

免责声明&#xff1a;文章来源于真实渗透测试&#xff0c;已获得授权&#xff0c;且关键信息已经打码处理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本…...

企业级管理系统模板 -- 若依

文章目录 前言一、若依模板运行效果二、若依模板下载地址 1、版本说明2、前端下载地址3、后端下载地址三、修改模板代码名称四、修改前端标题及logo总结 前言 在我们学习别人的项目时&#xff0c;总会遇到许多不同的管理系统&#xff0c;例如&#xff1a;学生管理系统&#xf…...

无人车搭载无人机技术详解

无人车搭载无人机技术&#xff0c;是近年来智能交通与无人机技术深度融合的产物&#xff0c;旨在通过集成两者的优势&#xff0c;实现更加灵活、高效的作业能力。该技术将无人机作为无人车的一个可移动、多功能的传感器平台或执行器&#xff0c;通过协同工作&#xff0c;扩展无…...

从“抠图”到“抠视频”,Meta上新AI工具SAM 2。

继2023年4月首次推出SAM&#xff0c;实现对图像的精准分割后&#xff0c;Meta于北京时间2024年7月30日推出了能够分割视频的新模型SAM 2&#xff08;Segment Anything Model 2&#xff09;。SAM 2将图像分割和视频分割功能整合到一个模型中。所谓“分割”&#xff0c;是指区别视…...

一篇讲清楚什么是密码加密和加盐算法 | 附Java代码实现

目录 前言&#xff1a; 一、密码加密 1. MD5介绍 2.彩虹表攻击 3.测试复杂密码是否能被攻破 二、加盐算法 1.对密码123456演示加盐算法 2.盐值的储存 3.密码加盐思想总结 三、Java代码实现 前言&#xff1a; 早些年&#xff0c;数据泄露屡见不鲜&#xff0c;每个班上总…...

C++入门2

函数重载 函数重载&#xff1a;是函数的一种特殊情况&#xff0c;C允许在同一作用域中声明几个功能类似的同名函数&#xff0c;这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同&#xff0c;常用来处理实现功能类似数据类型 不同的问题 比如下面的 int add(int x…...

在Nestjs使用mysql和typeorm

1. 创建项目 nest new nest-mysql-test 2. 添加config 安装 nestjs/config 包 pnpm i --save nestjs/config 添加 .env 文件 DATABASE_HOSTlocalhost DATABASE_PORT3306 DATABASE_USERNAMEroot DATABASE_PASSWORD123456 DATABASE_DBdbtest 创建 config/database.config.…...

【数据库】MySql深度分页SQL查询优化

问题描述 mysql中&#xff0c;使用limitoffset实现分页难免会遇到深度分页问题&#xff0c;即页码数越大&#xff0c;性能越差。 select * from student order by id limit 200000,10;如上语句&#xff0c;其实我们希望查询第20000页的10条数据&#xff0c;实际执行会发现耗时…...

黑马Java零基础视频教程精华部分_14_正则表达式

系列文章目录 文章目录 系列文章目录一、先爽一下正则表达式不使用正则的情况下使用正则的情况下 二、正则表达式的作用三、正则表达式具体表达1、规则2、字符类示例3、预定义字符示例首先学习转义字符 示例练习 四、基本练习1、快捷方法&#xff1a;2、验证手机号3、验证座机电…...

20240812 每日AI必读资讯

黑匣子被打开了&#xff01;能玩的Transformer可视化解释工具&#xff1a;Transformer Explainer - 佐治亚理工学院和 IBM 研究院开发一款基于 web 的开源交互式可视化工具「Transformer Explainer」&#xff0c;帮助非专业人士了解 Transformer 的高级模型结构和低级数学运算…...

C++ 项目中的类框架

/* * 类调用框架 */ /* CameraApp.h */ class CameraApp { public: CameraApp(); ~CameraApp(); int Init(void); int UnInit(void); public: XnetNode m_xnode_thd; XcamServer m_xcam_thd; }; /* CameraApp.cpp */ CameraApp::CameraApp(): m_…...

【Python随笔】比PyQt5更先进的pyside6安装和使用方法

最近因为自研日常开发工具的需求&#xff0c;决定重新拾起PyQt5之类的桌面工具开发技术栈&#xff0c;为啥选用PyQt&#xff0c;一是因为笔者比较精通python&#xff0c;二是因为不需要在外观上做什么特别的东西。经过一番调研&#xff0c;发现当前的PyQt5版本已经过时&#xf…...

如何给 VMware Workstation 虚拟机配置代理

文章目录 步骤一&#xff1a;检查虚拟机网络设置步骤二&#xff1a;获取代理服务器 IP 地址步骤三&#xff1a;配置虚拟机的代理设置步骤四&#xff1a;验证代理配置总结 在使用 VMware Workstation 虚拟机时&#xff0c;有时候我们需要通过代理服务器访问外部网络资源。本文将…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...