STC32G 三电感电磁循迹小车

2023-11-08

前言

准备18届的负压电磁,趁现在考试延期赶紧把车子给调了。

现在速度就只能提到1.5m,再往上调就有点打滑了,只能等后面逐飞把负压电机的做出来了之后看能不能让车子抓地更好,再往上调调。

硬件的主板目前使用逐飞的STC母板,电感排布为左中右。

目前换三轮车,链接

效果

三电感四轮电磁循迹小车


18届三轮负压电磁全元素
18届三轮负压电磁无元素,速度纯享版

准备工作

在实现这些电磁循迹之前,有必要进行一模块调试,分别是电机转速闭环、电磁采样,最后舵机闭环。

我个人感觉写寻迹小车也是一个比较大的工程项目,调试起来非常费时间,如果一下子写整个模块然后进行调试的话反而调试过程中会非常困难,推荐大家一个问题一个问题逐一解决之后,再合并。

增量式以及位置式PID

原理就不讲了,直接放我用的代码和结构体参数定义。

float PID_Control_Inc(PID* pid, int flag) // 增量式PID
{
    float inc = 0;

    pid->ek = pid->SetValue - pid->ActualValue;

    inc = pid->KP * (pid->ek - pid->ek_1) + pid->KI * pid->ek
          + pid->KD * (pid->ek - 2 * pid->ek_1 + pid->ek_2);

    pid->ek_2 = pid->ek_1; //存储误差
    pid->ek_1 = pid->ek; //存储误差

    if(flag == 1)
    {
        if(inc > pid->PIDmax)
            inc = pid->PIDmax;
        if(inc < pid->PIDmin)
            inc = pid->PIDmin;
    }
    pid->PIDout = inc;
    return pid->PIDout;
}
float PID_Control_Pos(PID* pid, int flag) // 位置式PID
{
    float Pos = 0;

    pid->ek = pid->SetValue - pid->ActualValue;
    pid->ek_sum += pid->ek;

    if(pid->ek_sum > pid->Sum_max)
        pid->ek_sum = pid->Sum_max;
    if(pid->ek_sum < pid->Sum_min)
        pid->ek_sum = pid->Sum_min;

    Pos = pid->KP * pid->ek + pid->KI * pid->ek_sum + pid->KD * (pid->ek - pid->ek_1);

    pid->ek_2 = pid->ek_1; //存储误差
    pid->ek_1 = pid->ek; //存储误差

    // 积分限幅
    if(flag == 1)
    {
        if(Pos > pid->PIDmax)
            Pos = pid->PIDmax;
        if(Pos < pid->PIDmin)
            Pos = pid->PIDmin;
    }
    pid->PIDout = Pos;
	
    return pid->PIDout;
}
typedef struct // PID结构体定义
{
    float32 SetValue; // 期望值 参考值
    float32 ActualValue; // 实际值
    float32 KP; // 比例因子
    float32 KI; // 积分因子
    float32 KD; // 微分因子
    float32 ek; // 本级误差
    float32 ek_1; // 上一次
    float32 ek_2; // 上上次
    float32 ek_sum; // 误差累积

    float32 Sum_max; // 误差累和上限
    float32 Sum_min; // 误差累和下限
    float32 PIDmax; // max limit
    float32 PIDmin; // min limit

    float32 PIDout; // output
}PID;

需知P因子能够增大响应速度但可能引起震荡,I因子能够消除静差但响应速度慢,可能引起震荡,D因子用于消除抖动。

因此对于转速的闭环采用PI控制,而对于舵机闭环则采用PD控制。

电机闭环

为了实现电机闭环,需结合编码器将转速信号转为脉冲信号,然后经MCU进行数据处理后反算为实际速度。

这里我采用的是龙邱的512线带方向输出的编码器,编码器同轴的齿轮齿数为31T,与车模后轮同轴的齿轮齿数为68T,我使用的是C车模,后轮直径为64mm。

根据机械传动公式,假设读取编码器脉冲个数的频率为500Hz,因此将可以计算出由编码器脉冲数转换为实际运行速度(米每秒)的比例系数
P u l s e 2 M P S = 1 512 × 31 68 × 64 × 1 0 − 3 × π × 500 = 0.0895 Pulse2MPS=\frac{1}{512}\times \frac{31}{68}\times 64\times 10^{-3} \times \pi \times 500=0.0895 Pulse2MPS=5121×6831×64×103×π×500=0.0895
在这里插入图片描述
接下来就可以结合PID算法进行实际的转速闭环了。

