pushgateway HA高可用方案
未经本人同意不得转载,若引用请附上原文链接。
项目使用flink来处理kafka中的无界流数据,采用的是flink on yarn的模式部署flink任务。最近做flink任务的监控过程中,踩了一些坑。下面是过程,只想看最终方案的直接拉到最后。
先说一下整体流程,flink官方支持通过配置,将运行过程中的jobManager,taskManager的各项指标推送给pushgateway(后面简称"pgw"),然后prometheus每隔30s从pgw主动拉取数据并存储;最后,grafana以prometheus作为数据源绘制各种指标的图标,同时alertmanager上配置了一些指标计算的表达式,当触发时会产生告警。
现在把重点放在 flink => pgw=> prometheus 这条链路上来
假设有2个flink job,因为是per job的模式,所以会在yarn上起两个flink 集群,每个集群都有1个jobManager和若干个taskManager(假设是2个)。最初的设计如下图
在测试场景中,每个作业只有少量的jobManager和taskManager,一直这样使用没问题。但是当部署到预生产环境时,需要调整作业的并行度,这时每个作业有1个jobManagerh和33个taskManager,作业也有将近10个。运行的过程中,发现pgw总是崩溃,导致指标数据中断。但是pgw本身也不支持调节运行各项参数,也找不到运行过程的打印的日志。怀疑其本身是个内存模型,推送的数据源过多导致数据量太大,内存溢出崩溃。(这里不得不吐槽pgw,挺不好用的)。同时也面临着单点问题(假使pgw能承载无限大的数据,但部署的节点有可能会宕机,导致指标都无法推送出去)。
于是从网上查询相关的解决方案,发现github上有个开源项目GitHub - ning1875/dynamic-sharding: 用动态分片解决pushgateway高可用 单点 HA问题,有一些解决思路。但对于我们来说不适用(公司对开源项目有比较严格的限制,且为此引入一整个分布式中间件consul有些矫枉过正的意思),但其提供的想法给了一些灵感。
最初的想法是使用“多点部署+nginx路由”的方式来解决HA的问题。在每个yarn的节点上全都部署一个pgw,然后将他们的ip+port作为上游资源池。flink侧将nginx节点的某个端口作为pgw的输入点,然后由nginx使用轮询的方式将请求依次发往不同的pgw,这样数据是均匀分布的,不会造成某个节点数据过多程序崩溃。然后prometheus从所有的pgw节点拉取数据,聚合在一起形成完整的数据。这样即使某个pgw节点挂了,但nginx有探活机制,它会将请求发往其他的pgw节点上。当宕机的pgw节点恢复后,nginx也会自动把请求分发给它。“完美”实现高可用。
然后新的问题就产生了,发现grafana上的图形针对同一个作业会生成多个图形。例如JobManager1的指标flink_jobmanager_job_uptime(上报flink作业运行时间的一项指标)会有多个图形。究其原因,正是因为nginx采用轮询的方式发送数据,导致JobManager1的指标数据可能在pgw1上有一部分,也可能在pgw2、pgw3上有一部分。
但prometheus抓取数据时,它在指标里增加了一项instance属性用于区分是从哪个pgw拿到的数据,导致本应该合并的数据没有合并,在promethues上用PromQL查询就会有多条数据(从而grafana上对于同一个指标会有多个图形)。但其实我们是不希望它区分数据从哪个pgw过来的,即对于同一个组件的同一个指标只希望有一条数据。那就需要把instance属性去除或掩盖。通过调研发现,在prometheus.yml里添加字段转换的配置可以实现
- job_name: "flink_monitor"scrape_interval: 30sstatic_configs:- targets: ['xxx.xxx.xxx.xxx:9091']metric_relabel_configs:- source_labels: [instance]target_laebl: 'instance'replacement: ''action: replace
相当于将instance的数值替换为空,这样就解决了多条数据的问题。
但是新的问题又产生了,发现grafana图形虽然只有一个了,但图形不正确。拿上述指标flink_jobmanager_job_uptime为例,它应该是个单调递增的直线,但实际显示它是乱七八糟的线,有上升也有下降,总运行时间怎么可能会下降呢,这不符合常识。
然后通过PromQL查询jobManager1的指标flink_jobmanager_job_uptime,是一条数据,但是,不停的点击查询发现,其数值不是递增的,有时候会变小。
又经过一番研究,才知道虽然instance被抹除了,但实际上prometheus还是从3个pwg节点上拿到了三份数据,表面上显示为一个指标项,但结果有三个。每次查询的时候随机返回一个。
这是jobManager推送指标数据到pgw的时间线,由于nginx的轮询机制,假设30s、60s、90s的指标发往了不同的pgw。而在prometheus的时间线上,就大有文章了。
由于prometheus是同时从多个pgw获取数据的,第30s时,由于只有pgw1有数据,拿到了指标值30,没问题。第60s时,pgw1和pgw2都有数据,同时拿到后prometheus将两个数据都存了下来,且pgw1返回的还是老数据,此时通过PromQL查询该指标时,你会发现值是在30和60两个值随机返回一个。到了90s时,pgw1、pgw2、pgw3都有了数据,而除了pgw3之外都是老数据,查询时也是随机挑一个返回。我晕~这样就能解释为啥grafana图形是乱的。
这pushgateway也太拉跨了,问你要数据你就给啊,也不看看你那都啥时候的数据了。
行,以解决问题为优先。如果,能把同一个组件(jobManager或taskManager)的数据发往同一个pgw,这样就不会产生多份数据的问题了,某个pgw只会独立的拥有某个jobManager的最新指标数据。我们知道nginx是有通过ip_hash,url_hash的能力,可能让同样的请求分发到同一个目标机器。
那就先研究一下,组件(jobManager或taskManager)上报指标时,它的请求是什么样的呢。通过nginx配置access_log后,打印出Request本身。以下是nginx.conf的部分配置(完整配置往后看),其中$request可以打印出请求url
# 定义日志打印格式
log_format main '$remote_addr - "$request" ''$status $upstream_addr';
通过转发的日志access_log发现,flink会调用以下API推送指标数据
PUT /metrics/job/flink-metrics112ljlkna02k1l29j210nkns HTTP/1.1
而中间这串flink-metrics112ljlkna02k1l29j210nkns,就是pgw的Group Key的概念(可以在pgw的前端页面上看到),每个独立的jobManager或taskManager都会拥有自己独一无二的Group Key。那答案就呼之欲出了,不需要解析报文体,请求的uri的唯一变化值就是Group Key,那只通过uri就能区分是哪个组件了。这不是完美契合nginx的uri_hash概念嘛,这样既解决了单点问题,又解决了数据混乱的问题。
说干就干,在nginx.conf上补充得到完整的配置。如下:
worker_processes 1;
events{worker_connections 1024;
}http {# 开启gzip压缩gzip on;# 下面这两项需要加,不加flink推送的指标数据过大,nginx转发会报错413# 配置请求体缓存区大小client_max_body_size 10m;# 配置客户端请求体最大值client_body_buffer_size 10m;# 配置上游服务器资源池upstream pushgateway_servers {# 配置按照uri进行hash,需要引入对应模块hash $request_uri# 配置pgw的实例ipserver xxx.xxx.xxx.xxx:9091;server xxx.xxx.xxx.xxx:9091;}# 定义日志打印格式log_format main '$remote_addr - "$request" ''$status $upstream_addr';server {listen 9099;server_name localhost;location / {proxy_pass http://pushgateway_servers; #使用上面的资源池proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;# 使用上面的日志定义access_log logs/access.log main;}}
}
配置完成后重启,发现一切“美好”~ 我们来分析一下现在的流程。
每个组件调用nginx时uri里已经表明了身份,通过url_hash,只会去往固定的pgw。也就是全量的组件数据会均匀(假设hash的均匀)分布在所有的pgw上,每个pgw拥有的数据都是独一无二且最新的,prometheusc从所有pgw获取数据拼凑成完整数据。
如果有pgw节点掉线(假设pgw1),nginx对于同一个uri的请求后续也会发往某个具体的pgw新节点(假设pgw2),不会发送给多个节点。同时因为pgw节点掉线,prometheus也无法从对应的pgw获取(老)数据,则不会产生多个数据值的问题。最多会因为抖动过程中,prometheus获取不到数据,在grafana上展示一个空点,但这是可以接受的。
那现在完美了吗?我又要说但是了,但是当pgw1节点恢复后,nginx由于自带的探活机制,又会重新把JM1的指标上送给pgw1,现在又出现pgw1和pgw2同时拥有JM1的数据,且pgw2是老数据。
现在的问题又到了,pgw1恢复时pgw2关于JM2的数据如何删除呢。dynamic-sharding里提到的,当pgw节点宕机需要从consul上剔除该节点,即使后面恢复也不使用该节点,这一点在consul里可以做到,但在nginx里无法控制啊。如果想要节点恢复使用,就等同于在扩容节点,需要重启所有pgw,以清除所有pgw内存中保留的数据。等下,重启pgw就可以清除旧数据,那我在pgw1节点恢复时,触发机制去重启pgw2不就相当于删除了JM2的旧数据。
事实上,这样并不好做。首先nginx根本没有提供相应的配置能让你在节点切走和切回时插入你想要的操作,可以通过lua脚本切入整个转发流程,但学习和使用成本较高。
在pgw的前端页面上,右上角有按钮“Delete All Groups”是可以删除当前pgw的所有数据的,通过这种方式可以实现不重启进程也能完成数据的删除,即通过API请求发到对应的pgw就可以实现清除其内存中的数据,而且不需要身份认证。
PUT /api/v1/admin/wipe
但由于无法得知pgw1挂了后,对应的组件数据被nginx重新分配到哪个节点中。目前采用的折衷处理方式是,在pgw的服务启动脚步里增加一个广播API请求到所有其他pgw节点上,以删除它们内存中的数据。这虽然会使最终prometheus中有些指标会缺失一两个数据点,但总比错误数据效果好一些吧。如果你有其他更好的方案,也欢迎来讨论。
至此,也就基本完成了pgw的HA。总结一下,通过部署多个pgw节点,前置nginx做负载均衡,通过uri_hash确保数据独立且均匀分布在所有pgw节点上。然后通过prometheus连接所有的pgw节点读取数据聚合形成flink集群完整数据。在pgw节点宕机时,数据会漂移至其他pgw节点继续上报。但当pgw节点恢复时,通过启动脚步广播API的方式清除其他所有pgw节点的内存数据。
相关文章:
pushgateway HA高可用方案
未经本人同意不得转载,若引用请附上原文链接。 项目使用flink来处理kafka中的无界流数据,采用的是flink on yarn的模式部署flink任务。最近做flink任务的监控过程中,踩了一些坑。下面是过程,只想看最终方案的直接拉到最后。 先说…...
在 Ubuntu Server 22.04 上安装 Docker 的详细步骤
本文档详细记录了在 Ubuntu Server 22.04 上安装 Docker 的完整过程,包括解决过程中遇到的问题。希望能对读者有所帮助。 安装过程,重点需要看官方文档。https://docs.docker.com/engine/install/ubuntu/ 步骤 1:卸载冲突的软件包 在安装 D…...
锻造船用发动机动力系统,铸强船舶“心脏”
船舶是海洋、湖泊及河流中重要的水上交通工具,不仅能够促进海上经济的发展,还能够保卫国家的制海权。船舶动力装置,也就是船舶的核心动力源——船用发动机动力系统对船舶的重要作用不言自明,关系到船舶的性能质量,能够…...
string类函数的手动实现
在上一篇文章中,我们讲解了一些string类的函数,但是对于我们要熟练掌握c是远远不够的,今天,我将手动实现一下这些函数~ 注意:本篇文章中会大量应用复用,这是一种很巧妙的方法 和以往一样,还是…...
前端工程化面试题(二)
前端模块化标准 CJS、ESM 和 UMD 的区别 CJS(CommonJS)、ESM(ESModule)和UMD(Universal Module Definition)是前端模块化标准的三种主要形式,它们各自有不同的特点和使用场景: CJS&…...
优化 LabVIEW 系统内存使用
在 LabVIEW 中,内存使用管理是确保高效系统性能的关键因素,尤其是在进行复杂的数据采集、信号处理和控制任务时。LabVIEW 程序的内存消耗可能会随着项目的规模和复杂度增加,导致性能下降,甚至出现内存溢出或程序崩溃。通过合理优化…...
pyqt6事件概要
例子: 利用qtdesigner建立闹钟 python代码 # 导入所需要的文件 from PyQt6.QtGui import QIcon, QPixmap from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QListWidgetItem from PyQt6 import uic from PyQt6.QtCore import Qt, QTime imp…...
鸿蒙分享(一):添加模块,修改app名称图标
码仓库:https://gitee.com/linguanzhong/share_harmonyos 鸿蒙api:12 新建公共模块common 在entry的oh-package.json5添加dependencies,引入common模块 "dependencies": {"common": "file:../common" } 修改app名称&…...
记忆泡沫垫市场:解锁舒适睡眠的黄金钥匙与增长潜力的深度剖析
在当今快节奏、高压力的生活中,优质睡眠已成为现代人追求健康生活的重要组成部分。记忆泡沫垫,作为床垫和枕头领域的一次革命性创新,凭借其独特的材质特性和对人体工学的完美贴合,正逐步成为改善睡眠质量的首选解决方案。本文将从…...
AI+电影特效产品化:开启电影人物年轻化新时代
随着人工智能技术的不断进步,它正在改变着我们生活的方方面面,包括娱乐产业。在电影制作领域,AI技术的应用尤其引人注目,尤其是在实现演员年轻化或老化效果方面。本文将介绍一款名为MyTimeMach...
探索 Python 应用的分层依赖:解决 UOS 环境中的 libvirt-python 安装问题
探索 Python 应用的分层依赖:解决 UOS 环境中的 libvirt-python 安装问题 背景Python 版本升级 问题描述原因分析与解决方案 Python 应用的分层依赖:安装与部署的视角libvirt-python的分层依赖尝试的解决方案 使用编译好的 .whl 文件"嫁接"整个…...
【MySQL 进阶之路】表级锁、行级锁详解
1. 表级锁和行级锁的概念及区别 表级锁(Table Lock) 表锁是一种较为粗粒度的锁,锁定的是整个表。当某个事务加锁表时,其他事务对该表的任何读写操作都会被阻塞,直到锁被释放。因此,表锁具有较高的冲突概率…...
FPGA系列,文章目录
前言 FPGA(Field-Programmable Gate Array,现场可编程门阵列)是一种集成电路,其内部结构可以通过软件重新配置来实现不同的逻辑功能。与传统的ASIC(Application-Specific Integrated Circuit,专用集成电路…...
离谱的梯形滤波器——增加过渡点
增加过渡点 频率采样法(Frequency Sampling Method)是一种设计FIR滤波器的方法,通过在频域中指定希望的频率响应,然后利用逆离散傅里叶变换(IDFT)来获得滤波器的脉冲响应。然而,这种方法容易导…...
容积卡尔曼滤波(CKF)仿真抛物线运动
容积卡尔曼滤波(CKF)仿真抛物线运动 容积卡尔曼滤波(Cubature Kalman Filter, CKF)的MATLAB实现。CKF是一种用于非线性系统状态估计的算法,它通过在状态空间中采样点(容积点)来近似非线性函数的…...
FlightGear+MATLAB+飞行手柄实现实时飞控视景系统
文章目录 一、软件配置二、FlightGearMATLAB联合仿真第一步 复制文件第二步 新建文件夹第三步 打开demo第四步 demo说明第五步 打开Simulink第六步 连接FlightGear第七步 设置FlightGear第八步 生成FlightGear连接文件FlightGear的设置Network的设置File的设置生成.bat文件 第九…...
Oracle 11g Data Guard 环境中的 GAP 处理办法
概述 在Data Guard 环境中,当主库的某些日志没有成功传送到备库时,就会发生归档裂缝(Archive Gap)。目前,Oracle 提供了两种日志 GAP 的检测和处理机制:自动 GAP 处理(Automatic Gap Resolutio…...
自建服务器,数据安全有保障
在远程桌面工具的选择上,向日葵和TeamViewer功能强大,但都存在收费昂贵、依赖第三方服务器、数据隐私难以完全掌控等问题。相比之下,RustDesk 凭借开源免费、自建服务的特性脱颖而出!用户可以在自己的服务器上部署RustDesk服务端&…...
华为HarmonyOS 快速构建各种文本识别应用 -- 通用文字识别
适用场景 通用文字识别,是通过拍照、扫描等光学输入方式,将各种票据、卡证、表格、报刊、书籍等印刷品文字转化为图像信息,再利用文字识别技术将图像信息转化为计算机等设备可以使用的字符信息的技术。 可以对文档翻拍、街景翻拍等图片进行…...
shell作业
计算器 #!/bin/bash num1$1 num2$3 op$2 case $op in"")echo $((num1 num2));;"-")echo $((num1 - num2));;"*")echo $((num1 * num2));;"/")if [ $num2 -ne 0 ]; thenecho $((num1 / num2))elseecho "除数不能为0"fi;;*)…...
css部分
前面我们学习了HTML,但是HTML仅仅只是做数据的显示,页面的样式比较简陋,用户体验度不高,所以需要通过CSS来完成对页面的修饰,CSS就是页面的装饰者,给页面化妆,让它更好看。 1 层叠样式表&#…...
nginx 配置 跨域、压缩、文件下载 、静态文件、防盗链
1.跨域配置 在server模块下 访问如:http://127.0.0.1:8080/static/a.txt #跨域server {listen 8080;server_name localhost;#允许跨域请求的域, *代表所有add_header Access-Control-Allow-Origin *;#允许带上cookie请求add_header Access-Contro…...
SQL教程(1):什么是SQL?有什么用?
如果你是刚接触用户研究的新手,可能会听说过一个词叫做 SQL(Structured Query Language,结构化查询语言),但你可能还不太清楚它是什么,如何使用它,或者为什么它会对你的用户研究有帮助。别担心&…...
c++笔记2
14、c的对象 对象和结构的区别; 结构:包含各种类型的变量; 对象:包含各种函数、和变量; 设计对象的时候引用class关键字创建类,和结构形状差不多; 将变量称之为属性,函数称之为方…...
Xlsxwriter生成Excel文件时TypeError异常处理
在使用 XlsxWriter 生成 Excel 文件时,如果遇到 TypeError,通常是因为尝试写入的值或格式与 XlsxWriter 的限制或要求不兼容。 1、问题背景 在使用 Xlsxwriter 库生成 Excel 文件时,出现 TypeError: “expected string or buffer” 异常。此…...
应用层协议/传输层协议(UDP)
目录 应用层 如何自定义应用层协议? 序列化方式 1.基于行文本的方式来传输 2.基于xml的方式 3.基于json的方式 4.yml的形式 5.protobuffer(pb)形式 传输层 端口号 协议 UDP 校验和 CRC TCP TCP/IP五层协议 应用层 -- 传输层 -- 网络层 -- 数据链路层…...
【Linux】应用层协议—HTTP
一、HTTP协议介绍 请求-响应模型:HTTP (Hyper Text Transfer Protocol) 协议是基于请求和响应的。客户端(如Web浏览器)发送一个HTTP请求到服务器,服务器处理请求后返回一个HTTP响应。 无状态,无连接协议:H…...
使用Vue3+Echarts实现加载中国地图,点击省份地图下钻(完整教程)
一. 前言 在众多 ECharts 图表类型中,开发者始终绕不开的有各种各样的地图开发,关于地图开发,可能比其他图表相对繁琐一些,其实说简单也简单,说复杂也复杂,其中不乏有层级地图、3D 地图等,感觉…...
双目相机的标定,视差图,深度图,点云生成思路与实现。
该文档记录从双目相机标定到点云生成的所有过程,同时会附上代码。 代码直接能跑。https://github.com/stu-yzZ/stereoCamera 目录 大致思路如下: 一、相机标定 1、相机参数介绍 2、单目相机标定 3、双目相机标定 二、图片畸变矫正 三、极线矫正…...
解决 minio上传文件Service: S3, Status Code: 403
错误信息 [software.amazon.awssdk.services.s3.model.S3Exception: (Service: S3, Status Code: 403, Request ID: 180E9BC04F11312E, Extended Request ID: 81aefed089495c5faf6270c59bea93c9783926f74ef647fe6b17908f0976b557)]分析过程 4XX一般是客户端错误。403表示禁止…...
SpringBoot实战——个人博客项目
目录 一、项目简介 ?二、项目整体架构 数据库模块 后端模块 前端模块 ?三、项目具体展示 ?四、项目的具体实现 1、一些准备工作 ??数据库、数据表的创建 ??设置数据库和MyBatis的配置 ??将前端项目引入到当前项目中 2、登录注册模块 ??实体类的创建 ?…...
OpenCV-平滑图像
二维卷积(图像滤波) 与一维信号一样,图像也可以通过各种低通滤波器(LPF)、高通滤波器(HPF)等进行过滤。LPF 有助于消除噪音、模糊图像等。HPF 滤波器有助于在图像中找到边缘。 opencv 提供了函数 **cv.filter2D()**&…...
nodejs官方文档学习-笔记-1
一、异步工作 process.nextTick(): 回调会在当前操作完成后立即执行,但在事件循环进入下一个阶段之前。它是最先执行的。 Promise.then(): 回调会在 microtask 队列中执行,通常是在当前操作完成后,但在事件循环进入…...
YOLOv7
YOLOv7 是 YOLO 系列的一个重要版本,由 Chien-Yao Wang 和 Alexey Bochkovskiy 等研究人员和开发者提出,继续改进了 YOLOv4 和 YOLOv5 的设计,主要在模型性能、训练效率以及推理速度上进行优化。YOLOv7 进一步优化了 YOLO 系列在速度和精度之…...
汉语唤醒词的模糊判断(Python)
汉语唤醒词的模糊判断【Python】 说明安装库代码Demo其他 说明 这是一个简单的汉语模糊唤醒词的判断器,汉语发音中前后舌以及声母韵母的区别,如果进行精准判断,很容易误判。需要一个模糊判断的逻辑! 安装库 pip install pypinyin代码Demo …...
C语言实例_26之根据输入计算星期几
1. 问题 请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。 2. 实现思路 思路一:嵌套if-else语句实现 首先接收用户输入的第一个字母,使用if-else语句进行判断。如果输入的是M࿰…...
包管理器npm,cnpm,yarn和pnpm
npm (Node Package Manager) 核心技术与工作原理 依赖解析: 广度优先搜索(BFS):npm 使用 BFS 算法来解析依赖树,尽量扁平化 node_modules 目录以减少重复的依赖项。冲突处理:如果两个包需要同一个依赖的不…...
docker-compose部署skywalking 8.1.0
一、下载镜像 #注意 skywalking-oap-server和skywalking java agent版本强关联,版本需要保持一致性 docker pull elasticsearch:7.9.0 docker pull apache/skywalking-oap-server:8.1.0-es7 docker pull apache/skywalking-ui:8.1.0二、部署文件docker-compose.yam…...
Android -- [SelfView] 自定义多行歌词滚动显示器
Android – [SelfView] 自定义多行歌词滚动显示器 流畅、丝滑的滚动歌词控件* 1. 背景透明;* 2. 外部可控制进度变化;* 3. 支持屏幕拖动调节进度(回调给外部);效果 歌词文件(.lrc) 一. 使用…...
记事本建java及java命名规范
1.桌面开发:c# 2. 记事本建java: 以class的名称(类名)为名,名称.java 编译jdk:javac 名称.java 调动运行jre : java 名称 查看名称.java里面的内容:cat 名称.java java 的命名规范 大驼峰(每个单词首…...
Elasticsearch scroll 之滚动查询
Elasticsearch scroll 之滚动查询 Elasticsearch 的 Scroll API 是一种用于处理大规模数据集的机制,特别是在需要从索引中检索大量数据时。通常情况下,Elasticsearch 的搜索请求会有一个结果集大小的限制 (fromsize 的检索数量默认是 10,000 条记录)&am…...
cartographer建图与定位应用
文章目录 前言一、安装cartographer1.安装环境2.源码编译2.1 下载2.2 编译 二、gazebo仿真2d建图0.准备仿真环境1.编写lua文件2.编写启动文件3.建图保存 三、cartographer定位 move_base导航3.1 编写启动文件3.2 启动launch 总结 前言 本文介绍cartographer在ubuntu18.04下的…...
CEEMDAN-CPO-VMD二次分解(CEEMDAN+冠豪猪优化算法CPO优化VMD)
CEEMDAN-CPO-VMD二次分解(CEEMDAN冠豪猪优化算法CPO优化VMD) 目录 CEEMDAN-CPO-VMD二次分解(CEEMDAN冠豪猪优化算法CPO优化VMD)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 首先运用CEEMDAN对数据进行一次分解ÿ…...
【Golang】Go语言编程思想(二):函数式编程
函数式编程 函数与闭包 支持函数式编程的语言当中,函数是一等公民,参数、变量、返回值都可以是函数。 以 adder 为例,下例实现了一个函数式编程: package mainimport "fmt"func adder() func(int) int {sum : 0retu…...
ros项目dual_arm_pick-place(moveit和gazebo联合仿真)(一)
目录 前言正文创建功能包具体代码运行 总结 前言 dual_arm_pick-place项目中,实现了两套的moveit和gazebo联合仿真。 启动文件分别是bringup_moveit.launch和arm_bringup_moveit.launch。 在这个项目中,我将代码重新创建了一个包,co_simula…...
点线面|点到两点直线距离求解
在点云库(PCL)中,计算点到直线的距离可以借助于向量运算。以下是这种计算方法的步骤以及相应的实现代码。 概念 要计算点 AA 到通过点 BB 和 CC 定义的直线的距离,可以使用以下步骤: 定义两个向量: 向量 …...
等保2.0三级测评华为华三交换机路由器
在使用本博客提供的学习笔记及相关内容时,请注意以下免责声明: 信息准确性:本博客的内容是基于作者的个人理解和经验,尽力确保信息的准确性和时效性,但不保证所有信息都完全正确或最新。 非专业建议:博客中的内容仅供参考,不能替代专业人士的意见和建议。在做出任何重要…...
鸿蒙分享(二):引入zrouter路由跳转+封装
码仓库:https://gitee.com/linguanzhong/share_harmonyos 鸿蒙api:12 鸿蒙第三方库地址:OpenHarmony三方库中心仓 zrouter地址:OpenHarmony三方库中心仓 1.引入zrouter 1.打开终端界面:输入 ohpm install hzw/zrouter 2.在项目…...
欧拉角和旋转矩阵之间的转换
在实际编程实践中,特别是使用C的Eigen库时,需要掌握多种空间旋转表示之间的转换。本文将深入探讨欧拉角与旋转矩阵之间的相互转换,这是使用库时常见的操作。 首先,让我们了解欧拉角。它是指通过围绕三个基本坐标轴旋转来表示三维对…...
Typora的激活
Typora的安装、激活 图文教程 | 2024年最新Typora激活使用教程合集 Typora 激活指南(2024年最新版) 图文教程 | 2024Typora最新版免费激活使用教程(新旧版可用)...