换个角度聊聊PID吧,很干。

2023-05-16

01


前言

大家好,前面发了几篇关于PID的文章:点击图片即可阅读。

f9ccf4d9add25aa3dd9ff486eeb5b001.jpeg

教你10分钟完成智能小车的PID调速。

87d495472d648e223e6050f89eff8204.jpeg

快速调试PID参数的3种方法。

02


自动控制系统

在直流有刷电机的基础驱动中,如果电机负载不变,我们只要设置固定的占空比(电压),电机的速度就会稳定在目标范围。

然而,在实际的应用中,负载可能会发生变化,此时如果还是输出固定的电压,电机的速度就偏离目标范围了,为了解决这个问题,我们需要引入自动控制系统中的闭环控制。接下来我们开始学习自动控制系统的内容。

概念:用自动控制装置,对关键参数进行自动控制,使它在受到外界干扰而偏离正常状态时,能够被自动地调节回到目标范围内。

应用场景:电水壶保温系统 、大棚温控系统、水位控制系统,等等。

分类:自动控制系统分为开环控制系统和闭环控制系统 。

① 开环控制系统

在开环控制系统中,系统输出只受输入的控制,没有反馈回路,控制精度和抑制干扰的特性都比较差。

电风扇风力控制系统就是一个开环控制的系统,我们设置好目标风力之后,控制电路就输出相应的电压(假设是电压控制),此时电机的扇叶转速就被控制在目标范围了。

理想状态下,风扇的输出风力确实可以稳定在目标值附近,然而,在实际的使用中,电机会逐渐老化,扇叶上的灰尘也会让负载增大,此时我们所设定目标风力和实际风力可能就存在偏差了。

25b3d348abf1b23e5b29d42aa0915a11.png

② 闭环控制系统

在闭环控制系统中,引入了反馈回路,利用输出(实际值)和输入(目标值)的偏差,对系统进行控制,避免偏离预定目标。

大棚温控系统就是一个闭环控制的系统,我们设置好目标温度之后,温度传感器会采集棚内的实际温度,然后将目标温度和实际温度进行偏差的计算,计算后的结果输入到控制电路中,控制电路进一步控制温控设备进行升温和降温,此时棚内的实际温度就被控制在目标范围了。

当实际温度因外部影响偏离目标值时,温度传感器(反馈电路)就能及时的反馈偏差,让系统自动调节温控设备,使得实际温度逐渐回到目标范围。

dab9d31ecbcf53fc2148775e0f771be2.png

03


PID 算法

match

‍ ‍

PID 算法是闭环控制系统中常用的算法,PID 分别是 Proportion(比例)、Integral(积分)、Differential(微分)的首字母缩写。它是一种结合比例、积分和微分三个环节于一体的闭环控制算法。

9450a58027be1a88deb5ac9827e0dd41.png

我们将输入目标值和实际输出值进行偏差的计算,然后把计算结果输入到 PID控制算法中,经过比例、积分和微分三个环节的运算,运算后的输出作用于执行器,从而让系统的实际值逐渐靠近目标值。

以大棚温控系统为例,来理解 PID 算法中三个环节的作用。

比例环节( Proportion)

比例环节可以成比例地反应控制系统的偏差信号,即输出与输入偏差成正比,可以用来减小系统的偏差。公式如下:

3104d17ada144f35e9456f119eb29c49.png

  • u —输出

  • Kp—比例系数

  • e —偏差

我们可以通过大棚温控去理解PID公式。例如需要调节棚内温度为 30℃,而实际温度为 10℃,此时的偏差 e=20,由比例环节的公式可知

当 e 确定时,Kp 越大则输出u 越大,也就是温控系统的调节力度越大,这样就可以更快地达到目标温度;而当 Kp 确定时,偏差 e 越大则输出 u 越大。

由此可见,在比例环节中,比例系数 Kp 和偏差 e 越大则系统消除偏差的时间越短

3baffbdced39d9452b8e552b40349dcd.png

当 Kp 的值越大时,其对应的橙色曲线达到目标值的时间就越短,与此同时,橙色曲线出现了一定幅度的超调和振荡,这会使得系统的稳定性下降。

所以我们在设置比例系数的时候,并不是越大越好,而是要兼顾消除偏差的时间以及整个系统的稳定性。

在实际的应用中,如果仅有比例环节的控制,可能会给系统带来一个问题:静态误差。

静态误差是指系统控制过程趋于稳定时,目标值与实测值之间的偏差。

