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

GPS卫星位置解算

本文介绍了基于C语言的GPS卫星位置解算原理与程序设计。针对每个原理、公式、代码设计进行了详细讲解,希望能够给测绘学子们带来帮助。

参考书籍:

李征航 黄劲松:GPS测量与数据处理(第三版)

目录

基础原理

1)卫星位置解算流程

2)卫星有关参数

3)卫星位置计算过程 

程序设计

数据预处理

1)GPS时转换(TimetoGPSsec)

2)选择最佳历元(select_epoch)

代码与解析

BDS卫星位置


基础原理

1)卫星位置解算流程

如流程图所示,在程序设计中对于一颗卫星的位置解算,是要经过多次迭代,直到信号传播时间收敛。

2)卫星有关参数

在正式开始程序设计之前,我们还需要了解一下卫星的相关参数及其含义。

平近点角M 

卫星平均运动角速度为n=\frac{2\Pi \ }{T}\,根据开普勒第三定律得:

\frac{T^{2}}{a^{3}}=\frac{4\Pi ^{2}}{GM}

所以卫星平均运动角速度n:

n= \sqrt{\frac{GM}{a^{3}}}

因此,平近点角M定义为:

M= n\left ( t-t_{0} \right )

t为信号发射时刻,t0为卫星过近地点时刻。

偏近点角E

如下图所示:以卫星椭圆轨道的焦点为原点,以指向近地点的方向为X轴Y轴平行于椭圆短半轴,建立轨道平面坐标系。以卫星椭圆中心为圆心,以卫星轨道的长半轴a为半径作一个辅助圆

过卫星S作X轴的垂线,其延长线与辅助圆交于S‘,圆心到S’的向径与X轴的夹角定义为偏近点角E。 

平近点角与偏近点角的关系可用开普勒方程表示:

M= E-e\sin E

在计算偏近点角E时,E0可用平近点角M做初始值,然后进行迭代计算,因为E非常小,因此迭代几次即可收敛,可将收敛标准设为1.0e-5。 

真近点角V

由上图所示,真近点角V与偏近点角E存在着一定关系,真近点角V可又下述式子得出:

V=\arctan \frac{\sqrt{1-e^{2}}\sin E}{\cos E-e}

其中,e为第一偏心率。

如果已知真近点角,那么卫星在轨道坐标系中的位置向量可以表示为:

 r= \frac{a\left ( 1-e^{2} \right )}{1+e\cos V}\binom{cosV}{sinV} 

卫星的运动速度                                                   

由上式得得卫星的运动速度为:

r= \frac{na}{1-e\cos E}\binom{-sinE}{\sqrt{1-e^{2}\cos E}}

由开普勒方程可得:

\widehat{M}=\widehat{E}\left ( 1-e\sin E \right )= n

因此,可以推导出卫星的运动方程:

\widehat{r}=\frac{GM}{r^{3}}r

卫星钟差

卫星钟差方程为:

\Delta t_{s}=a_{0}+a_{1}(t-t_{oc})+a_{2}(t-t_{oc})^{2}+\Delta t_{r}

a0,a1,a2为N文件中的钟频,钟偏和钟漂。(广播星历中的卫星钟差误差为10ns,等效距离为3m)

\Delta t_{r}=-\frac{2\sqrt{A\cdot GM}}{c^{2}}e^{2}sinE

其中\sqrt{A}为长半轴a的平方根,e为轨道偏心率,二者都由广播星历播发;GM为引力常数,大小为:398600500000000;E为卫星的偏近点角。(因为偏近点角E很小,该误差在伪距中可忽略不计)

3)卫星位置计算过程 

(1)求平均角速度n:

 n_{0}=\sqrt{\frac{GM}{a^{3}}}

n=n_{0}+\Delta n

\Delta n为广播星历(N文件)中卫星平均运动速率与计算值之差(\Delta n代码中用deltan表示)。 

(2)求规划时刻t_{k}

t_{k}=t-t_{oe}

t为信号发射时刻,t_{oe}为N文件中的参考历元(t_{oe}代码中用TOE表示)。 

信号发射时刻为:O文件观测时刻-信号传播时间。

近似信号传播时间=伪距观测值/光速-接收机钟差+卫星钟差+电离层改正+对流层改正

上式中,用参考时刻toe时刻代替了卫星过近地点t0时刻。

这是因为:广播星历2h更新一次,间给参考时刻设在中央时刻时,外推间隔小于1h。而卫星的运行周期为12h,采取卫星过近地点时刻t0,外推间隔最大可能达到6h。用toe代替t0,模型简单,并且可以保证精度。

计算t和toe时,需要保证二者之差在两小时内,计算才能生效。因此,在计算卫星位置前,需要根据O文件中的观测选择N文件中的最佳观测历元(代码见后文)。

(3)求平近角M

M=M_{0}+nt_{k}

M_{0}为N文件中的参考时间的平近点角。

(4)求偏近点角E

E_{0}=M

E_{n}=M+e\sin E_{n-1}

