目录
1 概述 1
1.1 研究背景及意义 1
1.2 机器人的应用领域及发展现状 1
1.2.1 应用领域 1
1.2.2 发展现状 1
1.3 双足机器人设计要求 2
1.3.1 硬件部分 2
1.3.2 软件部分 2
2 系统方案设计 3
2.1 主控芯片选择 3
2.2 机器人自由度选择 3
2.3 驱动方案选择 3
2.4 双足机器人的步态规划 4
2.5 双足机器人的步态设计 4
3 双足机器人的硬件设计 5
3.1 硬件系统结构 5
3.2 单片机控制模块 5
3.3 稳压驱动模块 6
3.4 舵机模块 7
4 双足机器人的软件设计 9
4.1 编程软件 9
4.2 程序设计 10
4.2.1 程序流程图 10
4.2.2 主程序 10
4.2.3 关节测试程序 11
4.2.4 行走程序 12
4.2.5 动作程序 12
5 调试 15
6 总结 18
参考文献 19
致谢 20
附录 21
2系统方案设计
2.1主控芯片选择
方案1:采用STC89C51单片机作为控制芯片。51单片机技术成熟、功耗低、价格低廉,但是STC89C51为八位单片机,运算速度相对较慢,实时性较差,复杂控制算法难以实现实时性控制,不利于精度高的控制。
方案2:采用STC15W4K56S4单片机作为控制芯片。该单片机为新一代的51单片机,指令完全兼容传统的8051,但运算速度远胜于8051。且STC15W4K56S4单片机内部具有6个独立的PWM波形发生器,能够自行根据用户需求产生脉宽调制信号(PWM)波形。
综上所述,虽然STC89C51单片机在成本上较为低廉,但处理速度较慢,难以实现复杂的控制算法的实时性,在高精度控制上力不从心,因此在芯片选择上选择方案2的STC15W4K56S4单片机作为控制芯片。
2.2机器人自由度选择
双足步行机器人的行走必须依赖自身的舵机关节,关节数量越多其灵活性就越高,同时对其的控制难度也就越大。人体的关节由于不是刚性物体而是柔性,因此具有相当高的自由度,而双足步行机器人若要实现行走需要至少4个自由度。根据设计要选择6自由度机器人作为本次设计的框架,在此基础上进行设计。本次设计中的6个自由度分别为2个踝关节、2个膝关节和2个髋关节。
2.3驱动方案选择
目前机器人的主流驱动方式大致分为液压驱动、气压驱动和电机驱动。液压驱动具有力矩大、相应速度快点的特点,但是其质量大,成本高昂;气压驱动具有相应速度快的特点但其稳定性较差,难以控制。并且液压和气压驱动主要用于大型设备当中,本系统作为小型设计系统则采用电机驱动的方式。
常用电机有步进电机、舵机和直流电机等。直流电机与步进电机的控制均较为复杂难以实现简单的精确控制,常用于较大型的机器人和巡线跟踪机器人,不适合本次设计的小型双足步行机器人,故选用舵机。
舵机是一种精度高、安全性强、低成本且易于维修的角度伺服驱动器,十分的适合于角度需要不断变化并且能够保持的系统,最早使用于船模。能够通过PWM波进行角度的控制,具有较高的稳定性且便于单片机的编程和实际应用。
2.4双足机器人的步态规划
在双足步行机器人的研究过程中步态规划一项重要的工作。步态规划是指在机器人的行走过程中对其运动轨迹的规划,它能够直接影响行走过程中动作的流畅性、电机所需提供的力矩的大小及行走的稳定性等多个方面,同时也会直接影响到机器人在动作控制方面的难易程度。因此双足机器人的运动稳定性的好坏受步态规划的影响。
实现步态规划的主要方法有基于仿生学的步态规划方法、基于算法的步态规划方法、基于模型的步态规划方法。
(1)基于仿生学的步态规划方法,通过对人行走过程中的正面和侧面录像的分析,获得该人在行走过程中主要活动关节的角度变化,然后根据力学相似的原理把这些角度近似地应用到机器人的关节变化上。
(2)基于算法的步态规划方法,通过类似于遗传控制、神经网络、模糊控制的智能算法,提高仿人机器人的学习、容错和自适应能力从而改善对环境适应性差和学习能力不足的缺陷。
(3)基于模型的步态规划方法,通过建立一个严格遵从指令运动的理想刚性机构对步态进行规划。主要使用连杆模型、倒立摆模型和桌子-小车模型等。
2.5双足机器人的步态设计
为了保证双足步行机器人在行走过程中的稳定,要知道双足机器人的步态规则,需要保证机器人的重心在行走时不发生改变才能使机器人在行走过程中处于稳定状态。而双足步行机器人的行走过程能够分解成双脚支撑时期与单脚支撑时期的交替。所以,可以将步态的设计分为两个独立的阶段:
(1)摆动腿从支撑腿的后方摆动到支撑腿的前方。
(2)机器人的重心从原来的支撑腿移动到开始的摆动腿上。因此,在一个行走的周期中,机器人先右侧身,迈出左腿,落地后左侧身,再迈出右腿和落地。侧身的幅度根据机器人的机械结构和重心的位置决定,以此保证行走中的稳定。
双足机器人的硬件设计
3.1硬件系统结构
图3.1 系统结构
#include"stc15.h"
#include "config.h"
#include "delay.h"
#define CYCLE 20000L //定义PWM周期(最大为32767)
sbit move=P2^3; //PWM5设置到P4^2口,PWM3设置到P4^5口
sbit text=P2^4;
sbit dongzuo=P2^5;
sbit stop=P2^6; //低电平有效
sbit PWM2=P3^7;
sbit PWM3=P4^5;
sbit PWM4=P4^4;
sbit PWM5=P4^2;
sbit PWM6=P0^7;
sbit PWM7=P0^6;
void PWM_config();
void delay_ms(unsigned char ms);
void PWM2_Set(unsigned short Wide);
void PWM3_Set(unsigned short Wide);
void PWM4_Set(unsigned short Wide);
void PWM5_Set(unsigned short Wide);
void PWM6_Set(unsigned short Wide);
void PWM7_Set(unsigned short Wide);
void key();
void zhanli();
void resetbody();
void turndown2(unsigned short x,unsigned short y);
void turndown3(unsigned short x,unsigned short y);
void turndown4(unsigned short x,unsigned short y);
void turndown5(unsigned short x,unsigned short y);
void turndown6(unsigned short x,unsigned short y);
void turndown7(unsigned short x,unsigned short y);
unsigned short xianzhuang2,xianzhuang3,xianzhuang4,xianzhuang5,xianzhuang6,xianzhuang7;
unsigned short angle2,angle3,angle4,angle5,angle6,angle7;
unsigned short a2,a3,a4,a5,a6,a7;
unsigned short mun,i;
void main()
{
PWM_config();
delay_ms(20);
zhanli();
mun=0;
while(1)
{
key();
}
}