MATLAB与STK互联:仿真并获取低轨卫星与指定区域地面站的可见性数据

news2024/11/7 11:35:26

MATLAB控制STK实现:仿真并获取低轨卫星与指定区域地面站的可见性数据

本次仿真主要参考了多篇文献和网站,包括但不限于:《Using MATLAB for STK Automation》、CSDN博文: 拜火先知的博客_CSDN博客-笔记、AGI官网有关MATLAB的内容等内容,学习后很有收获,在此写下学习记录。

文章目录

  • MATLAB控制STK实现:仿真并获取低轨卫星与指定区域地面站的可见性数据
    • 实验目的
    • MATLAB与STK互联并创建场景
    • 创建新卫星对象
      • 轨道类型设置
    • 创建均匀分布的目标接收机
      • 创建新的Facility并设置参数
      • 创建新的Sensor并设置参数
      • 创建新的Receiver并设置参数
      • 创建Access分析
    • 卫星相对于目标接收机的距离/速度/加速度/多普勒频率的计算
      • 使用STK逐一计算方法
      • 使用MATLAB自动化获取report
    • 使用MATLAB自动化获取report
      • 计算卫星可见性次数
      • 获取卫星可见性数据
    • 实验结果
      • MATLAB结构体数据
    • 实验效果视频
    • 实验代码

实验目的

使用MATLAB控制STK,实现如下功能:

  • 生成1颗LEO卫星或产生一个LEO星座
  • 在指定的区域内均匀分布目标接收机,指定区域大小为100km或500km
  • 通过STK的access分析低轨卫星在过顶时,卫星相对于目标接收机的距离/速度/加速度/多普勒频率(分辨率为10s)

MATLAB与STK互联并创建场景

MATLAB与STK互联,主要有两种方式,一种是connect、一种是com口。这里主要采用com口形式,要比connect连接简单一些。
在MATLAB命令窗口(或新建.m文件)输入以下命令:

%这里改成自己STK的版本号
uiapplication = actxserver(‘STK11.application’);

键入下面的代码以创建具有自定义时间段的新场景。

%root是以后操作场景以及场景中对象的源头
root = app.Per	sonality2;
%新建场景
scenario = root.Children.New('eScenario','MATLAB_PredatorMission');
%将场景保存在指定目录下,同时可以将场景重新命名
root.SaveScenarioAs('E:\Program Files\STK\Documents\STK 11 (x64)\Scenario1_jz2');
scenario.SetTimePeriod('2 Jun 2022 16:00:00.000','3 Jun 2022 16:00:00.000');
scenario.StartTime = '2 Jun 2022 16:00:00.000';
scenario.StopTime = '3 Jun 2022 16:00:00.000';
root.ExecuteCommand('Animate * Reset');

创建新卫星对象

以下代码,将新建卫星对象。控制句柄为sat

%mysat是卫星在STK场景中的名字
sat = scenario.Children.New(‘eSatellite’,'mysat');
%执行下面命令,也可建立卫星。因为‘eSatellite’枚举序号为18
%sat = scenario.Children.New(18,‘mysat’);
%执行Propagate命令后,卫星将运行,即在STK中可以看到卫星运行轨迹
sat.Propagator.Propagate;

关于STK卫星对象属性值的设置,参见MATLAB与STK互联5:查看STK中对象的属性(2)—卫星对象属性梳理1_拜火先知的博客-CSDN博客

在新建卫星对象后,直接执行:sat.Propagate语句,会生成STK默认参数的卫星。默认参数为:倾角28.5°,轨道高度300km的圆轨道,动力学模型为二体模型。
我们在分析问题时,绝大多数情况下都不会使用上述的默认参数,这就涉及到卫星轨道参数设置。卫星轨道参数设置,也存在多种方法,下面介绍:设置经典的轨道六根数。

