【机器人学】6-4.六自由度机器人运动学参数辨识-机器人精度验证【附MATLAB代码】
前言
前两个章节以及完成了机器人参数辨识。
【机器人学】6-1.六自由度机器人运动学参数辨识-辨识数学模型的建立
【机器人学】6-2.六自由度机器人运动学参数辨识-优化方法求解辨识参数
这里我们认为激光测量仪测量到的数据为机器人实际到达的位置,而机器人理论到达的位置是通过运动学解算出来的,在实际过程中,会产生误差导致机器人的理论位置与实际位置不相同。因此引出机器人的精度问题。
在标定了工具端、基座以及机器人本身的DH参数。那么我们的机器人精度如何呢?机器人的精度应该如何验证?
关于末端定位精度的概念
当我们在机械臂领域谈到未端定位精度这一概念时,实际上是诸多复杂概念的一个统称。整体而言,未端定位精度是描述机械臂整机运动性能的重要定量指标(一般我们会看到这个定量的数值在0.01mm和1m之间),其与机械臂本体硬件结构的刚度、传动误差与相应的伺服控制水平息息相关。
重复定位精度和绝对定位精度
在大多数情况下,工程师口中所述的未端定位精度一般指的是重复定位精度,这边首先就要引出两个重要概念的区分介绍:即重复定位精度(Repeatability)与绝对定位精度(Accuracy)。
重复定位精度是衡量机械臂未端到达空间相同一点一致性的能力,而绝对定位精度衡量的是机械臂未端到达空间目标点准确度的能力。
比如:让机械臂向前走100mm,第一次走到了99.8mm,第二次走到了100.1mm,这个差值0.03mm就是重复定位精度(并不是严格定义),而绝对定位精度是你需要运行100mm的距离,而实际走了101mm,这个差值1mm就是绝对定位精度。
通常由于机械臂本体制造中存在机械制造公差装配误差导致的运动学参数误差以及电机转角与关节转角间减速比误差等,导致机械臂存在重复性定位精度较高(0.05 mm /5个丝)以内,而绝对定位精度通常较低(1~2mm)。
验证标准
我们今天的定位精度的验证标准,遵循中华人民共和国国家标准-工业机器人性能规范及其试验方法-GB/T 12642
验证方法
实验条件:
1. 给机械臂安装一定的负载(通常使用半载),让机器人循环走空间中的5个点30次。用激光测量仪采集数据。此时可以得到激光测量仪采集到的5*30=150个数据,和给定的5个位置数据。
计算位姿准确度-绝对定位精度(AP)
计算位姿重复性-重复定位精度(RP)
重复定位进度的计算只需要对测量到的5*30=150个数据进行操作,而绝对定位精度的计算需要将给定的5个点的位置,与测量值相比较,由于激光测量仪的测量坐标系,与机械臂给定位置的给定值的坐标系不同,故需要进行转换。
其中
T06为我们的给定值,而T67和T-10,以经通过标定给出,故只需用式(6.2)即可求出在激光测量仪坐标系下的给定值。
已知标定后的结果为:
MATLAB代码验证
数据与函数准备
%重复的5个点的位置
function Position = verifyPara()
Position = [
-150,-350,630,78,-42,35;
-150,-650,930,79,-41,37;
150,-650,930,78,-42,35;
150,-350,630,81,-43,37;
0,-500,780,78,-45,41;
];
end
%激光测量仪测量到的5*30=150个数据
function measurementPara= measurementPara()
measurementPara = [
2227.1503 1299.0807 -124.93645 0 0 0;
1958.0963 1161.9514 171.70475 0 0 0;
2087.8145 896.25159 170.83141 0 0 0;
2362.3512 1026.0956 -131.34257 0 0 0;
2161.0067 1090.2524 22.07108 0 0 0;
2227.1328 1299.0675 -124.95587 0 0 0;
1958.0968 1161.9532 171.70837 0 0 0;
2087.8123 896.25279 170.83337 0 0 0;
2362.3504 1026.1024 -131.33808 0 0 0;
2161.0008 1090.2239 22.05651 0 0 0;
2227.1277 1299.0672 -124.957 0 0 0;
1958.0944 1161.9271 171.69652 0 0 0;
2087.7926 896.30133 170.84371 0 0 0;
2362.352 1026.0943 -131.34141 0 0 0;
2161.0026 1090.2215 22.057113 0 0 0;
2227.1286 1299.0658 -124.95844 0 0 0;
1958.0881 1161.9125 171.68597 0 0 0;
2087.7965 896.30007 170.84699 0 0 0;
2362.3567 1026.0941 -131.33545 0 0 0;
2161.0043 1090.217 22.058082 0 0 0;
2227.1269 1299.0627 -124.95822 0 0 0;
1958.088 1161.9106 171.68716 0 0 0;
2087.7957 896.30107 170.85008 0 0 0;
2362.3557 1026.0953 -131.33103 0 0 0;
2161.0028 1090.2176 22.054826 0 0 0;
2227.1245 1299.0624 -124.96233 0 0 0;
1958.0895 1161.9066 171.68568 0 0 0;
2087.7962 896.30256 170.84894 0 0 0;
2362.3569 1026.0909 -131.34075 0 0 0;
2161.0029 1090.2189 22.054347 0 0 0;
2227.1223 1299.0567 -124.96166 0 0 0;
1958.0858 1161.9049 171.68655 0 0 0;
2087.7986 896.30332 170.85224 0 0 0;
2362.3574 1026.094 -131.33775 0 0 0;
2161.0037 1090.2248 22.057439 0 0 0;
2227.1271 1299.0604 -124.95894 0 0 0;
1958.0896 1161.902 171.68774 0 0 0;
2087.7967 896.3074 170.85602 0 0 0;
2362.3575 1026.0921 -131.33658 0 0 0;
2161.0086 1090.2505 22.072462 0 0 0;
2227.1324 1299.0626 -124.95405 0 0 0;
1958.087 1161.8947 171.68433 0 0 0;
2087.7972 896.30836 170.85737 0 0 0;
2362.3605 1026.0935 -131.33612 0 0 0;
2161.0121 1090.2599 22.0819 0 0 0;
2227.1424 1299.0687 -124.94304 0 0 0;
1958.0947 1161.9415 171.70198 0 0 0;
2087.8176 896.26544 170.84715 0 0 0;
2362.3669 1026.0778 -131.34163 0 0 0;
2161.0095 1090.2586 22.077012 0 0 0;
2227.148 1299.0718 -124.93995 0 0 0;
1958.0974 1161.9659 171.71319 0 0 0;
2087.8227 896.243 170.83566 0 0 0;
2362.3656 1026.0794 -131.33656 0 0 0;
2161.0053 1090.2222 22.060474 0 0 0;
2227.1404 1299.0653 -124.94379 0 0 0;
1958.09 1161.9415 171.69821 0 0 0;
2087.8048 896.28336 170.84699 0 0 0;
2362.3655 1026.0884 -131.33415 0 0 0;
2161.0052 1090.2181 22.058498 0 0 0;
2227.141 1299.0652 -124.94244 0 0 0;
1958.0846 1161.9042 171.68599 0 0 0;
2087.7997 896.29979 170.85183 0 0 0;
2362.3688 1026.087 -131.33232 0 0 0;
2161.0078 1090.2438 22.073072 0 0 0;
2227.1406 1299.0661 -124.94075 0 0 0;
1958.0869 1161.9088 171.68885 0 0 0;
2087.7986 896.30631 170.86088 0 0 0;
2362.3698 1026.0803 -131.33583 0 0 0;
2161.0135 1090.2543 22.081642 0 0 0;
2227.1481 1299.0694 -124.93844 0 0 0;
1958.1003 1161.9703 171.7137 0 0 0;
2087.8147 896.27067 170.85004 0 0 0;
2362.3702 1026.0732 -131.33896 0 0 0;
2161.0145 1090.2489 22.079415 0 0 0;
2227.1411 1299.0657 -124.93989 0 0 0;
1958.0911 1161.9327 171.69864 0 0 0;
2087.8039 896.3008 170.85674 0 0 0;
2362.3693 1026.0841 -131.3328 0 0 0;
2161.0093 1090.2225 22.064856 0 0 0;
2227.1393 1299.0619 -124.94452 0 0 0;
1958.0888 1161.8893 171.6866 0 0 0;
2087.8052 896.3025 170.86156 0 0 0;
2362.3721 1026.0838 -131.33244 0 0 0;
2161.0165 1090.2413 22.082128 0 0 0;
2227.1346 1299.0572 -124.9494 0 0 0;
1958.0907 1161.8902 171.68926 0 0 0;
2087.8045 896.30308 170.85715 0 0 0;
2362.3694 1026.0844 -131.33563 0 0 0;
2161.0153 1090.2449 22.080295 0 0 0;
2227.135 1299.058 -124.94482 0 0 0;
1958.0889 1161.8905 171.68681 0 0 0;
2087.8068 896.30223 170.86288 0 0 0;
2362.373 1026.0809 -131.3344 0 0 0;
2161.014 1090.2388 22.081018 0 0 0;
2227.1381 1299.0576 -124.94568 0 0 0;
1958.0941 1161.8954 171.6958 0 0 0;
2087.8106 896.29813 170.86339 0 0 0;
2362.3744 1026.0758 -131.33531 0 0 0;
2161.0166 1090.2423 22.079447 0 0 0;
2227.1338 1299.0522 -124.94801 0 0 0;
1958.0918 1161.8941 171.68975 0 0 0;
2087.8121 896.2927 170.85906 0 0 0;
2362.3766 1026.0839 -131.33044 0 0 0;
2161.0195 1090.2426 22.081034 0 0 0;
2227.1346 1299.052 -124.94854 0 0 0;
1958.0941 1161.8959 171.69126 0 0 0;
2087.811 896.29205 170.86051 0 0 0;
2362.3757 1026.0845 -131.33301 0 0 0;
2161.024 1090.2508 22.08968 0 0 0;
2227.1534 1299.0688 -124.92994 0 0 0;
1958.1047 1161.9637 171.71792 0 0 0;
2087.8274 896.25739 170.85273 0 0 0;
2362.3796 1026.0758 -131.33511 0 0 0;
2161.0208 1090.2432 22.085467 0 0 0;
2227.1357 1299.0578 -124.94638 0 0 0;
1958.0981 1161.923 171.70381 0 0 0;
2087.8116 896.29648 170.86604 0 0 0;
2362.3796 1026.0797 -131.33004 0 0 0;
2161.0191 1090.2472 22.086271 0 0 0;
2227.153 1299.0648 -124.93174 0 0 0;
1958.1018 1161.9538 171.71551 0 0 0;
2087.8185 896.27232 170.8565 0 0 0;
2362.3806 1026.0816 -131.33051 0 0 0;
2161.0192 1090.2453 22.085389 0 0 0;
2227.142 1299.0491 -124.94231 0 0 0;
1958.0928 1161.8919 171.68926 0 0 0;
2087.8098 896.29497 170.86687 0 0 0;
2362.3808 1026.0833 -131.33199 0 0 0;
2161.0221 1090.2497 22.094875 0 0 0;
2227.1397 1299.0522 -124.94604 0 0 0;
1958.0909 1161.8938 171.68821 0 0 0;
2087.8105 896.29812 170.86859 0 0 0;
2362.3816 1026.0819 -131.32675 0 0 0;
2161.0214 1090.2481 22.090946 0 0 0;
2227.138 1299.0493 -124.94669 0 0 0;
1958.0962 1161.8912 171.69576 0 0 0;
2087.8151 896.2934 170.87058 0 0 0;
2362.3833 1026.0814 -131.3294 0 0 0;
2161.0205 1090.2542 22.094345 0 0 0;
2227.1403 1299.0491 -124.9435 0 0 0;
1958.0927 1161.8883 171.68916 0 0 0;
2087.8144 896.29467 170.87374 0 0 0;
2362.383 1026.0798 -131.32969 0 0 0;
2161.0222 1090.2577 22.094401 0 0 0;
2227.1387 1299.0474 -124.94533 0 0 0;
1958.0936 1161.8906 171.69421 0 0 0;
2087.8112 896.30127 170.86989 0 0 0;
2362.3816 1026.0765 -131.33263 0 0 0;
2161.0222 1090.2542 22.09253 0 0 0;
];
end
%旋转矩阵转轴角
function Rxyz=RotMat_AxisAngle(R)theta = acos((R(1,1)+R(2,2)+R(3,3)-1)/2);r = 1/2/sin(theta)*[R(3,2)-R(2,3);R(1,3)-R(3,1);R(2,1)-R(1,2)];Rxyz=theta*r;
end
%轴角转旋转矩阵
function R=AxisAngle_RotMat(Rxyz)theta=(Rxyz(1)^2+Rxyz(2)^2+Rxyz(3)^2)^0.5;if(abs(theta)<1e-8)R=eye(3);return;endr=Rxyz/theta;R=[r(1)^2*(1-cos(theta))+cos(theta) r(1)*r(2)*(1-cos(theta))-r(3)*sin(theta) r(1)*r(3)*(1-cos(theta))+r(2)*sin(theta)r(1)*r(2)*(1-cos(theta))+r(3)*sin(theta) r(2)^2*(1-cos(theta))+cos(theta) r(2)*r(3)*(1-cos(theta))-r(1)*sin(theta)r(1)*r(3)*(1-cos(theta))-r(2)*sin(theta) r(2)*r(3)*(1-cos(theta))+r(1)*sin(theta) r(3)^2*(1-cos(theta))+cos(theta)];
end
%绕Z轴的旋转矩阵转换
function R = rotz(t, deg)if nargin > 1 && strcmp(deg, 'deg')t = t *pi/180;endct = cos(t);st = sin(t);R = [ct -st 0st ct 00 0 1];
%绕Y轴的旋转矩阵转换
function R = roty(t, deg)if nargin > 1 && strcmp(deg, 'deg')t = t *pi/180;endct = cos(t);st = sin(t);R = [ct 0 st0 1 0-st 0 ct];
%绕X轴的旋转矩阵转换
function R = rotx(t, deg)if nargin > 1 && strcmp(deg, 'deg')t = t *pi/180;endct = cos(t);st = sin(t);R = [1 0 00 ct -st0 st ct];
计算与验证代码
clc;
clear;
addPoint = zeros(5,6);
P07 = [];
% 30*5=150 组激光测量仪测量到的数据
measurementPara = measurementPara();
length = size(measurementPara);
for i=1:lengthif(mod(i,5)==0) addPoint(5,:) = addPoint(5,:) + measurementPara(i,:);else addPoint(mod(i,5),:) = addPoint(mod(i,5),:) + measurementPara(i,:);end
end
addPoint = addPoint/30;
% RD1100W1BY670W92024-07-21-1数据
%基座标定数据
R00 = rotZ(-1.118222)*rotY(0.004544 )*rotX(0.006666);
P00 = [2.711833, 1.361573, -0.718014]'*1000;
%工具端标定数据
R67 = rotZ(1.933119)*rotY(-1.537018)*rotX(-1.01495);
P67 = [-0.029781, -0.029171, 0.106038]'*1000;
APR = zeros(5,3);
AllT06=verifyPara();
for i=1:5T06 = AllT06(i,:);R06 = AxisAngle_RotMat([T06(1,4),T06(1,5),T06(1,6)]/180*pi);P06 = T06(1,1:3)';P07 =[P07;[(R00*R06*P67)+(R00*P06)+P00]'];R07 = R00*R06*R67;APR(i,2) = atan2(-R07(1,3),sqrt(R07(2,3)^2+R07(3,3)^2)); % beta YAPR(i,1) = atan2(R07(2,3)/cos(APR(i,2)),R07(3,3)/cos(APR(i,2))); % aerfa XAPR(i,3) = atan2(R07(1,2)/cos(APR(i,2)),R07(1,1)/cos(APR(i,2))); % gama Z
end
APR = APR*180/pi - addPoint(:,4:6);
APP = addPoint(:,1:3) - P07;
APP = sqrt(APP(:,1).^2 + APP(:,2).^2 + APP(:,3).^2);
%绝对定位精度
AP=[APP ,APR]
L = [0 0 0 0 0];
Lt = [];
RPR = zeros(5,3);
for i=1:lengthif(mod(i,5)==0) L(5) = L(5) + sqrt((addPoint(5,1) - measurementPara(i,1))^2+(addPoint(5,2) - measurementPara(i,2))^2+(addPoint(5,3) - measurementPara(i,3))^2);Lt(i) = sqrt((addPoint(5,1) - measurementPara(i,1))^2+(addPoint(5,2) - measurementPara(i,2))^2+(addPoint(5,3) - measurementPara(i,3))^2);RPR(5,:)= RPR(5,:) + (addPoint(5,4:6)-measurementPara(i,4:6)).^2;else L(mod(i,5)) = L(mod(i,5)) + sqrt((addPoint(mod(i,5),1) - measurementPara(i,1))^2+(addPoint(mod(i,5),2) - measurementPara(i,2))^2+(addPoint(mod(i,5),3) - measurementPara(i,3))^2);Lt(i) = sqrt((addPoint(mod(i,5),1) - measurementPara(i,1))^2+(addPoint(mod(i,5),2) - measurementPara(i,2))^2+(addPoint(mod(i,5),3) - measurementPara(i,3))^2);RPR(mod(i,5),:)= RPR(mod(i,5),:)+(addPoint(mod(i,5),4:6)-measurementPara(i,4:6)).^2;end
end
L=L/30;
Lm = [0 0 0 0 0];
for i=1:lengthif(mod(i,5)==0) Lm(5) = Lm(5) + (L(5)-Lt(i))^2;else Lm(mod(i,5)) = Lm(mod(i,5)) + (L(mod(i,5))-Lt(i))^2;end
end
Lm = sqrt(Lm/29);
RPR = 6*sqrt(RPR/29);
RPP= [L + 3*Lm]';
%重复定位精度
RP = [RPP RPR]
测试结果
本实验数据来自一个不合格的机器人标定数据。
如上图可知:由于激光测量仪只是测量了位置信息,没有姿态信息,故重复定位精度的姿态重复度为0,绝对定位精度的姿态精度不具备参考性。该机器人的绝对定位进度为1.7088mm效果较差,重复定位精度为0.645效果一般。
下一章 【机器人学】6-5.六自由度机器人运动学参数辨识-逆运动学迭代解【附MATLAB代码】
相关文章:

