eCal 基础安装和使用

news2024/11/25 5:44:31

参考文章:
自动驾驶通信中间件ecal源码分析—1. 什么是ecal

1、安装

使用官网提供的指令安装

主要参考官网进行安装, https://eclipse-ecal.github.io/ecal/index.html
主要这里兼容的主要系统:
Ubuntu 18.04
Ubuntu 20.04
Ubuntu 22.04
这里我使用的是树莓派安装的ubuntu18.04
使用官网提供的指令直接安装:

sudo add-apt-repository ppa:ecal/ecal-latest
sudo apt-get update
sudo apt-get install ecal

安装完成后测试:

在 Ubuntu 上从终端调用该应用程序定期将一些文本打印到终端。在后台,应用程序创建了一个主题人员并向其发送数据:

ecal_sample_person_snd

接收部分:订阅者订阅了主题人员并将其接收的所有数据打印到终端:

ecal_sample_person_rec

运行过程:
在这里插入图片描述

2、基础demo hello word

(1)、事前准备:

需要安装protobuf通信组件
可以参考之前的文章:https://editor.csdn.net/md/?articleId=127388599
这里按照官网的教程直接使用下面的指令进行安装即可:

sudo apt install cmake g++ libprotobuf-dev protobuf-compiler

(2)、建立目录文件

需要一个bulid文件夹,一个cmake文件和一个main文件:

mkdir bulid
touch main.cpp CMakelists.txt

.
├── bulid/
├── CMakeLists.txt
└── main.cpp
在这里插入图片描述

(3)、cmake:

安装cmake:
参考:https://editor.csdn.net/md/?articleId=126542158
可以直接使用指令安装:

sudo apt install cmake
sudo cmake --version

Cmakelists文件:

cmake_minimum_required(VERSION 3.0)
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)

project(hello_world_snd)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(eCAL REQUIRED)

set(source_files
  main.cpp
)

add_executable(${PROJECT_NAME} ${source_files})

target_link_libraries(${PROJECT_NAME}
  eCAL::core
)

(4)、测试cmake

cd bulid
cmake ..

a、遇到cmake执行报错:
在这里插入图片描述

CMake Error at CMakeLists.txt:4 (project):
No CMAKE_CXX_COMPILER could be found.

CMAKE_CXX_COMPILER 没有找到;原因是没有安装gcc和g++编译环境。
解决:

sudo apt-get update
sudo apt-get install -y build-essential

安装上就行了。

b、遇到Cmake问题报错2
在这里插入图片描述

CMake Error at /usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
Could NOT find Protobuf (missing: Protobuf_LIBRARIES Protobuf_INCLUDE_DIR)
Call Stack (most recent call first):
/usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
/usr/share/cmake-3.22/Modules/FindProtobuf.cmake:650 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
/usr/lib/aarch64-linux-gnu/cmake/eCAL/eCALConfig.cmake:67 (find_package)
CMakeLists.txt:9 (find_package)

这里是说没有找到protobuf,需要先进行安装

sudo apt install cmake g++ libprotobuf-dev protobuf-compiler

安装完成后解决了。

(5)、消息发布端main.cpp

代买实现了一个ecal的发布器,按照延时发布消息。

#include <ecal/ecal.h>
#include <ecal/msg/string/publisher.h>

#include <iostream>
#include <thread>

int main(int argc, char** argv)
{
  // 初始化eCAL。我们的进程的名字是"Hello World Publisher"
  eCAL::Initialize(argc, argv, "Hello World Publisher");

  // 创建在主题“hello_world_topic”上发布的字符串发布器
  eCAL::string::CPublisher<std::string> publisher("hello_world_topic");

  // 创建一个计数器,这样我们的消息就会发生变化
  int counter = 0;

  // 无限循环(使用eCAL::Ok()将使我们能够从另一个应用程序优雅地关闭Process)
  while (eCAL::Ok())
  {
    // 创建带有计数器的消息并将其发布到主题
    std::string message = "Hello World " + std::to_string(++counter);
    std::cout << "Sending message: " << message << std::endl;
    publisher.Send(message);

    // Sleep 500 ms
    std::this_thread::sleep_for(std::chrono::milliseconds(500));
  }

  // finalize eCAL API
  eCAL::Finalize();
}