e为N文件中轨道偏心率;偏近点角需要迭代计算,将平近角M作为E的初始值带入,因为E很小,一般迭代几次即可收敛,收敛条件为

\left | E_{n}-E_{n-1} \right |< 1e-12

 1.0e-12为科学计数法,表示10的负12次方。

(5)求真近点角V

V=\arctan \frac{\sqrt{1-e^{2}}\sin E_{n}}{\cos E_{n}-e}

(6)求升交角距u

U=V_{k}+\omega

\omega为N文件中的近地点角距(\omega代码中用omega表示)。

(7)摄动改正

升交角距改正项:\delta _{u}=C_{uC}\cos 2U+C_{uS}\sin 2U

轨道向径改正项:\delta _{r}=C_{rC}\cos 2U+C_{rS}\sin 2U

轨道向径改正项:\delta _{i}=C_{iC}\cos 2U+C_{iS}\sin 2U

C_{uC}C_{uS}C_{rC}C_{rS}C_{iC}C_{iS}分别为N文件中提供的6个摄动改正参数。(\delta _{u}\delta _{r}\delta _{i}在代码中分别用Epsilon_u、Epsilon_r、Epsilon_i表示)

(8)计算改正后的升交角距、轨道向径、轨道向径

u_{k}=t_{k}+\delta _{u}

r_{k}=a\left ( 1-e\cos E_{k} \right )\delta _{r}

i_{k}=i_{0}+t_{k}\left ( IDOT \right )+\delta _{i}

(9)卫星在升交点轨道直角坐标系的坐标

x_{k}=r_{k}\cos u_{k}

y_{k}=r_{k}\sin u_{k}

(10)计算升交点经度L

L=\Omega _{0}+\left ( \Omega -\omega _{e} \right )t_{k}-\omega_{e} t_{oe}

 \Omega _{0}为N文件中GPS周开始时刻的升交点经度,\Omega为N文件中升交点赤经变化率,t_{oe}为N文件中参考历元时刻。

(11) 计算卫星在地固坐标系中的空间直角坐标系

X=x_{k}\cos L-y_{k}\cos i_{k}sinL

Y=x_{k}\sin L-y_{k}\cos i_{k}cosL

Z_{k}=y_{k}sini_{k}

(12)计算Z轴旋转变换,得到的新坐标

x=\cos \left ( e_{E}\Delta t \right )X+\sin \left ( e_{E} \Delta t\right )Y

y=-\sin\left ( e_{E}\Delta t \right )X+\cos \left ( e_{E} \Delta t\right )Y

z=Z

 e_{E}为地球自转角速度,\Delta t为信号传播时间。

(13)重新计算卫地距

R=\sqrt{\left ( x-x_{r} \right )^{2}+\left ( y-y_{r} \right )^{2}+\left ( z-z_{r} \right )^{2}}

 x_{r}y_{r}z_{r}为接收机坐标,可将O文件中接收机概略坐标当作接收机坐标初始值,减少迭代次数。

(14)重新计算信号传播时间

t=\frac{R}{Cv}

R为新的卫地距,Cv表示光速。 

 (15)重复步骤1~14,直到信号传播时间收敛,收敛条件为

\left | t_{n}-t_{n-1} \right |<0.0001

程序设计

单颗卫星位置解算流程:

  • 将年月日转换成GPS周内秒
  • 为卫星选择最佳历元
  • 计算信号近似传播时间
  • 卫星位置解算

数据预处理

1)GPS时转换(TimetoGPSsec)

GPS时也称GPS time,GPST,由GPS星载原子钟和地面监控站原子钟组成的一种原子时基准,其起点为1980年1月6日0时00分00秒。

观测值文件中的参考时刻是以年月日进行记录的,不利于计算,需转换成周内秒的形式。 

程序设计主要思想: 

  • 先计算到1980年1月1号0时有多少天
  • 考虑闰年(4年一润,百年不润,四百年一润),闰月(润年润月为29天),以及大小月。
  • 1980年1月6日为星期日,一周的开始,解算出来的天数需要减6(1980.1.6为GPS时起算时刻)
  • 将得到天数除以7,得到周内的天数,将周内天数转换成周内秒数

TimetoGPSsec代码如下:

double TimetoGPSsec(int year, int month, int day, int hour, int min, double sec)
{int DayofYear = 0, DayofMonth = 0, SecofWeek = 0;int i = 0;for (i = 1980; i < year; i++){//判断闰年if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)DayofYear += 366;elseDayofYear += 365;}for (i = 1; i < month; i++){//判断大小月if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)DayofMonth += 31;else if (i == 4 || i == 6 || i == 9 || i == 11)DayofMonth += 30;else{if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)DayofMonth += 29;elseDayofMonth += 28;}}int Day = DayofYear + DayofMonth + day - 6;//计算到1980年1月6号(星期日)有多少天SecofWeek = (double)(Day % 7) * 24 * 60 * 60 + (double)hour * 3600 + (double)min * 60 + sec;return SecofWeek;
}

 其中:

  • 传入的参数为O、N文件中得到的年、月、日、时、分、秒。
  • 返回值为计算得到的周内秒。

2)选择最佳历元(select_epoch)

