六足机器人步态过程分析及控制

目录

前言

一、遇到的问题

二、运动过程

三、协调运动

四、步态控制

五、结语


前言

经过了几个STM32的小项目,积攒了一些项目经验,决定做一个六足机器人,购买完舵机和支架组装好机器人,随后就开始了项目。六足机器人可以使用D-H建立模型构建运动学坐标系,再正逆运动学解算腿部末端的位置与各个关节角度的关系式,也可以使用几何法来分析出关系式。网上很容易找到,就不赘述了,这里用C语言直接表示出来。

#include "stdio.h"
#include "math.h"

//六足机器人腿上的三根连轴 
#define L1 45
#define L2 73
#define L3 115


float get_angle1(float x,float y,float z)
{
	double angle;
	angle=atan2(y,x);
	return angle;  
}
/*   注释部分时利用几何法解算的 
float get_angle2(float x,float y,float z)
{
	float angle;
	float R = sqrt(pow(x, 2) + pow(y, 2));
	float Lr=sqrt(pow(z, 2) + pow((R - L1), 2));
	float ar = atan(-z / (R - L1));                                                                                                                                                                                                              
	float a1=acos((pow(L2, 2) + pow(Lr, 2) - pow(L3, 2)) / (2 * Lr * L2));

	angle=a1-ar;

	return angle;
}

float get_angle3(float x,float y,float z)
{
	float angle;
	float R = sqrt(pow(x, 2) + pow(y, 2));
	float Lr=sqrt(pow(z, 2) + pow((R - L1), 2));
	float a1=acos((pow(L2, 2) + pow(Lr, 2) - pow(L3, 2)) / (2 * Lr * L2));
	float a2=acos((pow(Lr, 2) + pow(L3, 2) - pow(L2, 2)) / (2 * Lr * L3));

	angle=-(a1 + a2);
	
	return angle;
}
*/

//该部分时逆运动学解算的 
float get_angle2(float x,float y,float z)
{
	float data= L1-sqrt(pow(x,2)+pow(y,2)) ; 
	float a = (pow(L2,2)-pow(L3,2)+pow(data,2)+pow(z,2) )/(2*L2*sqrt( pow(data,2) +pow(z,2)));
	float b = z/data;
	float angle = acos(a)-atan(b);
	return angle;
}


float get_angle3(float x,float y,float z)
{
	float data= L1-sqrt(pow(x,2)+pow(y,2)) ; 
	float a = (pow(L2,2)-pow(L3,2)+pow(data,2)+pow(z,2) )/(2*L2*sqrt( pow(data,2) +pow(z,2)));
	float b = (pow(L3,2)-pow(L2,2)+pow(data,2)+pow(z,2) )/(2*L3*sqrt( pow(data,2) +pow(z,2)));
	
	float angle=-acos(a)-acos(b);
	
	return angle;
}


//正运动学结算 
float get_x(float angle1,float angle2,float angle3)
{
	return cos(angle1)*( L1+L3*cos(angle2+angle3)+L2*cos(angle2) );
}

float get_y(float angle1,float angle2,float angle3)
{
	return sin(angle1)*(L1+L3*cos(angle2+angle3)+L2*cos(angle2));
}

float get_z(float angle1,float angle2,float angle3)
{
	return L3*sin(angle2+angle3)+L2*sin(angle2);
}

int main(void)
{
    float angle1,angle2,angle3;
	float x,y,z;
	
	//逆运动学解算 
	angle1=get_angle1(100,100,-80);
	angle2=get_angle2(100,100,-80);
	angle3=get_angle3(100,100,-80);

	printf("angle1:%f\r\n",angle1* (180.0 / M_PI));
 	printf("angle2:%f\r\n",angle2* (180.0 / M_PI));
	printf("angle3:%f\r\n",angle3* (180.0 / M_PI));
	
	//正运动学结算 
	x=get_x(angle1,angle2,angle3);
	y=get_y(angle1,angle2,angle3);	
	z=get_z(angle1,angle2,angle3);
	
	printf("x:%f\r\n",x);
 	printf("y:%f\r\n",y);
	printf("z:%f\r\n",z);
	
    return 0;
}


查找资料的时候在嘉立创开源广场看到了一位大佬做的六足,我的六足机器人的姿态和位置控制就看大佬的PDF写的,如果大家想做六足机器人,建议先看一下这位大佬写的PDF,再来看这篇文章。 链接:十二分感谢这位佬icon-default.png?t=O83Ahttps://oshwhub.com/ryzee/Hexapod-robot

一、遇到的问题

看完这位佬的PDF里面的全向移动,我知道了全向移动时六条腿的落脚点位置如何解算出来的了,但还不知道这个运动过程是如何完成的,还有让这六条腿协调运动以及步态控制,经过一些时间的思考,想出了一个解决办法,先上图,下面是我的六足机器人步态时序图。(随手画的,有些潦草,见谅)       

二、运动过程

