首页 > 编程语言 >【自动驾驶】自定义消息格式的话题通信(C++版本)

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

时间:2024-08-09 10:28:00浏览次数:12  
标签:mymsg publisher include ROS 自定义 C++ msg 格式 ros

目录

新建消息文件

在功能包目录下,新建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;
}

程序测试

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

在这里插入图片描述

标签:mymsg,publisher,include,ROS,自定义,C++,msg,格式,ros
From: https://blog.csdn.net/hh1357102/article/details/141025662

相关文章

  • 使用Qt实现自定义GraphicsView
    在本文中,我们将介绍如何使用Qt实现一个自定义的GraphicsView,主要是作为笔记使用QGraphicsView框架方面的使用手法、套路,对代码就不做过多的解释了,它具有以下功能:显示图像可拖动的十字标记(CrossMarkItem)可调整大小的ROI(RegionofInterest)矩形FPS和日期时间显示保存和......
  • PC端文字过多展开收起跟在...后面(可自定义行数)
    话不多说直接上代码,可直接复制根据需求修改TextMore.vue<template> <div>  <divclass="yuanqu-con":style="{'--beforeHeight':beforeHeight}">   <div:style="{'-webkit-line-clamp':row}"clas......
  • C++ 禁用类的拷贝构造函数和赋值运算符
    C++中如果没有显式定义类的构造函数和赋值运算符,编译器会自动生成对应的函数,但是对于一些含有指针成员变量的类,自动生成的成员函数只会进行浅拷贝,会导致动态申请的内存在对象析构的时候doublefree,引起崩溃的问题。因此如果没有必要,通常会禁用该接口,避免用户调用该接口造成问题。......
  • nodejs语言,MySQL数据库;springboot的个性化资讯推荐系统66257(免费领源码)计算机毕业设计
    摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,个性化资讯推荐系统当然也不能排除在外。个性化资讯推荐系统是以实际运用为开发背景,运用软件工程原理和开发方法,采用springboot技术构建的一个管理系统。整......
  • c#语言,SQL server数据库;基于Web的社区人员管理系统的设计与实现36303(免费领源码)计算机
    目 录摘要1绪论1.1慨述1.2课题意义1.3B/S体系结构介绍1.4ASP.NET框架介绍2 社区人员管理系统分析2.1可行性分析2.2系统流程分析2.2.1数据增加流程2.2.2数据修改流程52.2.3数据删除流程52.3系统功能分析62.3.1功能性分析62.3.2非功能性......
  • 哪种编程语言更适合学习数据结构和算法:C++、Java 还是 Python?
    作为一名工程专业的学生,​​我正在尝试决定使用哪种编程语言来学习数据结构和算法(DSA)。我正在考虑C++,它提供高性能和强大的标准模板库,但对于初学者来说可能很复杂。Java具有强大的语法和内置集合,使DSA概念更容易掌握,尽管我不确定它与C++相比的性能。Python以其简单性和......
  • 【C++】构造函数类别
    1、默认构造函数形式:没有入参调用方式:直接定义声明:Constructor();调用:Constructorc;2、初始化构造函数形式:有参数列表调用方式:传参即可声明:Constructor(inta,intb);调用:Constructorc(1,2);3、拷贝构造函数形式:参数为变量常引用调用方式:当使用现有对象初......
  • C++标准模板库(STL)|容器|vector| queue|
    对STL进行总结,STL是standardtemplatelibrary的简写,是C++中的一个标准模板库,用于实现常用的数据结构和算法,它是C++程序员经常使用的一个工具箱。STL的主要目的是提高开发效率和代码质量,使得程序员可以更加便捷地完成常见的操作。里面包括:算法(algorithm)、容器(container)、仿函......
  • C#中的foreach和自定义比较
    在C#中foreach不能修改集合里面的值在C#中,使用foreach循环遍历集合时,通常不建议修改集合中的元素,因为foreach循环是针对集合的枚举器进行操作的,而枚举器通常不支持修改集合中的元素。如果尝试在foreach循环中修改集合,可能会抛出异常或导致不可预测的行为。然而,如果你......
  • 纯js 导出excel表格,xmlns 方式,导出格式只能是xls
    代码onstworksheet="Sheet1";consttableHTML="<tr><td>数据1</td><td>数据2</td></tr>";constexcelHTML=`<htmlxmlns:o="urn:schemas-microsoft-com:office:office"xmlns:x="urn:s......