编写好main文件后:

cd bulid
cmake ..
make
./hello_world_snd 

应该问题不大,最后的结果:
在这里插入图片描述
官网对代码的解释:

第 1 行包含基本的 eCAL 标头。 当我们要发布原始字符串时,第 2 行包含 eCAL 字符串发布服务器。 eCAL 支持多种消息格式。
第 10 行初始化了 eCAL。 在使用 API 之前,始终必须初始化 eCAL。 我们的eCAL流程的名称将是“Hello World Publisher”。 进程运行后,此名称将在 eCAL 监视器中可见。
第 13 行创建一个 eCAL 发布服务器。 eCAL 进程可以创建多个发布者(和多个订阅者)。 我们发布的主题将是“hello_world_topic”。
从第 20 行开始的 while 循环将导致无限发布循环。 eCAL 支持停止信号;当 eCAL 进程停止时,将返回 false。eCAL::Ok()
第 25 行将发布我们的消息并将其发送到已订阅该主题的其他 eCAL 进程。
第 32 行取消初始化 eCAL。应始终在应用程序退出之前执行此操作。

(6)、消息接收部分

这里需要新建一个和上文消息发布的目录一致的另一个目录

消息接收部分的cmake文件:

make_minimum_required(VERSION 3.0)
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)

project(hello_world_rec)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(eCAL REQUIRED)

set(source_files
  main.cpp
)

add_executable(${PROJECT_NAME} ${source_files})

target_link_libraries(${PROJECT_NAME}
  eCAL::core
)

消息接收部分的main代码:

#include <ecal/ecal.h>
#include <ecal/msg/string/subscriber.h>

#include <iostream>
#include <thread>

// 接收消息的回调函数
void HelloWorldCallback(const std::string& message)
{
  std::cout << "Received Message: " << message << std::endl;
}

int main(int argc, char** argv)
{
  // 初始化eCAL
  eCAL::Initialize(argc, argv, "Hello World Subscriber");

  // 创建监听“hello_world_topic”的订阅者
  eCAL::string::CSubscriber<std::string> subscriber("hello_world_topic");

  // 设置回调
  subscriber.AddReceiveCallback(std::bind(&HelloWorldCallback, std::placeholders::_2));

  // Just don't exit
  while (eCAL::Ok())
  {
    std::this_thread::sleep_for(std::chrono::milliseconds(500));
  }

  // finalize eCAL API
  eCAL::Finalize();
}

编译运行

cd bulid
cmake ..
make

(7)、测试运行

打开两个终端,先运行发布消息,然后另一个终端运行订阅程序:
发布

./hello_world_snd

订阅

./hello_world_rec 

可以看到通信成功
在这里插入图片描述

3、eCal 发布订阅 protobuf

使用字符串非常适合具有文本表示形式的简单数据。 但是数据通常会更加复杂,因此需要某种协议来定义数据的结构。
使用Google protobuf,因为:
它解决了如何为您序列化和反序列化数据的问题
您可以获得开箱即用的向下兼容性(如果您遵循指南)
它由谷歌维护,API稳定
eCAL监视器可以显示数据的良好反射视图

新建一个文件目录:

mkdir protobuf_rec protobuf_snd proto_messages

在这里插入图片描述

首先需要先制作一个protobuf文件,打开 proto_messages/hello_world.proto

syntax = "proto3";

package proto_messages;

message HelloWorld
{
  string name      = 1;
  uint32 id        = 2;
  string msg       = 3;
}

(1)、数据发送端

cmake文件

cmake_minimum_required(VERSION 3.0)
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON) # 如果未指定任何模式,则告诉 find_package() 在“模块”模式之前尝试“配置”模式。

project(protobuf_snd) # 指定project name

