MSPM0G3507_2024电赛自动行驶小车(H题)_问题与感悟

news2024/11/15 23:22:25

这次电赛题目选的简单了,还规定不能使用到摄像头,这让我之前学习的Opencv 4与树莓派无用武之地了,但我当时对于三子棋题目饶有兴趣,但架不住队友想稳奖,只能选择这个H题了......

之后我还想抽空将这个E题三子棋题目做做,写篇博客实现一下......

这篇文就将一些过程中 遇到的问题 与 可能的解决法 讲一下.....

目录

MSPM0G3507库函数问题与修改:

端口状态读取函数问题:

串口接收函数存在强制类型转换:

汇编文件定义的数据处理栈过小:

直流电机干扰磁场:

题目思路:

PID角度惯导:

PID角度惯导视频:

第一题:

第一题视频:

第二题:

第二题视频:

 第三题:

第三题视频:

主函数与状态安排:

网上查阅资料贴出:


MSPM0G3507库函数问题与修改:

端口状态读取函数问题:

在尝试通过读取引脚高低电平来获取八路寻迹的端口状态时,发现它的引脚读取函数设计有些奇特,返回值不是类似于STM32的那种0和1,

我们发现 DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_15) ,低电平就返回0,而高电平返回的不是1,而是引脚的编号......

串口接收函数存在强制类型转换:

在使用串口时发现 STATIC INLINE uint8 t DL UART receiveData(UART Regs *uart)

存在强制类型转换的现象:

这会将十六进制发送过来的数据强制转换为0~255的十进制数据,这是个多此一举的冗余步骤

随后去掉了这个强制类型转换:

汇编文件定义的数据处理栈过小:

在进行串口与数据接收时,我写了一个函数用于解算数据包以及计算角度,没想到在进行通信测试时,串口一直没有执行printf返回给上位机任何数据,后来才发现是在解算步骤卡住了:

以下是我解算JY901B陀螺仪 数据包定义的数据变量与函数,该函数在串口中断中调用:

数据变量:

最终结算好的数据存在了float Angle_R[3];

#include <string.h>


uint8_t RX_BUFFER[10];

typedef struct
{
	float angle[3];
}Angle;

struct SAngle//角度
{
	short Angle[3];
	short T;
};


struct SAngle stcAngle;
float Angle_R[3];

void JY901_Process(uint8_t RxData);

函数:


void JY901_Process(uint8_t RxData)
{
	static uint8_t state=0;
	static uint8_t bufsize=0;
	
	switch(state)
	{
		case 0:
						//搜索到帧头
						if(RxData==0x55)	{ state=1;}
						else state=0;
						break;
		case 1:
					 //搜索到角度帧
					  if(RxData==0x53)	{ state=2;}
						else state=0; //否则重新搜素
						break;
		case 2:
					 RX_BUFFER[bufsize]=RxData;
					 bufsize++;
					 if(bufsize==9)
					 {
							state=3;
						  bufsize=0;
					 }
					 break;
		case 3:
						memcpy(&stcAngle,&RX_BUFFER[0],8);
						for(uint8_t j = 0; j < 3; j++)
							{
								Angle_R[j] = (float)stcAngle.Angle[j]/32768*180;
							}
					  state = 0;
						break;
	}
	
}

随后为了解决这个问题,将汇编文件的栈大小进行了修改:

修改后:

直流电机干扰磁场:

中途发现陀螺仪存在左右飘逸的现象,起初怀疑是直流电机磁场对它有影响,就将直流电机的外壳接地了,结果发现影响更大了,就不在接地了.....

题目思路:

PID角度惯导:

这是将电机速度闭环之后,再对角度闭环的结果:可以使小车保持在一个角度:

 

//用于初始化pid参数的函数
void PID_Init(PID *pid, float p, float i, float d, float maxI, float maxOut)
{
    pid->kp = p;
    pid->ki = i;
    pid->kd = d;
    pid->maxIntegral = maxI;
    pid->maxOutput = maxOut;
}
 
