【蓝桥杯嵌入式】蓝桥杯嵌入式第十四届省赛程序真题,真题分析与代码讲解

news2024/11/25 14:58:02

 🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都已更新完毕,欢迎大家前往订阅本专题🎏

🎏【蓝桥杯嵌入式】蓝桥杯第十届省赛真题

🎏【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题

🎏【蓝桥杯嵌入式】蓝桥杯第十三届省赛程序真题

🪔本系列专栏 -   蓝桥杯嵌入式_勾栏听曲_0的博客

🍻欢迎大家  🏹  点赞👍  评论📨  收藏⭐️

📌个人主页 -  勾栏听曲_0的博客📝

🔑希望本文能对你有所帮助,如有不足请指正,共同进步吧🏆

🎇书咄咄,且休休,一丘一壑也风流。📈

目录

题目

硬件框图

功能要求

初始状态说明

赛题分析

代码实现


题目

硬件框图

功能要求

🍓功能概述

        1)通过PA1引脚输出频率、占空比可调节的脉冲信号。

        2)通过PA7引脚完成脉冲捕获功能,测量输入到该引脚的信号频率。

        3)通过微控制器的ADC 功能,检测电位器R37上输出的模拟电压信号。

        4)依试题要求,通过 LCD、LED完成数据显示、报警指示等功能。

        5)依试题要求,通过按键完成界面配置、参数设置等功能。

🍒性能要求

        1)按键响应时间:≤0.1秒。

        2)指示灯动作响应时间:≤0.2秒。

🍑PWM输出(PA1)

        1)低频模式:输出信号频率为4KHz。

        2)高频模式:输出信号频率为8KHz。

        PA1输出信号占空比可以通过电位器R37进行调节,关系如下图所示

        当模式切换时,在保证占空比不变的前提下,频率在5秒内均匀的升高或降低到目标频率,要求频率步进值小于200Hz。

🍍频率测量(PA7)

        测量输入到PA7引脚的信号频率,并将其转换为速度值,速度值(v)与频率值(f)的对应关系:

V = \frac{f*2\pi R}{100*K}

        其中f 单位为Hz,R和K作为参数,可以通过按键进行调整,n取小数点后2位有效数字。

🍋显示功能

        1)数据界面

                显示要素包括界面名称(DATA)、PWM输出模式(M、实时占空比(P)、实时速度(V)。

                实时速度取小数点后1位有效数字。

                输出模式以“H”表示高频模式、“L”表示低频模式,模式切换未完成前,屏幕显示的输出模式保持不变。

        2)参数界面

                显示要素包括界面名称(PARA)、参数R和K的当前值,R值和K值有效范围1-10,整数。

        3)统计界面

                显示要素包括:界面名称(RECD)、PWM输出模式切换次数(N)、高频和低频模式下的速度最大值。


                MH:高频模式最大速度,ML:低频模式最大速度,显示保留小数点后1位有效数字。

        4) LCD通用显示要求

                显示背景色(BackColor):黑色

                显示前景色(TextColor):白色

                数据项与对应的数据之间使用“=”间隔开。

                请严格按照图示3、4、5要求设计各个信息项的名称(区分字母大小写)和行列位置。

🍉按键功能

        1)B1:定义为“界面”按键,按下Bl按键可以往复切换数据、参数和记录三个界面,切换模式如下图所示。

        2)B2:定义为“选择”按键。

                在数据界面下,用于切换选择低频或高频模式。按键按下后,5秒内不可再次触发切换功能。

                在参数界面下,按下B2按键,切换选择R或K参数。每次从数据界面进入参数界面,默认当前可调整的参数为R参数;从参数界面退出时,新的R参数和K参数生效。

        3)B3:定义为“加”按键。

                在参数界面下,按下B3按键,当前可调整的参数加1,参数调整模式:

… 1  2  3  4  …  10  1  2  3  …

        4)B4:定义为“减”按键。

                在参数界面下,按下B4按键,当前可调整的参数减1,参数调整模式:

… 2  1  10  9  …  2  1  10  9  …

                在数据界面下,长按B4按键超过2秒后松开(长按键),可以“锁定”占空比调整功能,此时输出信号占空比保持不变,不受R37电位器输出电压控制;处于“锁定”状态后,再次按下B4按键(短按键),实现“解锁”功能,恢复R37电位器对输出信号占空比的控制。

要求:

        按键应进行有效的防抖处理,避免出现一次按键动作触发多次功能等情形。

        按键动作不应影响数据采集过程和屏幕显示效果。

        有效区分长、短按键功能,互不影响。

        参数调整应考虑边界值,不出现无效参数。

        当前界面下无功能的按键按下,不触发其它界面的功能。

🍇统计功能

        1)低频模式、高频模式切换次数(N)。

        2)高频、低频输出模式下的最大速度分开统计,保持时间不足2秒的速度值不纳入统计。

🥝LED指示灯功能

        1) LD1:处于数据界面,指示灯LD1点亮,否则熄灭。

        2) LD2:低频模式、高频模式切换期间,指示灯LD2以0.1秒为间隔切换亮、灭状态,模式切换完成后熄灭。

        3) LD3:占空比调整处于“锁定”状态时,指示灯LD3点亮,否则熄灭。4)LD4-LD8指示灯始终处于熄灭状态。

初始状态说明

        请严格按照下列要求设计作品上电后的初始状态:

        1)参数R为1。

        2)参数K为1。

        3)切换次数N为0。

        4)PWM输出模式为低频模式。

        5)处于“解锁”状态,R37电位器可以控制信号占空比。

        6)处于数据显示界面。

