基于动力学模型的机械臂滑膜控制

本文介绍了滑模控制的设计思路,包括设计滑模面、利用李雅普诺夫反推确定控制律,以及处理干扰项的方法。通过动力学模型和轨迹跟踪问题为例,详细讲解了如何设计控制律以确保系统的稳定性。同时提到了计算力矩法的应用,以克服模型误差和外部干扰。
摘要由CSDN通过智能技术生成

一、滑模控制设计思路

参考资料:https://zhuanlan.zhihu.com/p/463230163(思路理解)
https://blog.csdn.net/xiaohejiaoyiya/article/details/90271529(干扰的处理)

  • 滑模控制的思路有两个关键,一个是设计滑模面,另一个是李雅普诺夫反推滑模面控制律

1、设计滑模面

  • 滑模面有很多种,线性、二次型等,这里介绍线性的,选择何种滑模面的关键是看被控对象的
  • 滑模面数学形式如下:
    在这里插入图片描述
    当s=0时,根据微分方程的分离变量法,可知误差e指数级趋于0

2、李雅普诺夫反推滑模面s控制律

  • 通过上面的论述可知,一旦s趋于0,则误差也会趋于0。至此,问题从设计控制律u使得误差e趋于0,变成了设计控制律u使得s趋于0。
  • 如果增加控制律后,系统关于s的李雅普诺夫函数符合稳定性判定条件,则在有限时间内s一定会趋于0。进而,问题转变成了设计控制律使得关于s的李雅普诺夫函数符合收敛条件。

二、举例计算

1、控制对象动力学模型

在这里插入图片描述

2、控制目标

在这里插入图片描述

3、设计滑模面

在这里插入图片描述

  • 这里考虑轨迹跟踪问题,θd也是关于时间的函数

4、设计李雅普诺夫函数

在这里插入图片描述

5、反推控制律

(1)分析李雅普诺夫函数V

  • 根据李雅普诺夫的判定性质,只要V>0, V ˙ \dot{V} V˙<0,即可证明稳定。V明显大于0,所以重点是 V ˙ \dot{V} V˙的分析。
    在这里插入图片描述
    根据上式可知,只要设计合适的控制量u,使得 V ˙ \dot{V} V˙小于0,即可达到目标。

(2)反推控制器u

  • 之后就要去反推了,相较于靠直觉写控制器再用李雅普诺夫函数判定要明确了许多,但是仍然没那么好写。幸好已经有人总结了常见的设计方法,也就是 V ˙ \dot{V} V˙趋近律。常见的趋近律如下所示:
    在这里插入图片描述
    分别为等速、指数、幂次趋近律
  • 以等速趋近律为例,分析李雅普诺夫条件
    在这里插入图片描述
  • 根据趋近律计算控制器
    在这里插入图片描述

(3)处理干扰项d

  • 离完成控制器的设计还有最后一项d要处理,在上面提到的控制律中存在干扰d,可是干扰本来就没法测量。看到过有人在分析这里时,直接给出一个干扰最大值,然后和趋近律合并在一起,这就比较难理解为什么了,合并后一定符合李雅普诺夫条件吗?当然,经过计算其实是符合的,否则人家也不会那么写,但是确实比较难理解。

  • 可以先不管干扰d,直接用没有d的控制律做u,控制律如下所示:
    在这里插入图片描述

  • 在保持控制律的情况下,重新在 θ ¨ \ddot{θ} θ¨和u的关系中考虑d,再进行李雅普诺夫分析
    在这里插入图片描述
    这里最后那个放缩不容易一眼看出来,代几个数进去应该是正确的,人家推到最后都是直接L,不知道为啥这里有个J,但是这是惯量常数,影响不大。

  • 如果想 V ˙ \dot{V} V˙小于0,则ε要大于L/J。所以控制器中的ε是一个大于L/J的值,而下面截图中(图里ε对应η)这种将两个参数合并的写法,ε只要大于0即可,所以二者实质是一样的

在这里插入图片描述

三、基于计算力矩法的滑模控制