根据卫星的PRN号以及观测时间,选择与N文件中时间间隔最小的数据块进行解算。

主要思想: 

  • 遍历整个N文件数据块部分
  • 先判断卫星的PRN号是否相等
  • 设置最小时间差初始值为10000秒,每次更新最小值,并记录最小值所对应的历元数
  • 返回时间差最小的历元数

select_epoch代码如下

//挑选合适的星历
extern int select_epoch(double SecofWeek, int sPRN, pnav_body nav_b, int n_n)
{int n_epoch = 0;double min=10000;//假设最小值是1万秒double Min;int i;for (i = 0; i < n_n / 8; i++){if (sPRN == nav_b[i].sPRN){Min = fabs(SecofWeek - nav_b[i].TOE);if (Min <= min){n_epoch = i;min = Min;}}}return n_epoch;
}

其中:

  • SecofWeek为观测时刻的GPS周内秒,sPRN为卫星的PRN号,nav_b为导航文件数据块结构体,n_n为导航文件数据块总行数(不包含头部)
  • 需要传入的参数有:观测的周内秒时间、卫星的PRN号、N文件中数据块的结构体以及N文件数据块部分的行数。
  • 假设最小值min是一万秒,当比min小时,记录新的min,并记下该数据块的位置i到n_epoch中
  • 循环所有N文件中所有的数据块,返回最佳值

代码与解析

在程序设计时,将单次解算卫星位置的过程封装成一个函数,然后放入while循环中迭代计算,当信号传播时间收敛后,输出卫星位置结果。

定义一个结构体,用来当作函数的传参

//卫星位置传参
typedef struct Pos_t
{double X;double Y;double Z;double deltat;//改正前的接收机钟差double delta_t;//改正后的接收机钟差
}Pos_t;
#define C_V 299792458//光速(m)
#define GM 398600500000000//地心引力常数
#define math_e 2.718281828459 //e值
#define PI 3.141592653589793
#define Earth_e 7.2921151467e-5 //地球自转角速度
#define C1 4 //时间转换
double GPSsec = TimetoGPSsec(obs_e[i].y, obs_e[i].m, obs_e[i].d, obs_e[i].h, obs_e[i].min, obs_e[i].sec);
//根据O文件历元参考时间选择合适的N文件数据
int n_epoch = select_epoch(GPSsec, obs_e[i].sPRN[j], nav_b, n_n);
//观测时刻 - 参考时刻
double detat_toc = GPSsec - nav_b[n_epoch].TOE;
//计算近似的信号传播时间,接收机钟差已初始化为0(伪距/光速-接收机钟差+卫星钟差)
double delta_t = (obs_b[i].obs[j][C1] / C_V) - sta[i].delta_TR + nav_b[n_epoch].sa0 + nav_b[n_epoch].sa1 * detat_toc + nav_b[n_epoch].sa2 * pow(detat_toc, 2);
//计算卫星位置
double deltat = 0.0;//判断收敛
while (fabs(delta_t - deltat) > 0.0001)
{//临时结构体变量tmp,用来传参Pos_t tmp = { 0 };//计算卫星位置函数tmp = sat_pos(nav_b[n_epoch].deltan, nav_b[n_epoch].sqrtA, nav_b[n_epoch].TOE,nav_b[n_epoch].M0, nav_b[n_epoch].e, nav_b[n_epoch].omega, nav_b[n_epoch].OMEGA,nav_b[n_epoch].deltaomega, nav_b[n_epoch].Cuc, nav_b[n_epoch].Crc, nav_b[n_epoch].Cic,nav_b[n_epoch].Cus, nav_b[n_epoch].Crs, nav_b[n_epoch].Cis, nav_b[n_epoch].i0, nav_b[n_epoch].IDOT,delta_t, deltat, sta[i].X, sta[i].Y, sta[i].Z, GPSsec);//传参,更新信号传播时间deltat = tmp.deltat;delta_t = tmp.delta_t;sat[i][j].X = tmp.X;sat[i][j].Y = tmp.Y;sat[i][j].Z = tmp.Z;
}

其中:

  • obs_e:观测文件历元结构体,记录了每个观测值历元第一行时间及卫星数等信息
  • obs_b:观测文件数据块结构体,记录了每个观测历元观测值的数据
  • nav_b:导航文件数据块结构体,记录了每个历元的卫星参数
  • 观测值文件和导航文件的读取可参考:RINEX O文件读取和RINEX N文件读取
  • detat_toc:计算卫星钟差所用的时间
  • delta_t:近似信号传播时间
  • obs_b[i].obs[j][C1] / C_V:表示第i个历元第j颗卫星的伪距值除以光速,C1和C_V为宏定义
  • sta[i].delta_TR:接收机钟差,i表示第i个历元,接收机钟差初始化时需为0
  • nav_b[n_epoch].sa0 + nav_b[n_epoch].sa1 * detat_toc + nav_b[n_epoch].sa2 * pow(detat_toc, 2):该部分表示卫星钟差的计算,对照上文公式,省略了末项
  • deltat = 0.0:判断信号收敛,第一次计算时,需要初始化为0
  • Pos_t tmp:上文中用于传参的结构体
  • sat_pos:计算卫星位置函数,下文会详细展示