赛题分析

        今年的赛题与最近几届又较大的不同,近几届都是老三样(LED,按键,LCD)加串口再加一个模块组成,而今年没考串口,换成了脉冲捕获,而PWM输出也与以往有些不同,并不是简单的改一下频率或占空比,而是要使用的输出模拟电压经过一些换算来修改占空比,同时还有一共坑下面我们再讲解这个坑。还有就是会有更多细节上的要求,包括按键的长按也是很久没考过的点了。

        简单看一下硬件框图,得知考点主要有老三样(LED,按键,LCD),加脉冲捕获,模拟输入,PWM输出。

        看一下功能概述,这里也许有些同学会有点混,因为平常可能是用PA7引脚做PWM输出。但这次不一样。PA1引脚才是做PWM输出的,而PA7引脚是用来完成脉冲捕获的。同时要检测R37的模拟信号。

        我们看到PWM模块,PWM一共要求有两种输出模式,低频与高频,我们使用相关库函数更改PA1引脚的自动重装载值即可。第二点,PA1的PWM输出占空比是由R37电位器的电压决定的,看图得知是一共分段函数,R37的电压在1V一下时,占空比为10%,在3V以上时,占空比为85%,中间部分就是线性增长了。因为是线性的,所以解一个一元一次方程即可,解出来为:Y=37.5x-27.5(Y:占空比,单位%,X:R37通过ADC转换的电压。接下来大坑来啦,还要求我们在高频与低频模式切换时占空比要保持不变,并且,并且啊,重点来啦,并且频率的改变要在5秒内均匀变化,并且频率的每次变化不超过200Hz。

        我们现在重点来讲讲这个是怎么坑的,要怎么解。首先解决频率变化时保持占空比不变,这一点不算复杂,因为频率是通过改变自动重装载值来改变的,我们只需要获取当前PA1的自动重装载值然后乘上占空比的百分比,再将这个值代入改变占空比的函数即可。而这个频率的均匀变化是怎么个均匀法呢。也许有些同学把这个均匀的概念直接加到用来修改频率的自动重装载值上,嘿嘿,如果这样,这个坑就被你踩实了。比如说,初始状态是低频,设置预分频系数为“100”,自动重装载值为“200”,这样的频率就为4000Hz了,要像频率升到8000Hz,那么自动重装载值就要降到“100”,但重点是均匀变化,这个均匀不是指200到100这个数值均匀变化,而是频率均匀变化。所以应该以频率的变化来改变自动重装载值

        现在坑也说完了,我们开始正式说这个问题怎么解决。要求每次变化不大于200Hz,我们就让它每次改变100Hz吧,假设频率现在为4000Hz,要变为8000Hz,就要改变自动重装载值40次,又要求5秒内完成变化,那就没0.1秒改变一次吧。第一次变化成4100Hz,那么自动重装载值就变成了80MHz/100(预分频系数)/4100取下整,所以每次改变自动重装载值,只需要先将存储频率的那个变量加100,然后代入上述的式子中就可以得到相应的自动重装载值啦。然后用相关函数改变自动重装载值就可以啦。(记住上面说的,频率变化的同时,占空比也不能改变哦)我们来看一下这部分的代码实现:

if(flag_k2 == 1)		//按键2被按下的标志,这一部分只在按键被按下后执行一次
{
	flag_5s = 1;		//5s内按键2不能进行操作的定时器标志,开启这个定时器
	flag_k2 = 0;
	num ++;
	
	if(plv_pa1<200)		//plv_pa1:PA1的频率,小于200,即按键按下前问低频
	{
		flag_100 = 1;		//按键按下前为低频的标志
	}
	else if(plv_pa1 > 100)		//按键按下前为高频
	{
		flag_200 = 1;		//按键按下前为高频的标志
	}
}

if(flag_5s > 0 && flag_5s <= 400)		//flag_5s:5秒的定时,每10毫秒加一,加到500重置为0
																		//这一部分是0.1秒中断执行一次的计时器里面,所以0到400一共执行40次,共耗时4秒。
{
	if(deng == 0)			//LED2循环闪烁的标志
	{
		TurnOn_LED(2);
		deng++;
	}
	else
	{
		TurnOff_LED(2);
		deng = 0;
	}
	if(flag_100 == 1)						//如果是低频
	{
		plv_pa1 = 8000/(--f48);		//这里将公式80Mhz/100(预分频系数)/频率,简化了一下
	}
	if(flag_200 == 1)						//如果是高频
	{
		plv_pa1 = 8000/(++f48);
	}

        我们接着往下看,接下来的模块是脉冲捕获,脉冲捕获虽然好几年都没考过了,但是实现起来不算太难,也因为近几年都没考这个模块,本系列专题中也没有这个模块的讲解,如果有需要可在评论区留言,我再单独出一篇文章这脉冲捕获。然后这里也不是捕获后直接输出,还要经过一个公式的计算然后输出加速度,这里就不展开讲啦,会在下面的代码实现中具体讲怎么写的。

        再往下就是LCD的显示功能了,每个字母位于几行几列,每个参数保留几位小数等细节注意一下就可以啦。需要特别注意的是数据界面中,“H”或“L”的变化要在频率完全改变完后再改变。

        按键比以往多了一个长按,除此之外与往年形式都差不多了。

        所谓统计功能就是记录一下某些数值,也不用EEPROM来存储。

        LED模块就是常谈的闪烁与亮灭了。

        至此,题目就分析完毕,哪些是难点重点想必大家心中有所定见了,接下来我们就开始搓代码吧。

代码实现

        个人代码,仅供参考与讨论,解题思路最重要🧐

        🌽中断模块

                使用的是TIM3,10毫秒中断一次,里面实现了4个按键的单击,一个按键的长按,频率的均匀变化,占空比的变化等。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM3)
	{
		key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
		key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
		key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
		key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
		
		for(int i = 0;i < 4; i++ )
		{
			switch (key[i].judge_sta)
			{
				case 0:
				{
					if(key[i].key_sta==0) 
					{
						key[i].judge_sta = 1;	//第一次判断是否按下
						key[i].key_time = 0;
					}
				}
				break;
				case 1:
				{
					if(key[i].key_sta==0)	//进入下一次定时器扫描,按键还是按下状态,那么就确认为按下,以此来消抖
					{
						key[i].judge_sta = 2;
					}
					else
						key[i].judge_sta = 0;
				}
				break;
				case 2:
				{				
					if(key[i].key_sta==1) 		//判断是否松手
					{
						if(key[i].key_time < 100)
						{
							key[i].key_flag = 1;
						}
						if(key[i].key_time > 100)				//一次扫描10毫秒,100次1000毫秒,就是判断是否长按超过1000毫秒
																						//松手后,才会执行相应反应
						{
							key[i].long_flag = 1;
						}
						key[i].judge_sta = 0;		
						key[i].key_time = 0;
					}
					else
					{
						key[i].key_time++;
					}
				}
				break;
			}
		}
		
		
		if(a++ == 10)	//0.1s
		{
			a = 0;
			
			if(flag_k2 == 1)		//按键2被按下的标志,这一部分只在按键被按下后执行一次
			{
				flag_5s = 1;		//5s内按键2不能进行操作的定时器标志,开启这个定时器
				flag_k2 = 0;
				num ++;
				
				if(plv_pa1<200)		//plv_pa1:PA1的频率,小于200,即按键按下前问低频
				{
					flag_100 = 1;		//按键按下前为低频的标志
				}
				else if(plv_pa1 > 100)		//按键按下前为高频
				{
					flag_200 = 1;		//按键按下前为高频的标志
				}
			}

			if(flag_5s > 0 && flag_5s <= 400)		//flag_5s:5秒的定时,每10毫秒加一,加到500重置为0
																					//这一部分是0.1秒中断执行一次的计时器里面,所以0到400一共执行40次,共耗时4秒。
			{
				if(deng == 0)			//LED2循环闪烁的标志
				{
					TurnOn_LED(2);
					deng++;
				}
				else
				{
					TurnOff_LED(2);
					deng = 0;
				}
				if(flag_100 == 1)						//如果是低频
				{
					plv_pa1 = 8000/(--f48);		//这里将公式80Mhz/100(预分频系数)/频率,简化了一下
				}
				if(flag_200 == 1)						//如果是高频
				{
					plv_pa1 = 8000/(++f48);
				}
				
				if(flag_5s > 402)
				{
					if(flag_100 == 1)
					{
						plv_pa1 = 200;
						flag_100 = 0;
					}
					if(flag_200 == 1)
					{
						plv_pa1 = 100;
						flag_200 = 0;
					}
				}
				__HAL_TIM_SetAutoreload(&htim2,plv_pa1);
				
			}
			
			pa7_duty = getADC(&hadc2);
			if(pa7_duty <= 1 && flag_s == 0)
			{
				__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,plv_pa1*0.1);	
				pa1 = 10;
			}
			else if(pa7_duty >= 3 && flag_s == 0)
			{
				__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,plv_pa1*0.85);
				pa1 = 85;
			}
			else if(flag_s == 0)
			{
				__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,plv_pa1*(0.375*pa7_duty-0.275));	
				pa1 = 37.5*pa7_duty-27.5;
			}
		}
		
		if(flag_5s >0)
		{
			flag_5s+=1;
			if(flag_5s > 500)
			{
				flag_5s = 0;
				TurnOff_LED(2);
			}
		}
		
	}
}

        🍄脉冲捕获

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获计数器 频率测量
{
	
	if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)//中断消息来源 选择直接输入的通道
	{
		tim_val1= HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);//获取计数器1的值
		__HAL_TIM_SetCounter(htim,0);//计数器归零
		frq = 1000000/tim_val1; //frq=时钟(80m)/prescaler(80)/tim_val1
		HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_1);
	}
}

        🍅按键模块

