亿加合和智能车制作

标题: 看过的一篇较好的解释PID的文章,分享只为新手~ [打印本页]

作者: 戒灬    时间: 2012-11-22 15:54
标题: 看过的一篇较好的解释PID的文章,分享只为新手~
本文只是技术交流,仅仅是鄙人对一些知识的看法和认识,由于鄙人学疏
才浅,必然会在本文中出现定义理解不深刻,原理叙述有误等错误,敬请各位
高人理解,如有错误之处,请大家指出,我将积极学习改进。
其实很早就应该写这么一个东西,由于学习和工作太忙,一直没有时间去
写,春节放假,偶尔有了时间,决心一定要写好,本文只是针对初学者,对于
那些老鸟和大神们,基本上没有看的必要,所以再您看这篇文章之前,还要对
我多多的理解和宽容,写不好,我改进学习,写的好,希望对您有帮助。
(一) PID 的背景和一些原理上理解
PID 控制技术,是最简单的闭环控制技术之一,一般都是利用单反馈或者
多反馈来实现对控制对象的调节,实现被控对象的可控性和可预知性的控制。
使得设备运行的更加的可靠,合理且平稳。
PID 的全称为比例积分微分控制,P 即为比例,I 即为积分,D 即为微分。
PID 往往都是应用于惰性系统,所谓惰性系统就是变化较慢且无法精确控制和
调节的对象,其中最最重要的特点就是变化速度慢,调节速度慢,控制周期较
长,最经典的控制对象就为温度的温控。
下面就举一个简单的例子进行说明:
比如我们要对一个水箱里面的水进行加热,我们的目标加热温度为100℃,
首先我们不用闭环对水温进行加热,也就是说我们只是靠人为观察温度计的温
度值来对加热器进行人工的干预。
当温度加热到100℃以后,我们就停止加热,这个时候,虽然水温已经到
达100 且加热器已经不再通电加热,但是由于加热器的预热和水本身传递温度
的惰性,导致水温会继续上升,经过一段时间后,水温会继续升高,并且超过
100℃,那么该系统就无法达到我们所预期的要求。
这个时候您谁想,停止加热后本身会继续散热继续升温,那等到温度到90
摄氏度左右以后,我们停止加热,然后利用水的惰性和加热器的散热,让水温
继续升温,正好达到100℃,这样不就解决问题了吗? 这么想是对的,但是
水温要达到90 几度的时候我们停止加热呢?还有就是从停止加热到100℃的时
间是多少?经过一段时间后,温度没有达到100℃,而是小于100 摄氏度以后
温度就达到了顶峰,这样怎么办?
上述所有的办法,可能能够解决水温到达 100℃的要求,但是其中很多环
节很多结果都是无法预测和无法控制的,即便经历了很麻烦的人为干预同时经
过了一个较长的时间达到了我们对水温加热到100℃的要求,也要经历一个相
当复杂和相当漫长的时间才能达到,并且整个过程一直要有人为的干预,实在
是属于劳民伤财。
不只是对温度的控制,还有其他很多领域的过程控制,都遇到了这些让人
很困惑问题,所以科学家就针对此类问题发明了闭环控制原理,其中最经典最
简单最实用的就是PID 闭环控制。该控制原理简单可靠,参数调整简便,实用
性强,广泛的受到人们的支持。
利用 PID 控制原理对水温进行加热控制,我现在进行举例说明:目标温度
还是我们之前设定的100℃,加热前我们首先要把这个温度值输入到加热器控
制器中,此时温度计只是作为我们认为观察温度的一个参考,我们在水中放入
一个电子温度计,电子温度计测量的温度可以传送到控制器,以使得我们的PID
控制器知道当前的水温,在刚刚通电加热的时候,水温假定为室温20℃,当前
的水温会通过电子温度计测量并传输到PID 控制器中,此温度作为当前温度值
C_TEM,我们的目标温度值设定的为100℃作为T_TEM,那么CPU 通过计算
T_TEM-C_TEM=80,二者的差值较大为80,说明水温远远没有达到我们所需
的100℃,那么这个时候CPU 就给加热器通上最高的供电电压,以全速对水箱
里面的水进行加热,随着加热的进行,水温会慢慢的增加,某一时刻,水温达
到了80℃,那么目标温度与当前温度做差,差值仅仅为20,那么CPU 就知道
了当前的温度跟实际我们所希望的温度差别已经很小了,那么这个时候控制器
就减小加热器的供电电压,以一个适当的加热量对水温进行加热。当到了一个
时刻,水温达到了95℃,目标温度和他的差值仅仅只有5 了,说明温度已经十
分接近目标温度,此时控制器可能已经早已停止对加热器供电或者以一个更加
低电压的加热量对水温进行加热,直到水温加热到100℃。
当然水温不可能一直恒定在 100℃,水温一定会超过100 摄氏度,但是由
于采用PID 闭环控制,水温不会超过的太多,比如某一时刻水温到达了105℃,
做差后,差值为-5℃,CPU 就知道此时温度已经超过了目标温度,那么将会在
一段时间内停止加热,直到温度降低到100℃或者100℃以下后再进行进一步控
制,所以当水温到达100 摄氏度附近的时候,CPU 控制器将会频繁的对加热器
进行控制,从而导致水温永远维持在100℃左右附近,而且水温与100℃的目标
温度相差不会很大,宏观上通过平均测量,水温就是认为在100℃了,其实根
本上,水温是永远不会达到正好的100℃,只能是在100℃左右进行震荡,但是
震荡始终不会太大,从而达到了我们控制目标对象的要求,使得加热系统变得
更加科学更加可控。
当然上述所说明的 PID 加热状态是PID 各项参数调节比较好的情况下的状
态,PID 三个参数调整不好,会带来很多问题,比如系统震荡,超调等问题,
所以调整PID 参数也是一个比较重要的环节,这个我将会在下面进行说明。
上述对水温的 PID 控制已经基本上说明了PID 控制的核心,我们之所以利
用PID 进行闭环控制,就是为了让被控制对象快速稳定的达到目标值,从而实
现对被控制对象的可控性,可预知性。
一个人无法控制就是一个疯子,一个车子速度无法控制就是一个疯车。
(二) 智能车电机闭环控制算法
对于智能车的电机闭环控制算法,我之所以标题没有写上“智能车电机PID
闭环控制算法”是因为PID 算法根本就不是特别好的适用于智能车这种变化很
快的系统,对于智能车,电机的调速可以说是时时刻刻再进行调速控制的,我
上面说描述的经典PID 算法,都是针对一些惰性系统,也就是说是变化比较慢
的系统的,所以对于智能车的电机调速采用完完整整的PID 算法,是根本不可
取的,及时采用了,你必须要经过一些变换和改进才能使用。以上的简述只是
鄙人自己的看法,如有错误,请各位高手指正。
现在估计您会疑问,PID 不适用于智能车的电机控制,那什么才适用呢?
鄙人原来做过智能车,从鄙人本身的理解,P 算法控制电机,也就是比例控制
是最好的,反应速度快,控制精度高,不存在积分和微分效应,非常适用于适
用于控制周期短的系统,当然,对于一些特殊的逻辑控制算法,可能要采用PD
算法,用微分来做补偿,防止震荡和超调。
下面来说下电机控制算法从开始的加入到最终的确定的方法:
当然这一切的前提就是安装了编码器,车速有反馈,只有加上编码器,有
了反馈,才能组成一个闭环系统。当然您也可以加上码盘,或者霍尔开关等一
切可以返回车速的东西都可以。
(1) 首先建议在车速比较慢的时候,采用PID 算法来控制电机,为
什么开始要建议您采用PID 呢?主要是为了让您更加深刻理解
PID 算法的精髓和调试步骤方法等,有助于以后对控制算法更加
深入的研究和书写。调试PID 三个参数的方法,很多地方都提
供了,我在这里简单的说下:首先将ID 参数都变为0,先调整
P 比例参数,调整到速度基本上跟您给定的速度差不多,也就是
说基本稳定在您给定的脉冲数,当然这个时候会非常的震荡,
不要担心,接下来调整I,调整I 的结果就是震荡会消除很多,
但是车速会变化缓慢,也就是说会有一些延迟,然后再调整D,
调整D 的结果就是增强调节的灵活性和预见性,在给定速度变
化的过程中,能够以一个平稳过渡来变换,而且速度可以长时
间稳定在给定速度附近,然后PID 三个参数的基本范围就确定
了,然后再根据实际的跑车来微调这些参数,当然在您调试PID
之前,请仔细阅读PID 理论知识,这样有助于您的调试和理解,
当您把PID 调整好以后,您就基本上领会了PID 的精髓,对于
以后的调试作用非常大。这里的给定速度,就相当于上面对温
度例子中说的设定温度。意思是一样一样的。
(2) 当您对PID 掌握以后,您能做到给定多少速度,就能让车速稳
定在这个给定速度左右,可以适当的提高点车速,慢慢的观察
效果,你会发现当速度增加的时候,车速的控制会变得越来越
糟糕,调节缓慢,灵活性差。这个时候您就可以试着去掉I 积分
环节,然后再重新调整参数,按照上面说的,然后继续观察效
果,试着提高速度,继续观察,因为车速毕竟很慢,很多细节
我们都能看到,所以您就可以看到PID 到PD 变换以后,实际的
效果是增加多少,也算是一种进步,这个时候,经典的PID 公
式已经被我们简化,不要担心,您可以多多实验多多观察,可
能在这个变换之间,您能受到很多启发,会产生很多思路,谁
以后的调试车子都是有好处的。所以搞智能车,自己一步
一步的进步学习,远远比去某些淘宝店铺购买现成的程序学到
的东西更多,体会的也更多,思维开阔的也更多。
(3) 在您的车速在3M 内的时候,我强烈建议您采用PD 算法,因为
PD 算法是最好调整,最容易控制的。当然这个时候我也强烈建
议您加上P 控制,P 控制的话,不是说就单纯的P*偏差然后得
到的值给定PWM,而是一定要加上一些逻辑控制,不加上逻辑
控制而是直接运用比例公式来给定PWM 值,将会带来很多问
题,具体的逻辑控制讲解,在以后我会写出相关的文档,谢谢。
采用增量式编码器为反馈的智能车电机闭环调速系统:
其实借助于我上面举得例子,到这里,您可能已经明白对于智能车来
说闭环系统是一个必须的,不可脱离的。当然,您可能已经完全明白智能
车电机闭环调速系统怎么做,并且您可能也做的更好,要比我在这里所说
的更加的先进更加的有创意更加的有效果。所以在这里我只是简单的说说,
谢谢。
首先,我们需要时刻反馈当前的智能车速度给单片机或者 ARM,让
系统知道当前速度,有助于控制。
我们先说说为什么我们要反馈车子速度,要知道车子当前的速度?因
为我们的CPU 利用传感器采集道路信息,通过CPU 收集和处理变化,系
统就能知道车子当前的状态,比如是在直到上?还是在进入弯道?还是在
弯道内?还是正在出弯道?还是在上坡?还是穿过了起跑线?有了这些信
息,我们首先就是对舵机的控制,控制车子根据什么道路情况来进行转弯,
转弯的方向,大小,都是靠这些数据来实现,当然当前的速度值也是控制
舵机转向大小的一个附加因素,这样更加的有利于我们及时处理不同弯道。
知道了这些信息,就跟我们开车一样,我们要转弯了,得感知我们车的速
度,怎么感知啊,就靠汽车自带的速度表,这样我们就可以通过控制刹车
或者油门还有方向盘来控制车子平稳的转过弯道,不同的弯道,不同的速
度,转弯的控制和刹车的控制都是不同的。如果我们不知道当前的速度,
那么很可能因为拐弯速度过快,导致翻车,或者侧滑,造成危险。智能车
情况跟真车是一样的,我们必须知道车子当前速度,比如我们智能车拐弯
安全速度是3M/S,所谓安全速度就是车子顺利安全且没有较大侧滑过弯时
的速度,在进入弯道前我们车子的速度是4M/S,当传感器感知要进入弯道
了,通过跟安全速度对比,我们发现智能车的速度远大于安全弯道速度,
这个时候我们就要刹车,把车子速度快速降低到3M/S,这样保证我们顺利
快速的过弯。在这里您可能问3M/S 的安全速度怎么来?其实很简单这个
速度是靠实验来的,不用什么计算,完全属于经验值,根据跑道的材料、
车子机械性能和弯道的角度来决定,所以为什么我们要比赛的时候要试车,
试车中一个最重要的环节就是熟悉比赛跑道所用的材料,用于我们实验车
子的安全速度等。
对于智能车的速度反馈,在这里我就针对增量式编码器来说,其实码
盘啊,霍尔啊,他们原理都一样。光电增量式编码器不同于绝对值编码器,
绝对值编码器在编码器转动一周的每个特定位置都有一个确定的值输出,
增量式编码器转动一圈,固定输出一定的脉冲,无法确定转动到哪个位置,
对外输出一般为方波,这样有助于MCU 进行数据采集。
有了编码器,我们通过齿轮、皮带等将编码器跟电机或者传动轮进行
连接,这样电机转动的时候,就会带动编码器转动,然后编码器就能向外
输出方波,接到单片机上,我们就能进行采集编码器脉冲了。有了脉冲,
可能您又要问这个脉冲没有规律性,随着转动不停的增加,到底怎么来衡
量速度?您这个时候啊,动动手,观察观察数据特点,您会发现,当车速
度比较快的时候啊,脉冲数自增的速度比较快,也就是说,转速越快,频
率越高,单位时间内的脉冲数就越多,这样立刻有了灵感,我们用定时器
设置一个中断,这个中断的时间为5MS,那么每5MS 我们就采集编码器
一次脉冲值,当采集完毕后,我们就对脉冲数寄存器清零,这样在5MS
内,得到的脉冲数越多,说明车子速度越快,到这里车速就解决了。到这
里您可能会说:还没完呢,还没转换为速度呢?要把这个脉冲根据距离和
时间转换为具体的XX 米/秒的速度。您的这个想法很好,但是真的是没
有必要,我们根本没有必要浪费时间去计算这个,因为我们本来就是想知
道速度,脉冲数的多少已经就能衡量速度大小了,我们何必要很麻烦的转
换为具体速度? 一定时间内的脉冲数已经够了,够我们底层硬件进行判断
计算了。既然我们反馈的数据类型为脉冲数,所以我们所给定的速度也对
应的到脉冲数,比如50 个脉冲代表速度3M/S,80 个代表4M/S 的速度,
这样通过道路类型给定脉冲数,就能实现电机的闭环控制了,是不是很简
单?到这里我知道又有人会疑问,50 个脉冲对应3M/S,80 个脉冲对应4M/S
是怎么得到的?其实这个更简单,很多人做智能车容易把简单问题复杂化,
其实很多问题都可以用几行程序解决,比如那个坡道,很多人用了很多复
杂方法解决,比如加一个开关啊,加个加速度啊,加个陀螺仪啊,根本没
有必要,程序几行就搞定了。具体的脉冲对应速度,您固定给定一个脉冲
让车子跑跑到一圈,然后记下时间,跑道实际长度除以时间,就是对应速
度,你只是需要大概知道对应就行了,不用一个一个实验,具体的X 米/
秒是宏观上我们感知的,跟单片机没有任何关系。
迷迷糊糊的写了这么多,不知道会不会对初学者有什么帮助,鄙人在
这里献丑了,如有不对的地方,您大可批评,但请您理解我知识的欠缺,
我会更加努力。
作者: 戒灬    时间: 2012-11-22 15:55
占个沙发先,,,
作者: zhangwenqiang    时间: 2012-11-22 16:40
写的挺好的
作者: 利仔    时间: 2012-11-22 16:40
挺好理解的
作者: 1434636181    时间: 2012-11-22 17:44
写出自己的思想,就是值得鼓励的。只是就是这样交流,传播的嘛
作者: alvin1991    时间: 2012-11-22 17:59
顺顶!
作者: 天涯々湖畔    时间: 2012-11-22 18:28
写的很好,希望把没写的能写上,让我们更加受益~
作者: hbqyzpy    时间: 2012-11-22 18:52

