1 系统方案设计
人形机器人控制系统包括机器人控制器和机器人遥控器两部分。其中控制器以飞利浦公司的ARM7处理器为核心,包含17个舵机控制驱动电路与接口、串口通信调试电路、遥控接口、电源等。通过串口下载和传输控制信息。机器人遥控器使用无线模块向机器人控制器发送指令,控制机器人完成规定动作。
2 硬件设计
人形机器人控制器主板由控制核心LPC2114、电源及检测电路、外部晶振、JTAG调试接口、串口模块、遥控模块、舵机接口、LED指示灯等组成,组成框图如图1所示。
LPC2114基于一个支持实时仿真和跟踪的32位ARM7TDMI-S CPU,并带有128 k字节的高速Flash存储器,非常小的LQFP64封装、极低的功耗、2个32位定时器、4路10位ADC、PWM输出、46个GPIO以及多达9个外部中断使它们特别适用于工业控制、医疗系统、访问控制和电子收款机(POS)等[2]。
较高的功能集成度和强大的端口驱动能力使得机器人控制器主板电路的核心部分非常简洁,基本上实现了单芯片的设计,如图2所示为LPC2114控制器电路和4个舵机的驱动接口电路,其余13个舵机驱类同。
考虑到教育机器人的运动平衡控制,将PCB电路板按图3(a)所示位置布局。该布局除了处理器最小系统,以及必要的指示和控制电路外,最重要的就是17个舵机驱动接口,这里使用弯角3排针连接,保证链接的紧凑和可靠。17个舵机接口分为5组,与下载接口按照左右各9个布局,其中人形机器人的头包含1个舵机接口,负责左右运动,左胳膊包含3个舵机接口,分控肩、肘、腕3个运动自由度,左腿包含4个舵机接口,分控胯的左右/上下、膝盖及脚腕4个自由度。右胳膊与右腿的分控接口和功能与机器人控制器左半部分对称[3]。
最后将控制器与7.2V电芯并列装配到铝合金外壳中,作为机器人的躯体,同时作为运动平衡的重心,良好的布局对机器人的运动至关重要[4]。
考虑到人形机器人的自重和动作力度,设计采用FUTABA系列产品中的S3050大力矩车用、船用竞赛型金属齿轮数字舵机,如图3(b)所示。该舵机自重48.8克,尺寸小,在6V电压下工作,能够达到0.16秒/60度的转速,力矩大小为6.5千克/厘米。
17个舵机按照前述的分组和人体关节结构对称排列布局,头部1个舵机,左右胳膊各3个舵机,分别做为肩、肘、腕关节,左右腿各5个舵机,分别为髋关节的左右运动1个、前后运动1个、膝关节1个、踝关节前后运动1个、左右运动1个,其中2个肩关节舵机和2个髋关节的左右运动的舵机,上下左右对称紧凑安装,作为身体的一部分,所有其他舵机使用铝合金支撑固定成紧凑的人形结构[5]。
3 软件设计
软件设计主要包含软件架构设计、程序流程设计和驱动控制函数的设计。
3.1 软件架构
该人形机器人控制系统原理是:当机器人控制器接收到遥控器发出的指令后,ARM处理器根据指令要求,将要执行的动作参数分解成一系列宽度不等的PWM信号,并通过驱动电路输出到舵机接口,外部舵机根据占空比不同的PWM信号转动相应的角度,多个舵机不同的转动角度构成了不同的机器人瞬时动作,多个动作连贯执行就完成与外部命令相应的响应动作。软件架构如图4所示。本文主要对关键驱动函数进行说明。
3.2 舵机驱动程序设计
驱动脉冲与舵机转动角度如表1所示,不同的高电平时间对应着舵机不同的输出位置。因此可以使用LPC2114内部定时器模拟出17路以20ms为周期、高电平宽度与位置时序对应的PWM波形,来分别驱动控制17个舵机转动的角度,配合完成机器人的相关动作[6]。
多个舵机的驱动需要依据机器人的姿态数据计算出转动时间,将其时间数据按一定算法进行排序,并在CPU的控制下设置各舵机的运动和停止时间。
3.3 机器人舵机整体驱动函数 ManMoveFrame()设计
函数功能:将输入的各伺服器角度转换为各伺服器的高电平时间,按照17个伺服器高电平时间从短到长依次调用对应伺服器驱动。共18个入口参数,17个是伺服器角度,1个是动画停留时间,转换关系:1度约为0.00814ms。
函数定义:void ManMoveFrame(int16 Head_Angle,int16 Larm1_Angle,… ,,int16 Rleg5_Angle,uint8 t)
{uint8 i,t1; int HeadTime,Larm1Time,Larm2Time, … ,Rleg4Time,Rleg5Time;/*与角度对应的时间变量*/
int MotorTime[17]; /*各舵机驱动脉冲时间数组*/
MotorTime[0]=HeadTime=Head_0+Head_Angle*Angle1;/*头部驱动脉冲时间*/
/*MotorTime[1]至MotorTime[16]略;*/
qsort(MotorTime,17,sizeof(int),Compare); /*对MotorTime数组快排序,使其值从小到大重排*/ …
for(i=0;i机器人姿态数据输入驱动函数ManMoveKeyframeData()设计
机器人动作的关键姿态是由各舵机转动位置决定的,需要参照机器人的体态对17个舵机的自由度关系数据进行设置,驱动函数将如表2所示设置的参数转换为驱动信号,控制17个舵机的转动,从而完成机器人行走的动作。表格空白的地方默认数据为0。
函数功能:初始化各伺服器角度/时间数组,将机器人每姿态动作的各舵机角度数据输入给各伺服器数组。共19个入口参数:1个关键帧号、17个伺服器角度、1个动画停留时间。
函数定义:void ManMoveKeyframeData(uint16 ID,int16 H_Angle, …,int16 RL5_Angle,uint8 t){
ID_Max++;/*动作帧数,全局变量,记录动作帧数,每加入1帧,ID_Max的值就增1*/
H[ID]=H_Angle;/*头的角度*/ … RL5[ID]=RL5_Angle; /*左肩的角度*/
T_Key[ID]=t;/*帧动作完成的时间长度*/ }
3.5 机器人动作控制驱动函数ManMoveKeyframeToFrame()设计
主要功能:把动作幅度较大的姿态关键帧数据结合其下面紧挨的姿态关键帧数据转换为时间均匀的普通帧驱动参数,供整体驱动使用。入口参数:无。出口参数:无。
函数定义:void ManMoveKeyframeToFrame(void)
{uint16 id,h,la1,la2,la3,ra1,ra2,ra3,ll1,ll2,ll3,ll4,ll5,rl1,rl2,rl3,rl4,rl5;uint8 t,k;/*帧号、舵机时间临时变量*/
for(id=0;id机器人程序流程
机器人根据接收到的遥控命令自行判断并完成动作,工作流程如图5所示。因为人形机器人使用电池,工作比较耗电,所以在运动前要先检测工作电压,如果达到工作要求就接着工作,否则不执行动作并报警,工作电压不满足要求会造成机器人因动力不足而摔倒,接收到结束命令就停止运行,不再响应外部所发来的遥控命令,如果完成一个动作就恢复到立正站立状态[7]。
需要指出的是,在机器人运动时,程序对其外部的伺服器控制要进行分时分批控制,以减轻处理器功耗压力,达到可靠驱动的目的。
4 结论
按照机器人的运动体态完成运动数据的设计,经过测试,该控制系统可以完成包括前滚翻、后滚翻、俯卧撑在内的多种体操运动。课题组计划进一步封装函数,并设计可视化图形编程界面,以便可以在电脑上更加直观地生成运动数据,积木化编程,降低操作难度。
相关文章