void key_proc()
{
	if(key[0].key_flag == 1)
	{
		view++;
		if(view==3) view=0;
		if(view == 0)
		{
			TurnOn_LED(1);
			flag_r = 0;
		}
		else
		{
			TurnOff_LED(1);
		}
		LCD_Clear(Black);
		key[0].key_flag = 0;
	}
	if(key[1].key_flag == 1)
	{
		if(view == 0 && flag_k2 == 0)
		{
			flag_k2 = 1;
		}
		else if(view == 1)
		{
			flag_r++;
			if(flag_r == 2)
			{
				flag_r = 0;
			}
		}
		key[1].key_flag = 0;
	}
	if(key[2].key_flag == 1)
	{
		if(view == 1)
		{
			if(flag_r == 0)
			{
				R++;
				if(R == 11)
					R = 1;
			}
			else
			{
				K++;
				if(K == 11)
					K = 1;
			}
		}
		
		key[2].key_flag = 0;
	}
	if(key[3].key_flag == 1)
	{
		
		if(view == 1)
		{
			if(flag_r == 0)
			{
				R--;
				if(R == 0)
					R = 10;
			}
			else
			{
				K--;
				if(K == 0)
					K = 10;
			}
		}
		if(view == 0)
		{
			flag_s = 0;
			TurnOff_LED(3);
		}

		key[3].key_flag = 0;
	}
	if(key[3].long_flag == 1)
	{
		if(view ==0)
		{
			flag_s = 1;
			TurnOn_LED(3);
		}
		key[3].long_flag = 0;
	}
}

        🥑LCD模块

