自由体操机器人2技术报告Word文档格式.docx
《自由体操机器人2技术报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《自由体操机器人2技术报告Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
2003年参加“马斯特杯”中国机器人大赛的舞蹈机器人和机器人游北京项目,获得二等奖1项、三等奖2项;
在第四届全国智能机器人大赛中获得2项二等奖;
在“动感地带杯”2004年江苏省大学生机器人大赛中,获冠军1项,鼓励奖2项;
在“新科导航杯”2005年中国机器人大赛中,我校参赛的5个机器人全部获奖,夺得舞蹈组冠军、类人组季军,获得舞蹈组一、二、三等奖各1项,类人组三等奖2项。
2005年5月中央电视台《异想天开》栏目以我校机器人大赛为背景,摄制了五集专题节目。
在2007“银泉杯”中国机器人大赛中,我校26支代表队在比赛中再获佳绩,共获得一等奖5项、二等奖4项、三等奖9项。
方案设计
根据设计要求,本系统主要由控制器模块、软件模块、电源模块、舵机驱动等模块构成。
一、体操机器人整体设计
1、机器人概述:
此次设计的体操机器人主要由机械结构和控制系统组成,如果认为机械结构是人的骨架,那么控制系统就被认为是人的大脑,所以机器人的先进程度与功能强弱通常都直接与其控制系统的性能密切相关。
机器人控制系统是根据指令及传感信息控制机器人完成一定的动作或作业任务的装置,它是机器人的心脏,决定了机器人性能的优劣。
作为机器人的核心部分,机器人控制系统是影响机器人性能的关键部分之一,它从一定程度上影响着机器人的发展。
机器人技术的实现不仅取决于其机械机构的优化,在很大程度上还依赖于一个性能优良的智能控制系统;
而一个工作稳定、精度可靠的、实时性强的控制系统不仅需要高级的控制算法,还需要实现控制算法的手段。
很长时间以来国内外的学者提出了诸多的控制算法,也设计出实现某些算法的控制器,但整个技术还处在实验阶段,没有进入市场,特别是一些高级控制方法在实际中效果根本不理想,所以机器人控制系统有待进一步研究。
2、制作目标:
设计并制作一种能够完成指定动作的体操机器人。
可以根据预先设计的动作,以及定制的指令程序完成一系列高难度的体操动作,包括俯卧撑、前滚翻、后滚翻、侧翻及其他高难度动作。
其研究领域涉及到3D模型绘制及动力学仿真、单片机、电路理论、自动控制、电机原理与拖动、接口技术、结构力学、电子工艺等多方面的内容,以实现其智能控制。
3、方案设计
对机器人进行具体的设计。
首先对机器人的自由度安排进行考虑,以使其可以完成预先设想的动作。
其次是考虑各个连接部件如舵机,卡口,电池和控制板的尺寸具体设计各卡口的形状尺寸以及电池和电路板的尺寸等。
整体设计:
我们设计的自由体操机器人主要由金属铝条构成,身高约为21cm,结构尺寸比例是在研究体操运动员大量图片、视频,最终确定一个原始模型后,跟据比例缩放得到的,在制作前进行了大量的仿真与实验。
其中,主要运动部位包括:
头部、腹部、肩部、手部、腿部和脚部。
运动关节由伺服电机控制。
实物图:
零件设计CAD图
舵盘卡口设计图
舵机底部卡口
脚板1
脚板2
头部卡口
自由度设计:
设计含有十个自由度的自由体操机器人,各个自由度分布如下:
头部一个(控制前肢);
腹部一个(控制躯干动作);
肩部、手部、腿部和脚各两个。
通过伺服电机的控制,可以完成一些基本并带有一定难度的动作。
动作设计:
首先,机器人向所有裁判及观众鞠躬致意,然后进行双手俯卧撑,在双手俯卧撑之后,分别进行两个难度较高的单手俯卧撑,当动作完成后,起身直立。
接下来机器人进行前滚翻接后滚翻,然后进行倒立,并劈叉,紧接着机器人进行向左、向右的单手侧翻各一次,完成动作后起身直立。
最后进行自选动作,即倒立式撑起,当这些动作全部完成,机器人直立,向评委及观众致意。
技术支持
串口调试
1.1设置串口参数:
串口号:
1-16
波特率:
600-256000,>
115200时需要硬件支持。
2接收区/键盘发送区
2.1接收数据
a)设置串口参数
b)如果要按十六进制形式显示接收数据,将十六进制显示选项选中。
c)点击打开/关闭串口区中的打开串口按钮。
2.2显示接收数据的长度
因某些限制,显示接收数据的文本不能太长,所以当显示文本长度快达到62K时会自动将显示文本删减到32K,此时文本可保留32K的字符或约10K的十六进制数据显示。
2.3在键盘上发送英文字符
a)在接收区/键盘发送区的输入框中用鼠标点一下。
b)在键盘按下按键立刻发送。
在这里不能发送回车换行,也不能发送汉字,若要发送请在单字符串发送区发送。
3发送数据
可以发送单字符串,多字符串(字符串序列)或直接在键盘上发送英文字符。
有两种发送数据格式,一种是普通的字符串,另外一种是十六进制数据即HEX格式数据。
发送HEX格式数据时要在字符串输入区中输入HEX格式字符串,并且要将相应区内的十六进制发送选项选中。
例:
HEX格式数据字符串 1234ABCDFF
3.1单字符串发送区
3.1.1自动发送,自动发送周期:
此项功能可以每隔一段时间反复地自动发送输入框中的数据,点击自动发送按钮后即启动自动发送功能。
自动发送周期最大为65535mS。
3.2多字符串发送区
在多字符串发送区可以发送一个字符串,或者自动地、依次发送所有的字符串。
请把鼠标移到“接收区/键盘发送区”和“多字符串发送区”之间,当鼠标形状发生变化时按下鼠标器的左键不松开,然后移动鼠标,将“多字符串发送区”的宽度调宽一些,让“间隔时间”显露出来。
3.2.1发送一个字符串
a)输入字符串。
b)如果要发送16进制数据,要先在字符串后的HEX选项框中打上对勾。
c)点击发送按钮。
发送后,按钮上的数字作为当前字符串序号保存起来,此序号在自动循环发送中要用到它。
3.2.2发送多个字符串(字符串序列)
a)输入多个字符串。
b)如果要发送16进制数据,将相应的HEX选项打上对勾。
c)输入间隔时间,最大为65535mS。
d)点击自动循环发送按钮。
延时时间到达后发送当前字符串(见3.2.1的步骤c))的下一个字符串,间隔一段时间后再发送下一个。
发送完毕自动从头开始继续发送。
4打开/关闭串口区
其他技术:
1、伺服电机及普通直流电机的性能及控制方法
2、Amega16单片机的使用方法及控制电路板的制作
3、结构设计的一些规律及链接装置设计的经验
4、动作调试软件的编写思想及源代码
5、舵机原理及加工方法
基本控制模块电路
控制模块
采用Atmel公司的Atmaga16L单片机作为主控制器。
Atmage16有如下特点:
16K字节的系统内可编程Flash(具有同时读写的能力,即RWW),512字节EEPROM,1K字节SRAM,32个通用I/O口线,32个通用工作寄存器,用于边界扫描的JTAG接口,支持片内调试与编程,三个具有比较模式的灵活的定时器/计数器(T/C),片内/外中断,可编程串行USART,有起始条件检测器的通用串行接口,8路10位具有可选差分输入级可编程增益(TQFP封装)的
ADC,具有片内振荡器的可编程看门狗定时器,一个SPI串行端口,以及六个可以通过软件进行选择的省电模式
电源模块
采用锂电池供电,因为锂电池易于安装固定且供电效果较稳定,因此选用8V锂电池为舵机供电。
通过一个1117芯片的降压稳压后得到5V电压给单片机供电。
产品规格
技术参数
尺寸(mm)
重量
线长
6.0V
7.4V
转动角度
速度
扭力
A
B
C
D
E
g
oz
cm
sec/60o
kg-cm
oz-in
40.2
20.4
41.5
57
2.0
无
0.21
12
166.6
0.19
13.6
188.9
180°
适用范围:
机器人
采用Servo(航模用伺服电机,也称“舵机”)为主要驱动手段,此外在部分部位也可以使用直流电机。
Servo伺服电机主要靠脉冲来定位,伺服电机每接收到1个脉冲,就会旋转1个脉冲对应的角度,从而实现位移伺服电机,通过发送脉冲的频率就可以控制转动的速度。
Servo伺服电机可控速度,位置精度非常准确,且成本低廉,控制简便,较其他电机有着很大的优势。
舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。
其工作原理是:
控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。
它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。
最后,电压差的正负输出到电机驱动芯片决定电机的正反转。
当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。
程序模块
在软件方面,在机器人的关节舵机控制方面,采用由中国矿业大学信电学院机器人创新实验室自主研发的用VisualBasic开发的机器人动作调试软件编写代码;
对单片机剩余端口进行定义,使之根据需要控制自由体操机器人的各个关节部位。
//*******************************主函数***************************
voidmain(void)
{
unsignedintindexm;
unsignedcharshuru;
//********************初始化****************************
CLI();
//disableallinterrupts
port_init();
timer1_init();
fuwei();
MCUCR=0x00;
GICR=0x00;
TIMSK=0x04;
//timerinterruptsources
SEI();
//re-enableinterrupts
//*************************************************
dongzuo();
while
(1);
}
#include<
iom16v.h>
macros.h>
MATH.H>
unsignedintdataa,datab;
signedinta[24],b[24],c[24],d[24];
unsignedcharflag=0;
unsignedinti=0;
voiddongzuo();
//*****************************************************************
voidport_init(void)////////端口初始化
{
DDRA=0xFF;
DDRB=0xFF;
DDRC=0xFF;
DDRD=0x00;
//************************************T1初始化
voidtimer1_init(void)
TCCR1B=0x00;
//stop
TCNT1H=0xFF;
////////////////////setup初值
TCNT1L=0x30;
TCCR1A=0x00;
/////////tartTimer
TCCR1B=0x04;
///******************T1中断*************************
#pragmainterrupt_handlertimer1_ovf_isr:
9
voidtimer1_ovf_isr(void)//TIMER1hasoverflowed
{
//reloadcounterhighvalue
//reloadcounterlowvalue
flag++;
flag%=9;
switch(flag)
{
case0:
PORTA|=0x0f;
for(i=0;
i<
465;
i++);
451;
i++)
{
if(i==a[0])PORTA&
=~BIT(0);
if(i==a[1])PORTA&
=~BIT
(1);
if(i==a[2])PORTA&
=~BIT
(2);
if(i==a[3])PORTA&
=~BIT(3);
};
break;
case1:
PORTA|=0xf0;
if(i==a[4])PORTA&
=~BIT(4);
if(i==a[5])PORTA&
=~BIT(5);
if(i==a[6])PORTA&
=~BIT(6);
if(i==a[7])PORTA&
=~BIT(7);
case3:
PORTB|=0x0f;
if(i==a[8])PORTB&
if(i==a[9])PORTB&
if(i==a[10])PORTB&
if(i==a[11])PORTB&
case4:
PORTB|=0xf0;
if(i==a[12])PORTB&
if(i==a[13])PORTB&
if(i==a[14])PORTB&
if(i==a[15])PORTB&
case6:
PORTC|=0x0f;
if(i==a[16])PORTC&
if(i==a[17])PORTC&
if(i==a[18])PORTC&
if(i==a[19])PORTC&
case7:
PORTC|=0xf0;
if(i==a[20])PORTC&
if(i==a[21])PORTC&
if(i==a[22])PORTC&
if(i==a[23])PORTC&
};
}
//自定义函数*****************************************************************
voiddelay(unsignedinttime)//0.1s
unsignedintm,k;
for(m=0;
m<
time;
m++)
for(k=0;
k<
45000;
k++);
voidmoveto(unsignedintvel)
signedintk,m,tem=0,temp=0;
signedcharj;
for(j=0;
j<
24;
j++)
c[j]=b[j]-a[j];
//求出期望值与实际值之差
if(fabs(c[tem])<
fabs(c[j]))//找出最大的差
tem=j;
temp=fabs(c[tem]);
//暂存最大差的绝对值
j++)//把所有的差值都扩大70倍
c[j]=(c[j]*70)/temp;
//每个的步长,最大的为70
d[j]=a[j]*70;
for(k=0;
temp;
k++)//分temp步完成这个动作
for(j=0;
d[j]=d[j]+c[j];
a[j]=(d[j]/70);
}
vel;
m++)//每步中间的延时,产生速度
for(j=0;
100;
j++);
j++)//消去误差,绝对定位到
//期望值
a[j]=b[j];
}
//执行函数++++++++++++++++++++++++++++++++++++++++
voidzx(unsignedintdatazx)
datab=datazx%1024;
//解析数据,参数
dataa=(datazx-datab)/1024;
//指令
//zhixing0
if(dataa<
24)b[dataa]=datab;
elseif(dataa<
48&
&
dataa>
24)
{a[dataa-24]=datab;
b[dataa-24]=datab;
elseif(dataa==49)moveto(datab);
elseif(dataa==50)delay(datab);
voidfuwei(void)
unsignedchark;
a[0]=215;
a[1]=235;
a[2]=233;
a[3]=209;
a[4]=243;
a[5]=255;
a[6]=254;
a[7]=118;
a[8]=282;
a[9]=198;
a[10]=43;
a[11]=231;
a[12]=128;
a[13]=260;
a[14]=373;
a[15]=119;
a[16]=249;
a[17]=160;
a[18]=190;
a[19]=283;
a[20]=234;
a[21]=391;
a[22]=118;
a[23]=247;
k++)b[k]=a[k];
未来展望
在原有动作及实现的功能基础上,进一步完善结构设计及改进,在结构完善的基础上,再来调试及完成更复杂的动作功能设计,比如可以加快行动速度,反转速度,完善动作转变协调性,加入一些尝试动作,具体的可进一步设计。
机器人设计及开发随着经济及科技的发展,这些年来得到了巨大发展,但好多的机器人设计还是停留在简单的加工和调试上,真正的智能控制没能充分融入其中,所以下一步应加大对智能控制的机器人的科研投入研究力度,鼓励高校和科研机构开展更多的研究机器人的项目。