动手做一个简单的智能小车

2023-11-04

动手做一个简单的智能小车

来到CNDN一年了,看到了许多大佬的杰出作品.也该写点什么来回馈给大家了前不久接触了单片机,想提前进行实践一下所以有想法做一个实体出来,想来想去难的怕自己搞不定,但是还好找到了志同道合的王同学,一起搞一个智能小车.新手上路,多多指教

1.硬件的选取

走过许多坑才知道准备工作的重要性,前期对一个需要开发实体的了解的多少,决定你能走多远
  • 四驱的小车(如果对底板有要求可以选择买铝制的)
    马达,轮子,底板都是配套的某宝上可以买到

  • 智能的核心:单片机 开始时用正点原子的学习板做的,后来板子烧了
    然后直接买了系统板
    在这里插入图片描述
    普中的最小系统板,可扩展引脚很多.便宜好用

尽管说查看引脚手册和基础的芯片手册是基础,但是对于一般新手来说,更多的IO口才是最舒服的

  • 电源的选择
    我直接买的5号电池盒,因为要达到12v的电压,需要8节5号电池,看起来很累赘,但是续航还是可以的
    大家可以买12v的航模电池,既好看还可以充电就是贵点,但是接线麻烦一点
    在这里插入图片描述

2.模块的选取

你的小车要实现什么功能,这些传感器等模块的选取是很重要的
  • 驱动模块 L298N驱动
    开始的时候没有意识到一个驱动就可以控制四个轮子,用了两个驱动.浪费了资源和电量
    在这里插入图片描述

详细的资料可以看大佬
注意:调适马达的时候不要一股脑全都安装上去,先进行单个马达转动方向,接线的长度的调适,否则你会面临无限的拆卸

Moter.h

#ifndef __MOTER_H
#define __MOTER_H
#include "sys.h"
#define INright1 PEout(6)
#define INright2 PEout(7)
#define INleft1 PEout(8)
#define INleft2 PEout(9)
#define pwmright TIM3->CCR3
#define pwmleft TIM3->CCR4
#define LEFT 0x01
#define RIGHT 0x02
#define ONE 0x01
#define TWO 0x02
#define THREE 0x04
#define FOUR 0x08
#define Car_Right_90  200	//右转90度
#define Car_Right_45		550	
#define Car_Left_45		550		//左转45度
#define Car_Left_90		220
void Motor_init(void);		//电机初始化
void PWMout(u16 psc,u16 arr);	//pwm输出
void Carstart(void);			//小车启动
void Carback(void);				// 小车倒车
void Carstop(void);				//小车停止
void Greadspeed(u8 view);				//档速设置
void Carturn(u8 direction,u16 angle);				//小车转弯
void Carspeedcontrol(u16 speed); //速度控制
void Carturnall(u8 direction);  //原地旋转*/
#endif

Moter.c