set(CMAKE_CXX_STANDARD 14) # 指定C++版本
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 设置指定的C++编译器版本是必须的,如果不设置,或者为OFF,则指定版本不可用时,会使用上一版本。

find_package(eCAL REQUIRED) # 查找依赖包 eCAL
find_package(Protobuf REQUIRED) # 查找依赖包 Protobuf

set(source_files
  main.cpp
)

set(protobuf_files
    ${CMAKE_CURRENT_SOURCE_DIR}/../proto_messages/hello_world.proto
)

add_executable(${PROJECT_NAME} ${source_files}) # 添加一个可执行文件构建目标

PROTOBUF_TARGET_CPP(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/../proto_messages/ ${protobuf_files}) # 链接到目标头文件和源文件

target_link_libraries(${PROJECT_NAME}   # 将目标文件与库文件进行链接。
  eCAL::core
  protobuf::libprotobuf
)

源文件main.cpp

#include <ecal/ecal.h>
#include <ecal/msg/protobuf/publisher.h>

#include <iostream>
#include <thread>

#include "hello_world.pb.h"

int main(int argc, char** argv)
{
  // 初始化eCAL并创建一个protobuf发布者
  eCAL::Initialize(argc, argv, "Hello World Protobuf Publisher");
  eCAL::protobuf::CPublisher<proto_messages::HelloWorld> publisher("hello_world_protobuf");

  // 要求用户输入他的名字
  std::cout << "Please enter your name: ";
  std::string name;
  std::getline(std::cin, name);

  unsigned int id = 0;

  // 无限循环(使用eCAL::Ok()将使我们能够从另一个应用程序优雅地关闭Process)
  while (eCAL::Ok())
  {
    // 让用户输入消息
    std::cout << "Type the message you want to send: ";
    std::string message;
    std::getline(std::cin, message);

    // 创建一个protobuf消息对象
    proto_messages::HelloWorld hello_world_message;
    hello_world_message.set_name(name);
    hello_world_message.set_msg (message);
    hello_world_message.set_id  (id++);

    // 发送消息
    publisher.Send(hello_world_message);
    std::cout << "Sent message!" << std::endl << std::endl;
  }

  // finalize eCAL API
  eCAL::Finalize();
}

(2)、数据接收端

cmake文件:

cmake_minimum_required(VERSION 3.0)
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)

project(protobuf_rec)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(eCAL REQUIRED)
find_package(Protobuf REQUIRED)

set(source_files
  main.cpp
)

set(protobuf_files
    ${CMAKE_CURRENT_SOURCE_DIR}/../proto_messages/hello_world.proto
)

add_executable(${PROJECT_NAME} ${source_files})

PROTOBUF_TARGET_CPP(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/../proto_messages/ ${protobuf_files})

target_link_libraries(${PROJECT_NAME}
  eCAL::core
  protobuf::libprotobuf
)

源文件main.cpp

#include <ecal/ecal.h>
#include <ecal/msg/protobuf/subscriber.h>

#include <iostream>
#include <thread>

#include "hello_world.pb.h"

void HelloWorldCallback(const proto_messages::HelloWorld& hello_world_msg)
{
  std::cout << hello_world_msg.name() << " sent a message with ID "
            << hello_world_msg.id() << ":" << std::endl
            << hello_world_msg.msg() << std::endl << std::endl;
}

int main(int argc, char** argv)
{
  // 初始化eCAL并创建一个protobuf订阅者
  eCAL::Initialize(argc, argv, "Hello World Protobuf Subscriber");
  eCAL::protobuf::CSubscriber<proto_messages::HelloWorld> subscriber("hello_world_protobuf");

  // 设置回调
  subscriber.AddReceiveCallback(std::bind(&HelloWorldCallback, std::placeholders::_2));

  // 不要退出
  while (eCAL::Ok())
  {
    std::this_thread::sleep_for(std::chrono::milliseconds(500));
  }

  // finalize eCAL API
  eCAL::Finalize();
}

(3)、测试运行

cd bulid
cmake ..
make
./protobuf_snd
./protobuf_rec 

