当前位置: 首页 > news >正文

【机器人学】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.六自由度机器人运动学参数辨识-优化方法求解辨识参数 这里我们认为激光测量仪测量到的数据为机器人实际到达的位置&#xff0c;而机器人理论到…...

分销商城小程序系统渠道拓展

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

WPF篇(14)-ProgressBar进度条+Calendar日历控件+DatePicker日期控件

ProgressBar进度条 ProgressBar进度条通常在我们执行某个任务需要花费大量时间时使用&#xff0c;这时可以采用进度条显示任务或线程的执行进度&#xff0c;以便给用户良好的使用体验。 ProgressBar类定义 public class ProgressBar : RangeBase {public static readonly De…...

链表高频题目和必备技巧

链表高频题目和必备技巧 1. 链表类题目注意点 1&#xff0c;如果笔试中空间要求不严格&#xff0c;直接使用容器来解决链表问题 2&#xff0c;如果笔试中空间要求严格、或者在面试中面试官强调空间的优化&#xff0c;需要使用额外空间复杂度**O(1)**的方法 3&#xff0c;最…...

Vue3详细介绍,正则采集器所用前端框架

Vue3 引入了一个全新的响应式系统&#xff0c;它是基于ES6的Proxy特性构建的。这个系统使得 Vue 能够更加高效地追踪数据的变化&#xff0c;并在数据发生变化时自动更新DOM。响应式系统的核心是"可观察"&#xff0c;当数据变化时&#xff0c;视图会响应这些变化并重新…...

数据集--COCO2017(快速下载)

1、数据集介绍 数据集官网&#xff1a;https://cocodataset.org/#home COCO&#xff08;Common Objects in Context&#xff09;数据集是计算机视觉领域中最广泛使用的数据集之一&#xff0c;主要用于目标检测、分割和图像标注任务。COCO 数据集由 Microsoft 发布&#xff0c…...

【管理咨询宝藏159】顶级咨询公司人力三支柱建设方案思路

阅读完整版报告内容&#xff0c;请搜索VV号“管理咨询宝藏”。 【管理咨询宝藏159】顶级咨询公司人力三支柱建设方案思路 【格式】PDF版本 【关键词】人力咨询、三支柱、人力体系 【核心观点】 - 集团总部制定全集团共享中心总体规划路径&#xff0c;组织并负责实施与推广。各…...

跨时钟域总结

跨时钟域总结 秋招学习跨时钟域 总结一下吧 异步电路 设计中有两个频率不同的时钟(也可能多个),而有数据在两组时钟之间传输 单bit跨时钟域 慢时钟域数据-> 快时钟域 方法 : 使用两个锁存器 (打两拍) 数据跨时钟域同步过程中,脉冲宽度会改变&#xff0c;不影响同步结…...

富婆和富公子都在看的负载均衡和Haproxy大全

一.负载均衡 1.1&#xff1a;什么是负载均衡 负载均衡&#xff1a; Load Balance &#xff0c;简称 LB &#xff0c;是一种服务或基于硬件设备等实现的高可用反向代理技术&#xff0c;负载均 衡将特定的业务(web 服务、网络流量等 ) 分担给指定的一个或多个后端特定的服务器或…...

VScode找python环境 (conda)

第一步 CtrlshiftP 第二步 框框里输入&#xff1a;Python:Select Interpreter...

C# Winform序列化和反序列化

在NET Framework 4.7.2中不能用Newtonsoft.Json进行序列化和反序列化&#xff0c;为解决此问题&#xff0c;采用System.Text.Json进行序列化&#xff0c;注意要添加System.Memory的引用。 1、创建测试类 using System; using System.Collections.Generic; using System.Linq; …...

crc原理概述

CRC&#xff08;循环冗余校验&#xff09;是一种错误检测技术&#xff0c;用于确保数据在传输或存储过程中没有发生变化。它通过将数据视为一个多项式&#xff0c;利用二进制除法得到一个校验码&#xff08;CRC值&#xff09;。接收方使用相同的算法验证数据和CRC值是否匹配&am…...

C++要求或禁止在堆中产生对象

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

为什么阿里开发手册推荐用静态工厂方法代替构造器?

&#x1f345; 作者简介&#xff1a;哪吒&#xff0c;CSDN2021博客之星亚军&#x1f3c6;、新星计划导师✌、博客专家&#x1f4aa; &#x1f345; 哪吒多年工作总结&#xff1a;Java学习路线总结&#xff0c;搬砖工逆袭Java架构师 &#x1f345; 技术交流&#xff1a;定期更新…...

前端写法建议【让项目更加易于维护】

背景 标题前提条件&#xff1a; 没有字典接口、或其他原因&#xff0c;需要前端手动维护的情况 示例环境&#xff1a;vue2&#xff0c;其他项目同理 示例 如果项目有某种类别&#xff0c;前端和后端约定好了&#xff0c;某些情况下&#xff0c;需要前端写死时。 比如有字段…...

EasyExcel 自定义转换器、自定义导出字典映射替换、满足条件内容增加样式,完整代码+详细注释说明

虽然最之前是在其他地方看到的&#xff0c;但最终因缘巧合下找到了原文&#xff0c;还是尊重一下原作者。 参考引用了这位佬的博客&#xff0c;确实方便使用。 https://blog.csdn.net/qq_45914616/article/details/137200688?spm1001.2014.3001.5502 这是一个基于Easyexcel通过…...

C语言学习笔记 Day10(指针--中)

Day10 内容梳理&#xff1a; 目录 Chapter 7 指针 7.4 指针 & 数组 &#xff08;1&#xff09;指针操作数组元素 &#xff08;2&#xff09;指针加减运算 1&#xff09;加法 2&#xff09;减法 &#xff08;3&#xff09;指针数组 7.5 多级指针 Chapter 7 指针 …...

网页显示打印 pdf

文件服务使用 minio&#xff0c;使用 nginx 反向代理。 将文件存放在 minio 上&#xff0c;如果是公开的文件&#xff0c;则统一放到一个桶&#xff0c;设置为公开只读。 如果是私有文件&#xff0c;则使用临时链接&#xff0c;给有权限的用户查看和打印。 要实现在 html 页…...

1948-2024.5金融许可信息明细数据

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

【笔记】从零开始做一个精灵龙女-画贴图阶段(终)

这篇主要是细节&#xff0c;包括花纹和其它一些细化 皮肤 脖子 脖子一定要压暗&#xff0c;不然前后关系体现不出来 脸 1. 忘了有uv缝了&#xff0c;记得打开投影模式画 顺着头发轨迹长的方向画出发际线 背包手镯 1.先画出暗色花纹&#xff1a; 2.再加亮色&#xff0c;亮…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

听写流程自动化实践,轻量级教育辅助

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

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <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)简介第一篇

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