%将卫星轨道参数转换为开普勒六根数形式
kep=satPro.InitialState.Representation.ConvertTo(‘eOrbitStateClassical’);
%卫星轨道参数设置,可选择的形式有以下几种
%eOrbitStateClassical—经典轨道六根数形式
%eOrbitStateCartesian—位置、速度信息形式
%其他形式,大家可根据STK属性页查看,命名规则大致如上

下面是卫星参数设置,是本文重点

轨道类型设置

kep.SizeShapeType = 'eSizeShapeAltitude';

这里轨道形状类型,可以查看STK卫星轨道属性页面,有如下参数:

eSizeShapeSemimajorAxis—半长轴+偏心率型
eSizeShapeAltitude—远地点、近地点高度型
eSizeShapeRadius—远地点、近地点半径型
eSizeShapePeriod—轨道周期型
eSizeShapeMeanmotion—平动型

+++

LocationType:用于指定航天器在epoch轨道上的位置的元素

Orientation:轨道方向

kep.LocationType = 'eLocationTrueAnomaly';
kep.Orientation.AscNodeType = 'eAscNodeLAN';

+++

SizeShape:轨道的大小和形状

Orientation:轨道方向

Orientation.ArgOfPerigee:在卫星运动方向和轨道平面上,从上升节点到偏心矢量(轨道最低点)的角度。使用角维度。

Orientation.Inclination:轨道倾角。角动量矢量(垂直于轨道平面)和惯性Z轴之间的角。使用角维度。

kep.SizeShape.PerigeeAltitude = 500;
kep.SizeShape.ApogeeAltitude = 500;
kep.Orientation.Inclination = 60;
kep.Orientation.ArgOfPerigee = 0;
kep.Orientation.AscNode.Value = 0;
kep.Location.Value = 0;

+++

显示卫星轨迹

sat.Propagator.InitialState.Representation.Assign(kep);
sat.Propagator.Propagate;
image-20220605185848825

通过matlab运行后,STK生成的“mysat”卫星如图。

创建均匀分布的目标接收机

在一个指定的目标区域内,按照每隔0.5个经度和0.5个纬度(每个约50km分布一个监测站),均匀分布着多个Facility、Sensor、Receiver(由于输出多普勒频率只能用transmitter到receiver,所以需要在Facility上附着Sensor和Receiver),这三者属于附着关系,Receiver附着在Sensor上,Sensor附着在Facility上。

首先附上生成的结果图,由图知,监测站等距离均匀地分布在一个正方形区域内,每隔约50km分布一个。

image-20220605190632678

具体创建流程如下:

创建新的Facility并设置参数

首先需要进行for循环,在经纬度方向上个循环10次,也就是说一共在方圆500km内建立100个监测站。root.CurrentScenario.Children.New是建立一个新的Facility。

for Lat=0:9
    for lon=0:9
        facility = root.CurrentScenario.Children.New('eFacility', ['MyFacility',num2str(lon),num2str(Lat)]);

接着对Facility设置参数,值得一提的是,在对Facility进行位置定义时,facility.Position.AssignGeodetic每次增加0.5个经度/纬度。

    facility.Position.AssignGeodetic(41.9849+Lat*0.5,120.4039+lon*0.5,0) % Latitude, Longitude, Altitude
    % Set altitude to height of terrain
    facility.UseTerrain = true;
    % Set altitude to a distance above the ground
    facility.HeightAboveGround = .05; % km

创建新的Sensor并设置参数

创建新的Sensor的语句是:

sensor = facility.Children.New('eSensor',['MySensor',num2str(lon),num2str(Lat)]);

我们发现,如果单纯用该语句,那么sensor的视图会很难看,因此,我们需要关闭这个sight,但是由于找不到如何关闭,所以,只能接下来设置一下Constraints了,将Sensor的range_Max设置为0.

image-20220605191856095

故代码如下:

senConstraints = sensor.AccessConstraints;
        altitude = senConstraints.AddConstraint('eCstrRange');%file:///E:/Program%20Files/AGI/STK%2011/Help/Programming/index.htm#DocX/STKObjects~IAgSensor.html?Highlight=sensor.AccessConstraints
        altitude.EnableMax = true;
        altitude.Max = 0;
        % 可算出来了,设置了sensor的Constraints中的Range参数,让他为0,这样sensor就不会是个圆锥型了
        % IAgAccessConstraintCollection Collection
        % 对于sensor常规参数的修改,参考网址是:file:///E:/Program%20Files/AGI/STK%2011/Help/Programming/index.htm#DocX/STKObjects~IAgAccessConstraintCollection.html?Highlight=eCstrLunarElevationAngle%20eCstrLighting
        %STK开发如果没有头绪,一个是查帮助,另一个就是用get、invoke查看相关信息。所以,可以上get

代码不多,但是很费力地才运行成功。

创建新的Receiver并设置参数

设置Receiver的最大接收范围是5000km,仰角为5°

		receiver = sensor.Children.New('eReceiver', ['MyReceiver',num2str(lon),num2str(Lat)]);
        %设置地面站约束
        facConstraints = receiver.AccessConstraints;
        %设置最大距离约束
        rangeCstr = facConstraints.AddConstraint('eCstrRange');
        rangeCstr.EnableMax = 1;
        rangeCstr.Max = 2000;
        %设置仰角约束
        elevationCstr = facConstraints.AddConstraint('eCstrElevationAngle');
        elevationCstr.EnableMin = 1;
        elevationCstr.Min = 5;

创建Access分析

        sat2rec=receiver.GetAccessToObject(Transmitter);
        sat2rec.ComputeAccess;
    end
end

最终生成的结果如下,视频中所展示的那样

<video id=“video” controls=""src=“https://pdswsj.oss-cn-beijing.aliyuncs.com/img/20220605_193050.mp4” preload=“none”>

卫星相对于目标接收机的距离/速度/加速度/多普勒频率的计算

获取的方法包括使用STK逐一计算和使用MATLAB自动化获取两种方法

使用STK逐一计算方法

选择:Analysis-Access,在Access for中选择“mysat”,任意选择一个MyFacility,这里拟选择“MyFacility00”,然后单击“Report & Graph Manager…”,在右边“Styles”中选择AER,可以生成详细报告和图表

image-20220605194445561

image-20220605194512589

此外,选择任意transmitter和receiver还可以产生多普勒频率的仿真值,使用的是“Link Budget - detailed”这个Styles

image-20220605194719304

如上图所示。

使用MATLAB自动化获取report

正在学习,下周更新……

——————————————————————————————————————
更新:

使用MATLAB自动化获取report

实现MATLAB自动化需要以下几步:

计算卫星可见性次数

使用前文定义的sat2fac对象,根据STK提供的接口(IAgStkAccess Interface):

 			acc_interval = sat2fac.ComputedAccessIntervalTimes;
            %可见次数如下
            count=acc_interval.Count;

计算出在一天时间内卫星可见次数。

获取卫星可见性数据

可见性数据包括各个时刻(分辨率为10秒),卫星相对于地面站的仰角,距离等要素。

			acc.AER(lon*10+Lat).result(1,:)={'Time' 'azimuth' 'range'};
            sum=0;
            for i=0:count-1
                [str,sto] = acc_interval.GetInterval(i);
                %结合上篇博文,获取第一个可见弧段内的方位角
                aerDP = sat2fac.DataProviders.Item('AER Data').Group.Item('VVLH CBF').Exec(str,sto,10);
                azimuth = cell2mat(aerDP.DataSets.GetDataSetByName('Azimuth').GetValues);
                range = cell2mat(aerDP.DataSets.GetDataSetByName('Range').GetValues);
                time = aerDP.DataSets.GetDataSetByName('Time').GetValues;
                len=length(range);
                for j=1:len
                    acc.AER(lon*10+Lat).result(j+1+sum,:)={time(j) azimuth(j) range(j)};
                end
                sum=sum+len;
            end