再实际的小车应用中,光靠舵机闭环打角循迹是不行的,结合左右轮差速能够实改善转向性能。因此在进行转速闭环的同时,也需要对两个轮子同时进行闭环调试。

首先定义左右轮结构体变量。

extern PID pid_motor_L = {0}; // 左轮
extern PID pid_motor_R = {0}; // 右轮

然后使能定时器Timer1,并以500Hz的频率进入中断后读取速度。

void TIM1_Isr interrupt 3()
{
    float inc_L = 0.0;
    float inc_R = 0.0;
    float temp_L = 0.0;
    float temp_R = 0.0;
	float speed_goal = 1.5 * 60; // 后轮速度,米每分
	
	temp_L = ctimer_count_read(Encoder_L) * Pulse2MPM; // 左右轮当前速度
    temp_R = ctimer_count_read(Encoder_R) * Pulse2MPM;

    ctimer_count_clean(Encoder_L); // 编码器清零
    ctimer_count_clean(Encoder_R);

    if(DIR_Encoder_L == 1)
        pid_motor_L.ActualValue = temp_L;
    else
        pid_motor_L.ActualValue = (-1) * temp_L;
    if(DIR_Encoder_R == 0)
        pid_motor_R.ActualValue = temp_R;
    else
        pid_motor_R.ActualValue = (-1) * temp_R;
        
	pid_motor_L.SetValue = speed_goal ; // 差速
	pid_motor_R.SetValue = speed_goal ;
	inc_L = PID_Control_Inc(&pid_motor_L, 1);
	inc_R = PID_Control_Inc(&pid_motor_R, 1);
	
	duty_L += inc_L;
	duty_R += inc_R;
	
	if(duty_L > Motor_UpperLimit)
		duty_L = Motor_UpperLimit;
	if(duty_L < Motor_LowerLimit)
		duty_L = Motor_LowerLimit;
	
	if(duty_R > Motor_UpperLimit)
		duty_R = Motor_UpperLimit;
	if(duty_R < Motor_LowerLimit)
		duty_R = Motor_LowerLimit;
		
	DIR_1 = 0;
	pwm_duty(Motor_L, duty_L);
	DIR_2 = 0;
	pwm_duty(Motor_R, duty_R);
}

电磁采样

电磁采样原理略。

但需要注意,在采样到电磁值以后,需要首先将电磁前瞻对称放在赛道中心线上,即左右电感对称,中间电感在中心线上,然后旋拧电位器使左右电磁值相同并且小于中间电磁值,采样以后,需进行滤波以消除大幅度的扰动,并且进行归一化以适应赛道的变化。

对于三电感排布,记从左到右的电感分别为1、2、3,电磁值分别记为Lres、Mres、Rres。注意到电感到赛道中心线的距离与采样到的电磁值之间的关系是非线性变化的。为了让其线性化,对采样到的电磁值取倒以后,再1、2,2、3进行差比和。即 e r r o r 1 = 1 / L r e s − 1 / M r e s 1 / L r e s + 1 / M r e s , e r r o r 2 = 1 / M r e s − 1 / R r e s 1 / M r e s + 1 / R r e s error_1=\frac{1/Lres-1/Mres}{1/Lres+1/Mres}, error_2=\frac{1/Mres-1/Rres}{1/Mres+1/Rres} error1=1/Lres+1/Mres1/Lres1/Mres,error2=1/Mres+1/Rres1/Mres1/Rres
然后得到最后能够用于舵机闭环的误差 e r r o r = e r r o r 1 + e r r o r 2 e r r o r 1 − e r r o r 2 error=\frac{error_1+error_2}{error_1-error_2} error=error1error2error1+error2

滤波的方法有很多,均值滤波就能够达到很好的效果。归一化方法就是数学建模中常用的极大极小归一化法,但我们不能预先知道能够采集到的电磁值最大值最小值有多大,因此可以默认最大值为3600,最小为0.

