目 录
摘 要 I
Abstract II
1 文献综述 1
1.1 国外六足仿生机器人的发展情况 1
1.2 国内六足仿生机器人的发展情况 2
1.3 六足仿生机器人研究中存在的问题 2
1.4 六足仿生机器人的发展趋势 3
1.5 论文的主要内容 3
1.6 小结 4
2 六足仿生机器人的结构分析与步态规划 5
2.1 昆虫运动原理分析 5
2.2 六足仿生机器人六边形模型和长方形模型之间的比较 6
2.3 使用Inventor软件对六足仿生机器人实体造型 8
2.4 六足仿生机器人的结构分析 9
2.5 六足仿生机器人的步态规划 11
2.5.1 机器人坐标系的定义 11
2.5.2 六足仿生机器人腿的运动分析 12
2.5.3 牛顿―辛普森求解方法在运动求解中的应用 14
2.5.4 六足仿生机器人的直线行走步态 16
2.5.5 六足仿生机器人的转弯步态 18
2.5.6 六足仿生机器人的横向行走步态 19
2.5.7 六足仿生机器人的越障步态 20
2.6 小结 22
3 六足仿生机器人控制系统的硬件设计 23
3.1 舵机的原理与控制 23
3.2 控制系统的方案设计和选择 24
3.3 控制系统分析 25
3.3.1 主控芯片介绍 25
3.3.2 控制模块设计 27
3.3.3 电源模块设计 27
3.3.4 串口通信模块设计 28
3.3.5 无线通信模块 29
3.4 小结 30
4 六足仿生机器人控制系统的软件设计 31
4.1 控制系统的主程序 31
4.2 六足仿生机器人的单腿控制程序设计 32
4.3 六足仿生机器人的直线行走程序设计 33
4.4 六足仿生机器人的转弯程序设计 35
4.5 六足仿生机器人的越障程序设计 36
4.6 小结 37
5 结论与展望 38
参 考 文 献 40
致 谢 42
1.5 论文的主要内容
以六足仿生机器人为研究对象,研究了六足仿生机器人的控制系统。
(1)基于昆虫的身体结构和运动机理,给出了六足仿生机器人的简化结构模型。研究了六足仿生机器人的三足步态,详细分析了直线行走步态和转弯步态。
(2)对六足仿生机器人的矩形模型和六边形模型进行了分析比较。
(3)采用一片式解决方案,设计并制作了六足仿生机器人的硬件控制系统。系统具有良好的稳定性和可扩展性。
(4)采用Keil uVision3编写了六足仿生机器人控制系统的程序。通过编译、仿真、调试,实现了对六足仿生机器人的控制。
(5)对六足仿生机器人进行建模,使用Matlab进行系统仿真。并对程序进行移植,实现了六足仿生机器人的高实时性和高适应性的步态控制。
3 六足仿生机器人控制系统的硬件设计
六足仿生机器人有6条腿,而每条腿有3个转动关节,共计18个关节。每个关节由一个舵机驱动,因此需要18路PWM来控制这18个舵机。因此控制系统设计的关键是如何协调控制这18个舵机来实现直线行走和转弯等步态。此外,我们要设计的是能够自己计算生成步态所需数据并且能够根据需要实时调节步态的控制系统,所以主控芯片需要具有足够快的执行速度和良好的数学计算能力。
3.1 舵机的原理与控制
舵机又名伺服电机,是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。舵机可以在自动控制和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。
舵机的工作原理:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,脉冲宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。
舵机的控制需要一个周期20ms左右的脉冲,脉冲的高电平部分一般为0.5~2.5ms。如图3.1所示。
图3.1 舵机控制信号
输入信号的脉冲宽度和舵机输出转角之间呈线性对应关系,如图3.2所示。
图3.2 控制信号脉宽和舵机转角之间的关系
在我们的六足仿生机器人上使用的是MG995舵机,其参数如下:
1.尺寸:40.7×19.7×42.9mm
2.重量:55g
3.反应转速:无负载速度0.17s/60°(4.8V);0.13s/60°(6.0V)
4.工作死区:4us
5.工作电压:3.0~7.2V
6.工作扭矩:13kg·cm
7.使用温度:-30~+60℃
#include "spider.h"
#include "stm32f10x_init.h"void SPDRStructInit(SPIDER* spdr)
{spdr->Spdr_State = SPDR_STAT_NONE;spdr->Spdr_Height = 30.0;spdr->Right_Front_Leg.Height = spdr->Spdr_Height;spdr->Right_Front_Leg.Length = 140.0;spdr->Right_Front_Leg.anglenear = 90.0;spdr->Right_Front_Leg.Joint_Far = 540;spdr->Right_Front_Leg.Joint_Mid = 540;spdr->Right_Front_Leg.Joint_Near = 540;spdr->Right_Middle_Leg.Height = spdr->Spdr_Height;spdr->Right_Middle_Leg.Length = 140.0;spdr->Right_Middle_Leg.anglenear = 90.0;spdr->Right_Middle_Leg.Joint_Far = 540;spdr->Right_Middle_Leg.Joint_Mid = 540;spdr->Right_Middle_Leg.Joint_Near = 540;spdr->Right_Back_Leg.Height = spdr->Spdr_Height;spdr->Right_Back_Leg.Length = 120.0;spdr->Right_Back_Leg.anglenear = 90.0;spdr->Right_Back_Leg.Joint_Far = 540;spdr->Right_Back_Leg.Joint_Mid = 540;spdr->Right_Back_Leg.Joint_Near = 540;spdr->Left_Front_Leg.Height = spdr->Spdr_Height;spdr->Left_Front_Leg.Length = 140.0;spdr->Left_Front_Leg.anglenear = 90.0;spdr->Left_Front_Leg.Joint_Far = 540;spdr->Left_Front_Leg.Joint_Mid = 540;spdr->Left_Front_Leg.Joint_Near = 540;spdr->Left_Middle_Leg.Height = spdr->Spdr_Height;spdr->Left_Middle_Leg.Length = 140.0;spdr->Left_Middle_Leg.anglenear = 90.0;spdr->Left_Middle_Leg.Joint_Far = 540;spdr->Left_Middle_Leg.Joint_Mid = 540;spdr->Left_Middle_Leg.Joint_Near = 540;spdr->Left_Back_Leg.Height = spdr->Spdr_Height;spdr->Left_Back_Leg.Length = 120.0;spdr->Left_Back_Leg.anglenear = 90.0;spdr->Left_Back_Leg.Joint_Far = 540;spdr->Left_Back_Leg.Joint_Mid = 540;spdr->Left_Back_Leg.Joint_Near = 540;
}void SPDRChangeHeight(SPIDER *spdr,double newheight)
{spdr->Spdr_Height = newheight;spdr->Right_Front_Leg.Height = newheight;spdr->Right_Middle_Leg.Height = newheight;spdr->Right_Back_Leg.Height = newheight;spdr->Left_Front_Leg.Height = newheight;spdr->Left_Middle_Leg.Height = newheight;spdr->Left_Back_Leg.Height = newheight;
}void SPDRRenovateAllData_H(SPIDER* spdr)
{TIM_RFLJfarRenovate(spdr->Right_Front_Leg.Joint_Far);TIM_RFLJmidRenovate(spdr->Right_Front_Leg.Joint_Mid);TIM_RFLJnearRenovate(spdr->Right_Front_Leg.Joint_Near);TIM_RMLJfarRenovate(spdr->Right_Middle_Leg.Joint_Far);TIM_RMLJmidRenovate(spdr->Right_Middle_Leg.Joint_Mid);TIM_RMLJnearRenovate(spdr->Right_Middle_Leg.Joint_Near);TIM_RBLJfarRenovate(spdr->Right_Back_Leg.Joint_Far);TIM_RBLJmidRenovate(spdr->Right_Back_Leg.Joint_Mid);TIM_RBLJnearRenovate(spdr->Right_Back_Leg.Joint_Near);TIM_LFLJfarRenovate(spdr->Left_Front_Leg.Joint_Far);TIM_LFLJmidRenovate(spdr->Left_Front_Leg.Joint_Mid);TIM_LFLJnearRenovate(spdr->Left_Front_Leg.Joint_Near);TIM_LMLJfarRenovate(spdr->Left_Middle_Leg.Joint_Far);TIM_LMLJmidRenovate(spdr->Left_Middle_Leg.Joint_Mid);TIM_LMLJnearRenovate(spdr->Left_Middle_Leg.Joint_Near);TIM_LBLJfarRenovate(spdr->Left_Back_Leg.Joint_Far);TIM_LBLJmidRenovate(spdr->Left_Back_Leg.Joint_Mid);TIM_LBLJnearRenovate(spdr->Left_Back_Leg.Joint_Near);
}void SPDRRenovateAllData_S(SPIDER* spdr,u16* array)
{spdr->Right_Front_Leg.Joint_Far = array[0];spdr->Right_Front_Leg.Joint_Mid = array[1];spdr->Right_Front_Leg.Joint_Near = array[2];spdr->Right_Middle_Leg.Joint_Far = array[3];spdr->Right_Middle_Leg.Joint_Mid = array[4];spdr->Right_Middle_Leg.Joint_Near= array[5];spdr->Right_Back_Leg.Joint_Far = array[6];spdr->Right_Back_Leg.Joint_Mid = array[7];spdr->Right_Back_Leg.Joint_Near = array[8];spdr->Left_Front_Leg.Joint_Far = array[9];spdr->Left_Front_Leg.Joint_Mid = array[10];spdr->Left_Front_Leg.Joint_Near = array[11];spdr->Left_Middle_Leg.Joint_Far = array[12];spdr->Left_Middle_Leg.Joint_Mid = array[13];spdr->Left_Middle_Leg.Joint_Near = array[14];spdr->Left_Back_Leg.Joint_Far = array[15];spdr->Left_Back_Leg.Joint_Mid = array[16];spdr->Left_Back_Leg.Joint_Near = array[17];
}