参考:https://www.bilibili.com/video/BV13N4y1k7Cb/?spm_id_from=333.1007.top_right_bar_window_default_collection.content.click&vd_source=a686d8f8b0e9b94066f2d4ba714466e7

  • 可以想一想上面说的干扰d到底对应着什么,可以是外力扰动,比如风阻、摩擦;甚至可以是动力学模型参数中的误差。这里之前有一个误解,以为模型中的耦合项c也可以认为是干扰,实际是不行的,因为其变化比较大,这里使用计算力矩法规避了这一问题,并使用鲁棒项抑制了误差。
    在这里插入图片描述
    截图中,最后说系统变成了一个带干扰的线性系统,实际就是将所有参数误差全看成了干扰。比较特别的点在于定义了一个间接控制量v,建立v的控制器后,力矩T可以通过v计算。v控制器的建立过程就和普通滑模控制器的建立过程没有区别。

四、关于滑模控制的直观理解(后补)

1、整体思路

  • 将对误差e的控制修改到对S=0平面的控制,也就是当S=0时,误差e就会收敛到0
  • 控制器的目标就是把状态量按在S=0这个平面上,设计方法就是利用李亚普诺夫反推
  • 在李亚普诺夫中引入控制量u,最终反推出控制器。至此就已经完成滑模控制器的设计了,但是这不是一般常说的滑模控制器,因为一般说的滑模控制器实际上是滑模变结构控制器,这里还没有涉及到变结构的部分。
  • 所谓的变结构也就是根据状态有一个开关量,也就是那个sgn项。滑模控制器中利用这个sgn项,处理了系统误差和干扰。也可以理解成利用bangbang控制这样一个鲁棒控制器实现了把误差e和误差导数按在S平面上。

