ROS2自定义消息并在同一功能包与其他功能包中使用

news2025/1/11 2:17:53

1创建自定义消息

1.1. 创建工作空间

mkdir -p ros2_ws/src

1.2.创建功能包

cd ros2_ws/src
ros2 pkg create msg_pkg --build-type ament_cmake --dependencies rclcpp std_msgs

1.3.创建消息

在功能包msg_pkg中创建msg文件夹,并在msg目录中创建消息文件.类型.msg. 如Student.msg和Class.msg(切记消息类型首字母大写)

cd msg_pkg
mkdir msg

Student.msg中内容如下:

string name
int16 age

Class.msg中内容如下:

int16 id
Student[] students #当引用同一包中的消息时不需要加包名.如果在其他中中引用需要加上包名msg_pkg/Student[] students

1.4.修改CMakeLists.txt

添加如下代码段

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
#========================================
# 自定义消息
find_package(geometry_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)
set(msg_files
"msg/Student.msg"
"msg/Class.msg"
)
rosidl_generate_interfaces(${PROJECT_NAME}
  ${msg_files}
  DEPENDENCIES std_msgs geometry_msgs
 )
 ament_export_dependencies(rosidl_default_runtime)

#========================================

1. 5.修改package.xml

添加如下代码段

  <!--添加自定义消息-->
  <buildtool_depend>rosidl_default_generators</buildtool_depend>
  <exec_depend>rosidl_default_runtime</exec_depend>
  <member_of_group>rosidl_interface_packages</member_of_group>
  <!--添加自定义消息-->

1.6.编译并查看

1.6.1.编译

返回到工作空间目录下.这里是ros2_ws目录下,执行如下命令进行编译

colcon build --packages-up-to objectsDetection

1.6.2.查看

. install/local_setup.bash
ros2 interface package msg_pkg

出现如下消息类型,则成功
在这里插入图片描述

2.同一个包下使用自定义消息(简单的发布者和订阅者)

注意点:在同一个包中使用自定义消息在CMakeLists.txt中必须添加如下代码段,不然找不的自定义消息的头文件

rosidl_target_interfaces(classPlush
  ${PROJECT_NAME} "rosidl_typesupport_cpp")

2.1 发布者(在msg_pkg功能包的src中添加push.cpp)

#include <sys/time.h>
#include <algorithm>
#include <chrono>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <msg_pkg/msg/class.hpp>
#include <msg_pkg/msg/student.hpp>
#include <rclcpp/rclcpp.hpp>
#include <vector>
static volatile int keepRunning = 1;
void signal_handler(int signum) {
  printf("signal_handler: caught signal %d\n", signum);
  if (signum == SIGINT) {
    keepRunning = 0;
    // SLAM.Shutdown();
  }
}
int main(int argc, char const *argv[]) {
  if (signal(SIGINT, signal_handler) == SIG_ERR) {
    printf("Failed to caught signal\n");
  } else {
    std::cout << "signal_handler ok" << std::endl;
  }
  /* 初始化rclcpp  */
  rclcpp::init(argc, argv);
  /*产生一个节点*/
  auto node = std::make_shared<rclcpp::Node>("classPlus");
  RCLCPP_INFO(node->get_logger(), "RosNode_1节点已经启动.");
  rclcpp::Publisher<msg_pkg::msg::Class>::SharedPtr clss_pub =
      node->create_publisher<msg_pkg::msg::Class>("classMesag", 1);
  int i = 0;
  msg_pkg::msg::Class cl;
  while (keepRunning) {
    msg_pkg::msg::Student stu;
    stu.age = i * 10 + 1;
    stu.name = "stu" + std::to_string(i);
    cl.students.push_back(stu);
    if (i % 5 == 0) {
      cl.id = i;
      clss_pub->publish(cl);
      std::cout << "publish end" << std::endl;
    }
    i++;
  }
  rclcpp::shutdown();
  return 0;
}

2.1.1 修改CMakeLists.txt

添加如下代码段

#=========================================
#发布者
add_executable(classPlush src/push.cpp)
target_link_libraries(classPlush rclcpp::rclcpp )

rosidl_target_interfaces(classPlush
  ${PROJECT_NAME} "rosidl_typesupport_cpp")
 #注册可执行文件
install(TARGETS classPlush
DESTINATION lib/${PROJECT_NAME}
)
#=========================================

2.1.2 编译并查看可执行文件

2.1.2.1 编译(同上)

colcon build --packages-up-to objectsDetection

2.1.2.2 查看可执行文件

 ros2 pkg executables msg_pkg

若没有对应可执行文件classPlush出现或者运行报出如下错误,那是因为在CMakeLists.txt中没有加入install(TARGETS classPlush DESTINATION lib/${PROJECT_NAME} )进行注册.