#include<motor.h>
#include<sys.h>
#include "delay.h"
#include "stm32f10x.h"
void Motor_init(void)	
{
		GPIO_InitTypeDef GPIO_InitTypeStructer;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
		
		GPIO_InitTypeStructer.GPIO_Mode=GPIO_Mode_Out_PP;									//全部轮子
		GPIO_InitTypeStructer.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
		GPIO_InitTypeStructer.GPIO_Speed=GPIO_Speed_50MHz;
		GPIO_Init(GPIOE,&GPIO_InitTypeStructer);
}
void PWMout(u16 psc,u16 arr)
{
		GPIO_InitTypeDef GPIO_InitTypeStructer;
		TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStructer;
		TIM_OCInitTypeDef TIM_OCInitTypeStructer;
		
		RCC_PCLK1Config(RCC_HCLK_Div2);
		RCC_PCLK2Config(RCC_HCLK_Div1);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
		GPIO_InitTypeStructer.GPIO_Mode=GPIO_Mode_AF_PP;						//PWM驱动
		GPIO_InitTypeStructer.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
		GPIO_InitTypeStructer.GPIO_Speed=GPIO_Speed_50MHz;
		GPIO_Init(GPIOB,&GPIO_InitTypeStructer);
		
		TIM_TimeBaseInitTypeStructer.TIM_ClockDivision=0;							
		TIM_TimeBaseInitTypeStructer.TIM_CounterMode=TIM_CounterMode_Up;
		TIM_TimeBaseInitTypeStructer.TIM_Period=arr;
		TIM_TimeBaseInitTypeStructer.TIM_Prescaler=psc;
		TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitTypeStructer);	
		
		TIM_OCInitTypeStructer.TIM_OCMode=TIM_OCMode_PWM1;					//右驱动
		TIM_OCInitTypeStructer.TIM_OCPolarity=TIM_OCPolarity_High;
		TIM_OCInitTypeStructer.TIM_OutputState=TIM_OutputState_Enable;
		TIM_OCInitTypeStructer.TIM_Pulse=0;
		TIM_OC3Init(TIM3,&TIM_OCInitTypeStructer);
		
		TIM_OCInitTypeStructer.TIM_OCMode=TIM_OCMode_PWM1;					//左驱动
		TIM_OCInitTypeStructer.TIM_OCPolarity=TIM_OCPolarity_High;
		TIM_OCInitTypeStructer.TIM_OutputState=TIM_OutputState_Enable;
		TIM_OCInitTypeStructer.TIM_Pulse=0;
		TIM_OC4Init(TIM3,&TIM_OCInitTypeStructer);
		
		TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);			
		TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);        	
		
		TIM_ARRPreloadConfig(TIM3,ENABLE);				//重装载使能
		
		TIM_Cmd(TIM3,ENABLE);							//定时器使能
}
void Carstart(void)			//小车启动
{	
			pwmleft=4000;pwmright=4000;
			INleft1=0;INleft2=1;
			INright1=1;INright2=0;
}


void Carstop(void)			//小车停止
{
			INleft1=0;INleft2=0;
			INright1=0;INright2=0;
			delay_ms(3);
}
void Carback(void)
{
			
			pwmleft=6000;pwmright=6000;
			INleft1=1;INleft2=0;
			INright1=0;INright2=1;
			delay_ms(15);
}
void Greadspeed(u8 view)  			//挡位设置
{
		switch(view)
		{
			case ONE:pwmleft=4250;pwmright=4250;break;   //一档
			case TWO:pwmleft=4500;pwmright=4500;break;		//二档
			case THREE:pwmleft=4700;pwmright=4700;break;		//三档
			case FOUR:pwmleft=5000;pwmright=5000;break;		//四档
		}
}
void Carturn(u8 direction,u16 angle)     //不完善  需要减速进行转弯
{
		if(direction==0x01)  //左转				
		{
				Carspeedcontrol(6500);
				INleft1=1;INleft2=0;
				INright1=1;INright2=0;
				if(angle>1800)					//根据延迟和转弯速度判断转弯的角度
				{
					delay_ms(1800);
					delay_ms(angle-1800);
				}
				else
				delay_ms(angle);
		}
		else								//右转
		{
				Carspeedcontrol(6500);
				INleft1=0;INleft2=1;
				INright1=0;INright2=1;
				if(angle>1800)		
				{
					delay_ms(1800);
					delay_ms(angle-1800);
				}
				else
				delay_ms(angle);
		}
}
void Carspeedcontrol(u16 speed)
{
		pwmleft=speed;pwmright=speed;
}
void Carturnall(u8 direction)								//原地转圈
{
		if(direction==0x01)  //左转
		{
				Carspeedcontrol(6500);
				INleft1=1;INleft2=0;
				INright1=1;INright2=0;
		}
		else								//右转
		{
				Carspeedcontrol(6500);
				INleft1=0;INleft2=1;
				INright1=0;INright2=1;
		}
}

注意:每一次超声波测距的间隔意味这小车的灵敏度,以为这个模块只有大约15°的测量范围,尽管有了超声波的舵机摆动但是在测量斜体的时候还是有可能会发生碰撞.
解决:1.优化算法,对于舵机转动的角度经行细化,但是增加了计算负担,和测量的时间
2.在小车的两侧加上红外避障模块(原理和循迹模块类似 后面可以看)
在这里插入图片描述
3.双舵机,双超声波探测
steering.h