//进行一次pid计算
//参数为(pid结构体,目标值,反馈值),计算结果放在pid结构体的output成员中
void PID_Calc(PID *pid, float reference, float feedback)
{
 	//更新数据
    pid->lastError = pid->error; //将旧error存起来
    pid->error = reference - feedback; //计算新error
    //计算微分
    float dout = (pid->error - pid->lastError) * pid->kd;
    //计算比例
    float pout = pid->error * pid->kp;
    //计算积分
    pid->integral += pid->error * pid->ki;
    //积分限幅
    if(pid->integral > pid->maxIntegral) pid->integral = pid->maxIntegral;
    else if(pid->integral < -pid->maxIntegral) pid->integral = -pid->maxIntegral;
    //计算输出
    pid->output = pout+dout + pid->integral;
    //输出限幅
    if(pid->output > pid->maxOutput) pid->output =   pid->maxOutput;
    else if(pid->output < -pid->maxOutput) pid->output = -pid->maxOutput;
}
 
 


//首先定义PID结构体用于存放一个PID的数据
typedef struct
{
   	float kp, ki, kd; //三个系数
    float error, lastError; //误差、上次误差
    float integral, maxIntegral; //积分、积分限幅
    float output, maxOutput; //输出、输出限幅
}PID;

PID mypid = {0}; //创建一个PID结构体变量
PID_Init(&mypid, 1.5, 0, 3, 80, 100); //初始化PID参数






角度PID计算惯导部分:


char imu2(float angle)
{
    char flag = 0;
    float chazhi_angle;
    chazhi_angle = fabs(Angle_R[2] - angle);
	 targetValue=angle;
				  float feedbackValue = Angle_R[2]; //这里获取到被控对象的反馈值
	        PID_Calc(&mypid, targetValue, feedbackValue); //进行PID计算,结果在output成员变量设定执行器输出大小(mypid.output);
					SPEEED[0]=mypid.output;
					SPEEED[1]=mypid.output*(-1);
					SPEEED[2]=mypid.output;
					SPEEED[3]=mypid.output*(-1);
					I2C_Write_Len(MOTOR_FIXED_SPEED_ADDR,SPEEED,4);						//控制电机转动
	 if(chazhi_angle<3) {return 1;}
		return 0;
}

PID角度惯导视频:

PID角度惯导视频

第一题:

就将小车四个电机闭环,保持同速即可,使用状态机的思维去写的,写一个状态就测试一次小车的具体运行程序结果,看是否需要添加或修改其余传感器逻辑......

这里我有个空闲状态,一旦切换到空闲状态,小车就会对0度进行角度惯导......

//任务1
void TASK_1(void)
{
	GET_FTT_PORT_status();
	
	if(DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_16)==0)
	{beep(1);led(1);	delay_ms(10);	  beep(0);led(0);status1 =1;status3=99;}
	//选择状态进入
	switch(status1)
	{
		case 0:target_angle_F=1;target_angle=0;system_idie_state();     break;   //系统空闲状态:
		case 1: //无脑直线 
					//GET_FTT_PORT_status();
					target_angle_F=0;
					target_angle=0;         
					SPEEED[0]=45*(-1);
					SPEEED[1]=45;
					SPEEED[2]=45;
					SPEEED[3]=45*(-1);
					I2C_Write_Len(MOTOR_FIXED_SPEED_ADDR,SPEEED,4);						//控制电机转动
					//任意检测到线
					if(L1==1 || L2==1 || L3==1|| L4==1|| L5==1|| L6==1|| L7==1|| L8==1)
					{
						SPEEED[0]=0;
						SPEEED[1]=0;
						SPEEED[2]=0;
						SPEEED[3]=0;
						I2C_Write_Len(MOTOR_FIXED_SPEED_ADDR,SPEEED,4);						//控制电机转动
						beep(1);led(1);
						delay_ms(15);
						beep(0);led(0);
						status1=0;
					}
					break;
	}			
}

第一题视频:

2024电赛自动行驶小车(H题)_第一问

第二题:

这题的A->B部分就是先靠PID直线,然后巡线,然后想办法通过陀螺仪反馈使小车转到差不多180度的位置,陀螺仪因为读取方式不同,其实转到180度正还是不容易的......

然后我定的是-178度位置,为了防止它缓慢偏出线,我又增加了179的惯导在直行的逻辑中,(但这样简单粗暴的添加使得我的小车挺抖......)