如果我们在需要调节棚内温度为 30℃,而实际温度为 25℃,此时偏差 e=5,Kp 为固定值,那么此时的输出可以让大棚在半个小时之内升温 5℃,而外部的温差可以让大棚在半个小时之内降温 5℃,也就是说,输出 u 的作用刚好被外部影响抵消了,这就使得偏差会一直存在。

cd237a8807ebef565dcb613c29b8a1d7.png

我们可以通过增大 Kp 来增大输出,以此消除偏差。在实际应用中,此方法的局限性很大,因为我们不能确定偏差的大小,它是在实时变化的,如果我们把 Kp 设置得太大,就会引入超调和振荡,让整个系统的稳定性变差。因此,为了消除静态误差,我们引入了积分环节。

积分环节(Integral)

积分环节可以对偏差 e 进行积分,只要存在偏差,积分环节就会不断起作用,主要用于消除静态误差,提高系统的无差度。

引入积分环节后,比例+积分环节的公式如下:

b26299754a06da84882d3d99ef7c9e14.png

  • u —输出

  • e — 偏差

  • ∑e—累计偏差

  • Kp— 比例系数

  • Ki—积分系数

通过以大棚温控分析可以知道,如果温控系统的比例环节作用被抵消,存在静态误差 5℃,此时偏差存在,积分环节会一直累计偏差,以此增大输出,从而消除静态误差。

从上述公式中可以得知,当积分系数 Ki 或者累计偏差越大时,输出就越大,系统消除静态误差的时间就越短。

3c18921fefa5b324f48485fba96b3855.png

当 Ki 的值越大时,其对应的橙色曲线达到目标值的时间就越短,与此同时,橙色曲线出现了一定幅度的超调和振荡,这会使得系统的稳定性下降

因此,我们在设置积分系数的时候,并不是越大越好,而是要兼顾消除静态误差的时间以及整个系统的稳定性。

只要系统还存在偏差,积分环节就会不断地累计偏差。当系统偏差为 0的时候,说明已经达到目标值,此时的累计偏差不再变化,但是积分环节依旧在发挥作用(此时往往作用最大),这就很容易产生超调的现象了。

因此,我们需要引入微分环节,提前减弱输出,抑制超调的发生。

微分环节(Differential)

微分环节可以反应偏差量的变化趋势,根据偏差的变化量提前作出相应控制,减小超调,克服振荡。引入微分环节后,比例+积分+微分环节的公式如下:

4809eec55da4d01c4c80afbfcd4cf905.png

9c1be337aed8b081eb40bd773f7cf1b4.png

我们继续使用大棚温控去分析微分环节的作用。如果温控系统目标温度为 30℃,在上午八点的时候存在偏差15℃,经过一段时间的调节,到了上午九点,此时偏差已经缩小到5℃,偏差的变化量= 九点的偏差(第 k 次)-八点的偏差(第 k-1 次)= -10,结合上述公式可知,此时微分环节会削弱比例和积分环节的作用,减小输出以抑制超调。

最终得到了一个 PID算法公式:

b5d3e3a4365c2e3f1dcdc8a1c2b93d1a.png

这个公式是 PID 离散公式之一,除了离散公式之外,PID 还有连续的公式,但是因为连续的公式不利于机器计算,我们一般不研究。每一个系统的 PID 系数并不是通用的,这需要根据实际的情况去设置。

04


PID 算法离散公式

位置式 PID 公式

89632cefce5390f527f8fd99cea3c48e.png

d22af098774252834c71200fa14c266d.png

这个公式的计算需要全部控制量参与,它的每一次输出都和过去的状态有关。

增量式 PID 公式

通过位置式的 PID 公式,可推导出增量式 PID 公式

将 k = k-1 代入位置式 PID 公式

5b874eb5db80dbef7bd9f8153d310695.png

bc427561cb2f743d21c3f63567017e8f.png

增量式 PID 可以看出,增量式 PID 的计算并不需要一直累计偏差,它的输出与近三次的偏差有很大关系。

注意:增量式 PID 公式输出的只是控制量的增量。假设电机实际转速为 50RPM,现在我们要让它加速到 60RPM,如果采用的是位置式 PID,系统将直接输出 60RPM 对应的控制量(占空比);

如果采用的是增量式 PID,系统将输出提速 10RPM对应的控制量(占空比),此时我们还需要加上上次(50RPM)的输出。

两个 PID 公式的不同点

194683e602647a679b8e2f5ead72734b.png

两种 PID 公式的优缺点