#ifndef __STEERING_H
#define __STEERING_H
#define pwm TIM5->CCR3
#define   SG90_Right_90   195		//右转90度
#define   SG90_Right_45		190		//右转45度
#define   SG90_Front		185		//舵机摆正
#define   SG90_Left_45		180		//左转45度
#define   SG90_Left_90		175		//左转90度
#include "sys.h"
void Steering_Init(void);					//舵机初始化
void Steering_control(u16 angle);		//角度转动控制
#endif


steering.c

#include<steering.h>
#include<delay.h>
void Steering_Init(void)
{
		GPIO_InitTypeDef GPIO_InitTypeStructer;
		TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStructer;
		TIM_OCInitTypeDef TIM_OCInitTypeStructer;
	
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);

		
		GPIO_InitTypeStructer.GPIO_Mode=GPIO_Mode_AF_PP;						//舵机pwm驱动
		GPIO_InitTypeStructer.GPIO_Pin=GPIO_Pin_2;
		GPIO_InitTypeStructer.GPIO_Speed=GPIO_Speed_50MHz;
		GPIO_Init(GPIOA,&GPIO_InitTypeStructer);
		
		TIM_TimeBaseInitTypeStructer.TIM_ClockDivision=0;							//定时器5  20ms基础脉冲
		TIM_TimeBaseInitTypeStructer.TIM_CounterMode=TIM_CounterMode_Up;
		TIM_TimeBaseInitTypeStructer.TIM_Period=199;
		TIM_TimeBaseInitTypeStructer.TIM_Prescaler=7199;
		TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitTypeStructer);
		
		TIM_OCInitTypeStructer.TIM_OCMode=TIM_OCMode_PWM1;					//占空比 = t / T 相关参数如下:t = 0.5ms——————舵机会转动 0 °
//t = 1.0ms——————舵机会转动 45°
//t = 1.5ms——————舵机会转动 90°
//t = 2.0ms——————舵机会转动 135°
//t = 2.5ms——————舵机会转动180
		TIM_OCInitTypeStructer.TIM_OCPolarity=TIM_OCPolarity_Low;
		TIM_OCInitTypeStructer.TIM_OutputState=TIM_OutputState_Enable;
		TIM_OCInitTypeStructer.TIM_Pulse=0;
		TIM_OC3Init(TIM5,&TIM_OCInitTypeStructer);
			
		TIM_OC3PreloadConfig(TIM5,TIM_OCPreload_Enable);			//重装载使能
		
		TIM_Cmd(TIM5,ENABLE);							//定时器使能
}
void Steering_control(u16 angle)
{
		pwm=angle;
		delay_ms(500);
		pwm=7200;  								 //稳定舵机
}


ultrasonic.h

#ifndef __ULTRASONIC__H
#define __ULTRASONIC__H
#define Trig PFout(3)
#include<sys.h>
void Ultrasonic_Init(void); 				//超声波避障初始化 
u8 Lengthjudge(float len);							//距离判断是否规避
void TIM2_IRQHandler(void);				//中断函数
#endif


ultrasonic.c