作者: abch1120    时间: 2012-11-22 19:25

作者: 你是我/sun    时间: 2012-11-22 19:55

作者: 齐风鲁韵    时间: 2012-11-22 20:06

作者: 戒灬    时间: 2012-11-22 21:06
利仔 发表于 2012-11-22 16:40
挺好理解的

希望对你有帮助咯~
作者: 戒灬    时间: 2012-11-22 21:06
1434636181 发表于 2012-11-22 17:44
写出自己的思想,就是值得鼓励的。只是就是这样交流,传播的嘛

互相交流学习得才快嘛。。
作者: 戒灬    时间: 2012-11-22 21:07
天涯々湖畔 发表于 2012-11-22 18:28
写的很好,希望把没写的能写上,让我们更加受益~

比如?
作者: guanglidu    时间: 2012-11-22 21:14


作者: ljzzhinengche    时间: 2012-11-22 23:00
顶。。。楼主继续啊。。。
作者: 猎豹115    时间: 2012-11-23 09:33
很好,很强大!!
作者: 叶紫    时间: 2012-11-23 10:44
好深奥的样子啊,顶一个,争取下回我在看的时候能够看懂,呼啦啦。。。
作者: 戒灬    时间: 2012-11-23 13:09
叶紫 发表于 2012-11-23 10:44
好深奥的样子啊,顶一个,争取下回我在看的时候能够看懂,呼啦啦。。。