① 位置式:

优点:位置式 PID 是一种非递推式算法,带有积分作用,适用于不带积分部件的对象。

缺点:全量计算,计算错误影响很大;需要对偏差进行累加,运算量大。

② 增量式:

优点:只输出增量,计算错误影响小;不需要累计偏差,运算量少,实时性相对较好。

缺点:积分截断效应大,有稳态误差。

05


积分饱和问题

在位置式 PID 中,如果系统长时间无法达到目标值,累计偏差(积分)就会变得很大,此时系统的响应就很慢了。

例如某个电机能达到的最大速度为 300RPM,而我们设置了目标速度为 350RPM,这明显是一个不合理的目

016740fb0df6105c6b800770456e2a76.png

由于系统长时间无法达到目标值,累计偏差(积分)会变得越来越大,逐渐达到深度饱和的状态,此时我们再设置一个合理范围的目标速度(例如 200RPM),系统就没有办法在短时间内响应了。

为了避免位置式 PID 中可能出现的积分饱和问题,可以考虑下面解决方法:

① 优化 PID 曲线,系统越快达到目标值,累计的偏差就越小;

② 限制目标值调节范围,规避可以预见的偏差;

③ 进行积分限幅,在调整好 PID 系数之后,根据实际系统来选择限幅范围。

06


PID算法代码实现

控制量相关的结构体

我们知道PID 的离散化公式后,实现 PID 算法的代码是非常简单。

f52171c3349701d4143489b8a3d2640b.png

定义结构体来管理这些控制量

typedef struct
{
 __IO float SetPoint; /* 目标值 */
 __IO float ActualValue; /* 期望输出值 */
 __IO float SumError; /* 偏差累计 */
 __IO float Proportion; /* 比例系数 P */
 __IO float Integral; /* 积分系数 I */
 __IO float Derivative; /* 微分系数 D */
 __IO float Error; /* Error[1],第 k 次偏差 */
 __IO float LastError; /* Error[-1],第 k-1 次偏差 */
 __IO float PrevError; /* Error[-2],第 k-2 次偏差 */
} PID_TypeDef;

PID 算法代码

位置式 PID 代码

/*
* @brief pid 闭环控制
* @param *PID:PID 结构体变量地址
* @param Feedback_value:当前实际值
* @retval 期望输出值
*/
int32_t own_pid_ctrl(PID_TypeDef *PID,float Feedback_value)
{
    PID->Error = (float)(PID->SetPoint - Feedback_value); /* 计算偏差 */
    PID->SumError += PID->Error; /* 累计偏差 */
    PID->ActualValue = (PID->Proportion * PID->Error) /* 比例环节 */
    + (PID->Integral * PID->SumError) /* 积分环节 */
    + (PID->Derivative * (PID->Error - PID->LastError)); /* 微分环节 */
    PID->LastError = PID->Error; /* 存储偏差,用于下次计算 */
    return ((int32_t)(PID->ActualValue)); /* 返回计算后输出的数值 */
}

own_pid_ctrl 函数用来进行位置式 PID 的控制,该函数的 2 个形参:PID 传入 PID控制量相关的结构体地址;Feedback_value 传入当前系统的实际值,用于计算偏差。

在函数中,我们先计算本次偏差 Error,然后把偏差累计,存入 SumError 成员当中,接着根据位置式的公式进行三个环节的计算,计算后的期望输出存入 ActualValue 成员当中,然后存储本次偏差,最后返回期望输出值。

增量式 PID 代码

/*
* @brief pid 闭环控制
* @param *PID:PID 结构体变量地址
* @param Feedback_value:当前实际值
* @retval 期望输出值
*/
int32_t own_pid_ctrl(PID_TypeDef *PID,float Feedback_value)
{
    PID->Error = (float)(PID->SetPoint - Feedback_value); /* 计算偏差 */
    PID->ActualValue += 
/* 比例环节 */
    (PID->Proportion * (PID->Error - PID->LastError)) 
/* 积分环节 */
    + (PID->Integral * PID->Error) 
/* 微分环节 */
    + (PID->Derivative * (PID->Error - 2 * PID->LastError + PID->PrevError)); 
    PID->PrevError = PID->LastError; /* 存储偏差,用于下次计算 */
    PID->LastError = PID->Error;
return ((int32_t)(PID->ActualValue)); /* 返回计算后输出的数值 */
}

