PID控制器原理及模块化的源码

2023-05-16

文章目录

  • 摘要
  • PID原理概述
    • 比例环节
    • 积分环节
    • 微分环节
  • 串级双闭环PID控制
    • 外环
    • 内环
  • 模块化的源码
    • 主函数
    • 硬件初始化
    • PID复位
    • 定义私有变量
    • 计算串级PID
    • PID计算公式源码
    • LIMIT范围控制宏定义
    • 思维导图

摘要

小飞机由于飞手的技术和外部环境因素(刮风等)导致飞机飞行不稳定。

PID就是用来小飞机自动控制的作用(自稳作用)

PID原理概述

  • PID控制的原理是利用给定的目标值(期望值)实际测量值构成的偏差(误差),对被控对象进行的一种线性控制,控制系统通常由被控对象PID控制器两部分组成。

比例环节

  • 主要用于提高系统的动态响应速度和减少系统稳态误差即提高系统的控制精度
  • 成比例地反映控制系统的偏差信号,一旦产出误差,控制器立即产生控制作用,以减少偏差使实际值接近目标值。
  • 控制作用的强弱主要取决于比例系数的大小,比例系数过大,会使系统的动态特性变差,引起输出震荡,还可能导致闭环系统的不稳定;比例系数过小,被控对象会产生较大的静差,达不到预期控制的效果,所以在选择比例系数时要合理适当。

P o u t = K p e ( t ) P_{out} = K_pe(t) Pout=Kpe(t)

积分环节

  • 一个简单的比例控制会震荡,会在设定值的附近来回变化,因为系统无法消除多余的纠正,通过加上负的平均误差值,平均系统误差值就会渐渐减少,最终系统会在设定值稳定下来。
  • 积分环节会加速系统趋近设定值的过程,并且消除纯比例环节出现的稳态误差
  • 积分环节考虑过去误差,将误差值过去一段时间和乘以一个系数 K i K_i Ki,通常积分系数来表示积分作用的强弱,积分作用越强,消除偏差的过程会加快,但取值太大会导致系统趋于不稳定。

I o u t = K i ∫ 0 t e ( τ ) d τ I_{out} = K_i\int_0^te(τ)dτ Iout=Ki0te(τ)dτ

微分环节

  • 根据偏差信号的变化趋势对其进行修正,在偏差信号值变得太大之前,引入一个有效的修正信号,从而使系统的动作速度加快,减小调节时间。

D o u t = K d d d t e ( t ) D_{out} = K_d\frac{d}{dt}e(t) Dout=Kddtde(t)

串级双闭环PID控制

外环

  • 目标值:姿态角度
  • 测量值:实际姿态角度
  • PID输入: 目标值 - 测量值 (相减)
  • PID输出:提供使测量值趋近目标值的方法

