本算法复现了 RoboDK 的机器人校准功能:在训练集的理论校准后精度与 RoboDK 一致,在测试集的实测精度接近 Staubli 原厂

参考:RoboDK 机器人校准功能(https://robodk.com.cn/cn/robot-calibration)


特性

  • 支持 SDH 参数子集选择(每关节 α/a/θ/d 可独立选择是否参与校准)。
  • Base→WorldTool→Flange 外参与 DH 参数 联合估计
  • 残差为 TCP 三维位置(mm),输出统计与直方图对比。
  • 提供共垂线求解与可视化脚本,便于复核过程。

术语说明

  • 训练集(Training set):用于本算法与 RoboDK 共同辨识几何参数,包含 优化后 DH 参数基座到世界坐标系位姿 T_base^worldTCP 到法兰位姿 T_tcp^flange。由 3 个步骤的数据组成:

    1. 基座坐标系构建:26 组关节序列;
    2. TCP 构建:27 组关节序列;
    3. DH 校准与坐标系优化:≥60 组关节序列。
  • 测试集(Test set):在将辨识结果写入控制器后,用 ≥40 组 笛卡尔 TCP 位姿 验证机械臂的绝对定位精度

  • 执行方式:训练集与测试集均被转换为 Staubli VAL3 离线程序以驱动机器人(本工程不提供相应 VAL3 程序)。

  • 理论数值计算:以预设关节值经正向运动学求得 T_flange^base,再经坐标变换得到 T_tcp^world,与测量值作差得到位置残差。

给定关节角 J\mathbf{J}J 与前向运动学公式:
校准前(缺省 SDH)

Ttcpworld=Tbaseworld⋅Tflangebase(J)(默认 SDH)⋅Ttcpflange\;\mathbf T_{\text{tcp}}^{\text{world}}\;=\;\mathbf T_{\text{base}}^{\text{world}}\;\cdot\;\underset{\text{(默认 SDH)}}{\mathbf T_{\text{flange}}^{\text{base}}(\mathbf J)}\;\cdot\;\mathbf T_{\text{tcp}}^{\text{flange}}\;Ttcpworld=Tbaseworld(默认 SDH)Tflangebase(J)Ttcpflange

校准后(优化 SDH)
Ttcpworld′=Tbaseworld′⋅Tflangebase′(J)(优化 SDH)⋅Ttcpflange′\;{\mathbf T_{\text{tcp}}^{\text{world}}}'\;=\;{\mathbf T_{\text{base}}^{\text{world}}}'\;\cdot\;\underset{\text{(优化 SDH)}}{{\mathbf T_{\text{flange}}^{\text{base}}}'(\mathbf J)}\;\cdot\;{\mathbf T_{\text{tcp}}^{\text{flange}}}'\;Ttcpworld=Tbaseworld(优化 SDH)Tflangebase(J)Ttcpflange

校准效果

实验对象:TX2-90L 机械臂

机械臂简介与原厂精度

数据来源:robodk.com/robot/Staubli/TX2-90L

在这里插入图片描述

Staubli 原厂绝对定位精度:全工作空间 mean 0.07 mm、90%max 0.11 mm;在 508×508×508 mm 立方体子域内 mean 0.05 mm、90%max 0.08 mm。
数据来源:代码的工作路径/doc/TX2-90L/AbsoluteCalibrationQualityReport_TX2-90L.pdf

校准对比与结论

绝对定位精度图示(单位:mm)

图片1
本算法(训练集)校准前、后理论精度直方图
图片2
RoboDK(训练集)校准前、后理论精度直方图

绝对定位精度数据(单位:mm)
相同颜色为对比项。

算法数据集校准状态meanmax90%maxσnum of points
本算法训练集校准前(理论数值)0.4662830.8749760.6478410.1528510.91710860
训练集校准后(理论数值)0.0391630.0984290.0623820.0176920.10615360
测试集校准后(实际测量)0.05094660.10200010.083898440
RoboDK训练集校准前(理论数值)0.4660.8750.1540.92960
训练集校准后(理论数值)0.0390.0980.0180.09360

原始数据与报表见 代码的工作路径/RobotCalib/doc/TX2-90L/代码的工作路径/RobotCalib/results/TX2-90L/

要点:

  • 与 RoboDK 在同一训练集上的理论结果一致量级。
  • 写入控制器后的实测精度位于 Staubli 原厂报告立方体子域水平附近。
  • 测试集位姿分布与训练集不同,误差略有上浮,符合预期。

实验对象:TX200 机械臂

机械臂简介与原厂精度

数据来源:robodk.com/robot/Staubli/TX200

在这里插入图片描述

Staubli 原厂绝对定位精度:全工作空间 mean 0.17 mm、90%max 0.26 mm;在 847×847×847 mm 立方体子域内 mean 0.13 mm、90%max 0.18 mm。
数据来源:代码的工作路径/doc/TX200/AbsoluteCalibrationQualityReport_TX200.pdf

校准对比与结论

绝对定位精度图示(单位:mm)

图片1
本算法(训练集)校准前、后理论精度直方图
图片2
RoboDK(训练集)校准前、后理论精度直方图

绝对定位精度数据(单位:mm)
相同颜色为对比项。

算法数据集校准状态meanmax90%maxσnum of points
本算法训练集校准前(理论数值)1.2853612.1417031.6733690.3062901.837739107
训练集校准后(理论数值)0.1424120.4875900.2138810.0713940.428367107
测试集校准后(实际测量)0.1438180.5012940.24605744
RoboDK训练集校准前(理论数值)1.2692.1280.3092.196107
训练集校准后(理论数值)0.1420.4880.0720.358107

原始数据与报表见 代码的工作路径/RobotCalib/doc/TX200/代码的工作路径/RobotCalib/results/TX200/

要点:

  • 与 RoboDK 在同一训练集上的理论结果一致量级。
  • 实测精度位于原厂全域与立方体子域之间;由于训练/测试子域范围较原厂报告的立方体子域更大,误差略有放大属预期。
  • 测试集位姿分布更复杂,精度略低于训练集理论值。

总体结论
在 TX2-90L 与 TX200 两个样例上,本算法成功复现了 RoboDK 的校准能力;写入控制器后的实测绝对精度接近 Staubli 原厂校准水平。


环境依赖

  • C++17 编译器(GCC 9+/Clang 10+/MSVC 2019+)
  • CMake 3.16+
  • Eigen 3
  • Ceres Solver(含 EigenQuaternionParameterization
  • yaml-cpp
  • Python 3(可视化脚本:numpymatplotlib

Ubuntu 示例:

sudo apt update
sudo apt install -y build-essential cmake libeigen3-dev libyaml-cpp-dev libceres-dev \python3 python3-pip
pip3 install -U numpy matplotlib

macOS (Homebrew):

brew install cmake eigen ceres-solver yaml-cpp
pip3 install -U numpy matplotlib

编译

终端进入工程目录

mkdir build && cd build
cmake .. && make -j8

可执行文件输出:build/RobotCalibration


快速开始(内置样例)

项目提供两套样例数据 TX2-90L / TX200,样例数据是我在现场使用高精度设备采集的,并提供两套校准模型选项 simple / complete,推荐使用complete校准模型,本文所有的校准数据均使用complete模型获得:

# 运行样例:TX2-90L + complete
./build/RobotCalibration TX2-90L complete# 运行样例:TX200 + complete
./build/RobotCalibration TX200 complete

命令行参数:

Usage: RobotCalibration <robot_name: TX2-90L|TX200> <calib_mode: simple|complete>

程序会自动读取:

  • DH:config/DH/<robot_name>-default.yml
  • 选项:config/option/CalibConfig<Simple|Complete>.yml
  • 测量:config/measured/<robot_name>/机器人校准-Calibration.csv(及 Base/Tool 初始化所需 CSV)

输出默认写入:results/<robot_name>/


输出与可视化

运行结束后,results/<robot_name>/ 下包含:

  • OptimalReport_<robot_name>.txt
    • Base/Tool 外参(平移 + 四元数)
    • 原始与优化后的 DH 表
    • 逐样本三维位置误差及统计
  • accuracy_stats_hist_<robot_name>.png:校准前后的定位精度对比直方图

示例,OptimalReport_TX2-90L.txt如下:

========================== Calibration Report ==========================[1]base2world Transformation( [X,Y,Z]mm|Quaternion[q1-q4] ):331.331991,  349.413195,  429.000644,  -0.000022,  0.002251,  0.001411,  0.999996[2]tool2flange Transformation( [X,Y,Z]mm|Quaternion[q1-q4] ):24.990101,  0.213438,  14.899634,  0.000000,  0.000000,  0.000000,  1.000000[3] Original SDH Parameters:
Joint   Alpha(deg)      a(mm)           theta(deg)      d(mm)           
------------------------------------------------------------------------
1       -90.000000      50.000000       0.000000        0.000000        
2       0.000000        500.000000      -90.000000      0.000000        
3       90.000000       0.000000        90.000000       50.000000       
4       -90.000000      0.000000        0.000000        550.000000      
5       90.000000       0.000000        0.000000        0.000000        
6       0.000000        0.000000        0.000000        100.000000      [4] Optimized SDH Parameters:
Joint   Alpha(deg)      a(mm)           theta(deg)      d(mm)           
------------------------------------------------------------------------
1       -89.976980      50.072944       0.000000        0.000000        
2       0.021435        499.915919      -90.052042      0.000000        
3       90.007793       -0.258274       90.043030       50.250723       
4       -90.017136      0.022018        0.113726        549.979965      
5       90.009449       -0.008709       -0.073612       -0.016915       
6       0.000000        0.000000        0.000000        100.000000      
------------------------------------------------------------------------[5] Measurement Errors (per group):测量1:误差 = 0.026507 mm / 0.664059 mm(校准/未校准)测量2:误差 = 0.022484 mm / 0.473525 mm(校准/未校准)测量3:误差 = 0.048078 mm / 0.593382 mm(校准/未校准)测量4:误差 = 0.017212 mm / 0.286039 mm(校准/未校准)测量5:误差 = 0.027732 mm / 0.647841 mm(校准/未校准)测量6:误差 = 0.032805 mm / 0.217326 mm(校准/未校准)测量7:误差 = 0.035003 mm / 0.285724 mm(校准/未校准)测量8:误差 = 0.047712 mm / 0.182410 mm(校准/未校准)测量9:误差 = 0.079666 mm / 0.328047 mm(校准/未校准)测量10:误差 = 0.063394 mm / 0.456054 mm(校准/未校准)测量11:误差 = 0.034709 mm / 0.391084 mm(校准/未校准)测量12:误差 = 0.022172 mm / 0.455564 mm(校准/未校准)测量13:误差 = 0.036401 mm / 0.372025 mm(校准/未校准)测量14:误差 = 0.030719 mm / 0.494504 mm(校准/未校准)测量15:误差 = 0.054269 mm / 0.580226 mm(校准/未校准)测量16:误差 = 0.034244 mm / 0.375517 mm(校准/未校准)测量17:误差 = 0.008812 mm / 0.634352 mm(校准/未校准)测量18:误差 = 0.035747 mm / 0.420587 mm(校准/未校准)测量19:误差 = 0.048377 mm / 0.445601 mm(校准/未校准)测量20:误差 = 0.062382 mm / 0.520417 mm(校准/未校准)测量21:误差 = 0.043945 mm / 0.516382 mm(校准/未校准)测量22:误差 = 0.028854 mm / 0.294653 mm(校准/未校准)测量23:误差 = 0.040496 mm / 0.220989 mm(校准/未校准)测量24:误差 = 0.012670 mm / 0.412269 mm(校准/未校准)测量25:误差 = 0.098429 mm / 0.802622 mm(校准/未校准)测量26:误差 = 0.034564 mm / 0.312927 mm(校准/未校准)测量27:误差 = 0.057626 mm / 0.691680 mm(校准/未校准)测量28:误差 = 0.017561 mm / 0.374001 mm(校准/未校准)测量29:误差 = 0.037320 mm / 0.463712 mm(校准/未校准)测量30:误差 = 0.050038 mm / 0.525567 mm(校准/未校准)测量31:误差 = 0.038108 mm / 0.874976 mm(校准/未校准)测量32:误差 = 0.046431 mm / 0.425734 mm(校准/未校准)测量33:误差 = 0.027192 mm / 0.575715 mm(校准/未校准)测量34:误差 = 0.016891 mm / 0.355442 mm(校准/未校准)测量35:误差 = 0.048557 mm / 0.327223 mm(校准/未校准)测量36:误差 = 0.056675 mm / 0.637538 mm(校准/未校准)测量37:误差 = 0.069998 mm / 0.400602 mm(校准/未校准)测量38:误差 = 0.086267 mm / 0.289902 mm(校准/未校准)测量39:误差 = 0.021268 mm / 0.472069 mm(校准/未校准)测量40:误差 = 0.035523 mm / 0.566289 mm(校准/未校准)测量41:误差 = 0.035594 mm / 0.565018 mm(校准/未校准)测量42:误差 = 0.036709 mm / 0.637583 mm(校准/未校准)测量43:误差 = 0.026452 mm / 0.207000 mm(校准/未校准)测量44:误差 = 0.024210 mm / 0.485523 mm(校准/未校准)测量45:误差 = 0.051299 mm / 0.372913 mm(校准/未校准)测量46:误差 = 0.053558 mm / 0.368482 mm(校准/未校准)测量47:误差 = 0.036068 mm / 0.304884 mm(校准/未校准)测量48:误差 = 0.022227 mm / 0.426705 mm(校准/未校准)测量49:误差 = 0.045959 mm / 0.338290 mm(校准/未校准)测量50:误差 = 0.064172 mm / 0.386015 mm(校准/未校准)测量51:误差 = 0.026428 mm / 0.523266 mm(校准/未校准)测量52:误差 = 0.017636 mm / 0.647093 mm(校准/未校准)测量53:误差 = 0.022520 mm / 0.511791 mm(校准/未校准)测量54:误差 = 0.032559 mm / 0.265368 mm(校准/未校准)测量55:误差 = 0.031090 mm / 0.471388 mm(校准/未校准)测量56:误差 = 0.031606 mm / 0.795395 mm(校准/未校准)测量57:误差 = 0.036189 mm / 0.473452 mm(校准/未校准)测量58:误差 = 0.035285 mm / 0.610204 mm(校准/未校准)测量59:误差 = 0.055424 mm / 0.681401 mm(校准/未校准)测量60:误差 = 0.027973 mm / 0.540605 mm(校准/未校准)[6]校准结果统计(位置误差,单位:mm)mean       max        90%max     σ         6σ        number_of_points
------------------------------------------------------------------------------
校准前      0.466283   0.874976   0.647841   0.152851   0.917108         60
校准后      0.039163   0.098429   0.062382   0.017692   0.106153         60

示例,accuracy_stats_hist_TX2-90L.png如下:
在这里插入图片描述

手动生成直方图(可自定义输入报告路径):

python3 code/scripts/visualize_optimal_report.py results/TX200/OptimalReport_TX200.txt

演示平面法向与法向可视化(示例脚本):

python3 code/scripts/visualize_normal_plane.py

Docker(可选)

如需在容器内复现实验:

# 构建
docker build -t robotcalib -f docker/Dockerfile .# 运行(挂载当前工程,启用多核)
docker run --rm -it robotcalib \bash -lc "mkdir build && cd build && cmake .. && make -j8 && ./build/RobotCalibration TX2-90L complete"

如需导出图片到宿主机,确保将 results/ 目录挂载到宿主机路径。


技术服务

机械臂绝对精度/外参校准实战落地:提供线下的校准服务与线上的全量资料包(原理说明+完整代码+实测数据+软件操作+一线经验)。线上可持续答疑。

商业合作与答疑可加V,

可选的机械臂校准资料包

【机械臂校准资料包链接1】
【机械臂校准资料包链接2】

线上的全量资料包(原理说明+完整代码+实测数据+软件操作+一线经验)包括以下所有内容:

$ tree
.
├── 代码
│   └── RobotCalib
│       ├── CMakeLists.txt
│       ├── README.md
│       ├── code
│       │   ├── include
│       │   │   ├── core
│       │   │   │   ├── BaseCalib.hpp
│       │   │   │   ├── NormalCrossCompute.h
│       │   │   │   ├── RobotCalib.h
│       │   │   │   └── ToolCalib.hpp
│       │   │   └── tools
│       │   │       ├── DataReader.h
│       │   │       ├── DataStas.h
│       │   │       ├── Forward.h
│       │   │       └── MatrixCompute.h
│       │   ├── scripts
│       │   │   ├── visualize_normal_plane.py
│       │   │   └── visualize_optimal_report.py
│       │   └── source
│       │       ├── core
│       │       │   ├── NormalCrossCompute.cpp
│       │       │   └── RobotCalib.cpp
│       │       ├── main.cpp
│       │       └── tools
│       │           ├── DataReader.cpp
│       │           ├── DataStas.cpp
│       │           └── MatrixCompute.cpp
│       ├── config
│       │   ├── DH
│       │   │   ├── TX2-90L-default.yml
│       │   │   └── TX200-default.yml
│       │   ├── measured
│       │   │   ├── TX2-90L
│       │   │   │   ├── TX2-90L_绝对精度验证结果(测试集).xlsx
│       │   │   │   ├── 机器人校准-BaseSetup.csv
│       │   │   │   ├── 机器人校准-Calibration.csv
│       │   │   │   └── 机器人校准-ToolSetup.csv
│       │   │   └── TX200
│       │   │       ├── TX200_绝对精度验证结果(测试集).xlsx
│       │   │       ├── 机器人校准-BaseSetup.csv
│       │   │       ├── 机器人校准-Calibration.csv
│       │   │       └── 机器人校准-ToolSetup.csv
│       │   └── option
│       │       ├── CalibConfigComplete.yml
│       │       └── CalibConfigSimple.yml
│       ├── doc
│       │   ├── TX2-90L
│       │   │   ├── AbsoluteCalibrationQualityReport_TX2-90L.pdf
│       │   │   ├── RoboDK校准报告-TX2-90L.pdf
│       │   │   ├── RoboD校准位置精度截图-TX2-90L.png
│       │   │   ├── TX2-90L简介.png
│       │   │   └── 原厂校准位置精度截图-TX2-90L.png
│       │   ├── TX200
│       │   │   ├── AbsoluteCalibrationQualityReport_TX200.pdf
│       │   │   ├── RoboDK校准报告-TX200.pdf
│       │   │   ├── RoboDK校准位置精度截图-TX200.png
│       │   │   ├── TX200简介.png
│       │   │   └── 原厂校准位置精度截图-TX200.png
│       │   └── 计算共垂线的算法原理.md
│       ├── docker
│       │   └── Dockerfile
│       └── results
│           ├── TX2-90L
│           │   ├── OptimalReport_TX2-90L.txt
│           │   └── accuracy_stats_hist_TX2-90L.png
│           └── TX200
│               ├── OptimalReport_TX200.txt
│               └── accuracy_stats_hist_TX200.png
└── 文档├── robodk软件使用说明│   └── robodk进行机械臂校准的流程.vsdx├── 校准原理说明│   └── 工业六轴机械臂标定校准原理说明.docx└── 高级工程师经验分享└── staubli机械臂标定校准实施标准操作流程(真实工作经历吐血总结).docx28 directories, 49 files
(base) 

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue常用指令和生命周期

Vue 是基于 MVVM模型的前端 JavaScript 框架。Vue 核心是数据驱动视图&#xff0c;通过响应式数据实现视图自动更新。<template><div>{{ message }}</div><button click"changeMsg">修改内容</button> </template><script se…

深度学习周报(8.25~8.31)

目录 摘要 Abstract 1 RNN学习意义 2 RNN基础知识 2.1 核心思想 2.2 传播 2.3 优缺点 2.4 变体结构与应用场景 3 RNN结构代码示例 4 总结 摘要 本周主要学习了循环神经网络的学习意义与基础知识&#xff0c;重点了解了RNN循环连接的核心思想、前向传播与反向传播过程…

借助 LAMBDA 公式,实现单元格区域高效转换

新特性介绍 “转换单元格&#xff08;Transform&#xff09;” 功能允许用户将自定义的单参数 LAMBDA 公式应用于选中的单元格区域。用户可选择公式参数的作用域 —— 按单元格、按行、按列或按整个区域。 转换完成后&#xff0c;源单元格区域会被清空&#xff0c;转换后的区…

LeetCode 01背包 494. 目标和

494. 目标和给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 ‘’ &#xff0c;在 1 之前…

Dify 1.8.0 全网首发,预告发布

距离Dify 1.7.2过去两周了 Dify 1.8.0 又跟大伙见面了&#xff01; 1.8.0&#xff0c;属于主版本号不变、但第二位数字更新的“阶段性大更”&#xff0c;意味着功能上的显著优化和体验上的重要升级。 根据官方的Github日志&#xff0c;这一版本将继续聚焦三大核心方向&#x…

基于LangChain框架搭建AI问答系统(附源码)

AI问答系统1. 背景知识2. 问答系统流程3. 知识问答系统相关组件3.1 文档加载器3.2 文档切割器3.3 嵌入模型包装器3.4 向量存储库3.5 模型包装器3.6 链组件4. 问答系统演示4.1 问答程序4.2 演示大模型回答效果5.问答系统代码1. 背景知识 在人工智能技术飞速发展的今天&#xff…

【Python】QT(PySide2、PyQt5):Qt Designer,VS Code使用designer,可能的报错

Qt designer&#xff1a;可直接在designer界面&#xff0c;使用拖拽的方式设计需要的界面&#xff0c;可设定部分属性。安装Pyside2后&#xff0c;designer默认在python安装目录的Lib/sit_packages/PySide2文件夹中。designer使用&#xff1a;① 双击打开designer.exe&#xff…

前端常见安全问题 + 防御方法 + 面试回答

目录 XSS&#xff08;跨站脚本攻击&#xff09;CSRF&#xff08;跨站请求伪造&#xff09;SQL 注入文件上传漏洞其他前端常见安全问题面试常见问答 1. XSS&#xff08;跨站脚本攻击&#xff09; 定义 XSS&#xff08;Cross-Site Scripting&#xff09;是一种 通过注入恶意脚…

jxWebUI--下拉选择框

下拉选择框提供了预先定义好的选项&#xff0c;用户只能在这些选项中选择输入。 combobox 定义格式 combobox 控件名 属性列表 ;属性 bind 类型&#xff1a;string 缺省值&#xff1a; 输入控件所绑定的变量名。当给输入控件bind了一个变量名后【bindbind_var_name】&#xff0…

大模型时代:用Redis构建百亿级向量数据库方

大模型时代&#xff1a;用Redis构建百亿级向量数据库方案第一章&#xff1a;大模型时代的向量数据库挑战1.1 大模型时代的特征与需求1.2 向量数据库的核心价值1.3 百亿级向量的技术挑战第二章&#xff1a;Redis作为向量数据库的优势2.1 Redis的核心优势2.2 Redis向量搜索模块&a…

jsqlparser(六):TablesNamesFinder 深度解析与 SQL 格式化实现

在数据库应用开发中&#xff0c;SQL语句的解析和处理是一项常见而重要的任务。本文将深入探讨 JSQLParser 中的 TablesNamesFinder 类&#xff0c;分析其核心原理、与 AST 访问接口&#xff08;CCJSqlParserVisitor &#xff09;的关系、使用场景&#xff0c;并通过实际代码示例…

Python训练营打卡Day49-神经网络调参指南

知识点回顾&#xff1a;随机种子内参的初始化神经网络调参指南 参数的分类调参的顺序各部分参数的调整心得 作业&#xff1a;对于day41的简单cnn&#xff0c;看看是否可以借助调参指南进一步提高精度。 随机种子 import torch import torch.nn as nn# 定义简单的线性模型&…

Elasticsearch 常用任务管理命令及实战应用

常用任务管理命令 列出所有任务 curl -X GET "http://<es_host>:<es_port>/_tasks?detailedtrue&pretty" -H Content-Type: application/json获取特定类型的任务 curl -X GET "http://<es_host>:<es_port>/_tasks?actions<act…

Java试题-选择题(26)

Java试题-选择题(26) 题目 下列有关Thread的描述,哪个是正确的 ? A:启动一个线程的方法是:thread. run() B:结束一个线程的通常做法是:thread. stop() C:将一个线程标记成daemon线程,意味着当主线程结束,并且没有其它正在运行的非daemon线程时,该daemon线程也会自…

缓存的原理、引入及设计

开篇寄语&#xff1a;缓存&#xff0c;你真的用对了吗&#xff1f; 我们为什么要学习缓存呢&#xff1f;有必要学习缓存吗&#xff1f; 缓存的使用&#xff0c;是提升系统性能、改善用户体验的唯一解决之道。 其实&#xff0c;作为互联网公司&#xff0c;只要有直接面对用户的业…

单片机如何控制模数转换芯片

一、介绍单片机控制模数转换&#xff08;ADC&#xff09;芯片的核心是通过通信接口发送控制指令&#xff0c;并读取转换后的数字信号&#xff0c;本质是“指令交互数据传输”的协同过程&#xff0c;具体实现需分4步完成&#xff0c;关键在于接口匹配和时序同步。二、核心1. 先明…

【Proteus仿真】开关控制系列仿真——开关控制LED/拨码开关二进制计数/开关和继电器控制灯灭

目录 0案例视频效果展示 0.1例子1&#xff1a;开关控制LED灯亮灭 0.2例子2&#xff1a;数码管显示拨码开关二进制计数(000~255) 0.3例子3&#xff1a;开关和继电器控制灯亮灭 1基础知识补充 1.1 74LS245双总线收发器 1.1.1 引脚及功能 1.1.2应用场景 1.1.3真值表 1.2…

Q1 Top IF 18.7 | 基于泛基因组揭示植物NLR进化

文章DOI: 10.1016/j.chom.2025.07.011 标题&#xff1a;Pangenomic context reveals the extent of intraspecific plant NLR evolution 期刊&#xff1a;Cell Hose & Microbe (https://i-blog.csdnimg.cn/direct/0e31f86b94d348b0a1adb084ec4e49b7.png)(https://i-blog.cs…

技术干货|Prometheus PromQL查询语言之聚合操作内置函数

聚合操作 Prometheus还提供了下列内置的聚合操作符,这些操作符作用域瞬时向量。可以将瞬时表达式返回的样本数据进行聚合,形成一个新的时间序列。 sum (求和) min (最小值) max (最大值) avg (平均值) stddev (标准差) stdvar (标准差异) count (计数) count_values …

Redis 哨兵(Sentinel)全面解析

在2025年的数字化浪潮中&#xff0c;想象这样一个场景&#xff1a;凌晨3点&#xff0c;电商平台流量突然暴增&#xff0c;主Redis服务器因硬件故障突然宕机。几年前&#xff0c;这意味着紧急电话、慌乱的运维人员和不可避免的业务中断。而今天&#xff0c;用户甚至没有察觉任何…