2、bangbang控制

  • 这是一个利用bangbang控制的例子

  • 最近在调试一个单自由度的俯仰角电机,控制思路是在补偿模型的基础上使用pd控制器
    u = K p ∗ e + K d ∗ d e + G + f u = Kp*e +Kd*de + G + f u=Kpe+Kdde+G+f
    G是补偿的重力,f补偿摩擦力

  • 但是遇到了一个问题,这个俯仰轴机构有点复杂,重力影响到摩擦力,并且电机精度不够,也很难做高精度的辨识。只能拟合一个函数对摩擦力和重力进行补偿。出现的现象是在抬升的过程中会出现“卡顿”,在下降的过程中会出现“下坠”。

  • 这是由于模型补偿的不够准确导致的,为了解决这个问题,我想的办法是引入期望点的数据。比如期望位置在当前位置前面,补偿的时候就给一个向前运动的倾向,具体来说传统思路中摩擦力补充是以实际运动方向定义摩擦补偿的正负,而我转变成以误差(期望的运动方向)定义摩擦补偿的正负。并且补偿的大小稍大于之前辨识的结果

  • 当时调试的时候没有多想,这里其实有一个转变,之前的“补偿”是基于当前状态的,目标是想获得一种类似于“失重、无摩擦”的状态,而后来的操作是基于“误差”的,会更有向期望位置移动的“倾向”。注意这里的误差会出现一个突变,也就是误差在正、零、负之前切换时,对摩擦力的补偿会出现阶跃,类似于下面这个效果
    在这里插入图片描述

  • 这个阶跃的效果就是bangbang控制器中sgn(s)那一项了,所以我觉得sgn那一项的物理意义可以理解成一种根据“运动期望”快速切换的补偿

  • 我之前看滑模控制器时,认为这种阶跃式的快速切换会导致控制器震荡,可实际上并没有出现。我使用的是伺服电机,发出力的命令后其实是需要时间响应的,期望力在一个有限的区间中变化时,电机输出的力还是比较平缓的。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个基于 DSP 的 PWM 整流器滑膜控制的 C 代码示例: ```c #include <stdint.h> #include <stdbool.h> #include <stdlib.h> #include <math.h> #include <xdc/runtime/System.h> #include <xdc/runtime/Error.h> #include <ti/sysbios/BIOS.h> #include <ti/sysbios/knl/Task.h> #include <ti/sysbios/knl/Clock.h> #include <ti/sysbios/hal/Hwi.h> #include <ti/sysbios/family/c28/Hwi.h> #include <ti/sysbios/family/c28/Timer.h> #include <ti/sysbios/family/c28/Cpu.h> #include <ti/sysbios/family/c28/EventCombiner.h> #include <ti/drv/adc/ADC.h> #include <ti/drv/adc/soc/ADC_soc.h> #include <ti/drv/pwm/PWM.h> #include <ti/drv/pwm/soc/PWM_soc.h> #define ADC_BUF_SIZE 16 #define PWM_FREQ 10000 // PWM 频率,单位为 Hz #define PWM_MAX_DUTY 100 // PWM 最大占空比 #define PI 3.1415926 // ADC 句柄和缓存 ADC_Handle adc_handle; uint16_t adc_buf[ADC_BUF_SIZE]; // PWM 句柄和配置 PWM_Handle pwm_handle; PWM_Params pwm_params; PWM_Duty pwm_duty; PWM_Freq pwm_freq; uint32_t pwm_period; // 计算 PI 控制器的参数 float kp = 0.1; float ki = 0.01; float err_sum = 0.0; // 定时器中断处理函数 void timer_isr(void) { // 读取 ADC 的值 ADC_convert(adc_handle, adc_buf, 1); // 计算滑膜位置和目标位置的误差 float pos = (float)adc_buf[0] / 4096.0 * 2 * PI; float target_pos = PI / 2; float err = target_pos - pos; // 计算 PI 控制器输出 float p_term = kp * err; err_sum += err; float i_term = ki * err_sum; // 计算 PWM 占空比并更新 PWM 输出 float duty = p_term + i_term; if (duty > PWM_MAX_DUTY) { duty = PWM_MAX_DUTY; } else if (duty < 0.0) { duty = 0.0; } pwm_duty.value = (uint32_t)(duty / PWM_MAX_DUTY * pwm_period); PWM_setDuty(pwm_handle, &pwm_duty); } // 初始化 ADC void init_adc(void) { ADC_socGetInitCfg(ADC_CONTROLLER_SOC, &adc_soc_cfg); adc_handle = ADC_open(ADC_CONTROLLER_SOC, &adc_soc_cfg); ADC_Params adc_params; ADC_Params_init(&adc_params); adc_params.isContinuousMode = true; adc_params.callbackFxn = NULL; adc_params.userArg = NULL; ADC_init(adc_handle, &adc_params); ADC_enable(adc_handle); } // 初始化 PWM void init_pwm(void) { PWM_socGetInitCfg(0, &pwm_soc_cfg); PWM_init(); PWM_Params_init(&pwm_params); pwm_params.dutyUnits = PWM_DUTY_FRACTION; pwm_params.dutyValue = 0; pwm_params.periodUnits = PWM_PERIOD_HZ; pwm_params.periodValue = PWM_FREQ; pwm_params.idleLevel = PWM_IDLE_LOW; pwm_params.syncMode = PWM_SYNC_PWM; pwm_handle = PWM_open(0, &pwm_params); PWM_start(pwm_handle); PWM_getPeriod(pwm_handle, &pwm_freq); pwm_period = pwm_freq.lo / PWM_FREQ; } // 应用程序入口 int main(void) { // 初始化 ADC 和 PWM init_adc(); init_pwm(); // 初始化定时器 Timer_Handle timer_handle; Timer_Params timer_params; Timer_Params_init(&timer_params); timer_params.period = 1000 / PWM_FREQ; // 定时器周期为 PWM 周期的 1/1000 timer_handle = Timer_create(1, &timer_isr, &timer_params, NULL); if (timer_handle == NULL) { System_abort("无法创建定时器!"); } Timer_start(timer_handle); // 启动调度器 BIOS_start(); return 0; } ``` 注意:该代码只是一个示例,具体的实现可能需要根据实际需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值