实验结果

MATLAB结构体数据

我们讲个地面站与卫星的参数保存为一个结构体,字段1代表Facility01地面站相对于卫星Sat的各个可见时刻的数据信息。如图所示:

image-20220608210756252

该图就是Facility01地面站相对于卫星Sat的各个可见时刻的具体数据信息。

image-20220612181420914

实验效果视频

实验全流程视频如下

<video id=“video” controls=""src=“https://pdswsj.oss-cn-beijing.aliyuncs.com/img/20220612_181543.mp4” preload=“none”>

实验代码

写了一晚上程序,可以实现这个目标了,先附上最终代码

clear all
clc
app = actxserver('STK11.application');
root = app.Personality2;
scenario = root.Children.New('eScenario','MATLAB_PredatorMission');
root.SaveScenarioAs('E:\Program Files\STK\Documents\STK 11 (x64)\Scenario1_jz2');
scenario.SetTimePeriod('2 Jun 2022 16:00:00.000','3 Jun 2022 16:00:00.000');
scenario.StartTime = '2 Jun 2022 16:00:00.000';
scenario.StopTime = '3 Jun 2022 16:00:00.000';
root.ExecuteCommand('Animate * Reset');
%facility = scenario.Children.New('eFacility','GroundStation'); 
% areaTarget = root.CurrentScenario.Children.New('eAreaTarget', 'MyAreaTarget');
% root.BeginUpdate();
% areaTarget.AreaType = 'eEllipse';
% ellipse = areaTarget.AreaTypeData;
% %ellipse.Add(48.897, 18.637);
% ellipse.SemiMajorAxis = 85.25; % in km (distance dimension)
% ellipse.SemiMinorAxis = 85.25; % in km (distance dimension)
% ellipse.Bearing = 44; % in deg (angle dimension)
% root.EndUpdate();
sat = scenario.Children.New(18,'mysat');
kep = sat.Propagator.InitialState.Representation.ConvertTo('eOrbitStateClassical');
kep.SizeShapeType = 'eSizeShapeAltitude';
kep.LocationType = 'eLocationTrueAnomaly';
kep.Orientation.AscNodeType = 'eAscNodeLAN';
kep.SizeShape.PerigeeAltitude = 500;
kep.SizeShape.ApogeeAltitude = 500;
kep.Orientation.Inclination = 60;
kep.Orientation.ArgOfPerigee = 0;
kep.Orientation.AscNode.Value = 0;
kep.Location.Value = 0;
sat.Propagator.InitialState.Representation.Assign(kep);
sat.Propagator.Propagate;
sensor = sat.Children.New('eSensor','MySensor_sat');
Transmitter = sensor.Children.New('eTransmitter', 'Mytransmitter');
Transmitter.SetModel('GPS Satellite Transmitter Model');
%建立卫星对象,并设置参数
% satellite = root.CurrentScenario.Children.New('eSatellite', 'MySatellite');
% scenPath = 'E:\Program Files\STK\Documents\STK 11 (x64)\Scenario1_learn3';
% satelliteFilePath = [scenPath '\ISS_25544.sa'];
% satellite.ExportTools.GetEphemerisStkExportTool.Export(satelliteFilePath);

