仿生六足机器人研究报告.docx
《仿生六足机器人研究报告.docx》由会员分享,可在线阅读,更多相关《仿生六足机器人研究报告.docx(24页珍藏版)》请在冰豆网上搜索。
仿生六足机器人研究报告
项目研究报告
——小型仿生六足探测机器人
一、课题背景:
仿生运动模式的多足步行机器人具有优越的越障能力,它集仿生学原理、机构学理论、自动控制原理与技术、计算机软件开发技术、传感器检测技术和电机驱动技术于一体。
不论在何种地面上行走,仿生六足机器人的运动都具有灵活性与变化性,但其精确控制的难度很大,需要有良好的控制策略与精密的轨迹规划,这些都是很好的研究题材。
二、项目创新点:
作为简单的关节型伺服机构,仿生六足机器人能够实现实时避障,合理规划行走路线。
简单的关节型机器人伺服系统不仅具有可批量制造的条件,作为今后机器人群系统的基本组成,也可以作为探索复杂伺服机构的研究对象。
三、研究内容:
1.仿生学原理分析:
仿生式六足机器人,顾名思义,六足机器人在我们理想架构中,我们借鉴了自然界昆虫的运动原理。
足是昆虫的运动器官。
昆虫有3对足,在前胸、中胸和后胸各有一对,我们相应地称为前足、中足和后足。
每个足由基节、转节、腿节、胫节、跗节和前跗节几部分组成。
基节是足最基部的一节,多粗短。
转节常与腿节紧密相连而不活动。
腿节是最长最粗的一节。
第四节叫胫节,一般比较细长,长着成排的刺。
第五节叫跗节,一般由2-5个亚节组成﹔为的是便于行走。
在最末节的端部还长着两个又硬又尖的爪,可以用它们来抓住物体。
行走是以三条腿为一组进行的,即一侧的前、后足与另一侧的中足为一组。
这样就形成了一个三角形支架结构,当这三条腿放在地面并向后蹬时,另外三条腿即抬起向前准备替换。
前足用爪固定物体后拉动虫体向前,中足用来支持并举起所属一侧的身体,后足则推动虫体前进,同时使虫体转向。
这种行走方式使昆虫可以随时随地停息下来,因为重心总是落在三角支架之内。
并不是所有成虫都用六条腿来行走,有些昆虫由于前足发生了特化,有了其他功用或退化,行走就主要靠中、后足来完成了。
大家最为熟悉的要算螳螂了,我们常可看到螳螂一对钳子般的前足高举在胸前,而由后面四条足支撑地面行走。
参考以上的昆虫足部结构,我们想出了较简单的方式来表达。
一支脚共有两个关节(假设没有爪的情况下),一个关节采左右式移摆;另一个关节则是采偏摆式,使脚可提高,当做上下运动的一种,结构设计图如下。
2.运动学分析:
六足步行机器人的步态是多样的,其中三角步态是六足步行机器人实现步行的典型步态。
(1)三角步态介绍:
“六足纲〞昆虫步行时,一般不是六足同时直线前进,而是将三对足分成两组,以三角形支架结构交替前行。
目前,大部分六足机器人采用了仿昆虫的结构,6条腿分布在身体的两侧,身体左侧的前、后足及右侧的中足为一组,右侧的前、后足和左侧的中足为另一组,分别组成两个三角形支架,依靠大腿前后划动实现支撑和摆动过程,这就是典型的三角步态行走法,如下图所示。
图中机器人的髋关节在水平和垂直方向上运动。
此时,B、D、F脚为摆动脚,A、C、E脚原地不动,只是支撑身体向前。
由于身体重心低,不用协调Z向运动,容易稳定,所以这种行走方案能得到广泛运用。
〔2〕机器人行走步态分析:
项目设计共使用12个舵机用于步态实现。
每条腿上有两个舵机,分别控制髋关节和膝关节的运动,舵机安装呈正交,构成垂直和水平方向的自由度。
由于腿只有水平和垂直平面的运动自由度,所以只考虑利用三角步态实现直线行走。
分别给12个舵机编号(1~12),如图所示。
直线行走步态分析
由1、2、5、6、9、10号舵机控制的A、C、E腿所处的状态总保持一致〔都是正在摆动,或者都在支撑〕;同样,3、4、7、8、11、12所控制的B、D、F腿的状态也保持一致。
当处在一个三角形内的3条腿在支撑时,另3条腿正在摆动。
支撑的3条腿使得身体前进,,支撑相和摆动相经过调整,达到满足平坦地形下的行走步态要求和稳定裕量需求。
转弯步态分析
项目设计的机器人采用以一中足为中心的原地转弯方式实现转弯,下图为右转的示意图,图中E腿为支撑中足。
右转弯运动的过程如下:
1〕首先A、C、E腿抬起,然后A、C腿向前摆动,E腿保持不动,B、D、F腿支撑。
2〕A、C、E腿落地支撑,同时B、D、F腿抬起保持不动。
3〕A、C腿向后摆动。
整个运动过程中B、D、E、F不做前后运动,只是上下运动。
3.结构设计:
六足机器人的基本结构的设计主要包括机器人足部关节自由度转换结构的设计和躯干整体支架的设计。
〔1〕足部结构:
仿生六足机器人足部机构主要是电机间的与自由度转换结构。
采用Auto公司开发的3D机械制图软件辅助设计的方法,分析电机尺寸,设计固定作用的固定架,传动作用的U型架。
结构通过平面钣金加工制作,通过紧固件进行基本结构件的连接。
基本足部自由度转换结构设计实物图。
〔2〕躯干结构:
经过改进后的机器人躯干结构在结构设计软件中的设计图如下
躯干结构模拟图整体结构模拟图
4.驱动器与驱动原理:
仿生六足机器人采用电动驱动的方式进行驱动
驱动器采用微型直流角位移伺服电动机[舵机]。
(1)舵机原理
舵机是一种结构简单的、集成化的直流伺服系统,其内部结构由直流电机、减速齿轮、电位计和控制电路组成。
舵机采用的驱动信号是脉冲比例调制信号(PWM),即在通常为20ms的周期内,输入以0.5~2.5ms变化的脉冲宽度,对应的转角范围从O°变化到180°,脉冲宽度与转角呈线性关系[5]。
控制信号线提供一定脉宽的脉冲时,其输出轴保持在相对应的角度上。
若舵机初始角度状态在0°位置,则电机只能朝一个方向运动,所以初始化的时候,应将所有电机的位置定在90°的位置。
六足机器人腿部偶数舵机转轴为垂直运动,控制机器人腿部抬起和放下;奇数舵机转轴为水平转动,控制机器人腿部前进和后退。
(2)舵机控制方法
标准的舵机有3条导线,分别是:
电源线、地线、控制线。
电源线和地线用于提供舵机内部的直流电机和控制线路所需的能源.电压通常介于4~6V,一般取5V。
给舵机供电电源应能提供足够的功率。
控制线的输入是一个宽度可调的周期性方波脉冲信号,方波脉冲信号的周期为20ms(即频率为50Hz)。
当方波的脉冲宽度改变时,舵机转轴的角度发生改变,角度变化与脉冲宽度的变化成正比。
某型舵机的输出轴转角与输入信号的脉冲宽度之间的关系可用下图表示。
从上述舵机转角的控制方法可看出,舵机的控制信号实质是一个可嗣宽度的方波信号(PWM)。
该方波信号可由FPGA、模拟电路或单片机来产生。
采用FPGA成本较高,用模拟电路来实现则电路较复杂,不适合作多路输出。
一般采用单片机作舵机的控制器。
〔2〕选型:
辉盛SG90舵机
参数:
扭矩:
1.5KG/CM死区:
10us转速:
0.12秒/60度(4.8V)重量:
9克
5.控制电路的硬件设计
〔1〕电源模块--驱动电路和抗干扰技术
双电源供电:
舵机内部是直流电机驱动,在带载时启停的瞬间会产生较大的峰值电流,将舵机供电电源与MCU和IC的供电电源分开,双线供电能保证控制电路不受驱动电路产生不稳定脉冲的干扰。
为保证驱动器电源输入的稳定性,结合电路抗干扰技术,采用合适方法保证电路抗脉冲干扰、抗低频干扰、抗共模干扰的能力,使12个电机的多驱动系统能够稳定工作。
电源采用,镍氢电池7.4V,1200mA,15CC;
控制电路电源输入由1117低压差电压调节转换电路提供。
驱动电路电源由LM2596DC-DC直流开关电压转换电路提供。
〔2〕控制核心--单片机接口电路和传感器检测
控制电路主要由1602显示调试屏幕,12路舵机控制输出,抗干扰等部分组成,结合PROTEUS仿真技术,分析控制程序。
原理图如下:
6.计算机与软件开发:
单片机主控系统:
AVR单片机ATmega16
软件设计的基本思想软件的主要功能是使机器人在向前行进的过程中能够避开障碍物,即对12个舵机进行调度和控制。
可将软件功能分解为:
要避开障碍物,首先应探测到障碍物,其次能绕开障碍物,这就要求机器人能完成前进、后退、左右转弯等动作。
动作协调完美性的实现,要求了在任一时刻能够做出12个舵机的同步动作控制。
软件设计中首先将前进、后退、左右转弯等高层动作分解,具体到完成一个动作各个舵机所要完成的动作和时序。
采用模块化的设计思想,将对所有舵机的调度做成一个独立的模块,所有的高层动作都是通过调用底层舵机控制的模块来完成。
多个舵机的控制是采用多舵机分时控制的思想来实现的。
程序采用C语言模块化程序设计的基本思路程序模块如下。
〔1〕驱动模块:
12路PWM驱动信号通过软件计数法多路输出利用MCU片内定时器和I/O模块控制输出多路占空比可调的PWM控制信号
多舵机分时控制思想
由于单片机在某一时刻只能对一个中断进行响应,所以一个单片机驱动多个舵机的条件是每个舵机产生的中断时间间隔必须相互错开。
由于舵机的驱动周期内的2次电平变化的最短时间是高电平的脉宽时间,即0.5~2.5ms,则在不产生冲突的情况下,若分时对多个舵机产生驱动信号,则最多可实现的驱动舵机数量为20/2.5=8。
就是说一个单片机最多可以控制8个舵机运行在完整转角空间。
采用多舵机分时控制的思想,可实现对12个舵机的协调控制。
将12个舵机分成两组,定时器0控制舵机1~6,定时器1控制舵机7~12,每个定时器在一个周期内将产生12次定时器中断。
使数据发生错误也很难连续起来,大大提高整体的纠错能力。
〔2〕动作模块:
将计算得到的机器人运动数据封装为前进、后退、左转、右转的动作函数子程序。
设计电机控制的速度伺服、角度伺服程序,采用流程控制法调用动作函数。
〔3〕传感器模块:
针对传感器检测的输入,传感器检测使用AVR单片机片内引脚中断资源,并且对不稳定信号进行软件滤波处理,增加控制系统的稳定性。
〔4〕1602液晶显示调试模块:
1602液晶显示模块显示程序运行情况,作为程序调试的重要工具。
通过单片机IO口引脚发送数据,指令信息,显示当前舵机实时运行状态。
(5)全局控制上位机程序:
整合多模块,形成系统化控制结构图如下。
四、项目总结
完成的设计:
达到的要求:
1.控制系统对12路驱动器的稳定角度控制,速度控制。
2.整体结构与行走步态稳定性达到要求。
3.多种静态步态与传感器检测控制一体化的实现。
能够快速准确探测前方障碍物,针对不同情况探索行进路线。
项目成果总结:
项目已经设计制作出三代机器人样本实物,经过实际行走测试,稳定性,速度,蔽障性能等参数达到甚至超过预先设定的指标。
机器人相关参数与性能指标如下:
重量:
460g
尺寸:
160*100*40mm
平均功率:
1.2A*5V=6W
能够在平地上进行前进、后退、左转、右转等稳定步行能够准确探测前方障碍物,根据不同情况执行合适的步态,探索行走路径
五.附录程序:
//===========主程序main.c================//
#include
#include
#include<1602LCD.h>
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharf[12];
ucharm[12][7];
ucharsign,rooptime,roopnum;
uchardirec;
ucharcanmove=1;
ucharrun=0;
charparameter[12]={9,-9,-15,3,9,-3,-13,6,8,9,-14,-10};
voidsys_init(void)
{
DDRA=0xe0;
DDRB=0xff;
DDRC=0xff;
DDRD=0x0f;
PORTA=0x1f;
PORTB=0x00;
PORTC=0x00;
PORTD=0xf0;
TCCR2=0x0a;
OCR2=10;
TIMSK|=0x80;
Lcd_init();
_delay_ms(1000);
}
voidresidual(void)
{
uchari,j;
for(i=0;i<12;i++)
f[i]+=parameter[i];
for(i=0;i<12;i++)
for(j=0;j<7;j++)
m[i][j]+=parameter[i];
}
voidgait1(void)//动作函数前进
{
uchari;
roopnum=4;
rooptime=6;
sign=0;
i=0;
m[i][0]=140;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=1;
m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=2;
m[i][0]=150;m[i][1]=150;m[i][2]=160;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=3;
m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=4;
m[i][0]=150;m[i][1]=150;m[i][2]=140;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=5;
m[i][0]=150;m[i][1]=140;m[i][2]=150;m[i][3]=160;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=6;
m[i][0]=160;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=7;
m[i][0]=150;m[i][1]=140;m[i][2]=150;m[i][3]=160;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=8;
m[i][0]=140;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=9;
m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=10;
m[i][0]=150;m[i][1]=150;m[i][2]=160;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=11;
m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;
for(i=0;i<12;i++)
f[i]=m[i][3];
residual();
}
voidgait2(void)//动作函数后退
{
uchari;
roopnum=4;
rooptime=6;
sign=0;
i=0;
m[i][0]=150;m[i][1]=150;m[i][2]=140;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=1;
m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=2;
m[i][0]=160;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=3;
m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=4;
m[i][0]=140;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=5;
m[i][0]=150;m[i][1]=140;m[i][2]=150;m[i][3]=160;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=6;
m[i][0]=150;m[i][1]=150;m[i][2]=160;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=7;
m[i][0]=150;m[i][1]=140;m[i][2]=150;m[i][3]=160;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=8;
m[i][0]=150;m[i][1]=150;m[i][2]=140;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=9;
m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=10;
m[i][0]=160;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=11;
m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;
for(i=0;i<12;i++)
f[i]=m[i][3];
residual();
}
voidgait3(void)//动作函数左转
{
uchari;
roopnum=4;
rooptime=6;
sign=0;
i=0;
m[i][0]=140;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=1;
m[i][0]=150;m[i][1]=145;m[i][2]=150;m[i][3]=155;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=2;
m[i][0]=150;m[i][1]=150;m[i][2]=160;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=3;
m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=4;
m[i][0]=150;m[i][1]=150;m[i][2]=140;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=5;
m[i][0]=150;m[i][1]=155;m[i][2]=150;m[i][3]=145;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=6;
m[i][0]=160;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=7;
m[i][0]=150;m[i][1]=140;m[i][2]=150;m[i][3]=160;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=8;
m[i][0]=140;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=9;
m[i][0]=150;m[i][1]=145;m[i][2]=150;m[i][3]=155;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=10;
m[i][0]=150;m[i][1]=150;m[i][2]=160;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=11;
m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;
for(i=0;i<12;i++)
f[i]=m[i][3];
residual();
}
voidgait4(void)//动作函数右转
{
uchari;
roopnum=4;
rooptime=6;
sign=0;
i=0;
m[i][0]=140;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=1;
m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=2;
m[i][0]=150;m[i][1]=150;m[i][2]=160;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=3;
m[i][0]=150;m[i][1]=145;m[i][2]=150;m[i][3]=155;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=4;
m[i][0]=150;m[i][1]=150;m[i][2]=140;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=5;
m[i][0]=150;m[i][1]=140;m[i][2]=150;m[i][3]=160;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=6;
m[i][0]=160;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=7;
m[i][0]=150;m[i][1]=155;m[i][2]=150;m[i][3]=145;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=8;
m[i][0]=140;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=9;
m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=10;
m[i][0]=150;m[i][1]=150;m[i][2]=160;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;
i=11;
m[i][0]=150;m[i][1]=145;m[i][2]=150;m[i][3]=155;m[i][4]=0;m[i][5]=0;m[i][6]=150;
for(i=0;i<12;i++)
f[i]=m[i][3];
residual();
}
ISR(TIMER2_P_vect)//定时器2比