赞
踩
关键词:trot步态,walk步态,步态规划
目录
这篇文章介绍的是,这篇文章https://blog.csdn.net/weixin_41659552/article/details/113546299?spm=1001.2014.3001.5501中如红框所示的部分
步态:指机器人各腿依序进行抬腿、着地以及后蹬动作的一种行走方式。为了确保机器人在未受外界扰动的情况下能够稳定步行,需要进行步态规划。
摆动相:腿部抬起处于腾空的状态。
支撑相:腿部着地的状态。
周期:腿部完成抬腿迈步以及着地后蹬动作的时间。
步态频率:单位时间内完成的步态周期数。
步长:一个周期内,足端从抬腿到着地过程中走过的距离。
占空比:单腿处于支撑相的时间占整个周期的比值。
步幅:一个周期内,机身前进的距离。
单独看这些名词不好理解,我们就利用一个trot步态的例子进行讲解
经过上述的举例,我们已经明白了狗狗一条腿的摆腿顺序,和摆腿时间。但腿具体是怎样摆的,在空间划过怎样的曲线我们还不得而知,这个曲线可能有很多种,以下是我列的几种:
是的是的,前面 3 个是我夸张处理了,第四个和我们需要的但较为接近。
步态函数是一个以时间 t 为自变量,函数坐标 x 和 z 为因变量的函数,
它的物理意义就是在一个平面内,每个时间打一个点,打出的点可以大致连成一条曲线。
这条曲线的推导也并非是凭空捏造出来的,它的推导需要满足一定的条件,例如
对摆动相来说,为了减少对身体的冲击,需要保证轨迹方程在起始和结束时刻,X方向速度和加速度为零;在尽量降低起始的加速度的同时,速度不能过慢,故速度曲线应该是一段快速上升到平稳的曲线。
基于这样的一些要求,我们便可以使用待定系数法去求解一个,符合要求的曲线,首先设
其中 t 为时间,T 为周期。对式子进行积分,得
紧接着带入我们可以确定的值,如起始和结束时刻速度为 0 便可求得式子的参数。对求出的式子再积分一次,得出最终的步态曲线函数。
PA_TROT中采用的的是下图这个步态曲线函数,详细的介绍可以观看这个视频https://www.bilibili.com/video/BV1KQ4y1K7aV?from=search&seid=17567602001381485484)这个步态曲线函数是应该是从某个大佬的经过验证的论文中得来,大家直接拿来用就可以。
综上,我们知道了腿的摆腿顺序,摆腿时间和运动的轨迹,trot步态的基本原理就明白了,接下来就是程序实现。
首先,从原理到代码实现,应用前面章节的知识,我们应该明确输入量和输出量分别是什么?最基础的,我们应该知道当前的时间,抬腿的高度以及起始足端坐标和终点足端坐标,输出的值为足端坐标。
再按照上述理论的推导,一个周期内一组对角的腿一起迈出,然后另外一组对角的腿迈出。所以我们可以把周期设为一,占空比设为0.5。0~0.5个周期时,输出第1组坐标,0.5~1个周期输出第2组坐标。 因此我们首先用一个大的if为判断,看现在时间是属于哪个周期。当进入这个周期时,利用步态曲线函数计算出坐标,分别赋给对应的腿。
- faai=0.5
- Ts=1
-
- #函数功能:使用trot步态,生成足端坐标
- #变量作用:
- #t为当前时间
- #xs为起始足端坐标
- #xf为终点足端坐标
- #h为抬腿高度
- #r1,r2,r3,r4取值可以为1或者-1,代表曲线生成的正逆,用于控制转弯
- #返回值:足端坐标
- def cal_t(t,xs,xf,h,r1,r4,r2,r3): #小跑步态执行函数
- if t<=Ts*faai:
- sigma=2*pi*t/(faai*Ts)
- zep=h*(1-cos(sigma))/2
- xep_b=(xf-xs)*((sigma-sin(sigma))/(2*pi))+xs
- xep_z=(xs-xf)*((sigma-sin(sigma))/(2*pi))+xf
- #输出y
- y1=zep y2=0 y3=zep y4=0
- #输出x
- x1=-xep_z*r1 x2=-xep_b*r2 x3=-xep_z*r3 x4=-xep_b*r4
- return x1,x2,x3,x4,y1,y2,y3,y4
-
- elif t>Ts*faai and t<=Ts:
- sigma=2*pi*(t-Ts*faai)/(faai*Ts)
- zep=h*(1-cos(sigma))/2;
- xep_b=(xf-xs)*((sigma-sin(sigma))/(2*pi))+xs
- xep_z=(xs-xf)*((sigma-sin(sigma))/(2*pi))+xf
- #输出y
- y1=0 y2=zep y3=0 y4=zep
- #输出x
- x1=-xep_b*r1 x2=-xep_z*r2 x3=-xep_b*r3 x4=-xep_z*r4
- return x1,x2,x3,x4,y1,y2,y3,y4

其中狗腿对应表如下
——头——
1————2
4————3
我们还注意到,传入的参数的参数中,r1,r4,r2,r3会与 x 坐标相乘,这个是起什么作用呢?这是困惑了许久的问题。
我们翻阅整份程序,可以在web_c中找到这个值的源头,它是遥控器传入的值
大概意思是这样的 当value = left 时 L=-1;R=1 ;value = right 时 L=1;R=-1
当 L=-1;R=1时,r1 = r4 = L = -1;r2 = r3 = R = -1;x1,x4与原来的轨迹相反,x2,x3与原来的轨迹相同。
它意味着,机器人坐标左边的足端都会产生一条向后的轨迹,而机器人坐标右边的足端都会产生一条向前的轨迹,使机器人左边脚往后,右边脚往前,完成旋转的动作。
有了上述的原理基础,我们学习walk步态原理时就变得容易了。我们知道一个步态是由足端轨迹和步态对应的占空比构成。walk步态足端轨迹与trot相同,我就不再介绍。而walk步态的摆动相,支撑相,占空比如图所示
walk步态任何时候都有三条腿着地,四条腿分别依次迈,他们的抬腿顺序为:左前——右前——右后——左后,每个摆动相分别的占空比0.25。
此外,当三条腿支撑时,涉及到一个找零力矩点的问题。这个问题有点复杂,我简单说一下,希望大家能看得。由于三脚着地,与四脚着地或者两脚着地情况都不一样,重心不是在对角线上,而是在三脚着地点形成的三角形中。因此找到零力矩点后,我们便调整身体姿态,实现让重心向前移动,进而让机体向前移动。详细的原理可以看这篇文章《基于零力矩点的四足机器人非平坦地形下步态规划与控制》
walk步态代码实现的总体框架与trot步态差不多,输入量当前时间和抬腿高度是必不可少的,但还是存在其他的一些差异。
首先walk步态是 4 条腿分开抬,因此一个周期会被划分为四个分别计算四条腿的足端轨迹。其次因为需要调整重心,也需要传入身体姿态的值。
值得注意的是,由于程序中walk步态与trot步态的迈腿速度不一样,所以进循环的速度也不一样,trot步态的计时是在主循环中,而walk步态是写在了PA_WALK文件中的cal_w函数里。
以此类推,依次算出四条腿的值,即可。
四足仿生机器人控制系统的研究与设计 华中科技大学 程品
液压四足机器人驱动控制与步态规划研究 北京理工大学 王立鹏
电驱四足机器人步态规划及运动控制系统设计 安徽工业大学 崔越
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。