【机器人学】6-4.六自由度机器人运动学参数辨识-机器人精度验证【附MATLAB代码】
前言 前两个章节以及完成了机器人参数辨识。 【机器人学】6-1.六自由度机器人运动学参数辨识-辨识数学模型的建立 【机器人学】6-2.六自由度机器人运动学参数辨识-优化方法求解辨识参数 这里我们认为激光测量仪测量到的数据为机器人实际到达的位置,而机器人理论到…...

分销商城小程序系统渠道拓展
线上卖货渠道很多,想要不断提高营收和新客获取,除了自己和工具本身努力外,还需要其他人的帮助来提高商城店铺的整体销量。 搭建saas商城系统网站/小程序,后台上货,设置支付、配送、营销、精美模板商城装修等内容&…...

WPF篇(14)-ProgressBar进度条+Calendar日历控件+DatePicker日期控件
ProgressBar进度条 ProgressBar进度条通常在我们执行某个任务需要花费大量时间时使用,这时可以采用进度条显示任务或线程的执行进度,以便给用户良好的使用体验。 ProgressBar类定义 public class ProgressBar : RangeBase {public static readonly De…...

链表高频题目和必备技巧
链表高频题目和必备技巧 1. 链表类题目注意点 1,如果笔试中空间要求不严格,直接使用容器来解决链表问题 2,如果笔试中空间要求严格、或者在面试中面试官强调空间的优化,需要使用额外空间复杂度**O(1)**的方法 3,最…...
Vue3详细介绍,正则采集器所用前端框架
Vue3 引入了一个全新的响应式系统,它是基于ES6的Proxy特性构建的。这个系统使得 Vue 能够更加高效地追踪数据的变化,并在数据发生变化时自动更新DOM。响应式系统的核心是"可观察",当数据变化时,视图会响应这些变化并重新…...
数据集--COCO2017(快速下载)
1、数据集介绍 数据集官网:https://cocodataset.org/#home COCO(Common Objects in Context)数据集是计算机视觉领域中最广泛使用的数据集之一,主要用于目标检测、分割和图像标注任务。COCO 数据集由 Microsoft 发布,…...

【管理咨询宝藏159】顶级咨询公司人力三支柱建设方案思路
阅读完整版报告内容,请搜索VV号“管理咨询宝藏”。 【管理咨询宝藏159】顶级咨询公司人力三支柱建设方案思路 【格式】PDF版本 【关键词】人力咨询、三支柱、人力体系 【核心观点】 - 集团总部制定全集团共享中心总体规划路径,组织并负责实施与推广。各…...
跨时钟域总结
跨时钟域总结 秋招学习跨时钟域 总结一下吧 异步电路 设计中有两个频率不同的时钟(也可能多个),而有数据在两组时钟之间传输 单bit跨时钟域 慢时钟域数据-> 快时钟域 方法 : 使用两个锁存器 (打两拍) 数据跨时钟域同步过程中,脉冲宽度会改变,不影响同步结…...

富婆和富公子都在看的负载均衡和Haproxy大全
一.负载均衡 1.1:什么是负载均衡 负载均衡: Load Balance ,简称 LB ,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均 衡将特定的业务(web 服务、网络流量等 ) 分担给指定的一个或多个后端特定的服务器或…...

VScode找python环境 (conda)
第一步 CtrlshiftP 第二步 框框里输入:Python:Select Interpreter...

C# Winform序列化和反序列化
在NET Framework 4.7.2中不能用Newtonsoft.Json进行序列化和反序列化,为解决此问题,采用System.Text.Json进行序列化,注意要添加System.Memory的引用。 1、创建测试类 using System; using System.Collections.Generic; using System.Linq; …...
crc原理概述
CRC(循环冗余校验)是一种错误检测技术,用于确保数据在传输或存储过程中没有发生变化。它通过将数据视为一个多项式,利用二进制除法得到一个校验码(CRC值)。接收方使用相同的算法验证数据和CRC值是否匹配&am…...

C++要求或禁止在堆中产生对象
有时你想这样管理某些对象,要让某种类型的对象能够自我销毁,也就是能够“delete this”。很明显这种管理方式需要此类型对象被分配在堆中。而其它一些时候你想获得一种保障:“不在堆中分配对象,从而保证某种类型的类不会发生内存泄…...

为什么阿里开发手册推荐用静态工厂方法代替构造器?
🍅 作者简介:哪吒,CSDN2021博客之星亚军🏆、新星计划导师✌、博客专家💪 🍅 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师 🍅 技术交流:定期更新…...
前端写法建议【让项目更加易于维护】
背景 标题前提条件: 没有字典接口、或其他原因,需要前端手动维护的情况 示例环境:vue2,其他项目同理 示例 如果项目有某种类别,前端和后端约定好了,某些情况下,需要前端写死时。 比如有字段…...
EasyExcel 自定义转换器、自定义导出字典映射替换、满足条件内容增加样式,完整代码+详细注释说明
虽然最之前是在其他地方看到的,但最终因缘巧合下找到了原文,还是尊重一下原作者。 参考引用了这位佬的博客,确实方便使用。 https://blog.csdn.net/qq_45914616/article/details/137200688?spm1001.2014.3001.5502 这是一个基于Easyexcel通过…...

C语言学习笔记 Day10(指针--中)
Day10 内容梳理: 目录 Chapter 7 指针 7.4 指针 & 数组 (1)指针操作数组元素 (2)指针加减运算 1)加法 2)减法 (3)指针数组 7.5 多级指针 Chapter 7 指针 …...
网页显示打印 pdf
文件服务使用 minio,使用 nginx 反向代理。 将文件存放在 minio 上,如果是公开的文件,则统一放到一个桶,设置为公开只读。 如果是私有文件,则使用临时链接,给有权限的用户查看和打印。 要实现在 html 页…...

1948-2024.5金融许可信息明细数据
1948-2024.5金融许可信息明细数据 1、时间:1948-2024.5 2、指标:来源表、机构编码、机构名称、所属银行、机构类型、业务范围、机构住所、地理坐标、行政区划代码、所属区县、所属城市、所属省份、邮政编码、发证日期、批准日期、发证机关、流水号、是…...

【笔记】从零开始做一个精灵龙女-画贴图阶段(终)
这篇主要是细节,包括花纹和其它一些细化 皮肤 脖子 脖子一定要压暗,不然前后关系体现不出来 脸 1. 忘了有uv缝了,记得打开投影模式画 顺着头发轨迹长的方向画出发际线 背包手镯 1.先画出暗色花纹: 2.再加亮色,亮…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...