#include<ultrasonic.h>
#include<motor.h>
#include "delay.h"
u16 counter=0;
u8 judge=0;
void Ultrasonic_Init(void)
{
		GPIO_InitTypeDef GPIO_InitTypeStructer;
		TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
		NVIC_InitTypeDef NVIC_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
		
		GPIO_InitTypeStructer.GPIO_Mode=GPIO_Mode_Out_PP;									//PF3:Trig输出 PF4:Echo输入
		GPIO_InitTypeStructer.GPIO_Pin=GPIO_Pin_3;
		GPIO_InitTypeStructer.GPIO_Speed=GPIO_Speed_50MHz;
		GPIO_Init(GPIOF,&GPIO_InitTypeStructer);
		GPIO_ResetBits(GPIOF,GPIO_Pin_3);
	
		GPIO_InitTypeStructer.GPIO_Mode=GPIO_Mode_IN_FLOATING;									//PF3:Trig输出 PF4:Echo输入
		GPIO_InitTypeStructer.GPIO_Pin=GPIO_Pin_4;
		GPIO_Init(GPIOF,&GPIO_InitTypeStructer);
		GPIO_ResetBits(GPIOF,GPIO_Pin_4);
		
		TIM_TimeBaseStructure.TIM_Period = 999; //设置自动重装载寄存器周期的值
		TIM_TimeBaseStructure.TIM_Prescaler =71; //设置时钟频率除数的预分频值
		TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割
		TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数
		TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
			
		TIM_ClearFlag(TIM2, TIM_FLAG_Update);   //清除更新中断,免得一打开中断立即产生中断
		TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
		
		NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;             //选择串口1中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占式中断优先级设置为1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         //响应式中断优先级设置为1
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //使能中断
    NVIC_Init(&NVIC_InitStructure);
		
		TIM_Cmd(TIM2,DISABLE);																//定时器开启
}
u8 Lengthjudge(float len)
{
		float length=0,sum=0;
		u16 tim;
		u16 i=0;
		while(i!=5)
		{
		Trig=1;
		delay_us(20);
		Trig=0;
		while(GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_4)==RESET);
		TIM_Cmd(TIM2,ENABLE);//回响信号到来,开启定时器计数

		i+=1; //每收到一次回响信号+1,收到5次就计算均值
		while(GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_4)==SET);//回响信号消失
		TIM_Cmd(TIM2,DISABLE);//关闭定时器

		tim=TIM_GetCounter(TIM2);//获取计TIM2数寄存器中的计数值,一边计算回响信号时间

		length=(tim+counter*1000)/58.0;//通过回响信号计算距离cm

		sum=length+sum;
		TIM2->CNT=0; //将TIM4计数寄存器的计数值清零
		counter=0; //中断溢出次数清零
		delay_ms(5);
		}
		length=sum/5;
		if(length>len)
			judge=1;
		else
			judge=0;
		return judge;
			
}
void TIM2_IRQHandler(void) //TIM2 中断
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查 TIM2 更新中断发生与否
	{
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除 TIM2 更新中断标志
		counter++;
	} 
}


  • 循迹模块(TCRT5000)
    建议买整体的循迹模块,插线方便,连接到小车上也好看.
    在这里插入图片描述
    注意:这个循迹模块测量的距离是5mm-10mm,距离很短但是很灵敏.在连接到小车上面的时候多准备几个六角铜柱和螺母

    介绍:很简单的原理就不麻烦大佬了

    它有4个IO接口,我们只需要用3个即可,就是VCC,GND,D0其中D0就是用来返回信号的,它有两个状态,就是高电平和低电平。
    正常情况下,D0返回低电平,当模块检测到黑线的时候,返回高电平
    TCRC.h

#ifndef __TCRT_H
#define __TCRT_H
#include<sys.h>
#define TCRT1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_14)					//传感器引脚配置
#define TCRT2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_15)
#define TCRT3 GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_0)
#define TCRT4 GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_1)
#define TCRT5 GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_2)
void TCRT_Init(void);					//循迹初始化
void TCRT_Begin(void);					//小车开始循迹
#endif

TCRC.c

#include<TCRT.h>
#include<motor.h>
void TCRT_Init(void)
{
		GPIO_InitTypeDef GPIO_InitTypeStructer;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);			//初始化所需要的串口
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);
		
		GPIO_InitTypeStructer.GPIO_Mode=GPIO_Mode_IPU;			  						
		GPIO_InitTypeStructer.GPIO_Pin=GPIO_Pin_14|GPIO_Pin_15;
		GPIO_InitTypeStructer.GPIO_Speed=GPIO_Speed_50MHz;
		GPIO_Init(GPIOE,&GPIO_InitTypeStructer);
		
		GPIO_InitTypeStructer.GPIO_Mode=GPIO_Mode_IPU;			  						
		GPIO_InitTypeStructer.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
		GPIO_Init(GPIOF,&GPIO_InitTypeStructer);
		
}
void TCRT_Begin(void)														//循迹开始
{
		if(TCRT1==0&&TCRT2==0&&TCRT3==0&&TCRT4==0&&TCRT5==0)		//轮胎没有着地
		{
				Carstop();
		}
		if(TCRT1==1&&TCRT2==1&&TCRT3==1&&TCRT4==1&&TCRT5==1)		//没有在黑线上行驶
		{
				Carstart();
		}
		if(TCRT1==1&&TCRT2==1&&TCRT3==0&&TCRT4==1&&TCRT5==1)			//中间传感器在黑线上
		{
				Carstart();
		}
		if((TCRT1==0&&TCRT2==1&&TCRT3==1&&TCRT4==1&&TCRT5==1)|(TCRT1==1&&TCRT2==0&&TCRT3==1&&TCRT4==1&&TCRT5==1))
		{
				Carstop();
				Carturn(LEFT,50);  								//速度尽量很小,也不能特别小导致小车无法启动  角度越小越精准
		}
		if((TCRT1==1&&TCRT2==1&&TCRT3==1&&TCRT4==0&&TCRT5==1)|(TCRT1==1&&TCRT2==1&&TCRT3==1&&TCRT4==1&&TCRT5==0))
		{
				Carstop();
				Carturn(RIGHT,50); 
		}
		if(TCRT1==0&&TCRT2==0&&TCRT3==1&&TCRT4==0&&TCRT5==0)			//左转弯
		{
				Carstop();
				Carturn(LEFT,120); 
		}
		if(TCRT1==1&&TCRT2==1&&TCRT3==1&&TCRT4==0&&TCRT5==0)			//右转弯
		{
				Carstop();
				Carturn(RIGHT,120); 
		}
}



					**后续的模块还会添加**