//任务2  不许删动
//放置时 先正放再 向左边斜放 
void TASK_2(void)
{
	GET_FTT_PORT_status();         //获得巡线返回
	if(DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_15)==0){	  beep(1);led(1);	delay_ms(10); beep(0);led(0);		status2=1;status1=99;status3=99;}
	switch (status2)
	{
		case 0:system_idie_state();    break;
		case 1://A->B 无脑直线		
					target_angle_F=0;
					//imu2(0);         //惯导直行
					SPEEED[0]=45*(-1);
					SPEEED[1]=45;
					SPEEED[2]=45;
					SPEEED[3]=45*(-1);
					I2C_Write_Len(MOTOR_FIXED_SPEED_ADDR,SPEEED,4);						//控制电机转动
					//任意检测到线
					if(L1==1 || L2==1 || L3==1|| L4==1|| L5==1|| L6==1|| L7==1|| L8==1)
					{
						beep(1);led(1);
						delay_ms(15);
						beep(0);led(0);
						status2=2;status=1;
					}
					break;
		case 2://B->C 巡线 
					  FTT_judge_status();//判定巡线系统状态
						target_angle_F=0;
					//	//先清零系统预设方向
						status_Direction=0;
						//八路寻迹判断系统状态,一般会传给status_Direction数值
						FTT_judge_status();
						//选择状态进入
						switch(status)
						{
							case 0:system_idie_state();     break;   //系统空闲状态:
							case 1:system_follow_straight();break;	 //系统直线寻迹状态(可带小弧度偏转) 
							case 2:system_Turn_left();      break;   //小车左转调整状态
							case 3:system_Turn_right();     break;   //小车右转调整状态
							//case 4:system_stop();           break;   //停车
						}	
													
						//已经到C了
						if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 &&(fabs(Angle_R[2]+180)<=15))
						{
									beep(1);led(1);
									delay_ms(15);
									beep(0);led(0);
								  //imu2(-60);   //偏正
							    //targetValue=-44;
									target_angle_F=0;
									while(imu2_my(-175)==0)
										
									status2=3;status=0;		
						}
						//有可能是巡线时遇到调整角度黑线在夹缝		
						else if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0)
						{
							//imu2(-120);         //惯导偏正(向右)	
								system_Turn_right();
						}	
					break;
		case 3://C->D  无脑执行
					imu2_my(-177);         //惯导直行 175
					SPEEED[0]=45*(-1);
					SPEEED[1]=45;
					SPEEED[2]=45;
					SPEEED[3]=45*(-1);
					I2C_Write_Len(MOTOR_FIXED_SPEED_ADDR,SPEEED,4);						//控制电机转动
					//任意检测到线
					if(L1==1 || L2==1 || L3==1|| L4==1|| L5==1|| L6==1|| L7==1|| L8==1)
					{
						beep(1);led(1);
						delay_ms(15);
						beep(0);led(0);
						status2=4;status=1;
					}
					break;
		case 4://D->A   
					//	//先清零系统预设方向
						status_Direction=0;
						//八路寻迹判断系统状态,一般会传给status_Direction数值
						FTT_judge_status();
						//选择状态进入
						switch(status)
						{
							case 0:system_idie_state();     break;   //系统空闲状态:
							case 1:system_follow_straight();break;	 //系统直线寻迹状态(可带小弧度偏转) 
							case 2:system_Turn_left();      break;   //小车左转调整状态
							case 3:system_Turn_right();     break;   //小车右转调整状态
							//case 4:system_stop();           break;   //停车
						}	
													
						//已经到A了
						if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 &&(fabs(Angle_R[2])<=22))
						{
								SPEEED[0]=0;
								SPEEED[1]=0;
								SPEEED[2]=0;
								SPEEED[3]=0;
								I2C_Write_Len(MOTOR_FIXED_SPEED_ADDR,SPEEED,4);						//控制电机转动
									beep(1);led(1);
									delay_ms(15);
									beep(0);led(0);
									target_angle_F=0;
									target_angle=0;
								  while(imu2_my(0)==0)   //偏正
									status=0;
									status2=9;status1=0;
						}
						//有可能是巡线时遇到调整角度黑线在夹缝		
						else if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 && Angle_R[2]>0)
						{
							system_Turn_right();//惯导偏正(向右)
						}
												//有可能是巡线时遇到调整角度黑线在夹缝		
						else if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 && Angle_R[2]<0)
						{
								//imu2(10);         //惯导偏正(向右)
							system_Turn_right();
						}
					break;
	}
}

