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

news2024/11/16 3:01:06

目录

  • 新建消息文件
  • 更改包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 COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

配置 msg 源文件

add_message_files(
  FILES
  mymsg.msg
)

执行时依赖

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES demo02_talker_listener
  CATKIN_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.sleep
    ros::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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2043103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机械行业数字化生产供应链产品解决方案(十六)

我们的机械行业数字化生产供应链产品解决方案通过全面应用物联网、人工智能和大数据技术&#xff0c;构建了一个高效的智能生产与供应链系统&#xff0c;能够在设计、生产和物流全环节中实现实时数据监控与动态优化。系统通过智能分析和预测&#xff0c;优化了生产计划和资源配…

Linux系统驱动(十九)块设备驱动

文章目录 一、块设备驱动简介&#xff08;一&#xff09;简介&#xff08;二&#xff09;块设备驱动相关概念 二、块设备驱动&#xff08;一&#xff09;框架图1. 虚拟文件系统&#xff08;VFS&#xff09;2. Disk Cache&#xff1a;硬盘的高速缓存3. 映射层&#xff08;mappin…

IP代理如何增强网络安全性?

在当今的数字时代&#xff0c;网络安全已成为一个关键问题&#xff0c;而使用 IP 代理可以成为增强网络安全的有效方法。根据请求信息的安全性&#xff0c;IP 代理服务器可分为三类&#xff1a;高级匿名代理、普通匿名代理和透明代理。此外&#xff0c;根据使用的用途&#xff…

NT35510的LCD函数详解01(洋桃电子-触摸屏开发者笔记)

NT35510的LCD函数详解01&#xff08;洋桃电子-触摸屏开发者笔记&#xff09; 资料下载&#xff1a; 洋桃电子 YoungTalk 探索最好的 STM32 教学 (doyoung.net) 接口类型 NT35510 数据手册&#xff08;英文&#xff09;.pdf NT35510 应用手册&#xff08;英文&#xff09;.…

Jenkins持续集成工具学习

一、从装修厨房看项目开发效率优化 二、持续集成工具 三、JavaEE项目部署方式对比 四、Jenkins+SVN持续集成环境搭建

WebGoC题解(18) 630.电线杆(2019NHOI小乙)

题目描述 小C在农场的附近看到有n颗电线杆排成一行&#xff0c;相邻之间距离为20。它们高度可能不一样&#xff0c;但高度相同的电线杆顶端有电线连接。如下面示意图中&#xff0c;电线杆用粗细为6的垂直直线画&#xff0c;电线用粗细为2的水平直线画。给定每个电线杆的高度&am…

Linux-Haproxy搭建Web群集

LVS在企业应用中抗负载能力强 不支持正则处理&#xff0c;不能实现动静分离对于大型网格&#xff0c;LVS的实施配置复杂&#xff0c;维护成本较高 Haproxy是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用的代理的软件 适用于负载大的Web站点运行在硬件上可支持数以万计的…

AI大模型开发——4.transformer模型(0基础也可懂)(1)

无论是想怎样学习大模型&#xff0c;transformer都是一个绕不开的话题。transformer的出现彻底改变了nlp领域&#xff0c;进一步推动了大模型的产生&#xff0c;可以说&#xff0c;transformer就是大模型开发的鼻祖。 可能只通过说大家会有些不理解。大家可以看下方的大语言模型…

打卡第四十四天:最长公共子序列、不相交的线、最大子序和、判断子序列

一、最长公共子序列 题目 文章 视频 本题和最长重复子数组区别在于这里不要求是连续的了&#xff0c;但要有相对顺序&#xff0c;即&#xff1a;"ace" 是 "abcde" 的子序列&#xff0c;但 "aec" 不是 "abcde" 的子序列。 确定dp数…

4个快捷高效的ai在线写作工具推荐。

ai在线写作因其快速的创作方式&#xff0c;高效的写作效率以及能够为我们带来无限的灵感而被广泛应用。如果你还不会使用ai进行写作的话&#xff0c;就看看下面这4款AI写作工具吧。 1、笔灵在线创作 直通车 :https://ibiling.cn 这是个在线的AI工具网站&#xff0c;在内容创作…