在这里插入图片描述

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

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

相关文章

[附源码]java毕业设计8号体育用品销售及转卖系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

搜索服从幂律分布的网络 论文阅读

一、定义 1、幂律分布网络定义&#xff1a; 大部分通信网络和社会网络都具有幂律分布的特点&#xff0c;也即度数高的节点的数量少&#xff0c;度数低节点的数量多。 2、数学推导&#xff1a; 对于指数为τ、最小度数为k 1、在mkmaxm k_{max}mkmax​处有突变截止点的幂律分…

LeetCode链表练习(上)

文章目录前言1.反转链表1.题目分析2.代码示例2.力扣203. 移除链表元素1.题目分析2.代码示例3.力扣876. 链表的中间结点1.题目分析2.代码示例4.链表倒数第k个节点1.题目分析2.代码示例5.总结前言 之前介绍了链表的实现&#xff0c;为了更好巩固所学的知识&#xff0c;刷题是很有…

【路径规划】局部路径规划算法——DWA算法(动态窗口法)|(含python实现)

文章目录参考资料1. DWA算法原理1.1 简介1.2 算法原理1. 速度采样2. 轨迹预测&#xff08;轨迹推算&#xff09;3. 轨迹评价2. Python实现2.1 参数配置2.2 机器人运动学模型2.3 DWA算法类实现2.4 画图2.5 主函数3. 总结参考资料 The Dynamic Window Approach to Collision Avo…

二分查找的模板

这篇博客的二分用的都是左闭右闭的区间&#xff0c;对于二分来说还是我还是习惯这样写 最传统的二分查找&#xff0c;用左闭右闭写 int search(vector<int>& nums, int target) {int left 0;int right nums.size() - 1; // 定义target在左闭右闭的区间里&#xff0…

Mybatis学习之动态Sql

目录 1. 什么是动态Sql 2. 动态Sql需要学习什么 3. 动态Sql之《if》 4. 动态Sql之《where》 5. 动态Sql之《foreach》 6. 动态Sql之《sql》 7. PageHelper分页插件的使用 1. 什么是动态Sql 答案&#xff1a;动态Sql指的是&#xff0c;Sql语句是变化的&#xff0c;不是固…

Allegro原理图反标教程

Allegro原理图反标教程 Logic→Auto Rename Refdes→Rename 点击More进行详细设置 按照下图设置 点击Rename 打开刚刚rename时生成的rename.log文件,需要提取一些数据,如下图 将上图所有带有OLD和NEW的行提取出来,再将OLD,NEW删除 打开Capture,点击Tools→Back Annota…

C++中运行一个程序的内存分配情况及qt中的内存管理机制

一个由c/C编译的程序占用的内存分为以下几个部分 1、栈区&#xff08;stack&#xff09;— 由编译器自动分配释放 &#xff0c;存放函数的参数值&#xff0c;局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区&#xff08;heap&#xff09; — 一般由程序员分配释放&a…

【springboot】你了解@Autowired 和 @Resource吗?@Autowired 和 @Resource深入分析

Autowired 和 Resource深入分析“认祖归宗”--Autowired 和 Resource来源“通过现象看本质”--Autowired 和 Resource作用和区别1.现象一&#xff1a;一个业务接口只对应一个业务实现类2.现象二&#xff1a;一个业务接口 对应 两个或多个业务实现类我们在开发中&#xff0c;一直…

【数据结构】链表其实并不难 —— 手把手带你实现双向链表

文章目录0. 前言1. 双向链表的概念2. 双向链表的实现2.1 结构设计2.2 接口总览2.3 初始化2.4 创建新节点2.5 尾插2.6 头插2.7 尾删2.8 头删2.9 查找2.10 在pos位置之前插入2.11 在pos位置删除2.12 打印2.13 销毁3. 完整代码List.hList.ctest.c4. 结语0. 前言 之前&#xff0c;…

【Python百日进阶-WEB开发】Day175 - Django案例:07状态保持