计算卫星位置函数

//计算卫星位置Pos_t sat_pos( double deltan,double sqrtA,double TOE,double M0,double e,double omega,double OMEGA,double deltaomega,double Cuc,double Crc, double Cic, double Cus,double Crs,double Cis,double i0,double IDOT,double delta_t, double deltat, double X_R,double Y_R, double Z_R, double GPSsec)
{Pos_t pos_t={0};//计算信号发射时刻=O文件观测时刻-信号传播时间double T_S = GPSsec - delta_t;//计算卫星的平均角速度ndouble n0 = sqrt(GM) / pow(sqrtA, 3);double n = n0 + deltan;//计算归划时间tkdouble tk = T_S - TOE;if (tk > 32400)tk -= 604800;//规划时间改正else if (tk < -32400)tk += 604800;//计算卫星发射时卫星的平近角Mdouble M = M0 + n * tk;//迭代计算偏近点角double E = M, E0;do{E0 = E;E = M + e * sin(E);} while (fabs(E - E0) > 1.0e-5);//计算真近点角Vdouble cosv = (cos(E) - e) / (1 - e * cos(E));//cosVdouble sinv = sqrt(1 - pow(e, 2)) * sin(E) / (1 - e * cos(E));//sinVdouble Vk = atan2(sinv, cosv);//注意atan与atan2的不同//计算升交角距udouble u = Vk + omega;//计算摄动改正项double Epsilon_u = Cuc * cos(2 * u) + Cus * sin(2 * u);double Epsilon_r = Crc * cos(2 * u) + Crs * sin(2 * u);double Epsilon_i = Cic * cos(2 * u) + Cis * sin(2 * u);//计算改正后的升交角距、轨道向径、轨道倾角double uk = u + Epsilon_u;double rk = pow(sqrtA, 2) * (1 - e * cos(E)) + Epsilon_r;double ik = i0 + Epsilon_i + IDOT * tk;//计算卫星在升交点轨道直角坐标系的坐标double xk = rk * cos(uk);double yk = rk * sin(uk);//计算升交点经度double L = OMEGA + (deltaomega - Earth_e) * tk - Earth_e * TOE; //计算卫星在地固系下的直角坐标double X = xk * cos(L) - yk * cos(ik) * sin(L);double Y = xk * sin(L) + yk * cos(ik) * cos(L);double Z = yk * sin(ik);//通过 Z 轴的旋转变换,对该坐标进行地球自转改正,得到新坐标pos_t.X = cos(Earth_e * delta_t) * X + sin(Earth_e * delta_t) * Y;pos_t.Y = -sin(Earth_e * delta_t) * X + cos(Earth_e * delta_t) * Y;pos_t.Z = Z;//重新计算信号传播的时间double R = sqrt(pow(X - X_R, 2) + pow(Y - Y_R, 2) + pow(Z - Z_R, 2));pos_t.deltat = delta_t;pos_t.delta_t = R / C_V;return pos_t;
}

(上述代码为了更加清晰的体现哪个是新变量、哪个是旧变量,将开辟变量的工作放在函数中间;读者自己写代码时,建议将开辟变量的工作统一放到函数的起始位置,增加运行效率;有些语言不支持程序运行后再开辟变量,例如:Fortran)

传入参数:从deltann到IDOT,均为N文件中读取的参数,delta_t和deltat为信号传播时间,用于判断信号传播时间是否收敛,X_R,Y_R,Z_R为测站坐标,首次迭代时,可初始化为0或概略坐标(O文件头),GPSsec为转化成GPS时的观测时刻

上述代码中有关时间的参数比较多,这里再次梳理一遍,防止混淆:

观测时刻(GPSsec):接收机收到信号的时刻,O文件每个历元的第一行记录,需转换成GPS周内秒

卫星钟差时间(detat_toc):由观测时刻减去卫星信号发射时刻TOE,TOE以GPS周内秒的形式存储,这个时间只用于卫星钟差改正

信号近似传播时间(delta_t):由伪距进行计算,需要进行卫星钟差、接收机钟差、电离层和对流层改正(上述代码没有加入电离层和流层改正,推荐两种简单的改正模型:电离层经验模型Klobuchar,对流层经验模型GCAT)

信号发射时刻(T_S):由观测时刻减去信号近似传播时间

规划时间(tk):将信号发射时刻规划到以TOE为基准的时刻

上述代码与公式一一对应,需要注意以下几点:

1)if (tk > 32400)tk -= 604800;else if (tk < -32400)tk += 604800;规划时间改正,604800为一周的秒数,32400为一周半的秒数。该部分内容可参考其他博主:卫星发射时刻归化