void disp_proc()
{
	Vs = frq*2*3.14*R/(100*K);
	if(plv_pa1 >= 200)
	{
		if(Vs > V_max)
		{
			V_max = Vs;
		}
	}
	else if(plv_pa1 < 105)
	{
		if(Vs > V_min)
		{
			V_min = Vs;
		}
	}
	
	if(view==0)
	{
		char text[30];
		sprintf(text,"        DATA   ");
		LCD_DisplayStringLine(Line1, (uint8_t *)text);
		if(plv_pa1 == 200)		//频率完全改变完后改变M的值
		{
			sprintf(text,"     M=L      ");
			LCD_DisplayStringLine(Line3, (uint8_t *)text);
		}
		else if(plv_pa1 == 100)
		{
			sprintf(text,"     M=H      ");
			LCD_DisplayStringLine(Line3, (uint8_t *)text);
		}
		sprintf(text,"     p=%d%%  ",pa1);
		LCD_DisplayStringLine(Line4, (uint8_t *)text);
		sprintf(text,"     V=%.1f   ",Vs);
		LCD_DisplayStringLine(Line5, (uint8_t *)text);
	}
	else if(view==1)
	{
		//disp_clear();
		char text[30];
		sprintf(text,"        PARA    ");
		LCD_DisplayStringLine(Line1, (uint8_t *)text);
		sprintf(text,"     R=%d   ",R);
		LCD_DisplayStringLine(Line3, (uint8_t *)text);		
		sprintf(text,"     k=%d   ",K);
		LCD_DisplayStringLine(Line4, (uint8_t *)text);		
	}
	else if(view==2)
	{
		//disp_clear();
		char text[30];
		sprintf(text,"        RECD    ");
		LCD_DisplayStringLine(Line1, (uint8_t *)text);
		
		sprintf(text,"     n=%d      ",num);
		LCD_DisplayStringLine(Line3, (uint8_t *)text);
		sprintf(text,"     MH=%.1f        ",V_max);
		LCD_DisplayStringLine(Line4, (uint8_t *)text);
		sprintf(text,"     ML=%.1f        ",V_min);
		LCD_DisplayStringLine(Line5, (uint8_t *)text);
	}
}

        希望本篇文章对你有所收获,如有疑问或其他问题可在评论区留言📝

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

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

相关文章

k8s ingress controller 使用

目录 一 安装Ingress controller 二 创建service deploy 三 创建ingress 四 测试 一 安装Ingress controller apiVersion: v1 kind: Namespace metadata:name: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/instance: ingress-nginx--- # …

怎么把wav转换成mp3格式,5种方法值得收藏