第二题视频:

2024电赛自动行驶小车(H题)_第二问

 第三题:

第二题会做,这题其实也没问题...


//任务 3
void TASK_3(void)
{
	if(DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_14)==0) {beep(1);led(1);	delay_ms(10);	  beep(0);led(0); status3 =1;status2=9;status1=9;}
	switch(status3)
	{
		case 0:system_idie_state(); break;
		case 1://A->C 惯导后直线行驶
			    target_angle=-33;
					//target_angle_F=0;
					while(imu2(-33)==0)
					status3=2;
					break;
		case 2:
			    //imu2(-37);
					//targetValue=-10;
		      target_angle=-33;
					SPEEED[0]=55*(-1);
					SPEEED[1]=55;
					SPEEED[2]=55;
					SPEEED[3]=55*(-1);
					I2C_Write_Len(MOTOR_FIXED_SPEED_ADDR,SPEEED,4);						//控制电机转动
					//任意检测到线
					if(L1==1 || L2==1 || L3==1|| L4==1|| L5==1|| L6==1|| L7==1|| L8==1)
					{
						beep(1);led(1);
						delay_ms(15);
						beep(0);led(0);
						target_angle=0;
						status3=3;status=1;status2=99;status1=99;
					}			
					break;
		case 3://C-> B
					//	//先清零系统预设方向
						status_Direction=0;
						//八路寻迹判断系统状态,一般会传给status_Direction数值
						FTT_judge_status();
						target_angle_F=0;
						//选择状态进入
						switch(status)
						{
							case 0:system_idie_state();     break;   //系统空闲状态:
							case 1:system_follow_straight();break;	 //系统直线寻迹状态(可带小弧度偏转) 
							case 2:system_Turn_left();      break;   //小车左转调整状态
							case 3:system_Turn_right();     break;   //小车右转调整状态
							//case 4:system_stop();           break;   //停车
						}				
						//已经到B了
						if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 &&(fabs(Angle_R[2])>=156))
						{
									beep(1);led(1);
									delay_ms(15);
									beep(0);led(0);
								  //while(imu2(-148)==0)   //偏正
									status=0;		
									status3=4;status2=99;status1=99;
						}
						//有可能是巡线时遇到调整角度黑线在夹缝		
						else if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 && Angle_R[2]>0)
						{
							system_Turn_right();  //惯导偏正(向右)
						}
						//有可能是巡线时遇到调整角度黑线在夹缝		
						else if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 && Angle_R[2]<0)
						{
						  //imu2(10);         //惯导偏正(向右)
							system_Turn_left();
						}					
					break;
		case 4://调整好角度
					target_angle_F=0;
				  while(imu2_my(-163)==0)
					//target_angle=-63;
					//while(imu2(-63)==0)
					status3=5;	status2=99; status1=99;
					break;
		case 5:// B->D  
					target_angle_F=0;
			    imu2_my(-138);
					system_Turn_left();
					SPEEED[0]=55*(-1);
					SPEEED[1]=55;
					SPEEED[2]=55;
					SPEEED[3]=55*(-1);
					I2C_Write_Len(MOTOR_FIXED_SPEED_ADDR,SPEEED,4);						//控制电机转动
					//任意检测到线
					if(L1==1 || L2==1 || L3==1|| L4==1|| L5==1|| L6==1|| L7==1|| L8==1)
					{
						beep(1);led(1);
						delay_ms(15);
						beep(0);led(0);
						status3=6;status=1;
					}					
		case 6 ://D->A 
					//	//先清零系统预设方向
						status_Direction=0;
						target_angle_F=0;
						//八路寻迹判断系统状态,一般会传给status_Direction数值
						FTT_judge_status();
						//选择状态进入
						switch(status)
						{
							case 0:system_idie_state();     break;   //系统空闲状态:
							case 1:system_follow_straight();break;	 //系统直线寻迹状态(可带小弧度偏转) 
							case 2:system_Turn_left();      break;   //小车左转调整状态
							case 3:system_Turn_right();     break;   //小车右转调整状态
							//case 4:system_stop();           break;   //停车
						}	
													
						//已经到A了
						if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 &&(fabs(Angle_R[2])<=22))
						{
								SPEEED[0]=0;
								SPEEED[1]=0;
								SPEEED[2]=0;
								SPEEED[3]=0;
								I2C_Write_Len(MOTOR_FIXED_SPEED_ADDR,SPEEED,4);						//控制电机转动
									beep(1);led(1);
									delay_ms(15);
									beep(0);led(0);
									//target_angle_F=0;
									target_angle_F=1;target_angle=0;
								  while(imu2(0)==0)   //偏正
									status=0;		
									status3=7;
									status2=9;
									status1=0;
						}
						//有可能是巡线时遇到调整角度黑线在夹缝		
						else if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 && Angle_R[2]>0)
						{
							system_Turn_right();//惯导偏正(向右)
						}
												//有可能是巡线时遇到调整角度黑线在夹缝		
						else if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 && Angle_R[2]<0)
						{
								//imu2(10);         //惯导偏正(向右)
							system_Turn_right();
						}
					break;		
	}
}