其实只要花时间去理解,真心不深奥,,

作者: 如鱼得水    时间: 2012-11-24 23:52
支持!
作者: Huskar    时间: 2012-11-25 22:53
挺好的 很有帮助 楼主无私 非常感谢
作者: 戒灬    时间: 2012-11-26 00:50
Huskar 发表于 2012-11-25 22:53
挺好的 很有帮助 楼主无私 非常感谢

分享也是种快乐,,

作者: rao    时间: 2012-11-26 10:57
很棒!!!
作者: 側祐沵茬    时间: 2012-11-26 21:49
学习了
作者: xinxiang    时间: 2012-11-29 12:01
挺好的,不管有没有用 ,先学习了
作者: 扁舟子    时间: 2012-11-29 20:59
受益良多啊
作者: 戒灬    时间: 2012-11-29 21:35
xinxiang 发表于 2012-11-29 12:01
挺好的,不管有没有用 ,先学习了

加油吧

作者: 戒灬    时间: 2012-11-29 21:36
扁舟子 发表于 2012-11-29 20:59
受益良多啊

加油吧
作者: 扁舟子    时间: 2012-11-29 22:01
戒灬 发表于 2012-11-29 21:36
加油吧

嗯   在努力中。。
作者: suebillt    时间: 2012-12-6 18:20
{:soso_e179:}
作者: JudeScorpio    时间: 2013-1-9 20:03
谢谢楼主啦~
作者: royio    时间: 2013-1-15 14:34
很受启发。
作者: 431206148    时间: 2013-1-22 03:12
{:soso_e179:}收益匪浅,顶起。
作者: 荷马111    时间: 2013-1-22 09:49
我也来支持一下
作者: 恋深蓝    时间: 2013-1-22 19:52
期待楼主出新的文档!!
作者: 冰封情泪    时间: 2013-1-22 22:07
感觉不错
作者: chenyuchenyu    时间: 2013-1-25 15:15
很不错!学习了!
作者: ㄟDemo''    时间: 2013-1-25 16:00
一个人无法控制就是一个疯子,一个车子速度无法控制就是一个疯车。