% IAgFacility facility: Facility Object
for Lat=0:9
    for lon=0:9
        if lon~=0 | Lat~=0
            facility = root.CurrentScenario.Children.New('eFacility', ['MyFacility',num2str(lon),num2str(Lat)]);
            facility.Position.AssignGeodetic(41.9849+Lat*0.5,120.4039+lon*0.5,0) % Latitude, Longitude, Altitude
            % Set altitude to height of terrain
            facility.UseTerrain = true;
            % Set altitude to a distance above the ground
            facility.HeightAboveGround = .05; % km
            sensor = facility.Children.New('eSensor',['MySensor',num2str(lon),num2str(Lat)]);
            %         pattern1 = sensor.Pattern;
            %         sensor.FieldOfView
            senConstraints = sensor.AccessConstraints;
            altitude = senConstraints.AddConstraint('eCstrRange');%file:///E:/Program%20Files/AGI/STK%2011/Help/Programming/index.htm#DocX/STKObjects~IAgSensor.html?Highlight=sensor.AccessConstraints
            altitude.EnableMax = true;
            altitude.Max = 0;
            % 可算出来了,设置了sensor的Constraints中的Range参数,让他为0,这样sensor就不会是个圆锥型了
            % IAgAccessConstraintCollection Collection
            % 对于sensor常规参数的修改,参考网址是:file:///E:/Program%20Files/AGI/STK%2011/Help/Programming/index.htm#DocX/STKObjects~IAgAccessConstraintCollection.html?Highlight=eCstrLunarElevationAngle%20eCstrLighting
            %STK开发如果没有头绪,一个是查帮助,另一个就是用get、invoke查看相
            %关信息。所以,上get
            %         pattern1.ConeAngle = 85;
            receiver = sensor.Children.New('eReceiver', ['MyReceiver',num2str(lon),num2str(Lat)]);
            %设置地面站约束
            facConstraints = receiver.AccessConstraints;
            %设置最大距离约束
            rangeCstr = facConstraints.AddConstraint('eCstrRange');
            rangeCstr.EnableMax = 1;
            rangeCstr.Max = 2000;
            %设置仰角约束
            elevationCstr = facConstraints.AddConstraint('eCstrElevationAngle');
            elevationCstr.EnableMin = 1;
            elevationCstr.Min = 5;
            sat2fac=sat.GetAccessToObject(facility);
            sat2fac.ComputeAccess;
            %         aerDP = sat2fac.DataProviders.Item('AER Data').Group.Item('VVLH CBF').Exec(scenario.StartTime,scenario.StopTime,60);
            %         azimuth = cell2mat(aerDP.DataSets.GetDataSetByName('Range').GetValues);
            acc_interval = sat2fac.ComputedAccessIntervalTimes;
            %可见次数如下
            count=acc_interval.Count;
            %可见的弧段起始时间列表
            %acc_interval.ToArray(0,-1)
            %str、sto分别是第一个弧段的起始时间,是字符串类型。
            acc.AER(lon*10+Lat).result(1,:)={'Time' 'azimuth' 'range'};
            sum=0;
            for i=0:count-1
                [str,sto] = acc_interval.GetInterval(i);
                %结合上篇博文,获取第一个可见弧段内的方位角
                aerDP = sat2fac.DataProviders.Item('AER Data').Group.Item('VVLH CBF').Exec(str,sto,10);
                azimuth = cell2mat(aerDP.DataSets.GetDataSetByName('Azimuth').GetValues);
                range = cell2mat(aerDP.DataSets.GetDataSetByName('Range').GetValues);
                time = aerDP.DataSets.GetDataSetByName('Time').GetValues;
                len=length(range);
                for j=1:len
                    acc.AER(lon*10+Lat).result(j+1+sum,:)={time(j) azimuth(j) range(j)};
                end
                sum=sum+len;
            end
        end
    end
end

% satellite = root.GetObjectFromPath('/Satellite/mysat');
% receiver = root.GetObjectFromPath('/Facility/MyFacility99');
% senConstraints = sensor.AccessConstraints;
% altitude = senConstraints.AddConstraint('eCstrAltitude');%file:///E:/Program%20
% % Files/AGI/STK%2011/Help/Programming/index.htm#DocX/STKObjects~IAgSensor.html?Highlight=sensor.AccessConstraints
% altitude.EnableMax = true; 
% altitude.Max = 2;
% AER()
% 对于sensor常规参数的修改,参考网址是:file:///E:/Program%20Files/AGI/STK%2011/Help/Programming/index.htm#DocX/STKObjects~IAgAccessConstraintCollection.html?Highlight=eCstrLunarElevationAngle%20eCstrLighting