2)计算偏近点角E时,因为E极小,迭代几次即可收敛,因此收敛条件只要保证精度即可,在计算卫星钟差时,末项的改正数用到了偏近点角E,如需改正,可将E保留进行传参

3)C语言中角度计算均是以弧度为单位;atan和atan2均是求反正切函数,后者的使用范围是是四象限角

4)上述中用到的sqrt,pow,fabs分别是:开方函数,幂函数,取绝对值函数,均需包含头文件<math.h>

BDS卫星位置

BDS的卫星位置解算与GPS卫星有很大相似之处,其中MEO与IGSO卫星位置解算与GPS一致,GEO卫星从计算升交点赤经开始有所变化,在解算位置前,需要根据卫星的PRN号来判断卫星的种类,GEO计算公式如下(公式选自本科时期的论文,如有错误多多包涵):

 注意:(4-27)中-5°表示角度,为GEO卫星的倾角

相关文章:

GPS卫星位置解算

本文介绍了基于C语言的GPS卫星位置解算原理与程序设计。针对每个原理、公式、代码设计进行了详细讲解&#xff0c;希望能够给测绘学子们带来帮助。 参考书籍&#xff1a; 李征航 黄劲松&#xff1a;GPS测量与数据处理&#xff08;第三版&#xff09; 目录 基础原理 1&#xf…...

大数据:Sqoop 简介与安装

一、Sqoop 简介 Sqoop 是一个常用的数据迁移工具&#xff0c;主要用于在不同存储系统之间实现数据的导入与导出&#xff1a; 导入数据&#xff1a;从 MySQL&#xff0c;Oracle 等关系型数据库中导入数据到 HDFS、Hive、HBase 等分布式文件存储系统中&#xff1b; 导出数据&am…...

[附源码]计算机毕业设计文曦家教预约系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…...

HK1 BOX刷入 Armbian系统作为服务器

HK1 BOX刷入 Armbian系统作为服务器 1 安装Armbian到EMMC 硬件 HK1 BOX s905 x3 固件版本选择 Armbian_23.02.0_Aml_s905x3_bullseye_5.15.80_server_2022.12.01用usb启动&#xff0c;tf/sd有的设备不行&#xff0c;有干扰&#xff0c;有可能从TF卡无法启动系统。 用usb启…...

CEC2015:动态多目标野狗优化算法求解CEC2015(提供完整MATLAB代码,含GD、IGD、HV和SP评价指标)

一、动态多目标优化问题简介 现实世界中&#xff0c;许多优化问题不仅具有多属性&#xff0c;而且与时间相关&#xff0c;即随着时间的变化&#xff0c;优化问题本身也发生改变&#xff0c;这类问题称为动态多目标优化问题&#xff08;dynamic multi-objective optimization p…...

【蓝桥杯选拔赛真题31】python三位数组合个数 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python三位数组合个数 一、题目要求 1、编程实现 2、输入输出...

SpringBoot项目--如何不停服更新应用?

原文网址&#xff1a;SpringBoot项目--如何不停服更新应用&#xff1f;_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java后端项目如何不停机更新服务。 在生产环境中&#xff0c;一般都会每个服务部署多个实例。只要多于1个实例&#xff0c;就可以不停服更新应用。 不停服…...

MVVM与Vue响应式原理

Vue的响应式实现原理 MVVM M&#xff1a;模型 》data中的数据 V&#xff1a;视图 》模板 VM&#xff1a;视图模型 》Vue实例对象 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0EWNM16D-1670161519474)(C:\Users\lucas\Desktop\学习\图片\mode…...

vue和react的生命周期

vue和react的生命周期 一、Vue的生命周期二、React的生命周期2.1.类组件2.2.函数式组件一、Vue的生命周期 初始化阶段(组件创建、数据初始化)、挂载、更新、销毁 父子组件生命周期执行顺序 初次加载组件时:父beforeCreate – 父created – 父beforeMount – 子beforeCreate …...

浏览器高度兼容性

浏览器的卷去高度 1.标准模式 document.documentElement.scrollTop 2.非标准模式 document.body.scrollTop 浏览器高度兼容性 1.标准模式下 浏览器的实际高度&#xff1a; document.body.clientHeight 浏览器的可视高度&#xff1a;document.documentElement.clientHeight 2.非…...

关于天干地支及其计算

以天干地支计算日期是我国悠良的传统文化&#xff0c;最近在看如何计算人的生辰八字&#xff0c;写了个程序&#xff0c;但是只能算年的干支&#xff0c;月、日的干支计算方法太复杂了&#xff0c;望之只能却步&#xff0c;还是乖乖去查万年历比较好。这里记下关于干支的一些东…...

数据结构和算法之如何建立图

小白BG.1 邻接矩阵表示的图结点的结构 typedef struct GNode *PtrToGNode;//PtrToGNode是指向GNode的一个指针 struct GNode{ int Nv;//顶点数 int Ne;//边数 WeightType G[MaxVertexNum][MaxVertexNum]; DataType Data[MaxVertexNum];//存顶点的数据 }; typedef PtrToGNode MG…...

