![]() |
RMVL
2.5.0-dev
Robotic Manipulation and Vision Library
|
【控制律组件】离散动态全补偿的前馈环节,适合在已知系统模型或有外部扰动补偿需求时使用 更多...
#include <rmvl/lpss/ctl/ff.hpp>
Public 成员函数 | |
| void | reset () noexcept override |
| 重置状态 | |
| ControlStatus | do_compute (const std::vector< double > &desired, const std::vector< double > &fb, int32_t period, std::vector< double > &command) noexcept override |
| 执行一次控制计算 | |
| Public 成员函数 继承自 rm::lpss::ctl::ControlLawBase | |
| ControlStatus | compute (const msg::JointState &desired, const msg::JointState &fb, int32_t period, msg::JointState &command) noexcept |
| 执行一次控制计算 | |
静态 Public 成员函数 | |
| static ControlLawBase::ptr | create (const std::vector< double > &a0, const std::vector< double > &a1, const std::vector< double > &a2, InSampleMapping imapping=basic_pos_imapping, OutSampleMapping omapping=basic_pos_omapping) noexcept |
| 创建离散前馈环节实例 | |
额外继承的成员函数 | |
| Public 类型 继承自 rm::lpss::ctl::ControlLawBase | |
| using | ptr = std::unique_ptr<ControlLawBase> |
【控制律组件】离散动态全补偿的前馈环节,适合在已知系统模型或有外部扰动补偿需求时使用

上图所示, \(G_f(s)\)表示前馈环节,其设计通常基于系统的模型或经验数据,理论上动态全补偿的前馈传递函数 \(G_f(s)\) 具有如下表达式
\[G_f(s)=\frac1{G_s(s) G_b(s)}\tag1\]
其中, \(G_s(s)\) 是系统的传递函数, \(G_b(s)\) 是反馈环节的传递函数。
下面给出一个典型的例子:对于一般的电机模型,令电流 \(i\) 为输入 \(x_i(t)\),位置 \(\theta\) 为输出 \(x_o(t)\),那么由 FOC 保证,电机的输出力矩 \(M=k_Mi \),其中 \(k_M\) 是电机的力矩常数。假设电机的转动惯量为 \(J\),阻尼系数为 \(c\),那么系统的动力学方程为
\[J\ddot{x_i}(t)+c\dot{x_i}(t)=M=k_Mx_o(t)\tag2\]
对其进行拉普拉斯变换后得到系统开环传递函数为
\[G_s(s)=\frac{k_M}{Js^2+cs}\tag3\]
一般我们会使用双环反馈控制器来控制电机的位置,内环为速度环,外环为位置环,如下图所示:

其中, \(G_{c1}(s)\) 和 \(G_{c2}(s)\) 分别为位置环和速度环的控制器传递函数, \(G_{f1}(s)\) 和 \(G_{f2}(s)\) 分别为位置环和速度环的前馈传递函数。 理论上全补偿的前馈传递函数具有如下形式
\[\begin{aligned}G_{f1}(s)&=s\\G_{f2}(s)&=\frac{Js+c}{k_M}\end{aligned}\tag4\]
如果对于单环控制,则前馈传递函数的理论补偿形式为
\[G_f(s)=\frac{Js^2+cs}{k_M}\tag5\]
一般的,可以令前馈传递函数为
\[G_f(s)=a_0+a_1s+a_2s^2\tag6\]
其中 \(a_0\)、 \(a_1\) 和 \(a_2\) 是前馈环节的设计参数, 通过调整它们可以实现对系统动态性能的优化。式中不存在真分式,且前馈输入一般为给定的无噪声信号,因此求微分不会引入噪声,可以使用后向欧拉对前馈环节进行近似, 得到前馈环节的脉冲传递函数为
\[G_f(z)=a_0+a_1\frac{1-z^{-1}}T+a_2\left(\frac{1-z^{-1}}T\right)^2\tag7\]
转换为如下的差分方程形式
\[u[k]=\left(a_0+\frac{a_1}T+\frac{a_2} {T^2}\right)x[k]-\frac1T\left(a_1+\frac{2a_2}T\right)x[k-1]+\frac{a_2}{T^2}x[k-2]\tag8\]
|
inlinestaticnoexcept |
创建离散前馈环节实例
| [in] | a0 | 前馈零阶项系数 |
| [in] | a1 | 前馈一阶项系数 |
| [in] | a2 | 前馈二阶项系数 |
| [in] | imapping | 输入采样映射,默认为基础位置映射 |
| [in] | omapping | 输出采样映射,默认为基础位置映射 |
|
overridevirtualnoexcept |
执行一次控制计算
| [in] | desired | 当前时刻期望状态向量 |
| [in] | fb | 当前反馈状态向量(此接口中未使用) |
| [in] | period | 控制周期(毫秒) |
| [out] | command | 控制命令输出向量 |
实现了 rm::lpss::ctl::ControlLawBase.
|
overridevirtualnoexcept |
重置状态