各个站点的结果输出在了一个结构体中,每个结构体包含以下三种元素(time azimuth range),其中range就是星地间距离,可以作为整个系统的 输出。数据保存在这个链接,下载即可查看https://pdswsj.oss-cn-beijing.aliyuncs.com/img/matlab.mat

image-20220608210844209

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker engine stopped

1&#xff09;环境&#xff1a;win 10 2&#xff09;docker安装时已经已经安装了虚拟机 3&#xff09;启用网络适配器 4&#xff09;启用docker服务&#xff08;依赖服务LanmanServer&#xff09; 5&#xff09;全都弄好了&#xff0c;docker还是打不开&#xff0c;没办法了&a…

天翼网关 3.0 兆能 ZNHG600 获取超级密码改桥接

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 前不久朋友家断网&#xff0c;喊了宽带师傅修完之后&#xff0c;光猫就从桥接模式变成了路由模式。虽然对于日常上网来说区别不大&#xff0c;但这条宽带有公网 IP&#xff0c;通过光猫拨号的话&#xff0…

C语言常见进制 (二进制、八进制、十进制、十六进制)详解

C语言常见进制的详解 放在最前面的前言&#xff1a;1、分类2、二进制&#xff08;2.1&#xff09;二进制的解释说明&#xff08;2.2&#xff09;关于二进制的计算&#xff08;2.3&#xff09; 二进制转换为八进制&#xff08;2.4&#xff09; 二进制转换为十进制 3、八进制&…

在 .NET 8 Web API 中实现 Entity Framework 的 Code First 方法

本次介绍分为3篇文章&#xff1a; 1&#xff1a;.Net 8 Web API CRUD 操作.Net 8 Web API CRUD 操作-CSDN博客 2&#xff1a;在 .Net 8 API 中实现 Entity Framework 的 Code First 方法https://blog.csdn.net/hefeng_aspnet/article/details/143229912 3&#xff1a;.NET …

初识动态规划(由浅入深)

&#x1f913; 动态规划入门与进阶指南 &#x1f4d8; 动态规划&#xff08;Dynamic Programming, DP&#xff09;是一种非常经典的&#x1f4d0;算法方法&#xff0c;特别适合用来解决那些有大量重复计算的问题&#x1f300;。它可以将复杂的问题拆分为小问题&#x1f9e9;&a…

【STM32】SD卡

(一)常用卡的认识 在学习这个内容之前&#xff0c;作为生活小白的我对于SD卡、TF卡、SIM卡毫无了解&#xff0c;晕头转向。 SD卡&#xff1a;Secure Digital Card的英文缩写&#xff0c;直译就是“安全数字卡”。一般用于大一些的电子设备比如&#xff1a;电脑、数码相机、AV…

《JVM第5课》虚拟机栈

无痛快速学习入门JVM&#xff0c;欢迎订阅本免费专栏 Java虚拟机栈&#xff08;Java Virtual Machine Stack&#xff0c;简称JVM栈&#xff0c;又称Java方法栈&#xff09;是 JVM 运行时数据区的一部分&#xff0c;主要用于支持Java方法的执行。每当一个新线程被创建时&#xf…

Java Executor RunnableScheduledFuture 总结

前言 相关系列 《Java & Executor & 目录》《Java & Executor & RunnableScheduledFuture & 源码》《Java & Executor & RunnableScheduledFuture & 总结》《Java & Executor & RunnableScheduledFuture & 问题》 涉及内容 《…

软考(中级-软件设计师)数据库篇(1101)

第6章 数据库系统基础知识 一、基本概念 1、数据库 数据库&#xff08;Database &#xff0c;DB&#xff09;是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储&#xff0c;具有较小的冗余度、较高的数据独立性和扩展…

