目录
笔者在看灯哥较新版的四足机器人控制程序中,观察到他没有向往常一样使用的
传统的摆线轨迹
,而是采用
分段多项式
进行足端轨迹规划。其中引入了
摆动相抬腿速度
作为轨迹规划的一个影响因素,提高了其自适应能力,这跟笔者之前写到的足端轨迹规划文章中的三次多项式规划方式有相同的思想。
一、 规划方案:
考虑到灯哥的py-apple为八自由度四足机器人,因此我们只考虑机器人前进方向和竖直方向,将前进方向定为x轴,竖直方向定为z轴。
并定义下列参数含义:
- t: 当前时间
- Tf: 摆动相时间
- xt: 摆动相在x轴方向上的目标位置
- zh: 摆动相在z轴方向上的抬腿高度
- x0: 摆动腿在x轴上初始位置
- z0: 摆动相在z轴上初始位置
- xv0:摆动相抬腿前腿的瞬时速度
1、x轴规划
(1) 当
并且
时:
(2) 当
并且
时:
(3)当
时:
2、z轴规划
(1) 当
并且
时:
(2)当
时:
二、灯哥源代码:
def swing_curve_generate(t,Tf,xt,zh,x0,z0,xv0):
# X Generator
if t>=0 and t<Tf/4:
xf=(-4*xv0/Tf)*t*t+xv0*t+x0
if t>=Tf/4 and t<(3*Tf)/4:
xf=((-4*Tf*xv0-16*xt+16*x0)*t*t*t)/(Tf*Tf*Tf)+((7*Tf*xv0+24*xt-24*x0)*t*t)/(Tf*Tf)+((-15*Tf*xv0-36*xt+36*x0)*t)/(4*Tf)+(9*Tf*xv0+16*xt)/(16)
if t>(3*Tf)/4:
xf=xt
# Z Generator
if t>=0 and t<Tf/2:
zf=(16*z0-16*zh)*t*t*t/(Tf*Tf*Tf)+(12*zh-12*z0)*t*t/(Tf*Tf)+z0
if t>=Tf/2:
zf=(4*z0-4*zh)*t*t/(Tf*Tf)-(4*z0-4*zh)*t/(Tf)+z0
#Record touch down position
x_past=xf
t_past=t
# # Avoid zf to go zero
if zf<=0:
zf=0
#x,z position,x_axis stop point,t_stop point;depend on when the leg stop
return xf,zf,x_past,t_past
三、MATLAB复现
考虑到在该程序中,无法实时监测摆动腿速度,因此我们将xv0设置为定值,其他参数也任意初始化。
MATLAB源程序:
Tf = 0.5;
xv0 =1;
xt = 8;
zh = 4;
x0 = 0;
z0 = 0;
xf = zeros(1,length([0:0.01:Tf]));
zf = zeros(1,length([0:0.01:Tf]));
i=1;
k=1;
for t = 0:0.001:Tf
if(t>=0&&t<Tf/4)
xf(i) = (-4*xv0/Tf)*t*t+xv0*t+x0;
i=i+1;
elseif(t>=Tf/4&&t<(3*Tf)/4)
xf(i) = ((-4*Tf*xv0-16*xt+16*x0)*t*t*t)/(Tf*Tf*Tf)+((7*Tf*xv0+24*xt-24*x0)*t*t)/(Tf*Tf)+((-15*Tf*xv0-36*xt+36*x0)*t)/(4*Tf)+(9*Tf*xv0+16*xt)/(16);
i=i+1;
elseif(t>=(3*Tf)/4)
xf(i) =xt;
i=i+1;
end
if(t>=0&&t<Tf/2)
zf(k) = (16*z0-16*zh)*t*t*t/(Tf*Tf*Tf)+(12*zh-12*z0)*t*t/(Tf*Tf)+z0;
if(zf(k)<0)
zf(k)=0;
end
k=k+1;
elseif(t>=Tf/2)
zf(k) = (4*z0-4*zh)*t*t/(Tf*Tf)-(4*z0-4*zh)*t/(Tf)+z0;
if(zf(k)<0)
zf(k)=0;
end
k=k+1;
end
end
subplot(3,1,1);
plot(xf,zf,'m-','LineWidth',2);
xlim([-1 max(xf)+1]);
ylim([0 max(zf)+1]);
xlabel('x');
ylabel('z');
subplot(3,1,2);
t = 0:0.001:Tf;
plot(t,xf,'b--','LineWidth',2);
xlabel('t');
ylabel('x');
ylim([0 max(xf)+1]);
subplot(3,1,3);
plot(t,zf,'g-','LineWidth',2);
xlabel('t');
ylabel('z');
ylim([0 max(zf)+1]);
想知道其他轨迹规划方法的友友可以看我的这一篇文章:
四足机器人学习笔记(足端轨迹规划)_某只旺仔的博客-CSDN博客_足端轨迹