计算机毕业设计Java大众采编本微资讯发布平台(源码+系统+mysql数据库+lw文档)

计算机毕业设计Java大众采编本微资讯发布平台(源码系统mysql数据库lw文档) 计算机毕业设计Java大众采编本微资讯发布平台(源码系统mysql数据库lw文档)本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xff1a;idea eclipse…...

web前端-javascript-立即执行函数(说明、例子)

立即执行函数 /* (function(){alert("我是一个匿名函数~~~"); })(); */(function (a, b) {console.log("a " a);console.log("b " b); })(123, 456);1. 说明 函数定义完&#xff0c;立即被调用&#xff0c;这种函数叫做立即执行函数立即执…...

【计算机视觉】图像形成与颜色

图像形成与颜色 光照及阴影 辐射度学 颜色 颜色信息反映了入射光的能量分布与波长&#xff0c;可见光的波长在400nm到760nm之间。 RGB RGB分别代表三个基色&#xff08;R-红色、G-绿色、B-蓝色&#xff09;&#xff0c;如(0,0,0)表示黑色、(255, 255, 255)表示白色。其中2…...

Musical Christmas Lights——一个圣诞树灯光✨随音乐节奏改变的前端开源项目

文章目录前言视频介绍项目截图项目地址项目源码以上就是本篇文章的全部内容&#xff0c;将你编写好的项目分享给你的朋友们或者那个TA吧&#xff01;制作不易&#xff0c;求个三连&#xff01;❤️ &#x1f4ac; ⭐️前言 今天博主在刷短视频时&#x1f610;&#xff0c;朋友推…...

[附源码]Python计算机毕业设计SSM进出口食品安全信息管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…...

电平触发的触发器

普通的SR锁存器没有任何抗干扰能力 我们要加控制信号&#xff0c;来抵抗干扰 比如说我们不把信号直接加在门上&#xff0c;我们可以再加一级门电路&#xff0c;让这个输出和输入不在同一个门上&#xff0c;我们希望加入一个控制信号&#xff0c;来控制电路工作的时刻 对电路结…...

php后端+JQuery+Ajax简单表单提交

通过ajax,如果从后端直接想前端返回数组,那前端收到的是一个‘Array’的字符串。所以,我比较习惯的是用json对象的格式。由后端通过json_encode()函数,把数组封装成对象,传递到前端;前端也以json的格式接收。这里用提交表单来举例说明。 页面显示如下: JQueryAjax.…...

论文投稿指南——中文核心期刊推荐(计算机技术2)

>>>深度学习Tricks&#xff0c;第一时间送达<<< 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊。下面&#xff0c;简单介绍下什么是中文核心期刊要目总览&#xff1a; 《中文核心期刊要目总…...

集合java

java集合 集合、数组都是对多个数据进行存储操作的结构&#xff0c;简称Java容器 此时的存储&#xff0c;主要是指内存层面的存储&#xff0c;不涉及持久化的存储&#xff08;txt,jpg,avi&#xff09; Java集合可分为Collection 和 Map 两种体系 1. Collection接口&#xff1…...

spring boot 应用mybatis

Mybatis入门: Mybatis入门_做测试的喵酱的博客-CSDN博客 目录 一、spring boot 应用mybatis 核心 二、举例&#xff1a; 2.1 背景 2.2 项目结构&#xff1a; 2.3 依赖包 pom 2.4 项目配置文件application.yml 2.5 实例层entity 2.6 mybatis的mapper层 2.7 spring boot…...

Java项目:ssm图书馆管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 功能介绍 基于ssm的图书馆管理系统.主要功能包括&#xff1a;图书查询、图书管理、图书编辑、读者管理、图书的借阅与归还以及借还日志记录等。 用户分为…...

详解设计模式:命令模式

命令模式&#xff08;Command Pattern&#xff09;也被称为行动模式&#xff08;Action Pattern&#xff09;、事物模式&#xff08;Transaction Pattern&#xff09;&#xff0c;是在 GoF 23 种设计模式中定义了的行为型模式。 命令模式 是一种数据驱动的设计模式。请求以命令…...

家庭用户无线上网案例(AC通过三层口对AP进行管理)

组网需求 为一个家庭用户使用的网络架构。该家庭消费用户的上网流量大多是低速流量&#xff0c;例如浏览网页、玩游戏、看视频等。家庭成员使用的无线终端主要为手机、PC、电视机等。终端接入的数量正常情况下在10个以内&#xff0c;偶尔有家庭聚会等特殊情况&#xff0c;终端接…...

Spring Boot 2 (七):Spring Boot 如何解决项目启动时初始化资源

在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等。今天就给大家介绍一个 Spring Boot 神器,专门帮助大家解决项目启动初始化资源操作。 这个神器就是 CommandLineRunner,CommandLineRunner 接口的 Co…...

用Hopper修改代理软件端口