怎么把wav转换成mp3格式&#xff1f;wav格式相信很多小伙伴们不是很熟悉&#xff0c;这种文件格式通常用于录音室等一些专业音乐项目上&#xff0c;那么wav格式和mp3格式有什么区别呢&#xff1f;wav全名Waveform Audio File Format&#xff0c;是微软公司开发的一种声音文件格…

【HarmonyOS】小熊派鸿蒙系统搭建

文章目录一、BearPi-HM Micro 开发板介绍二、Linux镜像下载三、BearPi-HM Micro编译环境配置1.首先添加如下镜像源2.更新镜像源3.安装依赖库及工具4.安装hb5.测试hb是否安装成功四、安装mkimage工具1.新建tools目录2.下载mkimage.stm32工具到~/tools目录&#xff0c;并复制到/h…

谷粒商城-分布式基础篇3

1.商品服务-品牌管理 把逆向生成的前端代码复制到前端src\views\modules\product 这样我们基本的增删改查就有了 全局搜索isAuth,修改返回值为true 关闭eslint build\webpack.base.conf.js const createLintingRule () > ({// test: /\.(js|vue)$/,// loader: eslint-lo…

真题详解(线性表)-软件设计(四十八)

原创 真题详解(UML图&#xff09;-软件设计&#xff08;四十七)https://blog.csdn.net/ke1ying/article/details/130096516 TCP 属于传输层&#xff0c; 用TCP连接的应用层有&#xff1a; SMTP&#xff08;25&#xff09; HTTP&#xff08;80&#xff09; Telnet&#xff08;…

kitti数据集中---标注数据label_2

标注文件中16个属性&#xff0c;即16列。但我们只能够看到前15列数据&#xff0c;因为第16列是针对测试场景下目标的置信度得分&#xff0c;也可以认为训练场景中得分全部为1但是没有专门标注出来。下图是000001.txt的标注内容和对应属性介绍。 相机坐标系中&#xff0c;y方向是…

【软考数据库】第一章 计算机系统基础知识

目录 1.1 计算机系统 1.1.1 计算机硬件组成 1.1.2 中央处理单元 1.1.3 数据表示 1.1.4 校验码 1.2 计算机体系结构 1.2.1 体系结构分类 1.2.2 指令系统存 1.2.3 储系系统 1.2.4 输入/输出技术 1.2.5 总线结构…

【Golang开发面经】字节跳动(三轮技术面)

一面 epoll、select、poll 区别 select 机制刚开始的时候&#xff0c;需要把 fd_set 从用户空间拷贝到内核空间&#xff0c;并且检测的 fd 数是有限制的&#xff0c;由 FD_SETSIZE 设置&#xff0c;一般是1024。数组实现。 poll 的实现和 select 非常相似&#xff0c;只是描…

Node【一】初识Node

文章目录&#x1f31f;前言&#x1f31f;Node.js&#x1f31f;特性&#xff1a;&#x1f31f;1. 单线程&#x1f31f;2.异步IO&#x1f31f;前端中的异步&#x1f31f;Node中的异步&#x1f31f;3.跨平台&#x1f31f;4.运行速度快&#x1f31f; 劣势&#xff1a;&#x1f31f;…

ASP一个物流商品运输系统的设计与实现

物流运输行业的今天正朝着追求高效、低成本、稳定可靠的方向发展。本文详细介绍了网上物流管理系统&#xff0c;涉及到客户端运输线路设计、过程跟踪等功能模块以及管理员端的相应模块的具体实现&#xff0c;分析了整个系统的架构、工作原理、实现功能等。系统采用ASPMS SQL以B…

代码随想录算法训练营第43天 | 动态规划 背包理论基础 LeetCode1049.最后一块石头的重量II,494.目标和,474.一和零

代码随想录算法训练营第43天 | 动态规划 背包理论基础 LeetCode1049.最后一块石头的重量II&#xff0c;494.目标和&#xff0c;474.一和零 1049.最后一块石头的重量II 第一遍读题思考 重点在于背包问题的理论基础建议阅读以下两个链接。 背包问题理论基础&#xff0c;用二维…

sed命令基础

sed编辑器即流编辑器&#xff08;stream editor&#xff09;&#xff0c;根据命令处理数据流中的数据&#xff0c;这些命令可从命令行输入&#xff0c;或者指定文件中输入。 sed执行的操作如下&#xff1a; 1&#xff09;从输入读取一行数据 2&#xff09;根据提供的命令匹配数…

KSS-ICP: 基于形状分析技术的点云配准方法

目录 1. 概述 2. 算法实现 3. 实验结果 总结 Reference 三维点云配准是三维视觉领域一个经典问题&#xff0c;涉及三维重建&#xff0c;定位&#xff0c;SLAM等具体应用问题。传统的配准可以被分为两条技术路线&#xff0c;即基于全局姿态匹配的方法以及基于特征点对应的方法。…

疫情下社区管理系统的设计与实现(论文+源码)_kaic

疫情下社区管理系统 摘 要&#xff1a;新冠疫情下的社区人员管理系统是基于SpringBoot搭建的一套前后端分离系统。面向疫情下的社区管理人员和社区用户&#xff0c;主要用于进行社区服务&#xff0c;进行高效的社区人员管理。具有一定的经济效益和社会效益。本文分析了新冠疫情…

计算机网络第三章(数据链路层)【湖科大教书匠】

1. 概述 物理层发出去的信号需要通过数据链路层才知道是否到达目的地&#xff1b;才知道比特流的分界线 链路(Link)&#xff1a;从一个结点到相邻结点的一段物理线路&#xff0c;中间没有任何其他交换结点数据链路(Data Link)&#xff1a;把实现通信协议的硬件和软件加到链路…

【ROS实操2话题订阅输出乌龟位姿】

需求描述 已知turtlesim中的乌龟显示节点&#xff0c;会发布当前乌龟的位姿(窗体中乌龟的坐标以及朝向)&#xff0c;要求控制乌龟运动&#xff0c;并时时打印当前乌龟的位姿。 实现分析 1.首先&#xff0c;需要启动乌龟显示以及运动控制节点并控制乌龟运动。 2.要通过ROS命令…

网络原理TCP协议

hi,我们又见面了,今天为大家带来TCP协议,一共为大家介绍TCP协议的十个核心特性 1.确认应答 2.超时重传 3连接管理 4滑动窗口 5流量控制 6拥塞控制 7延迟应答 8捎带应答 9面向字节流(粘包问题) 10异常情况(心跳包) 11基于TCP应用层协议 TCP协议位于传输层,我们知道T…

微信小程序开发 | API应用案例(上)

API应用案例&#xff08;上&#xff09;5.1【案例1】用户登录5.1.1 案例分析5.1.2 前导知识5.1.3 搭建开发者服务器5.1.4 实现用户登录5.1.5 检查用户是否已经登录5.1.6 获取用户信息5.1.7 开放数据校验与解密5.2【案例2】个人中心5.2.1 案例分析5.2.2 前导知识5.2.3 实现底部标…

BE-SSL:基于边界增强自监督学习的脑结构分割

文章目录Boundary-Enhanced Self-supervised Learning for Brain Structure Segmentation摘要本文方法Supervoxel BranchRegistration BranchAtlas Selection实验结果Boundary-Enhanced Self-supervised Learning for Brain Structure Segmentation 摘要 边界增强自监督学习(…

用Pytorch搭建一个房价预测模型

本文参加新星计划人工智能(Pytorch)赛道&#xff1a;https://bbs.csdn.net/topics/613989052 目录 一、项目介绍 二、准备工作 三、实验过程 3.1数据预处理 3.2拆分数据集 3.3构建PyTorch模型 3.3.1.数据转换 3.3.2定义模型架构 3.3.3定义损失准则和优化器 3.3.4创建…