黑色部分是抬腿在空中向前滑动至落脚点的时间(摆动相),白色部分是在地面上向后滑动的时间(站立相)   

我认为控制这个步态应该从时间上入手,以黑色部分是抬腿在空中滑动至落脚点(这个运动过程我称为运动一)的时间,为一个时间节拍白色部分是在地面上向后滑动(这个运动过程我称为运动二)的时间,跟据不同的步态分别为一个时间节拍,两个时间节拍和五个时间节拍。可以通过控制一个节拍的时间,来控制住机器人运动的快慢。

先解决从抬腿点移动至落腿点这个运动,如何使运动一的时间刚好为一个节拍呢,相信下面的公式大家都知道

           \left\{\begin{matrix}x=x_{0}+v_{x}*t & & \\ y=y_{0}+v_{y }*t & & \end{matrix}\right.      

从X-Y平面上看,因为已经知道了落脚点的位置(x_{1},y_{1 }),那么就将落脚点的位置减去抬脚点x_{0}y_{0})的位置则就可以得到两点间的位移(\triangle x,\triangle y),再将位移除以一个时间节拍就可以得到速度v_{x}v_{y}了,开始运动时就定时器中断计时得到时间,将时间和速度带入公式当中就可以得到每时每刻的位置坐标(x,y),一个时间节拍结束后就可以精准达到落脚点的位置了。

                

解决了起点到达落脚点,但还没有将抬腿运动这个问题解决,这里我取了个巧(感觉有点随意了),我感觉抬腿的动作有点像y=\sin x函数在[0,\Pi ]范围内波形,于是抬腿的函数就出来了。这里将抬腿的高度与需要移动的距离(\sqrt{\Delta x^{2}+\Delta y^{2}})成正比,还需根据自己请况调整比例系数K的大小。 

 h=K*\sqrt{\Delta x^{2}+\Delta y^{2}}\sin ( \frac{\sqrt{x^{2}+y^{2}}}{\sqrt{\Delta x^{2}+\Delta y^{2}}}*\Pi )

OK,现在从起点抬腿在落点落腿这个运动解决了,那在地面上从划落点又划到起点怎么办呢,这个很好办,其实也跟上面的运动一样,只需将运动二的时间根据不同的步态调整为不同的时间,并且没有抬腿的动作,这个动作就完成了。

三、协调运动

在运动过程中,会积累一些误差导致运动不协调。为了解决这个问题,我在抬腿运动的起始点添加了一些条件判断。在开始抬腿动作时,会检查其他腿是否已经按照步态图的要求到达各自的位置。如果有腿尚未到位,会进行短暂等待(这段时间非常短,不会对整个运动过程产生影响)。一旦所有腿都到达位置,便会开始执行抬腿动作。

四、步态控制

在开始运动时会根据步态图将腿的状态放在时间线上不同位置,假设开始四角步态运动时,Leg1、Leg4在时间线上的起始处,Leg3、Leg6在时间线上的三分之二处(超前Leg1、Leg4一个时间节拍),Leg2、Leg5在时间线上的三分之一处(滞后Leg1、Leg4一个时间节拍),其他的步态以此类推。

六足机器人运动视频

 

五、结语

以上内容是在制作六足机器人遇到的一些问题和个人解决问题的方法措施,也希望大家能够通过这篇文章解决问题和疑惑。