背景 用代理软件可以访问google&#xff0c;但是端口经常不固定&#xff0c;从缺省1080变成了随机。 前几天其实已经用Hopper 3.0看了一次&#xff0c;但是好像不支持go&#xff0c;所以没反编译成功&#xff0c;这次换了4.0&#xff0c;支持了go。 Hopper与逆向 逆向的目的…...

PKI等介绍

PKI 1、概述 KPI名称&#xff1a;Public Key Infrastructure 公钥基础设施 KPI作用&#xff1a;通过加密技术和数字签名保证信息的安全 KPI组成&#xff1a;公钥加密技术、数字证书、CA、RA 2、信息安全三要素 机密型、完整型、身份验证、操作的不可否认性 3、哪些领域…...

《模拟电子技术》半导体原理部分笔记

《模拟电子技术》笔记绪论第一章 常用半导体器件第二章 基本放大电路绪论 有的人把三极管的出现作为电子技术工业革命的开始标志学习架构&#xff1a;半导体器件&#xff08;二极管、三极管、场效应晶体管&#xff09;、基于上述管的放大电路、集成运算放大器、放大电路的频率…...

Python与MySQL交互

第四章 Python与MySQL交互 1、客户端库概述及安装 PyMySQL介绍 PyMySQL是在 Python3.x 版本中用于连接 MySQL 服务器的一个客户端库。 PyMySQL安装&#xff1a; pip install pymysql执行过程如下图&#xff1a; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来…...

list的模拟实现(万字解读+由浅入深)

先申明一下本篇总体介绍过程是按照逐步深入去写的&#xff0c;所以可能有些同样类型不在一块&#xff01; 前言&#xff1a; 写这篇博客的时候&#xff0c;我是边思考边写它&#xff01;自己其中感觉自己对于list的理解更加的深入&#xff0c;其中提出的很多问题让我明白了lis…...

Java项目:SSM CRM人事管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 CRM人事管理系统&#xff0c;主要功能有&#xff1a; 用户管理&#xff1a;用户查询、添加用户、编辑、删除&#xff1b; 职位管理&#xff1a…...

Qt+opencv 鼠标画线实现几何图形识别并动态创建

前言 使用Qt OpenCV实现&#xff0c;通过鼠标画线绘制几何图形&#xff0c;然后通过opencv进行图形轮廓识别&#xff0c;返回图形顶点&#xff0c;然后创建对应的几何图形添加到场景中。绘制使用QGraphics体系完成。 看效果图&#xff1a; 本文demo在这里 点击下载 环境: …...

HTML5期末大作业——HTML+CSS+JavaScript平遥古城旅游景点介绍(6页)

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…...

HTML5期末考核大作业 基于HTML+CSS+JavaScript沪上美食(9页)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…...

Reg注册表读写

在Windows 95及其后继版本中&#xff0c;采用了一种叫做“注册表”的数据库来统一进行管理&#xff0c;将各种信息资源集中起来并存储各种配置信息。按照这一原则&#xff0c;Windows各版本中都采用了将应用程序和计算机系统全部配置信息容纳在一起的注册表&#xff0c;用来管理…...

HTML入门零基础教程(五)

嗨&#xff0c;大家好&#xff0c;我是异星球的小怪同志 一个想法有点乱七八糟的小怪 如果觉得对你有帮助&#xff0c;请支持一波。 希望未来可以一起学习交流。 目录 一、图像标签 1.图像标签 2.图标标签的其它属性 3.图像标签属性注意点&#xff1a; 一、图像标签 1.…...

java通过lock实现同步锁

这里我们是一个卖票的演示代码 其实 同步锁 远不止一个synchronized 它本身有一个 加上锁 和释放锁的过程 为了 让我们更好的理解这个过程 JDK5之后 为我们提供了一个单独的锁工具 lock lock是一个接口 他提供了 synchronized 方法 和 更广泛的语句操作 lock方法 获得锁 unl…...

Java多线程同步工具类:Semaphore原理剖析

Java多线程同步工具类&#xff1a;Semaphore原理剖析 文章目录Java多线程同步工具类&#xff1a;Semaphore原理剖析Semaphore原理实战案例前驱知识准备&#xff1a;AbstractQueuedSynchronizer队列同步器 [Java多线程之&#xff1a;队列同步器AbstractQueuedSynchronizer原理剖…...

C++之面向对象

目录 对象与类 类的语法&#xff1a; C中class与struct的区别&#xff1a; 通过类实例化对象的方式 具体案例 类作用域与分文件编写 创建circle.h头文件 创建源文件circle.cpp 创建all.cpp来作为程序的入口 封装 封装的意义 访问权限符 成员属性私有化 优点 具体…...

Windows-》CMD命令

CMD命令【1】Windows-》CMD命令1.mstsc&#xff1a;打开远程桌面连接。2.services.msc&#xff1a;打开本地服务设置。3.notepad&#xff1a;打开记事本。4.control&#xff1a;打开控制面板。5.regedit&#xff1a;打开注册列表编辑器。6.compmgmt.msc---设备管理器。&#xf…...

秒级使网站变灰,不改代码不上线,如何做到?