内环

  • 标值:外环输出,即角速度目标值
  • 测量值:实际角速度
  • PID输入:目标值-测量值
  • PID输出:提供使测量值趋近目标值的方法(调整电机转速

文章目录

  • 摘要
  • PID原理概述
    • 比例环节
    • 积分环节
    • 微分环节
  • 串级双闭环PID控制
    • 外环
    • 内环
  • 模块化的源码
    • 主函数
    • 硬件初始化
    • PID复位
    • 定义私有变量
    • 计算串级PID
    • PID计算公式源码
    • LIMIT范围控制宏定义
    • 思维导图

模块化的源码

主函数

#include "include.h"
void main()
{
    WDT_A_hold(WDT_A_BASE);
    _DINT();  //禁止所有中断
    //@@@
    Hardware_Init();//硬件初始化  
    _EINT();//使能中断
    while (1)
    {
        PollingKernel();  
    }
}

硬件初始化

void Hardware_Init(void)
{
    System_Clock_Init();
    I2C_INit();
    Motor_Init();
    LEDInit();			//LED灯闪初始化
    MPU6050Init();    	//g_MPUManager初始化
    SPL06_Init();		//SPL06初始化
    NRF_Radio_Init(); 
   	if(HARDWARE_CHECK)  //硬件检测
    {
        g_LedManager.emLEDPower = PowerOn;
    }
    
    gcs_init();   		//地面站通信初始化
    
    //@@@
    PID_Init();    		//PID参数初始化   
    
    USART_Init(USCI_A_UART_CLOCKSOURCE_ACLK,115200);
    Timer_Init();
}

##PID参数初始化

/*************************************************************************************
  *函数名称:PID_Init
  *函数描述:初始化所有PID参数
  *输   入:void
  *输   出:void
  *返   回:void
  *备   注:null
  *
  *
*************************************************************************************/
//@@@
void PID_Init(void)
{
    //Roll滚转 Pitch俯仰 Yaw偏航
    //Kp
    //可以加f表示float这样用???
    PIDGroup[emPID_Roll_Spd].kp		= 2.0f;  
    PIDGroup[emPID_Pitch_Spd].kp	= 2.0f;
    PIDGroup[emPID_Yaw_Spd].kp 		= 7.0f;
    
    //Ki
    PIDGroup[emPID_Roll_Spd].ki 	= 0.05f;
    PIDGroup[emPID_Pitch_Spd].ki	= 0.05f;
    PIDGroup[emPID_Yaw_Spd].ki		= 0.0f;
        
   	//Kd
    PIDGroup[emPID_Roll_Spd].kd 	= 0.15f;
    PIDGroup[emPID_Pitch_Spd].kd	= 0.15f;
    PIDGroup[emPID_Yaw_Spd].kd		= 0.2f;
    
    //Pos  //Kp
    PIDGroup[emPID_Roll_Pos].kp 	= 3.5f;
    PIDGroup[emPID_Pitch_Pos].kp	= 3.5f;
    PIDGroup[emPID_Yaw_Pos].kp 		= 6.0f;
    
    //不建议修改以下参数   为啥???
    //Height  //Spd
    PIDGroup[emPID_Height_Spd].kp 	= 3.5f;
    PIDGroup[emPID_Height_Spd].ki	= 0.00f;
    PIDGroup[emPID_Height_Spd].kd	= 0.5f;
         
    PIDGroup[emPID_Height_Pos].kp			= 2.0f;
    PIDGroup[emPID_Height_Pos].desired		= 80;
    PIDGroup[emPID_Height_Pos].OutLimitHigh	= 50;
    PIDGroup[emPID_Height_Pos].OutLimitLow	= -50;
        
	//初始化UAV相关信息  ???
    //很熟悉???
    g_UAVinfo.UAV_Mode = Altitude_Hold;
}

  • 说明:
    • PID控制是一维的控制

##结构体数组声明

//extern引用
//在此处声明,在别处定义
extern  PIDInfo_t  PIDGroup[emNum_of_PID_List];

##定义数据结构

//定义PIDInfo_t结构体

typedef struct
{
    float kp;
    float ki;
    float kd;
    float out;
    float Err;
    float desired;
    float measured;
    
    float Err_LimitHigh;
    float Err_LimitLow;
    
    float offset;
    float prevError;
    float integ;
    
    float IntegLimitHigh;
    float IntegLimitLow;
    
    float OutLimitHigh;
    float OutLimitLow;
    
}PIDInfo_t; //结构体名
//定义emPID_List_t枚举类型

typedef enum
{
	emPID_Pitch_Spd	=0;
	emPID_Roll_Spd,
	emPID_Yaw_Spd,
	
	emPID_Pitch_Pos,
	emPID_Roll_Pos,
	emPID_Yaw_Pos,
	
	emPID_Height_Spd,
	emPID_Height_Pos,
	
	emPID_AUX1,    //缺省变量,占位以后使用
	emPID_AUX2,
	emPID_AUX3,
	emPID_AUX4,
	emPID_AUX5,
	
	emNum_of_PID_List
	
}emPID_List_t;

##死循环部分


void PollingKernel()
{
	if(Thread_3MS)
	{
		Thread_3MS = false;
		GetMPU6050Data();
		
		//@@@
		FlightPidControl(0.003f);   //PID控制
		
		switch(g_UAVinfo.UAV_Mode)
		{
			//.....此部分代码省略
		}
       // .....此部分代码省略
	}
   // .....此部分代码省略
}

##PID控制函数

/*************************************************************************************
  *函数名称:FlightPidControl
  *函数描述:PID控制
  *输   入:float dt时间变量
  *输   出:void
  *返   回:void
  *备   注:null
  *
  *
*************************************************************************************/

void FlightPidControl(float dt)
{
	volatile static uint8_t status = WAITING_1;  //状态变量
	
	switch(status)
	{
		case WAITING_1:
			if(g_FMUf(g.unlock)  //等待解锁
			{
				status = READY_11;
			}
			break;
		case READY_11:
			ResetPID(); 	//批量复位PID
			g_Attitude.yaw = 0;
			PIDGroup[emPID_Yaw_Pos].desired = 0;
			PIDGroup[emPID_Yaw_Pos].measured = 0;
			status = PROCESS_31;
			break;
		case PROCESS_31:
			//内环测量值(角速度)  单位:角度/秒
			PIDGroup[emPID_Roll_Spd].measured 	= g.MPUManager.gyroX * Gyro_G;
			PIDGroup[emPID_Pitch_Spd].measured 	= g.MPUManager.gyroY * Gyro_G;
			PIDGroup[emPID_Yaw_Spd].measured 	= g.MPUManager.gyroZ * Gyro_G;
		
			//外环测量值(角度)    单位:角度
			PIDGroup[emPID_Pitch_Pos].measured 	= g_Attitude.roll;
			PIDGroup[emPID_Yaw_Pos].measured 	= g_Attitude.pitch;
			PIDGroup[emPID_Roll_Pos].measured 	= g_Attitude.yaw;
		
			//调节电机参数
            //X轴
			ClacCassadePID(&PIDGroup[emPID_Roll_Spd],&[PIDGroup[emPID_Roll_Pos],dt);
            //Y轴                                           
			ClacCassadePID(&PIDGroup[emPID_Pitch_Spd],&[PIDGroup[emPID_Pitch_Pos],dt);
            //Z轴                                            
			ClacCassadePID(&PIDGroup[emPID_Yaw_Spd],&[PIDGroup[emPID_Yaw_Pos],dt);  
			break;
		case EXIT_255; //退出控制
			ResetPID();
			status = WAITING_1;  //返回等待解锁
			break;
		default:
			status = EXIT_255;
			break;	
	}
}

PID复位

/*************************************************************************************
  *函数名称:ResetPID
  *函数描述:复位PID参数中经过计算得来的结果
  *输   入:void
  *输   出:void
  *返   回:void
  *备   注:null
  *
  *
*************************************************************************************/

void ResetPID(void)
{
    //在里面定义i也可以吗???
    for(int i=0;i<emNum_of_PID_List;i++)
    {
        PIDGroup[i].integ 		= 0;
        PIDGroup[i].prevError 	= 0;
        PIDGroup[i].out			= 0;
        PIDGroup[i].offset		= 0;
	}
    
    PIDGroup[emPID_Height_Pos].desired = 80;
}

定义私有变量

//私有变量区

const float  M_PI	= 3.1415926535; 
const float  RtA	= 57.2957795f;    //(360/2π) 弧度化为角度
const float  AtR	= 0.0174532925f;  //(2π/360) 角度化弧度

//@@@
const float  Gyro_G	= 0.03051756f * 2;  //(4000/65536)MPU6050精度

const float  Gyro_Gr= 0.0005326f * 2//Gyro_G换算成弧度
const float  PI_2	= 1.570796f;

计算串级PID

/*************************************************************************************
  *函数名称:ClacCascadePID
  *函数描述:计算串级PID
  *输   入:PIDInfo_t * pidRate ,PID速度环
  *		   PIDInfo_t * pidAngE ,PID角度环
  *		   const float dt ,单位运行时间
  *输   出:void
  *返   回:void
  *备   注:null
  *
  *
*************************************************************************************/

void ClacCascadePID(PIDInfo_t * pidRate, PIDInfo_t * pidAngE, const float dt)
{
    UpdatePID(pidAngE,dt);   //先计算外环
    
    pidRate->desired = pidAngE->out;  //将外环结果传递给内环
    
    UpdatePID(pidRate,dt);   //计算内环
}

PID计算公式源码

/*************************************************************************************
  *函数名称:UpdatePID
  *函数描述:计算PID相关值
  *输   入:PIDInfo_t * pid ,要计算的PID结构体指针
  *		   float dt	,单位运行时间
  *输   出:void
  *返   回:void
  *备   注:null
  *
  *
*************************************************************************************/

void UpdatePID(PIDInfo_t * pid, const float dt)
{
    float deriv;
    //(误差=目标值-测量值)
    pid->Err = pid->desired - pid->measured + pid->offset;
    
    //控制误差范围在[Err_LimitLow , Err_LimitHigh]之间
    if(pid->Err_LimitHigh != 0 && pid->Err_LimitLow != 0)
    {
        pid->Err = LIMIT(pid->Err, pid->Err_LimitLow, pid->Err_LimitHigh);
	}
    
    pid->Integ += pid->Err * dt;  //积分运算
    
     if(pid->IntegLimitHigh != 0 && pid->IntegLimitLow != 0)
    {
        pid->Integ = LIMIT(pid->Integ, pid->IntegLimitLow, pid->IntegLimitHigh);
	}
    
    deriv = (pid->Err - pid->prevError) / dt;  //微分运算
    
    //PID输出
    pid->out = pid->kp * pid->Err + pid->ki * pid->Integ + pid->kd * deriv;   
    
    if(pid->OutLimitHigh != 0 && pid->OutLimitLow != 0)
    {
        pid->out = LIMIT(pid->out, pid->OutLimitLow, pid->OutLimitHigh);
	}
    
    pid->prevError = pid->err; //供下次调用本次PID
}

LIMIT范围控制宏定义

//宏定义区

#define LIMIT(x,min,max)  ((x)<(min)?(min):((x)>(max)?(max):(x)))

思维导图

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

PID控制器原理及模块化的源码 的相关文章

  • PI闭环的FPGA实现

    PID闭环的FPGA实现 1 原理分析 最近小张同学在做项目的时候发现PI闭环的FPGA学习资料很少 秉持着 既然没有轮子 那么自己就造一个的原则 于是乎自己写了个PI的Verilog程序 FPGA中实现PI闭环与DSP STM32 arm
  • 详解汽轮机的TSI系统

    汽轮机安全监视系统 TSI 是一种集保护和检测功能于一身的永久监视系统 是大型旋转机械必不可少的保护系统 TSI可以对机组在起动 运行过程中的一些重要参数能可靠地进行监视和储存 它不仅能指示机组运行状态 记录输出信号 实现数值越限报警 出现
  • 基于MATLAB的模糊pi控制器的设计

    基于MATLAB的模糊pi控制器的设计 模糊规则隶属函数的建立 a newfis fuzzypid 添加第一个输入变量e a addvar a input e 1 1 a addmf a input 1 N zmf 1 1 3 a addm
  • 深入浅出PID控制算法(二)————PID算法离散化和增量式PID算法原理及Matlab实现

    引言 上篇介绍了连续系统的PID算法 但是计算机控制是一种采样控制 他只能根据采样时刻的偏差来计算控制量 因此计算机控制系统中 必须对公式进行离散化 具体就是用求和代替积分 用向后差分来代替微分 使模拟PID离散化为数字形式的差分方程 准备
  • # Arduino小车PID调速——整定参数初试水

    Arduino小车PID调速 整定参数初试水 在实现了小车较为可靠的测速基础上 便可以正式开展PID调速实验了 本文是基于使用Arduino平台上由Brett Beauregard大神写的PID库进行参数整定的 侧重于在对PID算法有基本了
  • Android : 通过pid获取app包名

    方法一 这个方法用在app主线程的activity或service里 因为要有context获取am private String getAppName int pid String pkgName ActivityManager am A
  • 专家PID

    专家PID 专家控制 专家控制是模拟人类专家控制的方式 它具有大量的专门知识和经验 和专家控制一样不需要知道对象的模型的情况下 对系统进行控制 专家控制的基本结构 和人类专家控制一样 知识库越是丰富 推理机越是精确 控制效果也就越好 不同的
  • 进程组必须有一个正在运行的领导进程吗?

    在类 Unix 操作系统中 如果一个进程 pid和它的pgid相等 则该进程是进程组的领导者 但是 如果进程领导者已经退出 并且同组中的其他进程仍在运行 那么谁是继任的领导者进程 没有继任领导者 一旦流程组领导者退出 该组就失去了领导权 没
  • 有人可以解释一下 Erlang 中 Pid(进程标识符)的结构吗?

    有人能解释一下 Erlang 中 Pid 的结构吗 Pids 看起来像这样
  • 如何迭代 PCB 以显示 Linux 内核模块中的信息?

    我想编写一个 Linux 内核模块 它可以显示所有正在运行的进程的 PID 我有以下代码 procInfo c My Kernel Module for process info include
  • 识别 DNS​​ 请求的 PID 源 (Windows XP)

    我希望确定发出 DNS 请求的进程 查看查询给了我一个线索 但并不能帮助我确定确切的过程 我可以在 Wireshark 中看到本地端口号 但请求太短暂 无法被 TCPView 接收 有没有可以捕获 DNS 请求和 PID 的日志记录工具 过
  • 使用批处理查找java PID

    我需要从 Windows 批处理控制台知道 java 进程 PID echo off set p CD FOR F tokens 1 A IN JAVA HOME bin jps exe v find p DO SET str A echo
  • 检查给定 pid 的进程是否存在

    给定 Linux 进程的 pid 我想从 C 程序检查该进程是否仍在运行 Issue a kill 2 http linux die net man 2 kill系统调用0作为信号 如果调用成功 则说明存在该pid的进程 如果呼叫失败并且e
  • 有没有办法链接linux的线程TID和pthread_t“线程ID”

    在 Linux 上 线程由pthread t或 TID 我正在寻找这两种线程 id 之间的桥梁 given a pthread t我可以得到它吗TID 显然 https stackoverflow com questions 558469
  • 如何在Windows中通过端口查找PID并使用java杀死找到的任务

    我需要通过进程端口在java代码中杀死进程 我可以在 cmd 中手动执行此操作 例如 C gt netstat a n o findstr 6543 TCP 0 0 0 0 6543 0 0 0 0 0 LISTENING 1145 TCP
  • mysql.server 启动时出现 PID 错误?

    我刚刚尝试使用自制程序 在 Mac OS X 10 6 上 安装 MySQL 但我在第一个障碍时遇到了问题 当尝试手动启动服务器 mysql server start 时 出现以下错误 ERROR Manager of pid file q
  • Process.start() 启动的进程返回错误的进程 ID?

    我正在使用以下代码启动可执行文件 Process proc new Process proc StartInfo FileName executablePath proc Start proc WaitForInputIdle 在这次通话之
  • Mysql 连接到服务器:用户 root@localhost 的访问被拒绝

    edit9 是否有可能我只是缺少文件夹的一些权限 我真的非常非常感谢更多的建议 edit3 由于这篇文章没有得到足够的回复 而且这绝对是至关重要的 我尽快完成这件事 我重建了我的帖子以显示我认为到目前为止我已经扣除的内容 注意 通过许多不同
  • 如何在bash中列出所有后台pid

    要么我无法正确表达我的搜索 要么答案不容易找到 但我正在尝试找出如何列出我的所有后台任务 PID 例如 到目前为止 我发现要列出我们使用的最后一个 PID 但现在我想列出之前任务的 PID 如果存在 但我找不到如何做到这一点 最终我想列出我
  • docker 容器无法启动,因为现有的 pid 文件

    当我启动 docker 容器时 它会失败 因为现有的 pid 文件 root newhope sergio docker logs sharp shockley httpd pid 1 already running httpd pid 1

随机推荐

  • 近期尝试UR5和PhantomOmni的联动仿真出现的问题

    近期尝试UR5和PhantomOmni的联动仿真出现的问题 最近在Github找到了几个代码 xff0c 虽然代码是好几年前的 xff0c 但经过尝试编译后有部分可以用 xff0c 有部分有问题 xff0c 现在拿一个来解释一下几年前的RO
  • 解决Linux系统不能上网问题

    解决Linux系统不能上网问题 相信很多Linux的萌新们 xff0c 初次安装LInux 系统后会为不能上网而烦恼 这一问题表现为 xff1a 能连到wifi但就是上不了网 xff01 xff01 xff01 导致这一问题的原因是 xff
  • C语言——蔡勒(Zeller)公式的使用

    C语言 蔡勒公式的使用 蔡勒公式简介 xff1a 蔡勒 xff08 Zeller xff09 公式 xff0c 是一个计算星期的公式 xff0c 随便给一个日期 xff0c 就能用这个公式推算出是星期几 计算公式 xff1a 核心公式 xf
  • 基于单片机定时智能窗帘控制系统设计-毕业资料

    资料下载地址 1022 xff08 百度网盘 xff09 xff1a 点击下载 智能窗户 AT89S52 1602显示 步进电机转动模拟开窗关窗 xff08 1 xff09 手动控制 xff1a 该功能是根据用户的需求通过按键进行窗帘的开关
  • windows10下安装ubuntu子系统

    windows10下安装ubuntu子系统 在win10上使用Ubuntu除了使用虚拟机外 xff0c 还有一种官方支持的Linux子系统模式 子系统上的流畅度比虚拟机高出了不知多少 xff01 经过多次尝试才成功配置 废话不多说 xff0
  • Windows10系统下的WSL+Ubuntu图形桌面配置

    Windows10系统下的WSL 43 Ubuntu图形桌面配置 参考 xff1a windows10下安装Ubuntu子系统 Windows下安装VcXsrv WSL Ubuntu下安装xfce desktop span class to
  • C++:什么是STL?

    什么是STL xff1f 1 STL概论1 1 STL基本概念1 2 STL六大组件简介1 3 STL优点 2 STL三大组件2 1 容器2 2 算法2 3 迭代器2 3 案例 1 STL概论 长久以来 xff0c 软件界一直希望建立一种可
  • makefile中.PHONY的作用是什么?

    makefile中 PHONY的作用是什么 xff1f 初学makefile的时候 xff0c 有一个关键字 PHONY 搞不懂 xff0c 在请教过同学之后豁然开朗 xff0c 遂写下经验望帮助更多的同学能够理解 在某度可以搜到phony
  • TCP和UDP的区别

    TCP和UDP的区别 1 TCP 是什么2 UDP 是什么3 TCP 和 UDP 的不同 1 TCP 是什么 TCP 的全称是Transmission Control Protocol xff0c 传输控制协议 它能够帮助你确定计算机连接到
  • 操作系统死锁 四个必要条件

    操作系统死锁 四个必要条件 1 死锁 xff1a 如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件 xff0c 那么该组进程是死锁的 2 产生死锁的原因 xff1a xff08 1 xff09 竞争不可抢占性资源 x
  • C++智能指针总结(面试常问)

    C 43 43 智能指针总结 xff08 面试常问 xff09 1 智能指针的实现原理2 C 43 43 11四种智能指针总结2 1 auto ptr xff1a 2 2 unique ptr 2 3 share ptr 2 4 weak
  • C++可重入函数和不可重入函数

    C 43 43 可重入函数和不可重入函数 可重入函数是指能够被多个线程 同时 调用的函数 xff0c 并且能保证函数结果正确不必担心数据错误的函数 不可重入函数是指不能运行在多任务环境下 xff0c 除非能保证互斥的函数 由于使用了未受保护
  • STM32单片机中WIFI模块数据传输问题(float->u32->u8/u8->u32->float)

    STM32单片机中WIFI模块数据传输问题 xff08 float gt u32 gt u8 u8 gt u32 gt float xff09 最近在做毕业设计 xff0c 在做wifi数据传输与接收时 xff0c 涉及到了STM32单片机
  • Windows10忘记用户密码?怎么打开电脑?

    Windows10忘记用户密码 xff1f 怎么打开电脑 xff1f 首先在输入密码的登录界面连续敲5次shift按键进入cmd命令行 输入net user查看用户 现在是自己创建的用户忘记密码 xff08 我的是Sunrise用户 xff
  • java --向上转型和向下转型

    一 简述 Java 转型主要是用在继承和接口实现的场景 xff0c Java 转型可分为向上转型和向下转型 xff0c 区别如下 xff1a 向上转型 xff1a 通过子类对象实例化父类对象 xff0c 这属于自动转换 向下转型 xff1a
  • docker

    docker 背景 环境配置的难题 软件开发最大的麻烦事之一 就是环境配置 用户计算机的环境都不相同如果某些老旧的模块与当前环境不兼容 那就麻烦了环境配置如此麻烦 换一台机器 就要重来一次 旷日费时能不能从根本上解决问题 软件可以带环境安装
  • 6.2 能控性

    能控性和能观性是线性系统学习中非常重要的部分 xff0c 它们是研究控制问题和滤波问题所必需的 今儿先来说能控性 一 能控性是啥 xff1f 定义6 1 若对任意初始状态 x 0 61
  • 计算机网络精选20道题

    1 现有一个公司需要创建内部的网络 xff0c 该公司包括工程技术部 市场部 财务部和办公室4个部门 xff0c 每个部门约有20 xff5e 30台计算机 试问 xff1a xff08 1 xff09 若要将几个部门从网络上进行分开 如果
  • “四旋翼”无人机“X模式”飞行原理

    文章目录 摘要飞行器分类四旋翼 X模式 飞行原理四旋翼 十模式 飞行原理参考资料 摘要 简单的介绍了四旋翼无人机的两种模式的飞行原理 飞行器分类
  • PID控制器原理及模块化的源码

    文章目录 摘要PID原理概述比例环节积分环节微分环节 串级双闭环PID控制外环内环 模块化的源码主函数硬件初始化PID复位定义私有变量计算串级PIDPID计算公式源码LIMIT范围控制宏定义思维导图 摘要 小飞机由于飞手的技术和外部环境因素