No executable found

2.1.3 执行并订阅查看

2.1.3.1 执行

ros2 run msg_pkg classPlush

2.1.3.2 查看

在这里插入图片描述

2.2 订阅者(编译修改同上)

#include <memory>
#include <msg_pkg/msg/class.hpp>
#include <msg_pkg/msg/student.hpp>

#include "rclcpp/rclcpp.hpp"
using std::placeholders::_1;

class MinimalSubscriber : public rclcpp::Node {
 public:
  MinimalSubscriber() : Node("classSub") {
    subscription_ = this->create_subscription<msg_pkg::msg::Class>(
        "classMesag", 10,
        std::bind(&MinimalSubscriber::topic_callback, this, _1));
  }

 private:
  void topic_callback(const msg_pkg::msg::Class::SharedPtr msg) const {
    std::cout << "clssid: " << msg->id << std::endl;
    for (int i = 0; i < msg->students.size(); i++) {
      msg_pkg::msg::Student std = msg->students[i];
      std::cout << "age: " << std.age << std::endl;
    }
  }
  rclcpp::Subscription<msg_pkg::msg::Class>::SharedPtr subscription_;
};

int main(int argc, char* argv[]) {
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<MinimalSubscriber>());
  rclcpp::shutdown();
  return 0;
}

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

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

相关文章

【C++】从0到1讲继承|复杂的菱形继承

个人主页&#xff1a;&#x1f35d;在肯德基吃麻辣烫 我的gitee&#xff1a;gitee仓库 分享一句喜欢的话&#xff1a;热烈的火焰&#xff0c;冰封在最沉默的火山深处。 前言 本文主要讲述的是继承的概念&#xff0c;以及基类和派生类和衍生出的各种东西&#xff0c;还有多继承…

js实现css样式变换的实训

js实现css样式变换的实训 一、需求二、效果展示1.效果展示 三、实现四、其他1.其它系统 一、需求 完成以下功能&#xff1a; 1.掌控板三颗RGB灯初始所有RGB灯为红色 2.当掌控板P被触摸时&#xff0c;第一颗灯为白色&#xff0c;其他为红色&#xff1b;当掌控板Y被触摸时&…

C# GDI+编程之Graphics类

最近需要使用到C#DrawLine绘制直线这个功能&#xff0c;对这个了解的不多&#xff0c;记录一下使用的时候遇到的问题。 绘制线的基础部分&#xff0c;这个之前在《C#自学笔记&#xff08;四十&#xff09;之Windows绘图》就写过&#xff0c;有兴趣的可以看下 我这里主要说下Gra…

选择最佳安全文件传输方法的重要性

在数字化时代&#xff0c;文件的传输是商务、教育、科研、医学等领域不可或缺的工作流程。为了保障数据安全&#xff0c;选择最佳安全文件传输方法非常关键。在本文中&#xff0c;我们将探讨选择最佳安全文件传输方法的重要性。 第一、最佳安全文件传输方法可以保证文件内容不被…

【C++进阶】可变模版参数

一、前言 我们在之前Linux的学习中了解过命令行参数&#xff0c;可以让我们在命令行中传入多个参数&#xff0c;并且之前在学习printf&#xff0c;scanf等接口时&#xff0c;接触过可变模版参数&#xff1a; 而今天学习的可变参数模板和普通模板的语义是一样的&#xff0c;只…

Mac 系统钥匙串证书不受信任

Mac 系统钥匙串证书不受信任 解决办法 通过尝试安装 Apple PKI 的 Worldwide Developer Relations - G4 (Expiring 12/10/2030 00:00:00 UTC) 解决该异常问题 以上便是此次分享的全部内容&#xff0c;希望能对大家有所帮助!

[USACO14OPEN] Odometer S

洛谷[USACO14OPEN] Odometer S 题目大意 当一个数的每一位中有至少一半的数字相同&#xff0c;那么这个数就是一个有趣的数。求区间 [ L , R ] [L,R] [L,R]中有多少个有趣的数。 100 ≤ L ≤ R ≤ 1 0 18 100\leq L\leq R\leq 10^{18} 100≤L≤R≤1018 题解 这道题很容易能想…

AcWing242. 一个简单的整数问题

输入样例&#xff1a; 10 5 1 2 3 4 5 6 7 8 9 10 Q 4 Q 1 Q 2 C 1 6 3 Q 2输出样例&#xff1a; 4 1 2 5 #include<bits/stdc.h> using namespace std; const int N1e55; int n,m,a[N],c[N],x,y,d; char ch; int lowbit(int x){return x&-x; } void add(int x,int…