注意&#xff1a;文本不是讲如何将网站置灰的那个技术点&#xff0c;那个技术点之前汶川地震的时候说过。 本文不讲如何实现技术&#xff0c;而是讲如何在第一时间知道消息后&#xff0c;更快速的实现这个置灰需求的上线。 实现需求不是乐趣&#xff0c;指挥别人去实现需求才…...

vue教程

vue window本地保存Local Storage 保存&#xff1a;window.localStorage.setItem(名,值); window.localStorage.setItem(token,backdata.data[2]); 查询&#xff1a;window.localStorage.getItem(名); window.localStorage.getItem(token); 删除&#xff1a;window.localStor…...

认识哈希表

作者&#xff1a;~小明学编程 文章专栏&#xff1a;Java数据结构 格言&#xff1a;目之所及皆为回忆&#xff0c;心之所想皆为过往 目录 为什么我们需要哈希表&#xff1f; 哈希表的原理 什么是哈希值 冲突 负载因子 解决冲突 闭散列 开散列/哈希桶 代码实现 不考虑…...

Vue学习:Hello小案例

使用Vue的目的&#xff1a;构建用户界面&#xff08;需要使用容器 摆放这个界面的内容&#xff09; favicon.ico:1 GET http://127.0.0.1:5500/favicon.ico 404 (Not Found) 没有页签图标 在者服务器中 http://127.0.0.1:5500没有/favicon.ico 强制刷新网页&#xff1a;s…...

IDEA创建Java Web项目

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;JAVA开发者…...

C++11中可变参数模板使用

在看同事编写的代码&#xff0c;发现有如下的代码&#xff0c;因为没用过&#xff0c;所以查了一下这是什么语法&#xff0c;通过查询资料知道了这是C11中增加的可变参数模板。 template<class T, class ...Args> bool GetValue(T &value, Args &&...args) c…...

MySQL 中的 sql_mode 选项以及配置

MySQL 中的 sql_mode 选项以及配置 目录MySQL 中的 sql_mode 选项以及配置一、查询与设置 sql_mode1、查询 sql_mode2、设置 sql_mode&#xff08;1&#xff09;通过命令设置&#xff08;2&#xff09;在配置文件中设置二、sql_mode 支持的模式1、ANSI 模式&#xff08;宽松模式…...

【C语言航路】第六站:指针初阶

目录 一、指针是什么 二、指针和指针类型 1.指针类型的意义 2.指针-整数 3.指针解引用 三、野指针 1.野指针的成因 &#xff08;1&#xff09;指针未初始化 &#xff08;2&#xff09;指针越界访问 &#xff08;3&#xff09;指针指向的空间释放 2.如何规避野指针 &a…...

从 JPA 2.x 迁移到 3.0

我最近收到了很多关于JPA 3.0的问题&#xff0c;由于EclipseLink和Hibernate现在提供了对它的全面支持&#xff0c;现在是时候仔细看看规范的最新更新了。作为从Java EE到Jakarta EE转换的一部分&#xff0c;Java Persistence API&#xff08;JPA&#xff09;更名为Jakarta Per…...

4个有点离谱,但真能让你身材变好的技巧!

博士一分钟,姿势涨不停我是好奇博士很高兴认识你们...

【scikit-learn】DBSCAN基于密度聚类ML模型实战及经验总结(更新中)

1.一直以来想写下基于scikit-learn训练AI算法的系列文章&#xff0c;作为较火的机器学习框架&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下scikit-learn框架DBSCAN密度聚类机器学习模型相关知识…...

Top10+java类

OWASPTOP10 文章目录 OWASPTOP10sql注入(面了几家问了几家)xss是什么SSRF文件上传文件包含漏洞命令执行漏洞代码执行漏洞常见的逻辑漏洞越权漏洞java类问题Java 内存马java反序列化的原理:讲一讲weblogic讲一讲shiro反序列化原理讲一讲fastjson反序列化原理:讲一讲log4j RC…...

Google I/O 2024 干货全解读:Gemini AI 横空出世,智能未来触手可及!

Google I/O 2024 干货全解读&#xff1a;Gemini AI 横空出世&#xff0c;智能未来触手可及&#xff01; 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》…...

立创EDA绘制电路原理图

1、下载立创EDA并安装注册&#xff0c;这里我用的是标准版 2、在账号名右键&#xff0c;新建工程 3、以单片机时钟电路为例 4、首先绘制原理图 &#xff08;1&#xff09;放置元器件&#xff0c;以AT89C52为例&#xff0c;在元件库中查找单片机&#xff0c;找到后确认封装&…...

比特币Brc-20部署发布:实用步骤演示,请点赞收藏!(二)

大家好&#xff0c;我是程序员大猩猩。 上一次我们讲到部署发布BRC-20合约的前期概念&#xff0c;以及获取unisat浏览器插件和获取测试币水龙头的获取。 比特币Brc-20部署发布&#xff1a;实用步骤演示&#xff0c;请点赞收藏&#xff01;&#xff08;一&#xff09; 这一节…...