【QT开发(6)】0926-QT 中加入 fastDDS 通信库的程序使用说明

news2024/11/22 20:14:05

在智能驾驶中,DDS有可能被广泛使用,因此推出这篇说明教程。

1、基于【QT开发(5)】教程的项目文档进行开发

2、安装DDS

查看《【eProsima Fast DDS(1)】安装eProsima Fast DDS》

至少安装:

foonathan_memory_vendor,一个 STL 兼容的 C++ 内存分配器 库。
fastcdr,一个根据 CDR 标准进行数据序列化的 C++ 库。
fastrtps,eProsima Fast DDS库的核心库。

测试安装是否正确的方法:在cmakelists 中加入

find_package(fastcdr REQUIRED)
find_package(foonathan_memory REQUIRED)
find_package(fastrtps REQUIRED)

如果cmake 提示找到了该库,则表示库ok。

3、在项目中添加通信message文件

我们一般是先写 DDS 的idl 文件(本质是定义定义数据结构体类型),然后通过DDS的代码生成工具生成 cpp 和hpp文件。如下图:
在这里插入图片描述

因为我们使用的【QT开发(5)】教程的项目文档进行开发,哪个项目直接遍历src 目录里面全部的cpp和hpp文件。因此我们把message 复制进入src目录即可,不用变更cmakelists

例如我们定义两个数据结构体PerceptionCommand 和WorkingStatus

module auto_msg {
  module msg {
    struct PerceptionCommand {
      uint64 time_stamp;
      uint8 system_command;
      uint8 system_reset;
    };
  };
};


module auto_msg {
  module msg {
    struct WorkingStatus {
      uint64 time_stamp;
      uint32 counter;
    };
  };
};

4、为了保持ROS2 代码的风格兼容,我们导入了rclcpp

目的:移植rclcpp 的publisher、subscription、和timer

因为我们使用的【QT开发(5)】教程的项目文档进行开发,哪个项目直接遍历src 目录里面全部的cpp和hpp文件。因此我们把rclcpp复制进入src目录即可,不用变更cmakelists

5、修改cmakelists 增加fastrtps

增加

find_package(fastcdr REQUIRED)
find_package(foonathan_memory REQUIRED)
find_package(fastrtps REQUIRED)

修改target_link_libraries ,增加fastrtps

    target_link_libraries( emptyApp 
                            fmt
                             Qt5::Widgets
                             ${OpenCV_LIBS}
                             fastrtps
                             pthread
                            )

因为我们使用的【QT开发(5)】教程的项目文档进行开发,哪个项目直接遍历src 目录里面全部的cpp和hpp文件。因此我们把message 、rclcpp复制进入src目录即可,不用变更cmakelists

6、增加一个基于DDS 通信的核心功能

我们建立一个example文件夹,建立example.cpp 和 example.hpp

先写 example.hpp,首先引入头文件

#include <rclcpp/rclcpp.hpp>
#include <PerceptionCommand.hpp>  // 这个是message 里面定义的 dds 通信数据结构体
#include <WorkingStatus.hpp>    // 这个是message 里面定义的 dds 通信数据结构体

然后建立一个对象Example class

class Example : public rclcpp::Node
{
 public:
  Example();
  ~Example();
  int Init();

 private:
  // 1# 订阅者
  rclcpp::Subscription<auto_msg::msg::PerceptionCommand>::SharedPtr perceptionCommand_sub_;
  // 2#  信息存储的成员
  rclcpp::AtomicSet<auto_msg::msg::PerceptionCommand> perceptionCommand_;

  // 3#建立 订阅者的回调函数 msg_PerceptionCommand_callback,实现的数据存放在perceptionCommand_成员
  void msg_PerceptionCommand_callback(const auto_msg::msg::PerceptionCommand::SharedPtr msg);

  // 4# 建立一个50ms 的定时器
    rclcpp::TimerBase::SharedPtr workingStatus_timer_;

  // 5# 建立发布者 Publisher
  rclcpp::Publisher<auto_msg::msg::WorkingStatus>::SharedPtr workingStatus_pub_;
  rclcpp::AtomicSet<auto_msg::msg::WorkingStatus> workingStatus_;

  // 6# 定时器的回调函数
  void timer_WorkingStatus_callback();

};

我们建立了6个函数,分别的作用是
1、建立一个 perceptionCommand_sub_ 订阅者
2、建立一个 perceptionCommand_ 的信息存储的成员
3、建立 订阅者的回调函数 msg_PerceptionCommand_callback,实现把收到的数据存放在 perceptionCommand_ 的信息存储的成员里面
4、建立一个50ms 的定时器
5、建立一个 workingStatus_pub_ 的发布者;4、建立一个 workingStatus_ 成员
6、建立一个 定时器的回调函数,处理perceptionCommand_ 成员的数据,并发送workingStatus_pub_ 数据。

example.cpp 里面这么写