// sample
    L[0] = adc_once(ADC_P00, ADC_12BIT);
    L[1] = adc_once(ADC_P00, ADC_12BIT);
    L[2] = adc_once(ADC_P00, ADC_12BIT);
    L[3] = adc_once(ADC_P00, ADC_12BIT);
    L[4] = adc_once(ADC_P00, ADC_12BIT);

    R[0] = adc_once(ADC_P06, ADC_12BIT);
    R[1] = adc_once(ADC_P06, ADC_12BIT);
    R[2] = adc_once(ADC_P06, ADC_12BIT);
    R[3] = adc_once(ADC_P06, ADC_12BIT);
    R[4] = adc_once(ADC_P06, ADC_12BIT);
	
	M[0] = adc_once(ADC_P13, ADC_12BIT);
	M[1] = adc_once(ADC_P13, ADC_12BIT);
	M[2] = adc_once(ADC_P13, ADC_12BIT);
	M[3] = adc_once(ADC_P13, ADC_12BIT);
	M[4] = adc_once(ADC_P13, ADC_12BIT);
	
    // get sum
    Sum_L  = L[0] + L[1] + L[2] + L[3] + L[4];
    Sum_R  = R[0] + R[1] + R[2] + R[3] + R[4];
	Sum_M  = M[0] + M[1] + M[2] + M[3] + M[4];

    // normalize and mean filter
    Lres =  (Sum_L - adc_min)  * 1000.0 / (adc_max - adc_min) / 5;
    Rres =  (Sum_R - adc_min)  * 1000.0 / (adc_max - adc_min) / 5;
	Mres =  (Sum_M - adc_min)  * 1000.0 / (adc_max - adc_min) / 5;
	
	error1 = (1.0 / Lres - 1.0 / Mres) / (1.0 / Lres + 1.0 / Mres);
	error2 = (1.0 / Mres - 1.0 / Rres) / (1.0 / Mres + 1.0 / Rres);
	error = (error1 + error2) / (error1 - error2);

舵机闭环

舵机打角的原理略。

在这里给大家提个醒,在进行调试之间,最好事先把两个前轮的机械结构弄对称。并且先给舵机一个50Hz较低脉宽的PWM,找到舵机的中间值,因为在出场之前,舵机可能没有调整它的中间位置。

定义舵机PID变量,并进行PD控制。

void TIM1_Isr interrupt 3()
{
	pid_steer.ActualValue = error;
    temp = PID_Control_Pos(&pid_steer, 1);
   
    duty_steer = Middle + 1.0 * (uint16)(temp);
    
	if(duty_steer > Left) // 舵机限幅
		duty_steer = Left;
	if(duty_steer < Right) // 舵机限幅
		duty_steer = Right;
		
	pwm_duty(PWMB_CH1_P74, duty_steer);
}

合并

uint16 const Middle = 800;
uint16 const Left = 880;
uint16 const Right = 720;

float adc_data_L[5], adc_data_R[5],adc_data_M[5]= {0};
float adc_max = 3600;
float adc_min = 0;
float error1,error2, error = 0;

uint16 duty_steer;
uint16 duty_L = 1500;
uint16 duty_R = 1500;
uint8 flag_fork=0; // 三叉标志
uint8 flag_R_circ_pre,flag_R_circ_in,flag_R_circ_out=0; // 右环岛
uint8 flag_L_circ_pre,flag_L_circ_in,flag_L_circ_out=0; // 左环岛
uint8 flag_trackout = 0;
uint8 Debug = 0;
uint8 test = 0;
float32 L[5], R[5], M[5]= {0}; // 存储以滤波
float32 Lres, Rres, Mres = 0; // 滤波结果,真正用于计算
float32 speed_goal = 1.5 * 60;

