【四足机器人】学习笔记 足端轨迹规划和步态规划

【四足机器人】学习笔记 足端轨迹规划和步态规划

近期,博主在古月居学习关于四足机器人的相关部分知识,从阳炼老师的四足机器人控制与仿真课程中学习到了很多内容,故在这里对四足机器人的四足运动控制部分进行相应的梳理。
博主在这篇文章中,对四足机器人的足端轨迹规划和步态规划进行了详细的介绍。

一、足端轨迹规划(摆线)

在了解四足机器人的足端轨迹规划前,我们要先了解关于摆线的相关知识,博主这里研究的四足机器人的足端轨迹规划与摆线有很大关联,通过研究摆线的轨迹,可以探究四足机器人足端的运动轨迹,并实验在不同参数下,不同的足端运动轨迹之间的优劣。

摆线,又称旋轮线、圆滚线,在数学中,摆线(Cycloid)被定义为,一个圆沿一条直线运动时圆便捷上一定点所形成的的轨迹,数学公式表示如下:
在这里插入图片描述

x=r*(t-sin(t))
y=r*(1-cos(t))

x对应于横向长度,y对应于纵向长度,t对应于累计弧度,范围为[0,2π],对这个式子做相应的变换,得到下列关系式

//xs为起始位置,xf为终点位置
xt=(xf-xs)*(σ-sin(σ))/2Π+xs
//h为最高位置,zs为起始高度
zt=h*(1-cos(σ))+zs
σ=2Πt/(λTs)0<t<λTs

通过式子的变换,可以通过给定的参数,可以在matlab中观察摆线轨迹,从而研究足端的运动控制。

二、步态规划

足式运动的步态是指腿的摆动和支撑运动以及这些运动之间的相对时间关系。不同的步态规则决定了不同的足式运动方式,从而形成了不同的步态形式。
目前对步态的研究主要是为了实现机器人的稳定周期运动。研究的重点是具体的步态规划方法。传统步态规划内容包括足端轨迹规划,以及协调腿和腿之间运动的相对时间关系,也就是步态时序。其中,足端运动轨迹还包括摆线相轨迹和支撑相轨迹,两者决定了单个腿的运动特征;而规划不同的步态时序就对应了机器人整体的不同步态形式。
按照平衡方式来分,四足机器人的步态可以分为静态步态,动态步态和准静态步态三种。博主在这里,主要介绍Walk步态和Trot步态。

1.Walk步态

Walk步态是一种静态步态,即在运动过程中始终有三条腿处于支撑相,至多只有一条腿处于摆动相,四足动物在walk步态中四条腿最常见的轮换顺序为1→3→4→2→1。
在这里插入图片描述
在一个运动周期内,四条腿的抬起时刻为φ1=0,φ2=φ+0.5,φ3=φ,φ4=0.5,1-p为处于摆动相的时间,但是1-p一定要小于φ,因为只有这样,walk步态才成立。
在这里插入图片描述

在这里插入图片描述

2.Trot步态

Trot步态是一种动态步态,适用于中低速跑动,并且具有比较大的运动速度范围,另一个重要特征是在中等速度下的Trot步态具有最高的能量效率。这些优点使得Trot步态成为最常用的四足步态。
在这里插入图片描述
Trot步态的特征是以对角的两条腿成对运动,即腿1和腿3运动一致,腿2和腿4运动一致,理想情况下对角腿同时抬起并同时着地。
在一个运动周期内,四条腿的抬起时刻为φ1=0,φ2=0.5,φ3=0,φ4=0.5,1-p为处于摆动相的时间,但是1-p一定要小于φ,因为只有这样,Trot步态才成立。在这里插入图片描述
Trot步态的一种临界状态是当p=φ=0.5,任意时刻都只有两条腿处于摆动相和支撑相,是Trot步态中最为理想的状态。
以上就是关于四足机器人足端轨迹规划和步态规划的全部知识了。