zynq PS端跑Linux响应中断

这篇文章主要是讲述如何在Zynq的PS上跑Linux启动IRQ&#xff0c;环境为vivado2019.1&#xff0c;petalinux2019.1 ubuntu20.04&#xff0c;本人初学者&#xff0c;欢迎批评指正 1. Vivado硬件设计 确保自定义IP的中断信号通过 IRQ_F2P 连接到PS端。在开始Petalinux配置之前&a…

R语言贝叶斯

原文链接&#xff1a;R语言贝叶斯进阶&#xff1a;INLA下的贝叶斯回归、生存分析、随机游走、广义可加模型、极端数据的贝叶斯分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247625527&idx8&snba4e50376befd94022519152609ee8d0&chksmfa8daad0cdfa…

qt QRadioButton详解

QRadioButton 是一个可以切换选中&#xff08;checked&#xff09;或未选中&#xff08;unchecked&#xff09;状态的选项按钮。单选按钮通常呈现给用户一个“多选一”的选择&#xff0c;即在一组单选按钮中&#xff0c;一次只能选中一个按钮。 重要方法 QRadioButton(QWidget…

webm格式怎么转换成mp4?这9种转换方法你肯定能够学会!

webm格式怎么转换成mp4&#xff1f;WebM&#xff0c;作为一种新兴的视频文件格式&#xff0c;虽然带着革新性的光芒&#xff0c;在视频压缩效率和播放流畅性上表现出色&#xff0c;却也面临着几个重要的挑战&#xff0c;这些问题直接影响了用户的体验&#xff0c;首先&#xff…

HTML 语法规范全解:构建清晰、兼容性强的网页基础

文章目录 一、代码注释1.1 使用注释的主要目的1.2 使用建议二、标签的使用2.1 开始标签和结束标签2.2 自闭合标签2.3 标签的嵌套2.4 标签的有效性三、属性四、缩进与格式4.1 一致的缩进4.2 元素单独占用一行4.3 嵌套元素的缩进4.4 避免冗长的行五、字符编码六、小结在开发 HTML…

10 P1094 [NOIP2007 普及组] 纪念品分组

题目&#xff1a; 代码&#xff1a; #include<iostream> using namespace std; # define M 100 #include<algorithm> int sa[100005];int main() {int w,n;cin>>w>>n;for(int i1;i<n;i){cin>>sa[i];}sort(sa1,sa1n);int l1;int rn;int count…

LeetCode.冗余连接(并查集以及广度优先搜索)

684.冗余连接| 传送门&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1&#xff5e;n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间&#xff0c;且这条附加的边不属于树中…

一文彻底整明白,基于Ollama工具的LLM大语言模型Web可视化对话机器人部署指南

在上一篇博文中&#xff0c;我们在本地部署了Llama 3 8B参数大模型&#xff0c;并用 Python 写了一个控制台对话客户端&#xff0c;基本能愉快的与 Llama 大模型对话聊天了。但控制台总归太技术化&#xff0c;体验不是很友好&#xff0c;我们希望能有个类似 ChatGPT 那样的 Web…

BES2600WM---HiLink RM56 EVK

0 Preface/Foreword 1 环境搭建 1.1 安装依赖工具 sudo apt-get install build-essential gcc g make zlib* libffi-dev e2fsprogs pkg-config flex bison perl bc openssl libssl-dev libelf-dev libc6-dev-amd64 binutils binutils-dev libdwarf-dev u-boot-tools mtd-utils…

Leetcode21:合并两个有效链表

原题地址&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示…

51c嵌入式~IO合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/12383193 一、单片机通信数据接收解析方法 前阵子一朋友使用单片机与某外设进行通信时&#xff0c;外设返回的是一堆格式如下的数据&#xff1a; AA AA 04 80 02 00 02 7B AA AA 04 80 02 00 08 75 AA AA 04 80 02 00 9B E2…