pytest--allure报告中添加用例详情

前言 前面介绍了如何生成allure的报告&#xff0c;看着allure的页面非常好看&#xff0c;但是感觉少了一些内容&#xff0c;allure还可以增加一些用例详情内容&#xff0c;这样让我们的报告看着更加绚丽。 allure增加用例详情 我们可以在报告测试套件中增加用例详情内容。 …

Spring初识(四)

文章目录 前言一.Bean的作用域1.1 作用域例子1.2 Bean的作用域类型 二.Bean的生命周期 前言 在前面我们学习了spring简单的读取和存储对象之后,Spring 中 Bean 是最核心的操作资源&#xff0c;我们接下来会介绍Bean对象. 一.Bean的作用域 什么是Bean作用域呢? 限定程序中变…

[DDPM] Denoising Diffusion Probabilistic Models

直接看paper云里雾里&#xff0c;一些推荐的讲解&#xff1a; The Annotated Diffusion Model 生成扩散模型漫谈&#xff08;一&#xff09;&#xff1a;DDPM 拆楼 建楼 生成扩散模型漫谈&#xff08;二&#xff09;&#xff1a;DDPM 自回归式VAE 生成扩散模型漫谈&#xff…

SQL-每日一题【619.只出现一次的最大数字】

题目 MyNumbers 表&#xff1a; 单一数字 是在 MyNumbers 表中只出现一次的数字。 请你编写一个 SQL 查询来报告最大的 单一数字 。如果不存在 单一数字 &#xff0c;查询需报告 null 。 查询结果如下例所示。 示例 1&#xff1a; 示例 2&#xff1a; 解题思路 1.题目要求我…

MyBatis---多表查询,动态sql的详细介绍

目录 1.命名规则 1.resultMap&#xff08;对应类属性名称与数据库字段名称&#xff09; 2.多表查询&#xff08;ResultMap&#xff09; 1.创建articleInfo类 2.创建ArticleMapper.xml配置文件和ArticleMapper接口 ①&#xff1a;不建议使用 &#xff08;文件之间耦合严重…

十大排序算法详解

目录 1. 冒泡排序 a. 思路 b. code 2. 插入排序 a. 思路 b. code 3. 希尔排序【插入排序plus】 a. 思路 b. code 4. 选择排序 a. 思路 b. code 5. 基数排序 a. 前置知识 b. 思路 c. code 6. 计数排序 a. 思路 b. code 7. 桶排序&#xff08;计数排序plus &…

怎么在shell中查看python版本以及降低anaconda的python版本

输入命令 python --version 电脑anaconda的python版本为3.11&#xff0c;如何降低版本 &#xff0c;输入命令 conda install python3.9 当安装完anaconda后&#xff0c;ubuntu系统的shell命令行最前面会出现base字样&#xff0c;此时要退出&#xff0c;就输入命令 conda deacti…

如何开启QQ邮件的SMTP服务以及如何使用Python发送邮件

如何开启QQ邮件的SMTP服务以及如何使用Python发送邮件 &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流哦&…

Qt应用开发——Drag and Drop

目录 一、前言 二、相关事件和类 三、实例 拖动文件到编辑框 一、前言 在实际场景中&#xff0c;经常会有导入文件的需求。导入文件一般两种方式&#xff0c;第一种QFileDialog显示一个文件选择窗口&#xff0c;选择后处理和显示。第二种就是使用拖放机制实现。还有在一些制…

.faust加密勒索数据库恢复---惜分飞

有客户的win服务器被勒索病毒加密,里面运行有用友系统的Oracle数据库&#xff0c;加密提示为&#xff08;camry2020aol.com&#xff09;&#xff1a; 加密的数据文件类似&#xff08;.DBF.id[0E564ACA-3493].[camry2020aol.com].faust&#xff09;: 通过工具检测发现少量bl…

(2)前端控制器的扩展配置, 视图解析器类型以及MVC执行流程的概述

SpringMVC入门程序的扩展说明 注册前端控制器的细节 在web.xml文件注册SpringMVC的前端控制器DispatcherServlet时使用url-pattern标签中使用/和/*的区别 /可以匹配.html或.js或.css等方式的请求路径,但不匹配*.jsp的请求路径/*可以匹配所有请求(包括.jsp请求), 例如在过滤器…

Kotlin空安全类型之平台类型

前言 众所周知,Kotlin的空安全很方便,能避免绝大部分的空安全问题 一般类型分为: 可空类型如 String? 不可空类型 String其中可空类型的String?可以赋值null或String类型的值,在使用时必须显式的进行空处理 而不可空类型的String,只能赋值String类型,无法向其赋值null,使用时…