机器人的交替步态算法主分为两个步骤腿部运动规划步态控制。下面是一个基于C语言的示代码,供参考。 ` #include <stdlib.h> #include <stdio.h> #include <math.h> #define PI 3.1415926 // 机器人参数 #define LEG_LENGTH 10.0 // 腿长 #define BODY_WIDTH 20.0 // 身体宽度 #define BODY_LENGTH 30.0 // 身体长度 #define GROUND_HEIGHT 0.0 // 地面高度 // 步态参数 #define STEP_HEIGHT 5.0 // 步高 #define STEP_LENGTH 20.0 // 步长 #define SWING_TIME 0.5 // 摆动时间 #define STANCE_TIME 1.0 // 支撑时间 // 腿部运动规划 void legMotionPlanning(double t, double *x, double *y, double *z) { // 计算腿部位置 double angle = 2 * PI * t / STANCE_TIME; *x = LEG_LENGTH * cos(angle); *y = 0.0; *z = LEG_LENGTH * sin(angle); // 如果在摆动期间,将腿部提高 if (t < SWING_TIME) { *z += STEP_HEIGHT * sin(PI * t / SWING_TIME); } } // 步态控制 void gaitControl(double t, double *x, double *y, double *z) { // 计算身体位置 double bodyX = BODY_LENGTH / 2.0 * sin(2 * PI * t / STANCE_TIME); double bodyY = BODY_WIDTH / 2.0 * sin(4 * PI * t / STANCE_TIME); double bodyZ = GROUND_HEIGHT; // 计算腿部位置 double legX, legY, legZ; if (t < STANCE_TIME / 2.0) { // 支撑期间,前两条腿后两条腿交替运动 legMotionPlanning(t, &legX, &legY, &legZ); x[0] = bodyX - BODY_LENGTH / 2.0; y[0] = bodyY - BODY_WIDTH / 2.0; z[0] = bodyZ; x[1] = bodyX - BODY_LENGTH / 2.0; y[1] = bodyY + BODY_WIDTH / 2.0; z[1] = bodyZ; x[2] = bodyX + BODY_LENGTH / 2.0; y[2] = bodyY - BODY_WIDTH / 2.0; z[2] = bodyZ + STEP_HEIGHT; x[3] = bodyX + BODY_LENGTH / 2.0; y[3] = bodyY + BODY_WIDTH / 2.0; z[3] = bodyZ + STEP_HEIGHT; } else { // 摆动期间,前两条腿后两条腿再次交替运动 legMotionPlanning(t - STANCE_TIME / 2.0, &legX, &legY, &legZ); x[0] = bodyX + BODY_LENGTH / 2.0; y[0] = bodyY - BODY_WIDTH / 2.0; z[0] = bodyZ + STEP_HEIGHT; x[1] = bodyX + BODY_LENGTH / 2.0; y[1] = bodyY + BODY_WIDTH / 2.0; z[1] = bodyZ + STEP_HEIGHT; x[2] = bodyX - BODY_LENGTH / 2.0; y[2] = bodyY - BODY_WIDTH / 2.0; z[2] = bodyZ; x[3] = bodyX - BODY_LENGTH / 2.0; y[3] = bodyY + BODY_WIDTH / 2.0; z[3] = bodyZ; } // 添加腿部运动 x[0] += legX; y[0] += legY; z[0] += legZ; x[1] += legX; y[1] += legY; z[1] += legZ; x[2] += legX; y[2] += legY; z[2] += legZ; x[3] += legX; y[3] += legY; z[3] += legZ; } int main() { double t = 0.0; while (1) { // 计算机器人位置 double x[4], y[4], z[4]; gaitControl(t, x, y, z); // 输出机器人位置 printf("Time: %f\n", t); for (int i = 0; i < 4; i++) { printf("Leg %d: (%f, %f, %f)\n", i+1, x[i], y[i], z[i]); } printf("\n"); // 更新时间 t += 0.01; if (t >= STANCE_TIME) { t = 0.0; } } return 0; } ``` 在这个示例代码中,我们首先定义了机器人步态的参数。在腿部运动规划中,我们计算了每条腿的位置,包括在摆动期间将腿部提高的情况。在步态控制中,我们计算了机器人的身体位置,并根据支撑期间摆动期间将前两条腿后两条腿交替运动。最后,我们将腿部位置添加到机器人位置中,并输出结果。通过不断更新时间,我们可以模拟机器人的运动过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值