文章目录五、状态保持5.1 Django中状态保持5.1.1 状态保持概述5.1.2 Cookie5.1.2.1 Cookie的用处&#xff1a;5.1.2.1 Cookie的特点&#xff1a;5.1.2.1 Cookie的操作&#xff1a;5.1.3 session5.1.3.1 Session的特点&#xff1a;5.1.3.2 Session依赖于Cookie5.1.3.3 存储方式5…

网页数据抓取-网页实时数据抓取软件

网页数据抓取&#xff0c;随着社会的发展&#xff0c;互联网的普及&#xff0c;不管是企业还是个人都意识到数据的重要性。今天给大家分享一款免费的网页数据抓取软件。只要点点鼠标就能轻松采集你想要的内容不管是导出还是自动发布都支持&#xff01;详细参考图片&#xff01;…

Qlib股票数据获取与查看(Qlib学习1)

文章目录Qlib基本信息数据使用方法1. 借助Qlib下载数据2. 查看相关数据参考链接Qlib基本信息 Qlib Github主页&#xff1a;https://github.com/microsoft/qlib Qlib quickstart&#xff1a;https://qlib.readthedocs.io/en/latest/introduction/quick.html#introduction 基本…

LeetCode刷题---142. 环形链表 II(双指针-快慢指针)

文章目录一、编程题&#xff1a;142. 环形链表 II&#xff08;双指针-快慢指针&#xff09;1.题目描述2.示例1&#xff1a;3.示例2&#xff1a;4.示例3&#xff1a;5.提示&#xff1a;6.提示&#xff1a;二、解题思路1.思路2.复杂度分析&#xff1a;3.算法图解三、代码实现总结…

如何理解Linux下一切皆文件

文章目录一、问题抛出二、如何理解三、Linux源码验证一、问题抛出 Linux中普通文件、目录、字符设备、块设备、网络设备等都被当做文件来对待。虽然他们的类型不同&#xff0c;但是Linux中提供了统一的操作接口。  普通文件、目录文件显然非常好理解&#xff0c;因此在本文中&…

今日论文阅读2022-11-10

多模态预训练论文ViLBERT: Pretraining Task-Agnostic Visiolinguistic Representations for Vision-and-Language Tasksvision-and-language tasks&#xff1a; visual question answering,visual commonsense reasoning, referring expressions, and caption-based image ret…

基于DeepLabV3实践路面、桥梁、基建裂缝裂痕分割

在我前面的文章中有基于改进的模型开发的裂缝裂痕检测模型&#xff0c;感兴趣的话可以看下&#xff1a; 《基于yolov5sbifpn实践隧道裂缝裂痕检测》 今天主要是趁着有时间基于deeplabv3来实践裂缝裂痕分割。首先来看效果图&#xff1a; 为了整体直观&#xff0c;这里专门是开…

腾讯蓝鲸 API 网关如何借助 APISIX 实现产品升级与业务完善

分享嘉宾朱雷&#xff0c;腾讯 IEG 运维 PaaS 平台技术负责人。 蓝鲸&#xff08;全名“蓝鲸智云”&#xff09;是一套孵化于腾讯 IEG&#xff08;互动娱乐事业群&#xff09;内部&#xff0c;服务于多业务与各内部平台的研运一体化 PaaS。 其作用是在 CI、CD 和 CO 三个阶段&a…

Spring 概述

Spring是 Java 应用程序开发框架。 Spring 框架的目标是使 J2EE 开发变得更容易使用&#xff0c;通过启用基于 POJO编程模型来促进良好的编程实践。 Spring Framework Spring 基础框架是 Spring Framework &#xff0c;基本上任何其他 Spring 项目都是以 Spring Framework 为…

如何进入 mysql?

目录 1. win r 2. 输入cmd点确定 3. 输入 mysql -u -t 4. 点回车出现 下面的 就代表已经进入 mysql 退出 mysql的 方法&#xff1a; 1. win r 2. 输入cmd点确定 3. 输入 mysql -u -t -u &#xff1a;代表你的用户名&#xff0c;如果是本地登录 则为 -uroot-p &am…