那先看一下主函数吧:实现的是循迹和避障
main.c

#include<motor.h>
#include<TCRT.h>
#include<ultrasonic.h>
#include<steering.h>
#include<usart.h>
#include "sys.h"
#include "delay.h"

 int main(void)
 {	
		//u16 angle[]={SG90_Right_90,SG90_Left_90}; 		//舵机角度数组
		//u16 angle1[]={Car_Right_90,Car_Left_90};						//小车转动
		//u8 direction[]={RIGHT,LEFT};
		//u8 i=0;
		delay_init();
		TCRT_Init();
		Steering_Init();
		Motor_init();
		Ultrasonic_Init();
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
		PWMout(0,7199);
		while(1)
		{
				TCRT_Begin();
		}
	 /*while(1)
	 {
			Steering_control(SG90_Front);	
			Carstart();				
			delay_ms(20);							//每隔500ms进行一次扫描 小车停止减小测量误差
			while(Lengthjudge(25.0)==0)			//进行距离判断 如果达到避障条件进入循环
			{
				Carstop();
				if(i==3)
					break;
				Steering_control(angle[i]);								//根据angle数组的顺序摆动舵机
				i++;
			}
			if(i!=0)						//i==0 说明前方无障碍物体
			{
					if(i==3)					//前方180°都为障碍物 掉头
					{
						Carturn(LEFT,540);
						i=0;
					}
					else							//有位置可以走进行转弯
					{
							if(i==1)
							{Carturn(direction[0],angle1[i-1]);				//i-1  while循环中多加了一次
								i=0;
							}
							else
							{
								Carturn(direction[1],angle1[i-1]);
								i=0;
							}
					}
					
			}
	 }*/
 }

3.材料的选择

  • 杜邦线:杜邦线长一点比较好,还是要根据你小车的大小进行选择,我的小车30cm就足够了
  • 胶枪:很便宜的东西,方便一些东西的固定.日后做别的项目也需要
  • 六角铜柱:小车上有许多的口,大部分模块都有这个铜柱的地方,配合螺母和螺丝就可以达到很好的固定
  • 螺丝刀
  • 黑胶布 小车循迹的时候用到(看模块的间隔买)
    别看这几个小小的材料,如果前期准备齐全可以减少很多时间的浪费,让你一心研究代码