void TM1_Isr() interrupt 3
{

    static uint16 count_led = 0; // 中断计数用于点灯
    static uint16 count_sample = 0;  // 中断计数用于滤波
	static uint16 count_delay_fork=0; // 三叉判断延时
    static uint16 count_delay_R_circ_pre = 0; // 预圆环延时计数
	static uint16 count_delay_R_circ_in = 0; // 入环延时
	static uint16 count_delay_R_circ_out = 0;
	static uint16 count_delay_L_circ_pre = 0; // 预圆环延时计数
	static uint16 count_delay_L_circ_in = 0; // 入环延时
	static uint16 count_delay_L_circ_out=0;
    static uint16 count = 0;

    float inc_L = 0.0;
    float inc_R = 0.0;
    float temp_L = 0.0;
    float temp_R = 0.0;
    float temp = 0;
    float dif_rate = 0; // 正常行驶差速系数
	float speed_rate=0;
    float Sum_L, Sum_R, Sum_LM, Sum_RM, Sum_M= 0;


	P42 = 1;
    flag_trackout = 0;
	
    count_led++;
    if(count_led >= 0.5 * TIM1_ISR_F)
    {
        count_led = 0;
        LED_toggle; // 用于调试,防止中断崩
    }
    // 速度
    temp_L = ctimer_count_read(Encoder_L) * Pulse2MPM; // 左右轮当前速度
    temp_R = ctimer_count_read(Encoder_R) * Pulse2MPM;

    ctimer_count_clean(Encoder_L); // 编码器清零
    ctimer_count_clean(Encoder_R);

    if(DIR_Encoder_L == 1)
        pid_motor_L.ActualValue = temp_L;
    else
        pid_motor_L.ActualValue = (-1) * temp_L;
    if(DIR_Encoder_R == 0)
        pid_motor_R.ActualValue = temp_R;
    else
        pid_motor_R.ActualValue = (-1) * temp_R;
	
	// sample
    L[0] = adc_once(ADC_P00, ADC_12BIT);
    L[1] = adc_once(ADC_P00, ADC_12BIT);
    L[2] = adc_once(ADC_P00, ADC_12BIT);
    L[3] = adc_once(ADC_P00, ADC_12BIT);
    L[4] = adc_once(ADC_P00, ADC_12BIT);
    
    R[0] = adc_once(ADC_P06, ADC_12BIT);
    R[1] = adc_once(ADC_P06, ADC_12BIT);
    R[2] = adc_once(ADC_P06, ADC_12BIT);
    R[3] = adc_once(ADC_P06, ADC_12BIT);
    R[4] = adc_once(ADC_P06, ADC_12BIT);
	
	M[0] = adc_once(ADC_P13, ADC_12BIT);
	M[1] = adc_once(ADC_P13, ADC_12BIT);
	M[2] = adc_once(ADC_P13, ADC_12BIT);
	M[3] = adc_once(ADC_P13, ADC_12BIT);
	M[4] = adc_once(ADC_P13, ADC_12BIT);
	
    // get sum
    Sum_L  = L[0] + L[1] + L[2] + L[3] + L[4];
    Sum_R  = R[0] + R[1] + R[2] + R[3] + R[4];
	Sum_M  = M[0] + M[1] + M[2] + M[3] + M[4];

    // normalize and mean filter
    Lres =  (Sum_L - adc_min)  * 1000.0 / (adc_max - adc_min) / 5;
    Rres =  (Sum_R - adc_min)  * 1000.0 / (adc_max - adc_min) / 5;
	Mres =  (Sum_M - adc_min)  * 1000.0 / (adc_max - adc_min) / 5;

    if(!test)
    {
		error1 = (1.0 / Lres - 1.0 / Mres) / (1.0 / Lres + 1.0 / Mres);
		error2 = (1.0 / Mres - 1.0 / Rres) / (1.0 / Mres + 1.0 / Rres);
		error = (error1 + error2) / (error1 + error2);
		
        pid_steer.KP = 20 + fabs(error)*fabs(error) *10;
        
		if(pid_steer.KP > 200)
            pid_steer.KP = 200;

        dif_rate = 0.001 + fabs(error) / 1000;
        if(dif_rate >= 0.003)
            dif_rate = 0.003;
		
		speed_rate = 0.9 + 0.1 / fabs(error) / fabs(error);
		if(speed_rate > 1.1)
			speed_rate = 1.1;
		
        pid_steer.ActualValue = error;
        temp = PID_Control_Pos(&pid_steer, 1);	
        
		if((!flag_R_circ_in) && (!flag_L_circ_in) && (!flag_fork))
			duty_steer = Middle + 1.0 * (uint16)(temp);

        if(duty_steer > Left) // 舵机限幅
            duty_steer = Left;
        if(duty_steer < Right) // 舵机限幅
            duty_steer = Right;

        // 速度差速控制
        if(Debug)
            dif_rate = 0;

        pid_motor_L.SetValue = speed_rate*speed_goal * (1 - dif_rate * temp) ; // 差速
        pid_motor_R.SetValue = speed_rate*speed_goal * (1 + dif_rate * temp) ;

        inc_L = PID_Control_Inc(&pid_motor_L, 1);
        inc_R = PID_Control_Inc(&pid_motor_R, 1);

        duty_L += inc_L;
        duty_R += inc_R;

        if(duty_L > Motor_UpperLimit)
            duty_L = Motor_UpperLimit;
        if(duty_L < Motor_LowerLimit)
            duty_L = Motor_LowerLimit;

        if(duty_R > Motor_UpperLimit)
            duty_R = Motor_UpperLimit;
        if(duty_R < Motor_LowerLimit)
            duty_R = Motor_LowerLimit;

        // out of track
        if((Rres < 80 && Lres < 80) && (!Debug))
        {

            DIR_1 = 1;
            pwm_duty(Motor_L, 0);
            DIR_2 = 1;
            pwm_duty(Motor_R, 0);
            flag_trackout = 1;
        }
        else
        {
            pwm_duty(PWMB_CH1_P74, duty_steer);
            DIR_1 = 0;
            pwm_duty(Motor_L, duty_L);
            DIR_2 = 0;
            pwm_duty(Motor_R, duty_R);
        }
    }
    P42 = 0;

需注意,在编写代码的时候务必要注意中断的执行时间。可以在进中断给一个IO口置1,出中断给IO置0。外接示波器读高电平时间。如果高电平的时间远大于低电平时间,那就要考虑降低一下中断频率了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STC32G 三电感电磁循迹小车 的相关文章

  • 谈Delphi编程中资源文件的应用

    一 初级应用篇 资源文件一般为扩展名为res的文件 在VC中资源文件用得非常普遍 但Delphi在其联机帮助中对资源文件没作什么介绍 其实利用其自带的资源编译工具BRCC32 EXE 一般位于 Delphi BIN目录下 我们完全可以做出跟
  • StringBuilder和StringBuffer&String的区别,以及它的基本用法

    StringBuilder在java5中引入 算的上是一个StringBuffer的一个用于单线程的版本 StringBuilder用于拼接字符串 用法跟StringBuffer差不多 都是创建一个字符缓存区 不用像String一样每增加一
  • JVM Tenured space is exhausted

    使用Android Studio命令gradlew assembleRelease打包apk 遇到了JVM Tenured space is exhausted的错误 网上查询后原因是JVM分配内存不足 需要在项目下的grade prope
  • 期货和股票的区别在哪里

    期货和股票的区别在哪里 股票与期货有什么区别 1 概念不同 股票是股份公司发行的所有权凭证 是各个股东作为持股凭证的一种有价证券 而期货属于一种标准化可交易合约 一种到期必须执行的合约 2 交易场所不同 股票是需要在证券交易所进行交易的 例
  • Netty实战(一)Nett的概念及体系结构

    Nett的概念及体系结构 第一章 Java网络编程 1 1 Java NIO 1 2 选择器 第二章 Netty是什么 2 1 Netty简介 2 2 Netty的特性 2 2 1 设计 2 2 2 易于使用 2 2 3 性能 2 2 4
  • 读取文件最后N行

    转自 http www zuidaima com share 1550463669226496 htm 指定行数 可以获取到从这行到文件尾的所有行 分享自大熊 源文件 读取最后10行结果 代码下载地址 http www zuidaima c
  • C++的智能指针unique_ptr、shared_ptr和weak_ptr

    C 的智能指针是一种特殊的指针类型 它能够自动管理内存资源 避免常见的内存泄漏和多次释放等问题 C 11引入了三种主要的智能指针 unique ptr shared ptr和weak ptr 目录 unique ptr shared ptr
  • 双线性插值算法的详细总结

    原文出处 http blog csdn net xjz18298268521 article details 51220576 最近在做视频拼接的项目 里面用到了图像的单应性矩阵变换 在最后的图像重映射 由于目标图像的坐标是非整数的 所以需
  • pcie设备之驱动加载udev事件详解

    打卡打卡 udev 自内核2 6之后取代devfs udev配置 usr lib udev rules d etc udev rules d 如何触发udev事件 kobject uevent函数 pcie scan扫描函数 初始化pcie
  • python在linux系统下的编辑编译运行

    PYTHON在linux系统下的编辑编译 新建一个脚本文件 编写程序 运行程序 若安装了如spyder这样的编辑器 若是很简单的代码 新建一个脚本文件 gedit xxx py 新建py格式文件 编写程序 运行程序 在当前目录下 输入pyt
  • 【论文学习】FD-MonbileNet: IMPROVED MOBILENET WITH A FAST DOWNSAMPLING STRATEGY

    原文链接 https arxiv org abs 1802 03750 作者介绍了一种高效且在有限运算量限制上十分准确的网络 Fast Downsampling MobileNet FD MobileNet 其中心思想是在MobileNet
  • 中国钢铁产业产量分析与市场需求状况研究报告2022版

    中国钢铁产业产量分析与市场需求状况研究报告2022版 修订日期 2021年12月 搜索鸿晟信合研究院查看官网更多内容 第一章 产业转移的内涵及模式概述 1 1 产业转移的概念界定 1 1 1 产业转移的定义 1 1 2 产业转移的分类 1
  • mysql 连续打卡_MySQL查询连续打卡信息?

    最近多次看到用SQL查询连续打卡信息问题 自己也实践一波 抛开问题本身 也是对MySQL窗口函数和自定义变量用法的一种练习 01 建表 所用数据库为MySQL8 0 简单而不失一般性 建立一个仅有记录id 用户id 日期和打卡标记共4个字段
  • Python用户消费行为分析实例

    本文借鉴于知乎用户秦路的专栏https zhuanlan zhihu com p 27910430 这里只是自己理解基础上加以扩充和整理修改 丰富细节 由于手头用户消费数据的缺失我们这次采用专栏的数据进行实战 原数据在此 链接 https
  • vue判断input框不能为空_vue判断input输入内容全是空格的方法

    moduleinfo card count count phone 1 count 1 search count count phone 7 count 7 card des 支持文本 图片 视频 网站安全检测等多格式识别服务 提供色情 涉
  • 吃透MIPI接口,你必须了解它这三种PHY规范的区别

    MIPI接口及其物理层特性 MIPI 移动行业处理器接口 是专为移动设备 如智能手机 平板电脑 笔记本电脑和混合设备 设计的行业规范的标准定义 MIPI标准定义了三个通用的唯一物理 PHY 层 即MIPID PHY C PHY和M PHY

随机推荐

  • Stars in Your Window 【POJ - 2482】【线段树扫描线】

    题目链接 最开始的时候做成了贪心 离线求二维前缀和 然后树状数组维护二维偏序 这样的想法是存在BUG的 因为我是将每个点当成左下角 右下角 左上角 右上角来分别计算最大贡献的 但这样的做法却不是最贪心的 因为有可能该点并不作为矩形的四个顶角
  • [ESP][驱动]ST7701S RGB屏幕驱动

    ST7701SForESP ST7701S ESP系列驱动 基于ESP IDF5 0 ESP32S3编写 本库只负责SPI的配置 SPI设置屏幕信息两方面 由于RGB库和图形库的配置无法解耦 具体使用的图形库需要自行配置添加 本示例默认绑定
  • 全局异常处理Seata事务失效解决方案

    全局异常处理Seata事务失效解决方案 最近的项目用到了seata来管理全局事务 在进行测试的时候 发现当service A 调用Service B时 如果ServiceA报错 ServiceB能回滚 但是如果ServiceB报错 Serv
  • 区块链基础和底层技术

    大家好 这里是链客区块链技术问答社区 链客 有问必答 区块链基础 区块链的维基百科定义 区块链是一个基于比特币协议的不需要许可的分布式数据库 它维护了一个持续增长的不可篡改的数据记录列表 即使对于该数据库节点的运营者们也是如此 简而言之 区
  • 机器视觉图像分析领域,单目测量和双目测量有什么区别和用途?

    单目测量和双目测量在许多应用场景中都有广泛的应用 以下是一些典型的应用场景 单目测量应用场景 1 无人机定位与导航 单目摄像头可以用于无人机的视觉定位与导航 通过捕捉地面特征点 实现无人机的姿态估计和位置定位 2 机器人视觉导航 在轻量级的
  • CART回归树 GBDT XGB LGB

    CART回归树 GBDT XGB LGB 1 决策树 ID3 C4 5 CART 决策树算法原理 上 CART树 首先我们看看决策树算法的优点 1 简单直观 生成的决策树很直观 2 基本不需要预处理 不需要提前归一化 处理缺失值 3 使用决
  • Windows中使用Docker安装Redis

    1 拉取Redis 以管理员身份运行CMD 执行如下命令拉取Redis docker pull redis 2 在D盘新建目录D Net Program Net Docker Redis 在D盘新建D Net Program Net Doc
  • DataSphereStudio创建工作流时报错No FileSystem for scheme: hdfs问题

    DataSphereStudio创建工作流时报错No FileSystem for scheme hdfs问题 最近在用微众银行开发的dss工具 但是安装完之后 创建工作流报错No FileSystem for scheme hdfs 如果
  • java nio socket,Java----NioSocket的简单使用

    一 自己理解的概念 nioSocket 即new io socket 是一种同步非阻塞的I O 其使用buffer来缓存数据和channel来传输数据 使用select来分拣消息 其使用的ServerSocketChannel和Socket
  • 激光SLAM直接线性方法里程计运动模型及标定

    原创作者 W Tortoise 原创作者文章 https blog csdn net learning tortosie article details 107763626 1 里程计运动模型 1 1 两轮差分底盘的运动模型 1 2 三轮全
  • [转]换位思考多周期约束

    在开篇前先推荐两篇文档 一篇是altera的官方文档 Appling Multicycle Execptions in the TimeQuest Timing Analyzer 另一篇是riple兄很早之前推荐过的Multicycles
  • C# .NETCORE3.1 系列教程(一) 开发环境搭建与创建的一个Web项目

    TOC JXMaker NET CORE3 1系列教程 一 开发环境与创建Web项目 JXMaker NET CORE3 1系列教程 一 开发环境搭建与创建的一个Web项目 开发环境 教程中使用的开发环境为Win2010 VS 2019 安
  • BUCK型开关电源中的损耗与效率的计算

    在BUCK型开关电源中 如果没有损耗 那效率就是100 但这是不可能的 BUCK型开关电源中主要的损耗是导通损耗和交流开关损耗 导通损耗主要是指MOS管导通后的损耗和肖特基二极管导通的损耗 是指完全导通后的损耗 因为导通不是瞬间导通 有个从
  • 显示序号_合并单元格如何快速更新序号,最简单的3个函数解决你的问题

    在使用Excel表格的时候 我们经常会对数据填充一个序号 但是经常会碰到一个困难点的地方就是 当出现合并单元格的时候 自动填充序号就无法使用 今天我们就来学习3个最简单的 合并单元格中如何自动更新序号 一 案例说明 案例说明 如上图所示 我
  • Java中Path.of()使用报错

    Java中Path of方法的使用 起因 学习Java核心技术这本书的3 7 3章节时 对于书中代码的实现出现了一些问题 书中所呈现的是这样的语句 点击查看代码 Scanner in new Scanner Path of myfile S
  • Vue配置代理(解决跨域请求)

    app vue
  • 《区块链原理与技术》学习笔记(一)——区块链概念和区块链共识机制

    区块链原理与技术 专业课学习笔记 第一部分 一 概论 1 什么是区块链 2 区块链与比特币的关系 2 1 区块链是比特币的底层技术 是比特币的核心基础与架构 2 2 区块链不止是比特币 3 区块链的特点 3 1去中心化 3 2 透明性 3
  • 使用Python绘制6.1儿童节消消乐,素描图,词云图,字符画图,提取轮廓图及蒙太奇效果图

    这篇博客将介绍如何使用Python绘制6 1儿童节消消乐 素描图 词云图 字符画图 提取轮廓图及蒙太奇效果图 使用Python绘制端午dragboat消消乐 美轮美奂的界面效果 1 效果图 6 1儿童节快乐原始图VS素描图 素描进阶 正常
  • 苹果手机充电口接触不良怎么办_充电器接触不良怎么办 高手来教你几招-装修攻略...

    手机在充电过程中 会遇到有些充电器接触不良的情况 有些人会误以为是手机的原因 当我们手机充不上电时候 其实可以换一个充电器对手机进行充电 充电器接触不良可能是金属接触片太脏了 而导致的接触不良 可以拿干净的布和纸擦试一下 也可以拿少许棉花
  • STC32G 三电感电磁循迹小车

    文章目录 前言 效果 准备工作 增量式以及位置式PID 电机闭环 电磁采样 舵机闭环 合并 前言 准备18届的负压电磁 趁现在考试延期赶紧把车子给调了 现在速度就只能提到1 5m 再往上调就有点打滑了 只能等后面逐飞把负压电机的做出来了之后