第三题视频:

 这里就直接放第四问的视频了...第四问就是将第三问重复执行4次......

2024电赛自动行驶小车(H题)_第四问

主函数与状态安排:

主函数中有些任务状态变量statusx的初始值并不是0,这是为了防止进入其余状态时执行它的状态0操作(小车惯导0度 )的行为,并且,进入其余状态时,也应合理安排这些状态变量,使其不要互相串搞.....

网上查阅资料贴出:

PID超详细教程——PID原理+串级PID+C代码+在线仿真调参-CSDN博客

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

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

相关文章

快手批量取关

目录 突然发现快手木有批量取关功能&#xff0c;没有功能就创造功能 执行代码中 逐渐变少 后面关注列表没人了&#xff0c;总数还有32&#xff0c;不知道是不是帮测出个bug还是咋的(^_^) 突然发现快手木有批量取关功能&#xff0c;没有功能就创造功能 刚开始1000多人 执行代…

中间件之异步通讯组件rocketmq入门

一、概述 1.1介绍 RocketMQ是阿里巴巴2016年MQ中间件&#xff0c;使用Java语言开发&#xff0c;RocketMQ 是一款开源的分布式消息系统&#xff0c;基于高可用分布式集群技术&#xff0c;提供低延时的、高可靠的消息发布与订阅服务。同时&#xff0c;广泛应用于多个领域&#…

暖水袋 亚马逊日本站认证 PSE认证步骤

暖水袋是用来加热取暖的生活用品&#xff0c;有内置热水来加热的类型和利用微波炉加热后使用的类型等。内置热水的暖水袋有塑料制、橡胶制、陶器制等多种类型&#xff0c;但是利用加热石头而不是利用热水来取暖的产品类型为审查对象外商品。 审查资料 每个 ASIN 的文件&#x…

成为AI产品经理,为何应选择LLMs方向?

前言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;越来越多的人开始考虑如何在这个领域找到自己的位置。对于那些希望成为AI产品经理的人来说&#xff0c;选择LLMs&#xff08;Large Language Models&#xff0c;大型语言模型&#xff09;方向是一个非常…

mac下通过brew安装mysql的环境调试

mac安装mysql 打开终端&#xff0c;运行命令&#xff08;必须已经装过homebrew哦&#xff09;&#xff1a; 安装brewbin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"已安装brew直接运行&#xff1a;brew install mysql8.0报…

模拟自然光照:饮料稳定性测试的创新方法

饮料添加剂的光照稳定性测试旨在评估其在光照影响下的保持稳定性的能力&#xff0c;特别是在储存期间。此测试有助于制造商理解饮料在不同光源作用下的变化&#xff0c;例如颜色、口感、香气等感官性质的变化&#xff0c;以及营养成分的衰变速率。这些信息对改进产品配方、包装…

泉盛UV-K5/K6固件编译教程

0.准备的硬件 win11/win10电脑泉盛UV-K5/K6k口写频线 1.准备的文件&#xff08;点击链接下载&#xff09; gcc arm编译器 链接: gcc-arm-none-eabi-10.3-2021.10-win32Make 链接:Download make-3.81.exe (GnuWin) 2.编译过程&#xff08;这里以Losehu固件为例子&#xff09; 0.…

AI时代的职场焦虑与机遇

原文链接&#xff1a;https://tecdat.cn/?p37205 在人工智能的浪潮中&#xff0c;职场焦虑愈发显著。本杰明米勒的故事便是这一现象的缩影。2023年初&#xff0c;他领导着一个超过60人的团队&#xff0c;为一家科技公司创作推广文章和博客。然而&#xff0c;随着公司决定采用…