总接

  • 做一个项目的时候不能头脑一热想做就做,前期一定要做足准备工作和相关的资料也要查询
  • 单片机的引脚口的分配看似轻松,但是随着模块的增加,你会发现有需要多引脚口有特定的作用,所以要进行提前的规划,做一个有大局观的人.(关键是看引脚手册 和对于单片机的手册)
  • 闭门造车行不通,没有任何经验的你做出来惊世骇俗的东西几乎不可能,所以多多借鉴和学习大佬的知识和想法能让你快速进步.CSND就是一个不错的知识平台.感谢各位博客大佬
  • 引用以为大佬的一句话作为结束吧:有了错误先确保代码没有问题,再去查找硬件的问题(真的深有体会)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动手做一个简单的智能小车 的相关文章

  • 如何利用CHAT做简单的总结体会?

    问CHAT 在测试过程中使用appium python自动化的优点和体会 CHAT回复 使用 Appium 配合 Python 进行自动化测试主要有以下几点优点 1 跨平台性 Appium 支持 iOS 和 Android 平台的应用自动化
  • 扬帆证券:产业化破题在即 人形机器人超预期演进

    大模型助力下的拐点 特斯拉A股产业链上 两笔重磅出资几乎一起现身 总规划超百亿元 1月4日 拓普集团公告 与宁波经济技能开发区办理委员会签署了 机器人电驱系统研发生产基地项目出资协议书 公司拟出资50亿元 建设机器人核心部件生产基地 此次出
  • 欧盟反垄断主管即将会见库克,iPhone NFC功能要开放了?

    1月5日路透社报道 欧盟反垄断主管玛格丽特 维斯塔格 Margrethe Vestager 即将在下周举办会议 会见苹果 博通 英伟达等多个科技公司CEO 苹果首席执行官蒂姆 库克 Tim Cook 就在其中 欧盟反垄断想来大家应该已经不陌
  • 用通俗易懂的方式讲解:图解 Transformer 架构

    文章目录 用通俗易懂方式讲解系列 1 导语 2 正文开始 现在我们开始 编码 从宏观视角看自注意力机制 从微观视角看自注意力机制 通过矩阵运算实现自注意力机制
  • 【信道估计】【MIMO】【FBMC】未来移动通信的滤波器组多载波调制方案(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 【路径规划】基于A*算法路径规划研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 蒙特卡洛在发电系统中的应用(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • Soul App:年轻人的社交状态,还有多少种可能?

    查尔斯 狄更斯在 双城记 的开篇写下 这是最好的时代 这是最坏的时代 这是智慧的时代 这是愚蠢的时代 这是信仰的时期 这是怀疑的时期 人们面前有着各样事物 人们面前一无所有 既然万事万物都和狄更斯所说般 好坏参半 那又何必执着于过去 苦恼于
  • 利用CHAT写实验结论

    问CHAT 通过观察放置在玻璃表面上的单个水滴 人们可以观察到水滴充当成像系统 探究这样一个透镜的放大倍数和分辨率 CHAT回复 实验报告标题 利用玻璃表面的单一水滴观察成像系统的放大倍数和分辨率 一 实验目的 通过对比和测量 研究和探索玻
  • 让CHAT介绍下V2ray

    CHAT回复 V2Ray是一个网络工具 主要用于科学上网和保护用户的网络安全 它的名字源自Vmess Ray 光线 通过使用新的网络协议 为用户提供稳定且灵活的代理服务 下面是一些V2Ray的主要特性 1 多协议支持 V2Ray 提供了大量
  • 基于opencv的大米计数统计(详细处理流程+代码)

    在我每周的标准作业清单中 有一项是编写计算机视觉算法来计算该图像中米粒的数量 因此 当我的一个好朋友M给我发了一张纸上的扁豆照片 显然是受到上述转发的启发 请我帮他数一下谷物的数量时 它勾起了我怀旧的回忆 因此 我在我的旧硬盘上寻找很久以前
  • 台积电再被坑,2纳米光刻机优先给Intel和三星,美国太霸道了

    外媒指出今年ASML的10台2纳米光刻机分配已经基本确定了 Intel拿到6台 三星获得3台 台积电只能得到一台 考虑到美国对ASML的强大影响力 外媒的这些消息应该有较高的可信性 Intel在先进工艺制程方面 自从2014年量产14纳米之
  • 性能大减80%,英伟达芯片在华“遇冷”,我方霸气回应:不强求

    中国这么大一块市场 谁看了不眼馋 在科技实力大于一切的今天 高端芯片的重要性不言而喻 作为半导体产业发展过程中不可或缺的一环 芯片技术也一直是我国技术发展的一大 心病 在美西方等国的联手压制下 我国芯片技术发展处处受阻 至今也未能在高端芯片
  • 强烈推荐收藏!LlamaIndex 官方发布高清大图,纵览高级 RAG技术

    近日 Llamaindex 官方博客重磅发布了一篇博文 A Cheat Sheet and Some Recipes For Building Advanced RAG 通过一张图给开发者总结了当下主流的高级RAG技术 帮助应对复杂的生产场
  • 2023最新pytorch安装(超详细版)

    前言 一 判断是否有Nvidia 英伟达显卡 二 CPU版 2 1 安装Anaconda 2 2 创建虚拟环境 2 3安装pytorch 2 4 验证pytorch是否安装成功 三 GPU版 3 1 安装Anaconda 3 2 创建虚拟环
  • 人工智能 AI 如何让我们的生活更加便利

    每个人都可以从新技术中获益 一想到工作或生活更为便利 简捷且拥有更多空余时间 谁会不为之高兴呢 借助人工智能 每天能够多一些空余时间 或丰富自己的业余生活 为培养日常兴趣爱好增添一点便利 从电子阅读器到智能家居 再到植物识别应用和智能室内花
  • 蒙特卡洛在发电系统中的应用(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 自动驾驶离不开的仿真!Carla-Autoware联合仿真全栈教程

    随着自动驾驶技术的不断发展 研发技术人员开始面对一系列复杂挑战 特别是在确保系统安全性 处理复杂交通场景以及优化算法性能等方面 这些挑战中 尤其突出的是所谓的 长尾问题 即那些在实际道路测试中难以遇到的罕见或异常驾驶情况 这些问题暴露了实车
  • 两个月进口猛增10倍,买近百台光刻机,难怪ASML不舍中国市场

    据统计数据显示 2023年11月和12月 中国从荷兰进口的光刻机设备同比猛增10倍 进口金额超过19亿美元 让ASML赚得盆满钵满 ASML早前表示中国客户在2023年订购的光刻机全数交付 2023年11月中国进口的光刻机达到42台 进口金
  • 对中国手机作恶的谷歌,印度CEO先后向三星和苹果低头求饶

    日前苹果与谷歌宣布合作 发布了 Find My Device Network 的草案 旨在规范蓝牙追踪器的使用 在以往苹果和谷歌的生态形成鲜明的壁垒 各走各路 如今双方竟然达成合作 发生了什么事 首先是谷歌安卓系统的市场份额显著下滑 数年来

随机推荐

  • tkmybatis自定义xml报错

    刚刚再写一个项目 然后项目使用的是tk mybatis 后面我有在项目中引入了mybatis plus 想使用公司的自动生成类的文件 当引入进来后 我以为一切都是水到渠成的 当一执行 它给我报个这个错 我一看这个先去配置文件看了下 配置的路
  • 常用C#代码

    常用C 代码 获取系统路径 1 获取电脑的路径 string dir Environment GetFolderPath Environment SpecialFolder DesktopDirectory 获取系统桌面目录路径 strin
  • sql注入基础

    0x01sql语句基础 1 select语句 格式 select from table 从table表中获取字段信息 select from table where 在满足where后的条件下查询字段信息 2 insert语句 格式 ins
  • STM32通过串口2使用ESP8266WIFI模块连接新大陆云平台

    目录 使用硬件 分步骤 配置TCP连接 连接WIFI 1 使用ESP8266的复位引脚进行复位 2 发送基本AT指令 3 连接新大陆 4 新大陆云平台显示在线及上传数据测试成功 5 串口显示 5 涉及的函数 发生AT检测WIFI模块错误 如
  • JetBrains设置inline hint的背景色、前景色

    如题 修改IDE的hint前景色和背景色 修改后结果
  • 元宇宙的价值究竟在哪 有哪些方向值得重点关注?关于元宇宙进行详细介绍

    1992年 第一次经济危机持续至此给全球带来了极大的打击 而在互联网行业 网络不再是政府和军队专属的使用品 Dephi开始为他们的客户提供在线网络服务 并逐渐的从电子邮件服务发展到了全方位的网络服务 这一年对于整个互联网而言具有里程碑的历史
  • 【Vue3】vite配置css 的sourceMap ,以及文件引用配置别名

    Vite 2 9配置浏览器加载 CSS 源映射 vite config ts 有一个devSourcemap属性css可以设置为true 这是vite config ts我目前正在使用的文件 export default defineCon
  • [论文阅读] (17)CCS2019 针对PowerShell脚本的轻量级去混淆和语义感知攻击检测(经典)

    娜璋带你读论文 系列主要是督促自己阅读优秀论文及听取学术讲座 并分享给大家 希望您喜欢 由于作者的英文水平和学术能力不高 需要不断提升 所以还请大家批评指正 非常欢迎大家给我留言评论 学术路上期待与您前行 加油 前一篇总结了Powershe
  • 仿真软件都在这里了!20+国内外自动驾驶仿真软件大盘点

    编辑 智车科技 原文链接 https mp weixin qq com s nG48GndQVb7rFtMdjYUU3Q 点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 仿真测试 技术交流群 导
  • 生态伙伴

    法律人的日常工作中 离不开案例文书 法律法规的检索 而如何高效 便利的进行内容检索 一直困扰着法律人 本期飞书生态伙伴 觅律搜索 是一款专门为法律人量身定制的智能法律信息检索工具 收录超过5000万份裁判文书 权威案例 法律法规 律师律所等
  • Thymeleaf 提示: Cannot perform conversion to XML from legacy HTML:

    SpringBoot 1 5 x 集成Thymeleaf 2 1 x 提示如下错误信息 http nio 9096 exec 1 ERROR org thymeleaf TemplateEngine THYMELEAF http nio 9
  • 加密货币:我们为何而战?

    在 加密货币 领域中肆虐的冲突是无止境的 这些激烈的争论冲突涉及到各个方面 参与各方也几乎不去尝试达成双方都能接受的妥协让步 有趣的是 站在这些争议焦点的对立面往往是同一群人 从加密货币极繁主义和财富的分配 到治理和共识算法等等 这些争议的
  • Ubuntu/linux 下安装jdk和eclipse,超详细教程

    1 首先下载jdk和eclipse jdk官方下载网址 http www oracle com technetwork java javase downloads index html 官方有时候下的很慢很慢 百度网盘现成的jdk8 htt
  • 保研之路——中山大学数据科学与计算机学院直硕夏令营

    中山大学数据科学与计算机学院直硕夏令营 个人情况 高校复试参与情况 中山大学数据科学与计算机学院直硕 7 14 7 20 结语 嗯 抱着不白花这么多路费住宿费的初衷准备写一个保研经验贴 希望学弟学妹少花点钱吧orz 我的战术大概是只要学校给
  • stm32实用篇4: stm32数据类型长度

    由于经常会忘记stm32的数据类型长度 测试一下 DEBUG INFO stm32数据类型长度 DEBUG INFO char d byte sizeof char DEBUG INFO short d byte sizeof short
  • 算法:归并排序和快排的区别

    一 二者比较 归并排序和快排的相同点 1 利用分治思想 2 具体实现都用递归 归并排序和快排的不同点 1 先分解再合并 归并排序先递归分解到最小粒度 然后从小粒度开始合并排序 自下而上的合并排序 2 边分解边排序 快速排序每次分解都实现整体
  • Educoder_web实训作业——写在最后

    今天终于把最后一章的web发了出来 这也是我第一次完整的将一个实训作业写成一个专栏推送 其实 这不是我第一次做关卡答案的文章了 上个学期Java实训的时候 由于当时自身也有很多题不是特别清楚 就上网搜了一下 没想到发现网上面已经有人开始再发
  • MFC中OnTimer定时器用法

    一 单个定时器用法 定时器工作主要流程 设置定时器SetTimer 时间到后调用OnTimer函数 关闭定时器KillTimer 可以在程序初始化用SetTimer函数弄成多个线程类似 并行进行多个函数功能 1 1 SetTimer H n
  • Python实现排队论——多坑位仿真(未使用仿真库,纯手写仿真)

    Python实现排队论 多坑位厕所 在一次偶然机会 接触到运筹学的排队论问题 于是简单尝试了一下硬撸代码 纯手打仿真 没有使用仿真库 建议大家可以学习Simpy库 用以仿真 一 案例 主要是基于 蒙特卡罗思想 求解 单坑位 排队等待时间问题
  • 动手做一个简单的智能小车

    动手做一个简单的智能小车 来到CNDN一年了 看到了许多大佬的杰出作品 也该写点什么来回馈给大家了前不久接触了单片机 想提前进行实践一下所以有想法做一个实体出来 想来想去难的怕自己搞不定 但是还好找到了志同道合的王同学 一起搞一个智能小车