int Example::Init()
{
  counter_ = 0;

  workingStatus_pub_ = this->create_publisher<auto_msg::msg::WorkingStatus>(
    "example_status_pub",
    2);


  perceptionCommand_sub_ = this->create_subscription<auto_msg::msg::PerceptionCommand>(
    "perception_command_pub",
    2,
    std::bind(&Example::msg_PerceptionCommand_callback, this, _1));

  workingStatus_timer_ = this->create_wall_timer(50, std::bind(&Example::timer_WorkingStatus_callback, this)); // 50 millisecond

  return 0;
}


void Example::timer_WorkingStatus_callback()
{
  // here is how use the msg which had received
  auto_msg::msg::PerceptionCommand perceptionCommand = perceptionCommand_.Get();
  if (perceptionCommand.system_command() == 0x06) {
    // for example, do sth what you want when command equal some value
    int a = 1;
  }


  auto_msg::msg::WorkingStatus workingStatus;
  workingStatus.time_stamp() = rclcpp::PlatformGetMs();
  workingStatus_pub_->publish(workingStatus);
}


void Example::msg_PerceptionCommand_callback(const auto_msg::msg::PerceptionCommand::SharedPtr msg)
{
  perceptionCommand_.Set(*msg);
}

7、修改main 文件

增加头文件引用

#include <rclcpp/rclcpp.hpp>
#include "example.h"

main 函数里面加入

        rclcpp::init(argc, argv);
        std::shared_ptr<yanyx::auto::Example> example = std::make_shared<yanyx::auto::Example>();
        example->Init();
        rclcpp::spin(example);

关于 rclcpp::spin() 的说明可以看我的另外一篇文章《【eProsima Fast DDS(2)】ROS2:spin() spin_some()函数》,这个是堵塞了main 函数。

整体上处理的思路是:

1、建立一个 perceptionCommand_sub_ 订阅者
2、建立一个 perceptionCommand_ 的信息存储的成员
3、建立 订阅者的回调函数 msg_PerceptionCommand_callback,实现把收到的数据存放在 perceptionCommand_ 的信息存储的成员里面
4、建立一个50ms 的定时器
5、建立一个 workingStatus_pub_ 的发布者;4、建立一个 workingStatus_ 成员
6、建立一个 定时器的回调函数,处理perceptionCommand_ 成员的数据,并发送workingStatus_pub_ 数据。

建立一个订阅者
建立一个存储成员
订阅者的回调函数把收到的数据存放在成员
建立一个50ms 的定时器
建立发布者
定时器回调>处理存储的数据>并调用发布者发数据

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

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

相关文章

idea Springboot 高校科研资源共享系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 高校科研资源共享系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c; 系统具有完整的源代码和数据…

spring源码解析——IOC-开启 bean 的加载

概述 前面我们已经分析了spring对于xml配置文件的解析&#xff0c;将分析的信息组装成 BeanDefinition&#xff0c;并将其保存注册到相应的 BeanDefinitionRegistry 中。至此&#xff0c;Spring IOC 的初始化工作完成。接下来我们将对bean的加载进行探索。 BeanFactory 当我…

WinPcap4.1.3安装失败解决方法,A newer version of winpcap...

WinPcap4.1.3安装失败解决方法&#xff0c;A newer version of winpcap… 如图所示&#xff0c;提示本地安装有更高版本的WinPcap时&#xff0c;按如下操作即可解决。 找到相应文件&#xff0c;扩展名修改成如下&#xff1a; C:\Windows\SysWOW64 的wpcap.dll改成 wpcap.dll.…

微服务治理:构建强大、健壮的分布式系统

文章目录 什么是微服务治理&#xff1f;微服务治理的挑战1. 服务注册和发现2. 负载均衡3. 故障处理4. 安全性5. 监控和日志记录 构建强大的微服务治理1. 服务网格2. 服务注册和发现3. 负载均衡4. 故障处理5. 安全性6. 监控和日志记录 微服务治理的未来 &#x1f389;欢迎来到架…

ACGAN

CGAN通过在生成器和判别器中均使用标签信息进行训练&#xff0c;不仅能产生特定标签的数据&#xff0c;还能够提高生成数据的质量&#xff1b;SGAN&#xff08;Semi-Supervised GAN)通过使判别器/分类器重建标签信息来提高生成数据的质量。既然这两种思路都可以提高生成数据的质…

Oracle - 多区间按权重取值逻辑

啰嗦: 其实很早就遇到过类似问题&#xff0c;也设想过&#xff0c;不过一致没实际业务需求&#xff0c;也就耽搁了&#xff1b;最近有业务提到了&#xff0c;和同事讨论&#xff0c;各有想法&#xff0c;所以先把逻辑整理出来&#xff0c;希望有更好更优的解决方案&#xff1b;…

传统遗产与技术相遇,古彝文的数字化与保护

古彝文是中国彝族的传统文字&#xff0c;具有悠久的历史和文化价值。然而&#xff0c;由于古彝文的形状复杂且没有标准化的字符集&#xff0c;对其进行文字识别一直是一项具有挑战性的任务。本文介绍了古彝文合合信息的文字识别技术&#xff0c;旨在提高古彝文的自动识别准确性…

linux 和 windows的換行符不兼容問題

linux 和 windows的換行符&#xff1a; 1.vim 模式下&#xff0c;執行命令&#xff1a; :set ffunix idea中設置code style