增量式 PID 的代码实现和位置式是非常类似的,所以我们在实际的代码实现中,可以通过一个宏定义来切换这两种不同的算法,值得注意的是,增量式 PID 输出的是调节量,所以计算期望输出值 ActualValue 的时候是自增运算,这一点和位置式 PID 是不一样的。

-END-


往期推荐:点击图片即可跳转阅读

5fec8c71532f19dc214e0336e0834d49.jpeg

深入理解PID的微分、积分电路

271ebcba693a7c33d4fc250cdfe4a6d0.jpeg

平衡小车PID,就该这么调!!!

5c21109429bf2cb4ad5b42287c111973.jpeg

增量式PID是什么?不知道你就落伍了

68683ae938b00aafededd712c03763fc.jpeg

PID算法搞不懂?看这篇文章。

8106ef39d21dcf0180ff846824aed3d7.jpeg

啥是PIDPID可以吃吗?

f3d79c5737d84cb0f3c3e971d7050d8c.jpeg

到底什么是串级PID

4d923795f204492897428edf66210e17.jpeg

PID系统稳定性与零极点的关系

677189c06e4725f1a58fbca783ee38da.jpeg

万能算法PID趣味总结

178a772dbca358ef806e1cbccdf0b118.jpeg

增量式PID是什么?不知道你就落伍了

8e430862ce8a798cfbabbc281c847ace.jpeg

再聊PID

52a94531e80a711480289e8b55b054fe.jpeg

PID到底是个啥?来给你讲个故事

fb5226bd83748c84d07bcbe9b741bf4d.jpeg

电子设计竞赛(4)-常用的两种PID算法

1e15bc54db7145887d41b487342f64a3.jpeg

电子设计竞赛(三)-SPWM与PID

4bf58a0d36733f3abf0d9aac3b36c890.jpeg

平衡小车PID,就该这么调!!!

046d9c34c9a087c569213396640dc433.jpeg

再论PIDPID其实很简单。。。

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

换个角度聊聊PID吧,很干。 的相关文章

  • setns对当前进程无效问题的排查(getpid获取值不变)

    1 复现流程及lxc的处理 demo1程序与执行结果如下 此时在容器内部看不到执行的程序 int main int ret fd pid printf father pid old d n getpid fd open dev ns O R
  • 工程实践---ZN法整定PID

    工程实践 ZN法整定PID 知乎 zhihu com
  • PID控制原理解释

    PID控制原理解释 文章目录 PID控制原理解释 0 前言 1 控制原理图解释 2 算法分析 3 PID数学模型解释 4 调参技巧说明 0 前言 参考网址 http blog gkong com liaochangchu 117560 as
  • 详解汽轮机的TSI系统

    汽轮机安全监视系统 TSI 是一种集保护和检测功能于一身的永久监视系统 是大型旋转机械必不可少的保护系统 TSI可以对机组在起动 运行过程中的一些重要参数能可靠地进行监视和储存 它不仅能指示机组运行状态 记录输出信号 实现数值越限报警 出现
  • PID算法应用于室内温度控制的C语言实现

    我最近在学习PID算法 对此很感兴趣 所以与大伙分享下 有不足的地方欢迎指出 非常谢谢 PID算法的基本内容本篇博客就不做阐述了 网上有很多资料 文章的主题是用C语言实现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调参 蓝牙遥控这五个部分向大家讲解平衡小车的制作过程
  • 【STM32CubeMX】位置式PID调节控制输出电压(超详解)

    本文将借助STM32CubeMX来配置ADC DMA DAC USART 并利用PID位置式算法实现对输出电压进行AD采集通过PID算法调节DAC 获取到我们想要的电压值 讲解的主要知识 何为PID以及为何需要PID STM32CubeMX
  • 专家PID

    专家PID 专家控制 专家控制是模拟人类专家控制的方式 它具有大量的专门知识和经验 和专家控制一样不需要知道对象的模型的情况下 对系统进行控制 专家控制的基本结构 和人类专家控制一样 知识库越是丰富 推理机越是精确 控制效果也就越好 不同的
  • 三个闭环负反馈PID调节系统:电流环、速度环和位置环的关系

    三个闭环负反馈PID调节系统 电流环 速度环和位置环的关系 伺服电机为了达到生产的精准控制 电机一般采用三环控制 这主要是为了使伺服电机系统形成闭环控制 所谓三环就是3个闭环负反馈PID调节系统 电压映射电流变化 电流映射转矩大小 转矩大小
  • multiprocessing.Pool 与 maxtasksperchild 产生相同的 PID

    我需要在一个与所有其他内存完全隔离的进程中运行一个函数多次 我想用multiprocessing为此 因为我需要序列化来自函数的复杂输出 我设置了start method to spawn 并使用一个游泳池maxtasksperchild
  • 如何获取生成的 java 进程的 PID

    我正在编写几个 java 程序 在完成我想做的任何事情后 需要在单独的 JVM 中杀死 清理 为此 我需要获取我正在创建的 java 进程的 PID jps l可在 Windows 和 Unix 上运行 您可以使用 java 程序调用此命令
  • 在 Unix 环境中检测过时的 pid 文件

    在 Unix 环境中检测陈旧 pid 文件的标准 跨平台方法是什么 假设我想终止应用程序的旧实例 但如果该应用程序已经退出 我当然不想破坏具有相同 PID 的不相关进程 现在我找到了一种在我的 Ubuntu 也可能是其他基于 GNU Lin
  • 在Qt中fork后获取进程的PID

    我正在创建一个成功分叉的 Qt C 控制台应用程序 当我在 fork 之前调用 QCoreApplication applicationPid 然后在 fork 之后 在子进程中 调用 QCoreApplication applicatio
  • 有人可以解释一下 Erlang 中 Pid(进程标识符)的结构吗?

    有人能解释一下 Erlang 中 Pid 的结构吗 Pids 看起来像这样
  • 如何在 OSX 10.9 中从 ProcessSerialNum 获取 PID?

    GetProcessPID在 OSX 10 9 中被标记为已弃用 并附有注释 使用适当的 processIdentifier 属性 NSRunningApplication 对象 问题是构造类方法NSRunningApplication没有
  • 从命令行启动进程时如何捕获进程的 PID?

    有没有办法纯粹在 bat 文件中执行此操作 目的是推出iexplore exe 然后在完成时杀死该实例 这是我使用的 echo off rem there is a tab in the file at the end of the lin
  • 如何通过VBA获取当前Excel实例的进程ID,而不使用标题?

    如何获取运行 VBA 代码的当前 Excel 实例的进程 ID 我不想通过标题中的名称来请求它 当我有两个或多个具有相同标题的 Excel 实例时 这会导致问题 您可以使用此方法来获取当前进程ID Declare Function GetC
  • 多处理时如何获取每个进程ID

    我有一些问题 因为我是 Python 和 Pyside 的新手 我有N个进程同时运行 由于这些进程需要一些时间才能完成其工作 因此最终用户可能想要取消特定进程 因此 我需要一种方法来了解进程的 ID 以便将此功能添加到程序中 有一个answ

