后续过程中,我们定义参数p为Kp,second_ord_lim为加速度最大值
a
m
a
x
a_{max}
amax;后面部分用error表明位移量的误差,v表示速度进行推导。
首先,我们来带大家回顾一下高中知识,还记得高中小车问题里面,位移、速度、加速度和时间中如果已知其中几个量怎么求另外几个吗,我这边直接给出:
x
=
v
0
t
+
1
2
a
t
2
x=v_0t+\frac{1}{2}at^2
x=v0t+21at2
2
a
x
=
v
t
2
−
v
0
2
2ax=v_t^2-v_0^2
2ax=vt2−v02
那么回到我们的源程序中,我将直接从同时定义了Kp和二阶限制的else部分开始讲。
首先是这部分函数
float linear_dist = second_ord_lim /sq(p);
如前所述,
K
p
=
1
/
d
t
K_p=1/dt
Kp=1/dt,那么下面这段程序可以解释为如下(后面把
d
t
dt
dt简化表示为
t
t
t)
l
i
n
e
a
r
_
d
i
s
t
=
a
m
a
x
K
p
2
=
a
m
a
x
t
2
{linear\_dist}=\frac{a_{max}}{K_p^2}=a_{max}t^2
linear_dist=Kp2amax=amaxt2
c
o
r
r
e
c
t
i
o
n
_
r
a
t
e
=
2
a
m
a
x
(
e
r
r
o
r
−
(
l
i
n
e
a
r
_
d
i
s
t
2
)
)
=
2
a
m
a
x
(
e
r
r
o
r
−
a
m
a
x
t
2
2
)
correction\_rate=\sqrt{2a_{max}(error-(\frac{linear\_dist}{2}))}=\sqrt{2a_{max}(error-\frac{a_{max}t^2}{2}})
correction_rate=2amax(error−(2linear_dist))=2amax(error−2amaxt2)
假定初始速度
v
0
v_0
v0为0,那么由
2
a
x
=
v
t
2
2ax=v_t^2
2ax=vt2 和
x
=
1
2
a
t
2
x=\frac{1}{2}at^2
x=21at2 可进一步推算上面的公式
c
o
r
r
e
c
t
i
o
n
_
r
a
t
e
=
2
a
m
a
x
(
e
r
r
o
r
−
x
′
)
=
2
∗
a
m
a
x
∗
△
x
=
v
correction\_rate=\sqrt{2a_{max}(error-x')}=\sqrt{2*a_{max}*△x}=v
correction_rate=2amax(error−x′)=2∗amax∗△x=v
如果
e
r
r
o
r
error
error表示的是角度误差,角速度用
w
w
w表示的话,那么同样的
c
o
r
r
e
c
t
i
o
n
_
r
a
t
e
correction\_rate
correction_rate计算出来的即是期望的角速率,实际上姿态控制器中就是如此的计算。
function correction_rate =sqrt_controller(error,p,sencond_ord_lim,dt)if sencond_ord_lim<0|| sencond_ord_lim==0
rate = p.*error;
elseif p==0if error>0
rate =sqrt(2.*sencond_ord_lim.*error);
elseif error<0
rate =-sqrt(2.*sencond_ord_lim.*(-error));else
rate =0;
end
else
linear_dist = sencond_ord_lim/(p.*p);if error>linear_dist
rate =sqrt(2.*sencond_ord_lim.*(error-(linear_dist./2)));
elseif error<-linear_dist
rate =-sqrt(2.*sencond_ord_lim.*(-error-(linear_dist./2)));else
rate = p.*error;
end
end
if dt~=0if rate <-abs(error)/dt
correction_rate =-abs(error)./dt;
elseif rate >abs(error)/dt
correction_rate =abs(error)./dt;else
correction_rate = rate;
end
else
correction_rate = rate;
end
end
绘图程序:
Kp =4.5;
sencond_ord_lim =1.4;
dt =1;
R =zeros(1,401);
i =1;for error =-20:0.1:20
rate =sqrt_controller(error,Kp,sencond_ord_lim,dt);R(1,i)=rate;
i = i+1;
end
plot(-20:0.1:20,R);
grid on
ylabel("期望角速率")xlabel("angle error")