个人可识别信息(PII) AI 去除 API 数据接口

个人可识别信息(PII) AI 去除 API 数据接口 ai / 隐私保护 基于 AI 模型自动去除个人识别信息&#xff08;PII&#xff09; 个人信息保护 / AI 模型 。 1. 产品功能 基于自有专业模型进行 PII 自动去除高效处理敏感信息全接口支持 HTTPS&#xff08;TLS v1.0 / v1.1 / v1.2 /…

地质灾害评估和治理工程勘查设计资质乙级资质办理标准

地质灾害评估和治理工程勘查设计资质乙级资质的办理标准主要包括单位条件、专业技术人员条件、仪器设备要求以及申请材料等方面。以下是详细的办理标准&#xff1a; 一、单位条件 **1、法人资格&#xff1a;**申请单位应具有企业法人或者事业单位法人资格。 **2、管理体系&a…

龙良曲pytorch课时1-课时13

前言 这篇是个人学习龙曲良老师的pytorch课程的笔记&#xff0c;疑惑地方自己加的内容 一、pytorch引入 1. 自动求导 在深度学习中&#xff0c;我们通常需要训练一个模型来最小化损失函数。这个过程可以通过梯度下降等优化算法来实现。梯度是函数在某一点上的变化率&#x…

Linux基础入门--目录结构之基本目录操作及注意事项

&#x1f600;前言 本篇博文是关于Linux基础入门–目录结构的基本介绍、基本目录和操作命令&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&…

滴答定时器笔记

SysTick介绍 1.1 什么是SysTick&#xff1f; Systick&#xff0c;即滴答定时器&#xff0c;是内核中的一个特殊定时器&#xff0c;用于提供系统级的定时服务。该定时器是一个24位的 递减计数器&#xff0c;具有自动重载值寄存器的功能。当计数器到达自动重载值时&#xff0c;它…

无人机中的温度/湿度/气压传感器详解!!!

一、温度传感器 温度传感器是一种用来测量物体或环境的温度变化的传感器。在无人机中&#xff0c;温度传感器通常采用红外线热成像技术&#xff0c;通过红外线相机获取物体表面的温度数据&#xff0c;实现对环境和物体温度的监测和测量。该技术具有响应速度快、无需接触、测量…

100个练习学习Rust!构文・整数・变量

前一篇文章 【0】准备 【1】构文・整数・变量 ← 本次全部文章列表 《100 Exercise To Learn Rust》第2回&#xff0c;也就是实际演习的第1回&#xff01;从这次开始&#xff0c;我们会适度减少前置说明&#xff0c;直接进入问题的解决&#xff01; 本次的相关页面 1.1. Syn…

SpringBoot入门第一篇

目录 SpringBootSpring Boot核心特性Spring Boot应用结构目录结构样例目录结构讲解 Spring Boot版本更新概览升级建议总结 常见使用场景社区和资源常见疑问**Spring Boot的自动配置机制是如何工作的&#xff1f;****Spring Boot支持哪些常见的配置文件格式&#xff1f;****为什…

硬件设计-1/f噪声、均方根(RMS)噪声与等效噪声带宽

简介&#xff1a; 学习下噪声的知识&#xff0c;为什么写这个呢&#xff0c;因为前几年有次面试和别人谈到这个问题。 定义解释&#xff1a; 1/F噪声 高频下的噪声为白噪声(即其频谱密度不会随频率而变化)。这种情况适用于运算放大器的大 部分频率范围&#xff0c;但在低频率…

C语言问答进阶--2、C语言简介及基本的输入输出函数

C语言简介 Q&#xff1a;您好&#xff0c;能大体介绍下C语言吗&#xff1f; A&#xff1a;当然可以。C语言是一种计算机语言&#xff0c;它主要被用在系统编程里&#xff0c;可以说&#xff0c;C语言的产生就和操作系统的编写密不可分。 【C语言简要历史】 1978年由美国电话电报…