<think>好的,我现在需要帮助用户解决关于五连杆机构运动学解算的问题。首先,用户提到的是腿部五连杆机构,这可能用于机器人或仿生机械腿,所以应用场景可能是行走或运动控制。用户的需求是寻找运动学解算的方法或算法,可能包括正向和逆向运动学,以及如何在仿真中应用。 首先,我需要回忆五连杆机构的基本结构。五连杆通常由五个刚性杆件通过旋转或移动副连接,形成闭环结构。在腿部应用中,可能有两个驱动关节,比如髋关节和膝关节,其余三个是被动关节,形成闭环链。这种情况下,需要建立运动学模型来计算末端执行器的位置,比如脚部的位置。 接下来,考虑正向运动学。正向运动学是根据关节角度计算末端位置。对于五连杆,可能需要使用几何法或DH参数法。但五连杆是闭环结构,传统DH参数适用于开链,所以可能需要拆分成两个开链,再结合闭环约束方程。例如,将五连杆拆分为两个四杆机构,分别计算末端位置,再通过约束条件求解。 然后是逆运动学,即已知末端位置求关节角度。逆解通常更复杂,尤其是闭环机构。可能需要数值迭代方法,如牛顿-拉夫森法,或者解析法,如果可能的话。用户提到的引用[3]中提到了几何法和代数法,可能适用于这里。比如,使用几何法分解问题,应用三角函数和几何关系来解算角度。 另外,用户提供的引用[2]提到四连杆的正向运动学算法,这可能对五连杆有帮助。四连杆通常用几何推导,五连杆可能需要类似但更复杂的方法。例如,建立坐标系,使用向量或坐标变换,结合闭环条件来解方程。 需要注意五连杆的自由度。通常闭环机构自由度计算为3n - 2j - h,其中n是连杆数,j是关节数,h是螺旋副等。但可能需要具体分析。如果五连杆有两个驱动关节,那么自由度是2,因此逆解需要两个输入参数。 在仿真方面,可能需要使用MATLAB、Simulink或ROS中的运动学库,或者自己编写算法。例如,用Python的NumPy处理矩阵运算,或者使用Robotics Toolbox进行建模。 可能的步骤包括: 1. 建立五连杆的几何模型,确定各关节坐标。 2. 拆分为两个开链,建立正向运动学方程。 3. 添加闭环约束,解方程组得到被动关节角度。 4. 对于逆运动学,使用数值方法或几何分解。 5. 验证算法,进行仿真测试。 还需要考虑奇异点、多解情况,以及计算效率,因为实时控制可能需要快速解算。 用户可能还需要知道如何具体实施,比如代码示例或具体公式。需要参考引用中的四连杆方法,扩展到五连杆。例如,引用[2]的四连杆使用几何推导,五连杆可能需要分解为两个四杆机构,或者引入额外的约束方程。 总结:五连杆的运动学解算需要结合闭环结构的几何分析,可能拆分为开链并应用约束,使用解析法或数值法求解。正向和逆运动学都需要处理多变量方程组,可能需要迭代或几何分解。</think>### 五连杆机构运动学解算方法详解 五连杆机构是闭环系统中常见的多自由度机构,其运动学解算需结合几何分析、代数方程与数值优化。以下是分步解析: --- #### **一、五连杆机构基础模型** 假设腿部五连杆由两个主动关节(如髋关节$q_1$、膝关节$q_2$)和三个被动关节构成,形成闭环链。需建立坐标系: 1. 以基座为原点$O$,定义各连杆长度$L_1, L_2, L_3, L_4, L_5$。 2. 主动关节角度为$q_1, q_2$,被动关节角度为$\theta_3, \theta_4, \theta_5$。 3. 末端执行器位置为$P(x,y)$。 --- #### **二、正向运动学解算** 目标:已知$q_1, q_2$,求末端位置$P(x,y)$。 1. **拆分闭环为开链** 将五连杆拆分为两条独立链: - 链1:$O \rightarrow L_1(q_1) \rightarrow L_2 \rightarrow P$ - 链2:$O \rightarrow L_4(q_2) \rightarrow L_3 \rightarrow P$ $$ \begin{cases} x = L_1 \cos q_1 + L_2 \cos \theta_3 \\ y = L_1 \sin q_1 + L_2 \sin \theta_3 \\ x = L_4 \cos q_2 + L_3 \cos \theta_4 \\ y = L_4 \sin q_2 + L_3 \sin \theta_4 \\ L_5 \text{闭合约束}: \sqrt{(x - x_5)^2 + (y - y_5)^2} = L_5 \end{cases} $$ 2. **联立方程求解** 通过联立方程消去$\theta_3, \theta_4$,结合数值法(如牛顿迭代)求解$x,y$[^2]。 --- #### **三、逆运动学解算** 目标:已知$P(x,y)$,求$q_1, q_2$。 1. **几何分解法** 将五连杆分解为两个四杆机构,利用几何关系(如余弦定理)计算主动关节角度: $$ \cos q_1 = \frac{x^2 + y^2 + L_1^2 - L_2^2}{2 L_1 \sqrt{x^2 + y^2}} $$ 2. **数值优化法** 若解析解复杂,可采用梯度下降或雅可比矩阵迭代逼近目标位置[^3]。 --- #### **四、算法实现与仿真** 1. **代码示例(Python伪代码)** ```python import numpy as np def forward_kinematics(q1, q2, L): # 定义连杆长度 L = [L1, L2, L3, L4, L5] # 数值法求解闭环约束方程 def equations(vars): x, y = vars eq1 = L[0]*np.cos(q1) + L[1]*np.cos(theta3) - x eq2 = L[0]*np.sin(q1) + L[1]*np.sin(theta3) - y # ...其他约束方程 return [eq1, eq2] # 使用牛顿迭代法求解 from scipy.optimize import fsolve solution = fsolve(equations, initial_guess) return solution ``` 2. **仿真工具** - MATLAB/Simulink:利用Simscape Multibody搭建物理模型。 - ROS + MoveIt!:集成运动学求解器进行路径规划。 - CoppeliaSim(V-REP):可视化仿真与碰撞检测。 --- #### **五、关键问题与优化** 1. **多解与奇异点** 需筛选符合物理约束的解,并避开雅可比矩阵奇异位形。 2. **实时性优化** 采用预计算查找表(LUT)或神经网络加速解算[^2]。 3. **误差补偿** 引入传感器反馈(如IMU)修正运动学模型误差。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值