从零手搓一个【消息队列】项目设计、需求分析、模块划分、目录结构

文章目录 一、需求分析1, 项目简介2, BrokerServer 核心概念3, BrokerServer 提供的核心 API4, 交换机类型5, 持久化存储6, 网络通信7, TCP 连接的复用8, 需求分析小结 二、模块划分三、目录结构 提示&#xff1a;是正在努力进步的小菜鸟一只&#xff0c;如有大佬发现文章欠佳之…

Linux账户组管理及权限练习

1.使用id命令查看root账户信息 [rootserver ~]# id root 用户id0(root) 组id0(root) 组0(root) 2.使用id命令查看自己的普通账户信息 [rootserver ~]# id kxy 用户id1000(kxy) 组id1000(kxy) 组1000(kxy),10(wheel) 3.新建账户test1&#xff0c;并查看账户信息&#xff1a; [ro…

安装python扩展库

博主&#xff1a;命运之光 专栏&#xff1a;Python程序设计 Python扩展库安装 Python提供了丰富的标准库&#xff08;不需要安装&#xff09; &#xff0c;还支持大量的第三方扩展库&#xff0c;它们数量众多、功能强大、涉及面广、使用方便&#xff0c;得到各行业领域工程师的…

千问的大模型KnowHow

卷友们好&#xff0c;我是rumor。 通义千问昨天放出了14b参数的模型&#xff0c;还有一份比较详尽的技术报告&#xff0c;包含作者们训练8个模型的宝贵经验。 同时他们开源的13B比起开源的SOTA也有不少提升&#xff1a; 今天我们就来一起白嫖&#xff0c;更多细节请移步原文&am…

Mybatis 日志(Apache Commons Logging)

之前我们介绍了使用JDK Log打印Mybatis运行时的日志&#xff1b;本篇我们介绍使用Apache Commons Logging打印Mybatis运行时的日志。 如何您对Mybatis中使用JDK Log不太了解&#xff0c;可以参考&#xff1a; Mybatis 日志(JDK Log)https://blog.csdn.net/m1729339749/articl…

上海市小机灵数学比赛回顾和五年级1-15届真题和答案学习资料

从2017年到现在&#xff0c;之前卷得非常厉害的上海市一系列与升学挂钩的竞赛如“小机灵杯、走美杯、希望杯、中环杯”等比赛都成为了竞赛历史的一部分。 尽管教育部门明确规定&#xff0c;学校不得将相关比赛的成绩作为学生评价和选拔的要素&#xff0c;但是许多家长仍按对于…

【STM32基础 CubeMX】从0带你点灯

文章目录 前言一、GPIO的概念二、CubeMX配置GPIO2.1 基础配置2.2 GPIO配置 三、点灯代码讲解3.1 cubemx生成的代码3.2 1个库函数 四、LED闪烁总结 前言 一、GPIO的概念 STM32是一系列微控制器芯片的品牌&#xff0c;它们用于控制各种电子设备。其中的GPIO是通用输入/输出端口的…

Spring IOC(控制反转)与DI(依赖注入)

定义 IOC(Inversion of Control)&#xff0c;即控制反转&#xff1a;对象的创建控制权不再由程序来执行&#xff0c;而是交由给Spring容器处理。简单的说程序不需要进行new操作&#xff0c;对象直接由Spring容器自动创建。 DI(Dependency Injection)&#xff0c;即依赖注入&am…

窗口类介绍

目录 Qwidget QDialog QMessageBox QFileDialog QFontDialog QColorDialog QInputDialog QProgressDialog QMainWindow 菜单栏 工具栏 状态栏 停靠窗口 窗口布局 Qwidget 常用的一些函数包括&#xff1a; 设置窗口的大小&#xff0c;尺寸&#xff0c;得到对应的…

蓝海彤翔亮相2023新疆网络文化节重点项目“新疆动漫节”

9月22日上午&#xff0c;2023新疆网络文化节重点项目“新疆动漫节”&#xff08;以下简称“2023新疆动漫节”&#xff09;在克拉玛依科学技术馆隆重开幕&#xff0c;蓝海彤翔作为国内知名的文化科技产业集团应邀参与此次活动&#xff0c;并在美好新疆e起向未来动漫展映区设置展…

Ubuntu为什么键盘会出现乱字符

今天上午起来只是要简单打一个命令&#xff0c;需要输入一个"双引号&#xff0c;但是总是显示&#xff0c;我一开始以为是中了病毒&#xff0c;把键盘给改了&#xff0c;后来发现虚惊一场&#xff1a;出现这个原因是因为ubuntu的键盘设置有问题。 我把键盘设置为英国英语…

C++简单实现红黑树

目录 一、概念 二、红黑树的性质 三、红黑树的定义 四、红黑树的插入操作 情况一&#xff08;叔叔节点存在且为红色&#xff09;——变色向上调整&#xff1a; 情况二&#xff08;叔叔节点不存在或为黑色&#xff09;——旋转变色&#xff1a; 2.1叔叔节点不存在 2.2叔叔…