作者: 乔大侠    时间: 2013-1-25 16:02
先顶再看
作者: s无敌熊仔s    时间: 2013-1-26 15:54
写的很好啊
作者: 奋斗小青年、    时间: 2013-1-26 17:17

作者: 程伟NO.1    时间: 2013-1-26 20:03

作者: 程伟NO.1    时间: 2013-1-26 22:17
三遍
作者: midsummer    时间: 2013-1-27 03:28

作者: AoAO~赤匕--藏刃    时间: 2013-1-27 18:40
谢谢分享
作者: chachacha    时间: 2013-2-1 12:15

作者: Dwe    时间: 2013-2-1 17:04
v.thx,really really really
作者: ---··    时间: 2013-2-2 00:10
先顶
作者: ---··    时间: 2013-2-2 00:30
再顶
作者: luosidao    时间: 2013-2-18 22:08
写的挺好的,通俗易懂
作者: 漫无止尽的八月    时间: 2013-2-19 02:05
mark

作者: 微笑pasta    时间: 2013-2-19 17:04

作者: flyboy101    时间: 2013-2-20 20:52
写得不错,很易理解
作者: 黑小子攀    时间: 2013-2-21 09:10

作者: 心静0189    时间: 2013-2-21 11:03

作者: 威仔    时间: 2013-2-21 15:35
小白表示很强大,很容易理解,写得很不错···谢谢了···
作者: 真实的谎言    时间: 2013-2-22 19:35
很有用,谢谢啦!
作者: Believe_me    时间: 2013-2-27 15:57
嗯,很好,谢谢
作者: lyb    时间: 2013-2-27 16:13
受益匪浅啊
作者: 模电还要继续看    时间: 2013-2-28 16:36
顶一个
作者: 瓜豪gh    时间: 2013-2-28 19:55
感谢
作者: 蛋求无悔    时间: 2013-3-1 15:17
看了一遍,写的非常好,作者是谁??
作者: zanran8    时间: 2013-3-2 09:44