排序算法:插入排序,golang实现

目录 前言 插入排序 代码示例 1. 算法包 2. 插入排序代码 3. 模拟程序 4. 运行程序 5. 从大到小排序 插入排序的思想 循环细节 外层循环 内层循环 循环次数测试 假如 10 条数据进行排序 假如 20 条数据进行排序 假如 30 条数据进行排序 假设 5000 条数据&…

Elasticsearch服务器开发教程(第2版 电子版)

前言 本书也将讨论被称为Querydsl的查询语言&#xff0c;通过它可以创建复杂的查询并过滤返回的结果。除了这些&#xff0c;你还将看到如何使用切面技术&#xff08;faceting&#xff09;基于查询结果来计算汇总数据&#xff0c;以及如何使用新引进的聚合框架&#xff08;分析…

云计算 Logstash 配置管理 Kibana数据统计分析

日志分析系统ELK 项目架构图 Logstash 是一个开源的、服务器端的数据收集引擎&#xff0c;与 Elasticsearch 和 Kibana 一起构成了 Elastic Stack&#xff08;之前称为 ELK Stack&#xff09;。Logstash 的主要功能是处理和转发数据&#xff0c;它可以从多种数据源收集数据&a…

Autowired自动注入Map问题

问题 昨天开发的时候遇到一个诡异的问题&#xff0c;通过Map注入接口下所有的子类&#xff0c;然后json打印出来的时候&#xff0c;没有子类的信息&#xff0c;并且去调用的时候报了空指针异常。 排查问题过长&#xff0c;并且涉及到源码&#xff0c;所以这里先说结论&#x…

2018-架构师案例(七)

问题1 性能需求指什么&#xff1f; 解析&#xff1a; 指响应时间&#xff0c;吞吐量&#xff0c;资源利用率等指标&#xff0c;保证系统正常运行的情况下&#xff0c;这些数据表示系统的性能。 问题2&#xff08;9分&#xff09; MemCache和Redis两种工具的优缺点&#xff0c…

js 前端 解析excel文件【.xlsx文件】信息内容

需求&#xff1a; 从excel文件中解析里面的内容 1、使用插件xlsx.full.min.js&#xff0c;地址&#xff1a;https://unpkg.com/xlsx/dist/xlsx.full.min.js实例&#xff1a; <script src"https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script><i…

【机器学习基础】数据预处理

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

【综合案例】使用DevEco Studio编写B站视频卡片

效果展示 知识点 层叠布局 介绍&#xff1a;层叠布局具有较强的 组件层叠 能力。 使用场景&#xff1a;卡片层叠效果 特点&#xff1a;层叠操作 更简洁&#xff0c;编码效率更高。【绝对定位的优势是更灵活】 Stack容器内的子元素顺序是先写的在最下面&#xff0c;即从下到上依…

数据结构与算法-二分搜索树节点删除

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、二分搜…

关于Unity四种合批技术详解

文章目录 一.静态合批(StaticBatching)1.启用静态合批2.举例说明3.静态合批的限制4.静态合批的优点缺点5.动态指定物品合批 二.动态合批(Dynamic Batching)1.启用动态合批2.合批规则3.举例说明4.使用限制 三.GPU Instancing1.启用GPU Instancing2.启用限制3.举例说明 四.SRP Ba…

构建积极心理学资源站:从零到一的旅程

自己搭建的心理学资源站 积极心理学网站&#xff1a;致力于推动积极未来 欢迎来到kuakua.app&#xff0c;这是一个致力于积极心理学的资源站。 作为一个独立开发者&#xff0c;我与一些热爱心理学的学生合作&#xff0c;创建了这个网站。 我们的目标是通过分享心理学知识和资源…

创新就业政策:智慧校园就业管理的策略之道

在智慧校园的广阔版图中&#xff0c;就业管理板块的“就业政策”功能模块犹如一颗璀璨的明星&#xff0c;照亮着学子们的未来职业道路。它不仅是一座信息的灯塔&#xff0c;指引着学生们穿越就业政策的迷雾&#xff0c;更是一把开启梦想大门的钥匙&#xff0c;帮助他们把握机遇…