[RTKLIB]模糊度固定相关问题(二)
文章目录
- 一、固定模糊度的前置工作
- 1. 做好固定模糊度的准备
- 2. 建立双差模糊度
- 3. 问题与总结
版权声明:本文为原创文章,版权归 Winston Qu 所有,转载请注明出处。
在上一篇文章中,介绍了RTKLIB中manage_amb_LAMBDA()函数,并详细介绍了其操作方式和工作方法。可见[RTKLIB]模糊度固定相关问题(一)
本篇文章中,我们针对其模糊度固定函数resamb_LAMBDA()、ddidx()做详细的分析,进一步的探索模糊度固定中有意思的部分。
一、固定模糊度的前置工作
1. 做好固定模糊度的准备
在前一篇文中我们说到,为了提高浮点模糊度的固定率,进行了部分模糊度*、延迟上星的操作。但究其根本,还没有真正接触到模糊度固定的底层,并没有创建模糊度双差数组,也没有去建立模糊度求解的矩阵方程,更还没尝试通过整数最小二乘方法去固定模糊度。
模糊度固定是一个比较复杂和繁琐的过程,前期会有许多的准备过程。从状态量中提取我们需要的状态,通过方差-协方差阵计算我们需要的Q矩阵。然后通过LAMBDA方法去求解固定后的状态向量,并通过一定的方法转换到单差模糊度,修正已有状态量。… 上述过程听着就挺复杂的,我们可以通过函数仔细看看做了哪些工作,从中理解设计和求解的思想。
附上源代码:
/* resolve integer ambiguity by LAMBDA ---------------------------------------*/
static int resamb_LAMBDA(rtk_t *rtk, double *bias, double *xa,int gps,int glo,int sbs)
{prcopt_t *opt=&rtk->opt;int i,j,nb,nb1,info,nx=rtk->nx,na=rtk->na;double *DP,*y,*b,*db,*Qb,*Qab,*QQ,s[2];int *ix;double var=0,coeff[3];double QQb[MAXSAT];trace(3,"resamb_LAMBDA : nx=%d\n",nx);rtk->sol.ratio=0.0;rtk->nb_ar=0;if (rtk->opt.mode<=PMODE_DGPS||rtk->opt.modear==ARMODE_OFF||rtk->opt.thresar[0]<1.0) {return 0;}/* skip AR if position variance too high to avoid false fix */for (i=0;i<3;i++) var+=rtk->P[i+i*rtk->nx];var=var/3.0; /* maintain compatibility with previous code */trace(3,"posvar=%.6f\n",var);if (var>rtk->opt.thresar[1]) {errmsg(rtk,"position variance too large: %.4f\n",var);return 0;}/* Create index of single to double-difference transformation matrix (D')used to translate phase biases to double difference */ix=imat(nx,2);if ((nb=ddidx(rtk,ix,gps,glo,sbs))<(rtk->opt.minfixsats-1)) { /* nb is sat pairs */errmsg(rtk,"not enough valid double-differences\n");free(ix);return -1; /* flag abort */}rtk->nb_ar=nb;/* nx=# of float states, na=# of fixed states, nb=# of double-diff phase biases */y=mat(nb,1); DP=mat(nb,nx-na); b=mat(nb,2); db=mat(nb,1); Qb=mat(nb,nb);Qab=mat(na,nb); QQ=mat(na,nb);/* phase-bias covariance (Qb) and real-parameters to bias covariance (Qab) *//* y=D*xc, Qb=D*Qc*D', Qab=Qac*D' */for (i=0;i<nb;i++) {y[i]=rtk->x[ix[i*2]]-rtk->x[ix[i*2+1]];}for (j=0;j<nx-na;j++) for (i=0;i<nb;i++) {DP[i+j*nb]=rtk->P[ix[i*2]+(na+j)*nx]-rtk->P[ix[i*2+1]+(na+j)*nx];}for (j=0;j<nb;j++) for (i=0;i<nb;i++) {Qb[i+j*nb]=DP[i+(ix[j*2]-na)*nb]-DP[i+(ix[j*2+1]-na)*nb];}for (j=0;j<nb;j++) for (i=0;i<na;i++) {Qab[i+j*na]=rtk->P[i+ix[j*2]*nx]-rtk->P[i+ix[j*2+1]*nx];}for (i=0;i<nb;i++) QQb[i]=1000*Qb[i+i*nb];trace(3,"N(0)= "); tracemat(3,y,1,nb,7,2);trace(3,"Qb*1000= "); tracemat(3,QQb,1,nb,7,4);/* lambda/mlambda integer least-square estimation *//* return best integer solutions *//* b are best integer solutions, s are residuals */if (!(info=lambda(nb,2,y,Qb,b,s))) {trace(3,"N(1)= "); tracemat(3,b ,1,nb,7,2);trace(3,"N(2)= "); tracemat(3,b+nb,1,nb,7,2);rtk->sol.ratio=s[0]>0?(float)(s[1]/s[0]):0.0f;if (rtk->sol.ratio>999.9) rtk->sol.ratio=999.9f;/* adjust AR ratio based on # of sats, unless minAR==maxAR */if (opt->thresar[5]!=opt->thresar[6]) {nb1=nb<50?nb:50; /* poly only fitted for upto 50 sat pairs *//* generate poly coeffs based on nominal AR ratio */for ((i=0);i<3;i++) {coeff[i] = ar_poly_coeffs[i][0];for ((j=1);j<5;j++)coeff[i] = coeff[i]*opt->thresar[0]+ar_poly_coeffs[i][j];}/* generate adjusted AR ratio based on # of sat pairs */rtk->sol.thres = coeff[0];for (i=1;i<3;i++) {rtk->sol.thres = rtk->sol.thres*1/(nb1+1)+coeff[i];}rtk->sol.thres = MIN(MAX(rtk->sol.thres,opt->thresar[5]),opt->thresar[6]);} elsertk->sol.thres=(float)opt->thresar[0];/* validation by popular ratio-test of residuals*/if (s[0]<=0.0||s[1]/s[0]>=rtk->sol.thres) {/* init non phase-bias states and covariances with float solution values *//* transform float to fixed solution (xa=xa-Qab*Qb\(b0-b)) */for (i=0;i<na;i++) {rtk->xa[i]=rtk->x[i];for (j=0;j<na;j++) rtk->Pa[i+j*na]=rtk->P[i+j*nx];}/* y = differences between float and fixed dd phase-biasesbias = fixed dd phase-biases */for (i=0;i<nb;i++) {bias[i]=b[i];y[i]-=b[i];}/* adjust non phase-bias states and covariances using fixed solution values */if (!matinv(Qb,nb)) { /* returns 0 if inverse successful *//* rtk->xa = rtk->x-Qab*Qb^-1*(b0-b) */matmul("NN",nb,1,nb, 1.0,Qb ,y,0.0,db); /* db = Qb^-1*(b0-b) */matmul("NN",na,1,nb,-1.0,Qab,db,1.0,rtk->xa); /* rtk->xa = rtk->x-Qab*db *//* rtk->Pa=rtk->P-Qab*Qb^-1*Qab') *//* covariance of fixed solution (Qa=Qa-Qab*Qb^-1*Qab') */matmul("NN",na,nb,nb, 1.0,Qab,Qb ,0.0,QQ); /* QQ = Qab*Qb^-1 */matmul("NT",na,na,nb,-1.0,QQ ,Qab,1.0,rtk->Pa); /* rtk->Pa = rtk->P-QQ*Qab' */trace(3,"resamb : validation ok (nb=%d ratio=%.2f thresh=%.2f s=%.2f/%.2f)\n",nb,s[0]==0.0?0.0:s[1]/s[0],rtk->sol.thres,s[0],s[1]);/* translate double diff fixed phase-bias values to single diff fix phase-bias values, result in xa */restamb(rtk,bias,nb,xa);}else nb=0;}else { /* validation failed */errmsg(rtk,"ambiguity validation failed (nb=%d ratio=%.2f thresh=%.2f s=%.2f/%.2f)\n",nb,s[1]/s[0],rtk->sol.thres,s[0],s[1]);nb=0;}}else {errmsg(rtk,"lambda error (info=%d)\n",info);nb=0;}free(ix);free(y); free(DP); free(b); free(db); free(Qb); free(Qab); free(QQ);return nb; /* number of ambiguities */
}
我们来拆解步骤,并给出详细的解释。
- 准入条件判断,根据定为模式、位置方差判断当前是否适合进入模糊度固定。
ps:可以想想如果位置方差很大,为什么不适合进入模糊度固定呢? - 申请了一个
im=(nx,2)的空间,用于保存构建双差浮点模糊度的索引值。之后通过ddidx()函数构建了双差浮点模糊度矩阵,在此处做了一个模糊度个数的判断,判断是否小于设定的最小固定卫星。ps:若出现三颗三频的卫星,此处的nb=(3-1)*3=6,确实满足最小卫星>4的条件,但是此处的固定是否有意义呢?我觉得这是一个版本迭代的BUG - 根据公式计算双差浮点模糊度
y、双差协方差矩阵Qb、双差实参协方差矩阵Qab。ps:如果从理论角度来说,在此处我们需要求四个矩阵,分别为Qa、Qab、Qba、Qb,但实质上我们只用到Qb、Qab就能完成整个计算流程。 - 输出固定前的浮点双差模糊度
N(0)和模糊度的方差Qb*1000,在调试模糊度固定的时候,这两个值是非常重要的两个值。 - 使用
lambda()函数进行浮点双差模糊度的固定,如果解算失败就释放申请的内存;若解算成功,则进行ratio test。ps:这里的解算成功不是指成功求解整数模糊度,而是指成功进行lambda()解算 - 输出计算过后的整数双差模糊度的最优解和次优解,如果设置了动态AR阈值,还需要根据卫星数计算模糊度阈值。
- 进行
ratio test判断模糊度最优解与次优解的残差是否合规,模糊度是否可以被采纳。 - 将计算的整数双差模糊度通过计算更新到固定解位置和相应的方差-协方差解算矩阵上,并通过
restamb()函数将整数双差模糊度转换到对应的浮点单差模糊度。ps:保存在xa变量中了,此处的restamb()与ddidx()互为反映射关系 - 返回模糊度个数
nb。
2. 建立双差模糊度
如果要进行模糊度解算,肯定需要在系统中简历双差模糊度方程,如何做双差?选择怎样的卫星作为第一颗卫星?其中的奥秘都集中在ddidx()函数中。
附上源代码:
/* index for single to double-difference transformation matrix (D') --------------------*/
static int ddidx(rtk_t *rtk, int *ix, int gps, int glo, int sbs)
{int i,j,k,m,f,n,nb=0,na=rtk->na,nf=NF(&rtk->opt),nofix;double fix[MAXSAT],ref[MAXSAT];trace(3,"ddmat: gps=%d/%d glo=%d/%d sbs=%d\n",gps,rtk->opt.gpsmodear,glo,rtk->opt.glomodear,sbs);/* clear fix flag for all sats (1=float, 2=fix) */for (i=0;i<MAXSAT;i++) for (j=0;j<NFREQ;j++) {rtk->ssat[i].fix[j]=0;}for (m=0;m<6;m++) { /* m=0:GPS/SBS,1:GLO,2:GAL,3:BDS,4:QZS,5:IRN *//* skip if ambiguity resolution turned off for this sys */nofix=(m==0&&gps==0)||(m==1&&glo==0)||(m==3&&rtk->opt.bdsmodear==0); /* step through freqs */ for (f=0,k=na;f<nf;f++,k+=MAXSAT) {/* look for first valid sat (i=state index, i-k=sat index) */for (i=k;i<k+MAXSAT;i++) {/* skip if sat not active */if (rtk->x[i]==0.0||!test_sys(rtk->ssat[i-k].sys,m)||!rtk->ssat[i-k].vsat[f]) {continue;}/* set sat to use for fixing ambiguity if meets criteria */if (rtk->ssat[i-k].lock[f]>=0&&!(rtk->ssat[i-k].slip[f]&2)&&rtk->ssat[i-k].azel[1]>=rtk->opt.elmaskar&&!nofix) {rtk->ssat[i-k].fix[f]=2; /* fix */break;/* break out of loop if find good sat */}/* else don't use this sat for fixing ambiguity */else rtk->ssat[i-k].fix[f]=1;}if (rtk->ssat[i-k].fix[f]!=2) continue; /* no good sat found *//* step through all sats (j=state index, j-k=sat index, i-k=first good sat) */for (n=0,j=k;j<k+MAXSAT;j++) {if (i==j||rtk->x[j]==0.0||!test_sys(rtk->ssat[j-k].sys,m)||!rtk->ssat[j-k].vsat[f]) {continue;}if (sbs==0 && satsys(j-k+1,NULL)==SYS_SBS) continue; if (rtk->ssat[j-k].lock[f]>=0&&!(rtk->ssat[j-k].slip[f]&2)&&rtk->ssat[j-k].vsat[f]&&rtk->ssat[j-k].azel[1]>=rtk->opt.elmaskar&&!nofix) {/* set D coeffs to subtract sat j from sat i */ix[nb*2 ]=i; /* state index of ref bias */ix[nb*2+1]=j; /* state index of target bias *//* inc # of sats used for fix */ref[nb]=i-k+1;fix[nb++]=j-k+1;rtk->ssat[j-k].fix[f]=2; /* fix */n++; /* count # of sat pairs for this freq/constellation */}/* else don't use this sat for fixing ambiguity */else rtk->ssat[j-k].fix[f]=1;}/* don't use ref sat if no sat pairs */if (n==0) rtk->ssat[i-k].fix[f]=1;}}if (nb>0) {trace(3,"refSats=");tracemat(3,ref,1,nb,7,0);trace(3,"fixSats=");tracemat(3,fix,1,nb,7,0);}return nb;
}
我们来拆解步骤,并给出详细的解释。
- 对所有的卫星
rtk->ssat[i].fix[j]结构体进行清空,进行初始化。 - 对每个星座的每个频率进行双重循环,确定每个星座和每个频率中的参考卫星
第一颗符合规定的卫星,对符合条件的卫星设定rtk->ssat[i-k].fix[f]=2; /* fix */,对有载波观测值但不符合条件的卫星设定rtk->ssat[i-k].fix[f]=1;完成卫星清洗工作,选出参考卫星。ps:本段存在很大的问题,在后面详细叙述。 - 上一个循环已经确定了参考卫星,在这个循环中确定同星座同频率的非参考卫星,与参考卫星组
pairs,并记录对应的索引号、卫星号。 - 返回双差
卫星(模糊度)个数。
3. 问题与总结
通过上述的两个函数,我们就完成了除整数最小二乘(LAMBDA)外的所有模糊度固定的流程。表面上似乎没问题,但通过仔细的解析和细细回味,可以发现很多不合理的地方。
- 选择参考星的时候,并没有选择高度角最高的卫星;
ps:这个问题其实困扰我一段时间了,似乎如果只更新xa、xp,选择高度角最高的卫星和系统内的第一颗卫星并没有很大的差别 - 双差模糊度
nb和参与计算的卫星ns之争。在上述的代码中,使用nb判断这次解算是否有效,这似乎是一个随着版本迭代的bug。在单频状态下,nb确实可以代表参与解算的卫星数,但随着频率的增加,多频模糊度固定时,nb的数量可能会很大,但是真实参与解算和固定的卫星ns可能不满足固定的最小卫星数,此时固定的解算结果有意义吗?ps:通过固定的模糊度修正的nx实际上是秩亏的,个人认为是不正确的。 - restamb()与ddidx()互为映射关系,但其中的判断条件太简单了,且需要丰富判断条件。
版权声明:本文为原创文章,版权归 Winston Qu 所有,转载请注明出处。
相关文章:
[RTKLIB]模糊度固定相关问题(二)
文章目录 一、固定模糊度的前置工作1. 做好固定模糊度的准备2. 建立双差模糊度3. 问题与总结 版权声明:本文为原创文章,版权归 Winston Qu 所有,转载请注明出处。 在上一篇文章中,介绍了RTKLIB中manage_amb_LAMBDA()函数ÿ…...
QtAV for ubuntu16.04
下载ubuntu https://releases.ubuntu.com/16.04/ubuntu-16.04.7-desktop-amd64.iso 下载ffmpeg https://ffmpeg.org/download.html 下载QtAV https://github.com/wang-bin/QtAV/releases 更新 sudo apt update 安装库 sudo apt-get install libglu1-mesa-dev freeglut3-dev…...
MFC 文件读写包括字符串的结构体
试过CString char* 写入的都是地址 struct Param{int ID;int index;char val[128]; };vector<Param>ans; UINT count 17; ans.resize(count); FILE* fp; fopen_s(&fp,_T("my.txt"),_T("rb")); if(count ! fread(&ans[0],sizeof(Param),cou…...
在家构建您的迷你聊天Chat gpt
推荐:使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 什么是指令遵循模型? 语言模型是机器学习模型,可以根据句子的前一个单词预测单词概率。如果我们向模型请求下一个单词,并将其递减地反馈给模型以请求更多单词ÿ…...
pytest自动化测试框架之断言
前言 断言是完整的测试用例中不可或缺的因素,用例只有加入断言,将实际结果与预期结果进行比对,才能判断它的通过与否。 unittest 框架提供了其特有的断言方式,如:assertEqual、assertTrue、assertIn等,py…...
C++模板的用法
目录 模板的概念 函数模板(Function Templates) 基本用法 函数模板的实例化 匹配原则 类模板(Class Templates) 模板的概念 C中的模板(Templates)实际上是一种泛型编程(Generic Programm…...
ESP 32 蓝牙虚拟键盘链接笔记本电脑的键值问题
由于打算利用esp32 通过蓝牙链接电脑后实现一些特俗的键盘功能,所以就折腾了一下,折腾最耗费时间的却是键值问题,让一个20多年的老司机重新补充了知识 过程曲折就不说了,直接说结果。 我们通过网络搜索获取的键值和蓝牙模拟键盘传…...
128.【Maven】
Maven仓库 (一)、Maven 简介1.传统项目管理的缺点2.Maven是什么3.Maven的作用 (二)、Maven 的下载与安装1.下载与认识目录2.配置Maven的全局环境 (三)、Maven 的基础概念1.Maven 仓库(1).仓库分类 2. Maven 坐标3.Maven 本地仓库配置(1).改变默认的仓库地址(2).改变远程仓库地址…...
嵌入式虚拟仿真实验教学平台之串口发送数据
嵌入式虚拟仿真实验教学平台课程系列 串口发送数据实验 课程内容 本实验使用 STM32 的串口发送数据。开始仿真后,打开串口监视器,串口监视器会打印出要发送的数据。 课程目标 学习配置使用GPIO功能学习配置使用复用功能学习配置使用UART功能 硬件设计 本课程…...
Android Studio 屏幕适配
Android开发屏幕适配流程 首先studio中没有ScreenMatch这个插件的,下去现在这个插件 点击File->settings->Plugins->(搜索ScreenMatch插件),点击下载,应用重启Studio即可,如下图 在values下 创建dimens.xml,…...
【C++】C++11--- 线程库及详解lock_guard与unique_lock
目录 一、thread类的介绍二、线程函数参数三、 原子性操作库四、lock_guard与unique_lock4.1、mutex的种类4.2 lock_guard4.3 unique_lock 一、thread类的介绍 在C11之前,涉及到多线程问题,都是和平台相关的,比如**windows和linux下各有自己…...
第二篇|研究数据哪里来——建筑业
数据是研究和产业发展的重要基石,然而无论是学者、企业还是研究机构往往都面临着“找数据难”的局面。本期将分享一些查找建筑相关的数据及资料的渠道。希望可以帮大家解决这一难题,有用求收藏求收藏求收藏~ 1.政府机构 可以查找国家、地方政府的建筑行…...
numpy ascontiguousarra 学习笔记
目录 numpy ascontiguousarra函数 转换命令: ascontiguousarray等价效果: ascontiguousarray学习笔记 ascontiguousarray函数将一个内存不连续存储的数组转换为内存连续存储的数组,使得运行速度更快。 在昇腾开发版上使用时,…...
【算法|双指针系列No.1】leetcode283. 移动零
个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…...
PHP8定义字符串的方法-PHP8知识详解
字符串,顾名思义,就是将一堆字符串联在一起。字符串简单的定义方法是使用英文单引号( )或英文双引号(" ")包含字符。另外,还可以使用定界符定义字符串。本文还介绍了字符串的连接符。…...
分享21年电赛F题-智能送药小车-做题记录以及经验分享
这里写目录标题 前言一、赛题分析1、车型选择2、巡线1、OpenMv循迹2、灰度循迹 3、装载药品4、识别数字5、LED指示6、双车通信7、转向方案1、开环转向2、位置环速度环闭环串级转向3、MPU6050转向 二、调试经验分享1、循迹2、识别数字3、转向4、双车通信5、逻辑处理6、心态问题 …...
字符串统计-C语言/Java
描述 计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次。数据范围: 1≤n≤500 例如,对于字符串 ab…...
Styled-components,另一种css in js的方案
介绍 Styled-components是一种流行的CSS-in-JS库,它为React和React Native应用程序提供了一种优雅的方式来管理组件的样式。它的设计理念是将CSS样式与组件逻辑紧密绑定在一起,从而使样式在组件层级中作用更加清晰和可维护 使用 安装Styled-components…...
nginx部署以及反向代理多域名实现HTTPS访问
nginx部署以及反向代理多域名实现 1.nginx部署 1.1 编写nginx部署文件 docker-compose.yml version: 3 services: nginx:restart: always image: nginx:1.20container_name: nginx-mainports:- 80:80- 443:443volumes: # 基础配置- /opt/nginx_main/nginx-info/nginx.conf:/…...
24届近5年东华大学自动化考研院校分析
今天给大家带来的是东华大学控制考研分析 满满干货~还不快快点赞收藏 一、东华大学 学校简介 东华大学(Donghua University),地处上海市,是教育部直属全国重点大学,国家“双一流”、“211工程”建设高校…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