作者: wxstar1    时间: 2013-3-3 14:18
学习了!

作者: 炎炎夏日    时间: 2013-3-5 22:44

作者: 可欣    时间: 2013-3-9 12:15
{:soso_e100:}{:soso_e129:}
作者: 人生。。初见    时间: 2013-3-9 12:50
又看了一遍,想问一下,速度过快时如何刹车,pwm为0,还是电机反转????

作者: 戒灬    时间: 2013-3-9 13:59
人生。。初见 发表于 2013-3-9 12:50
又看了一遍,想问一下,速度过快时如何刹车,pwm为0,还是电机反转????

要看你是两轮车还是四轮车,,有种刹车叫反接制动。

作者: 人生。。初见    时间: 2013-3-9 15:50
戒灬 发表于 2013-3-9 13:59
要看你是两轮车还是四轮车,,有种刹车叫反接制动。

我们的是四轮的,对于制动不是太清楚,能不能给点资料介绍

作者: 398720241    时间: 2013-3-11 20:40
写得真好,希望能多写些没写上的,感觉有些眉目了,谢谢!
作者: betesla    时间: 2013-3-14 11:33
不错啊 有利于新手理解
作者: 夫哂之    时间: 2013-3-17 04:04
嘿嘿,谢谢拉~~
作者: ytcx    时间: 2013-3-17 12:58

