RMVL  2.5.0-dev
Robotic Manipulation and Vision Library
载入中...
搜索中...
未找到
rm::lpss::ctl::FeedForward类 参考final

【控制律组件】离散动态全补偿的前馈环节,适合在已知系统模型或有外部扰动补偿需求时使用 更多...

#include <rmvl/lpss/ctl/ff.hpp>

类 rm::lpss::ctl::FeedForward 继承关系图:
rm::lpss::ctl::FeedForward 的协作图:

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>

详细描述

【控制律组件】离散动态全补偿的前馈环节,适合在已知系统模型或有外部扰动补偿需求时使用

ff
图1:带前馈环节的反馈控制系统

上图所示, \(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\]

一般我们会使用双环反馈控制器来控制电机的位置,内环为速度环,外环为位置环,如下图所示:

motor
图2:带前馈的双环控制电机调速模型

其中, \(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\]

成员函数说明

◆ create()

ControlLawBase::ptr rm::lpss::ctl::FeedForward::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 )
inlinestaticnoexcept

创建离散前馈环节实例

参数
[in]a0前馈零阶项系数
[in]a1前馈一阶项系数
[in]a2前馈二阶项系数
[in]imapping输入采样映射,默认为基础位置映射
[in]omapping输出采样映射,默认为基础位置映射
返回
前馈环节独占指针
函数调用图:

◆ do_compute()

ControlStatus rm::lpss::ctl::FeedForward::do_compute ( const std::vector< double > & desired,
const std::vector< double > & fb,
int32_t period,
std::vector< double > & command )
overridevirtualnoexcept

执行一次控制计算

参数
[in]desired当前时刻期望状态向量
[in]fb当前反馈状态向量(此接口中未使用)
[in]period控制周期(毫秒)
[out]command控制命令输出向量
返回
控制计算状态

实现了 rm::lpss::ctl::ControlLawBase.

函数调用图:

◆ reset()

void rm::lpss::ctl::FeedForward::reset ( )
overridevirtualnoexcept

重置状态

实现了 rm::lpss::ctl::ControlLawBase.