随机推荐

  • 【MFC开发(6)】复选框按钮控件Check Box

    1 新建复选框 直接拖拽即可 xff0c 设置名字可修改caption内容 2 设置默认选中 复选框可多选 xff0c 所以可以给很多复选框按钮进行选中 xff0c 代码如下所示 xff0c 放在dlg初始化函数中实现 获取多选框香蕉的指针
  • 【MFC开发(15)】进度条控件Progress Control

    1 进度条控件的常用方法 首先给控件添加一个变量 在dlg初始化函数钟进行方法的实现 进度条显示区域 设置进度条的范围 m progress SetRange 0 100 设置进度条当前的位置 m progress SetPos 75 获取
  • 【MFC开发(16)】树形控件Tree Control

    1 树形控件的属性配置 xff08 1 xff09 Check Boxes xff1a 默认为false xff0c 如果选择为true的话每个节点前面会带有一个方框 xff08 2 xff09 Edit Labels xff1a 默认为f
  • 【MFC开发(17)】高级列表控件List Control

    1 介绍 ListCtrl 高级列表控件也是我们平时编程过程中很常用的一个控件 xff0c 一般涉及到报表展示 记录展示之类的 xff0c 都需要ListCtrl 高级列表控件 例如 xff1a 任务管理器啊 xff0c 文件列表啊 xff
  • STM32L4单片机连接语音模块NVC的源码

    这周写了一下STM32L4的语音模块 xff0c 使用的语音芯片是NVC系列芯片 xff0c 提供一下代码给以后需要的朋友们 xff0c 不喜勿喷 头文件NVC h ifndef NVC H define NVC H 音源 define S
  • oled显示模块ssd1306

    管脚定义 GND 电源地 VCC xff1a 供电电源3 3v 5v都可以 D0 xff1a 串行输入时钟CLK D1 xff1a 串行输入数据 RES xff1a 复位 DC xff1a 控制输入数据 命令 xff08 高电平1为数据 低
  • 上位机串口数据检验方式(一)——校验和

    最近还是在写上位机软件 xff0c 还是有一堆问题 xff0c 因为是第一次做这个东西 xff0c 有些东西只能到论坛上来查 xff0c 最近做到了数据通信 xff0c 刚开始没有想到数据协议这些东西 xff0c 现在涉及到了 xff0c
  • c#上位机开发(三)——串口通信上位机开发1

    今天主要做一个跟市面上差不多的稍微简单点的上位机软件 xff0c 效果如下图所示 1 功能概述 xff08 1 xff09 端口扫描 xff0c 主要是扫描出可用的端口用来连接 xff08 2 xff09 波特率的选择 xff0c 使用一个
  • 使用python执行外部命令subprocess

    1 使用python执行外部命令subprocess subprocess模块是Python自带的模块 xff0c 无须再另行安装 xff0c 它主要用来取代一些旧的模块或方法 xff0c 如os system os spawn os po
  • #Qt on android#使用Qt 获取GPS信号

    注意事项 xff1a 1 Qt版本一定要大于等于5 3 xff0c 因为低于5 3的版本对于android系统来说并不能成功获取gps信号 2 环境正确搭建 xff0c 一定要注意 xff01 构建 xff08 build xff09 的系
  • 2023年TI杯全国大学生电子设计竞赛通知正式发布

    关于组织2023年 全国大学生电子设计竞赛的通知 xff08 电组字 2023 01号 xff09 各赛区组织委员会 各有关高等学校 xff1a 全国大学生电子设计竞赛 xff08 以下简称全国竞赛 xff09 组委会在认真总结往届电子设计
  • HTTPClient调用https请求,通过基本认证用户名密码(Basic Auth)

    本文来源是Apache官网例子 xff1a httpcomponents client ClientAuthentication java at 4 5 x apache httpcomponents client GitHub 之前找过很
  • c中结构体数据对齐问题

    1 为什么需要数据对齐 提升CPU读取数据的效率 CPU每次都是从以4字节 xff08 32位CPU xff09 或是8字节 xff08 64位CPU xff09 的整数倍的内存地址中读进数据的 xff08 例如32位的只能0x000000
  • js打开新窗口的方法总结

    Window open 方法 完整代码 window span class token punctuation span span class token function open span span class token punctu
  • 一文详解堆栈(二)——内存堆与内存栈

    前言 xff1a 我们经常听见一个概念 xff0c 堆 xff08 heap xff09 和栈 xff08 stack xff09 xff0c 其实在数据结构中也有同样的这两个概念 xff0c 但是这和内存的堆栈是不一样的东西哦 xff0c
  • 《动手学ROS2》3.2ROS2工作空间介绍

    本系列教程作者 xff1a 小鱼 公众号 xff1a 鱼香ROS QQ交流群 xff1a 139707339 教学视频地址 xff1a 小鱼的B站 完整文档地址 xff1a 鱼香ROS官网 版权声明 xff1a 如非允许禁止转载与商业用途
  • Ubuntu18.04 realsenseD435i深度摄像头外参标定的问题

    Ubuntu18 04 realsenseD435i深度摄像头外参标定的问题 鱼香ROS介绍 xff1a 鱼香ROS是由机器人爱好者共同组成的社区 xff0c 欢迎一起参与机器人技术交流 进群加V xff1a fishros2048 文章信
  • STM-32:USART串口协议、串口外设—数据发送/数据发送+接收

    目录 一 串口通信1 1通信接口1 2串口通信1 2 1简介1 2 2硬件电路1 2 3串口参数及时序 二 STM32的USART外设2 1USART简介2 2USART框图 三 数据传输3 1数据帧3 2输入数据策略3 2 1起始位侦测3
  • 大疆M3508、M2006必备CAN总线知识与配置方法

    大疆M3508 M2006必备CAN总线知识与配置方法 文章目录 大疆M3508 M2006必备CAN总线知识与配置方法前言 xff1a 0x00 需要 额外的 CAN收发器 xff01 xff01 xff01 0x01 硬件层面分析为什么
  • 换个角度聊聊PID吧,很干。

    01 前言 大家好 xff0c 前面发了几篇关于PID的文章 xff1a 点击图片即可阅读 教你10分钟完成智能小车的PID调速 快速调试PID参数的3种方法 02 自动控制系统 在直流有刷电机的基础驱动中 xff0c 如果电机负载不变 x