作者: ベ咔布奇シ诺    时间: 2013-3-18 10:45

作者: ベ咔布奇シ诺    时间: 2013-3-18 10:45

作者: 守候幸福_1    时间: 2013-3-18 20:33
好文章
作者: guangzhejiaoya    时间: 2013-3-25 12:09
受教啦,谢谢
作者: 蓝色调    时间: 2013-3-27 16:57

作者: 赦叶    时间: 2013-4-1 14:21
有道理
作者: 黑与白    时间: 2013-4-5 11:21
学习了!谢谢楼主!!!
作者: 浙东东    时间: 2013-4-9 22:34
写得不错,对我调车感觉有所启发。
作者: 林的0922    时间: 2013-4-10 12:58
太好了
作者: kido    时间: 2013-4-10 14:13
不错啊,顶了
作者: 曹益奇    时间: 2013-4-11 18:09
顶一个、、刚好现在需要
作者: shhu1993    时间: 2013-4-11 19:00

作者: cocacola    时间: 2013-4-12 15:37
受益匪浅!
作者: hnhdzzc    时间: 2013-4-15 19:56
MARK
作者: 天空之城-    时间: 2013-4-15 22:24
尤其是速度估计灵活啊 ,精辟啊,。
作者: 泳Z    时间: 2013-4-18 09:03
给力
作者: 月影残伦    时间: 2013-4-18 20:55
写的很好···
作者: 阿涛    时间: 2013-4-21 09:22
谢谢,帮助很大
作者: 月影残伦    时间: 2013-4-21 19:19
小车如果用PI控制会不会更好点
作者: 月影残伦    时间: 2013-4-21 19:20
小车如果用PI控制会不会更好点
作者: 月影残伦    时间: 2013-4-21 19:21
小车如果用PI控制会不会更好点
作者: WangYuxi_sky    时间: 2013-4-23 13:32
受教了
作者: aqzz44miss    时间: 2013-4-24 14:53

作者: 一棵小草    时间: 2013-4-24 19:56
速度闭环加进去感觉没效果,车子跑着跑着就加速,越加越快,最后就趴那了,求指教啊
作者: gy810986741    时间: 2013-4-29 12:41

作者: idao    时间: 2013-4-29 16:18
赞一个~~
作者: liqijian    时间: 2013-5-1 08:46
{:soso_e100:}




欢迎光临 亿加合和智能车制作 (http://www.znczz.com/) Powered by Discuz! X3.2