【S089】犬形自动装卸货机器人
作品说明 |
作者:霍书瑶 赵鹏程 钟凌 陈凰妙
单位:上海交通大学
指导老师:王留芳
1. 作品简介
作品的创意来源于电影《Wall-E》,我们希望设计一个可以自动完成装卸货全过程的机器人,完成物品的识别、收集与运输。机器人可实现前进、后退、转弯、红外避障、智能循迹,以及机械手的回转、上下转动、手爪抓取等功能。若需要取某一物件时,先操纵手动控制机器人前进,当要接近物件时手动激发LED模块使灯闪亮从而再次激发闪动传感器,这样就能驱动自动程序使料斗抬起并完成卸货。其作品完成图如下所示:
作品说明
作品完成图
2. 主要创新点
① 使用四足控制机器人的整体运动,实现前进、后退与转向。
② 自创机械臂机构,实现双自由度运动与单自由度夹取。
③ 采用纸质翻斗,克服了已有材料不能自由造型的缺陷,同时大大减轻了重量,减小了标准舵机的负担。
④ 翻斗设计成斜面,盖子开启时可使乒乓球自由滚下,盖子闭合时与翻斗箱组成V形面,防止乒乓球滚动或脱离机器人。
⑤ 编写程序代码时运用模块化编程,共有主函数、初始化函数、前进函数、后退函数及装载,条理清晰且易修改。
⑥ 运动DelayNS函数及for语句控制舵机小角度连续转动,克服了标准电机不能控制转速的缺点。
⑦ 尝试运用手柄编程来控制机器人。
3. 设计思路及实现过程
3.1 硬件部分
总体来看,机器人由6个舵机(2个圆周舵机,4个标准舵机控制)共有6个自由度,包括2个前进/后退自由度,2个机械手运动自由度,1个机械手夹取自由度,1个翻斗装卸货自由度。硬件机构的构造主要可分为四足、机械手与纸质翻斗三个模块。
3.1.1 四足部分
(1)结构介绍
四足的部分是机器人主体运动的基础,如下图所示,其主要组成有如下五个部分:
① 圆周舵机——四足的动力来源,两个舵机分别控制左右两侧的双足系统,因此两侧的双足相互独立。
② 传动齿轮——将舵机的转动传递给传动轴。
③ 传动轴——连接舵机与四足机构。
④ 偏心轮——将传动轴的圆周运动转化为走路运动。
⑤ 连杆组——运动的实现机构。
在行走过程中,动力由舵机依上述次序传递。
四足结构组成
(2)运动学分析
对四足机构进行几何建模如下图所示:
四足机构建模
图中,杆AB为前足,杆DE为后足,杆CD为中部连杆。点A为前足滑移铰连接端,点B、E分别为前后两足的端点(足部)。圆M为偏心轮动力端,点C为偏心轮跟随端,故半径CM即为偏心轮有效偏心距。圆N为后腿固定点,圆C为辅助圆。
以C点为目标点构造运动,同时跟踪点B、E的轨迹,可得如下轨迹图:
四足机构轨迹图
由图中可以看出,前足的运动轨迹呈月牙形,后足的运动轨迹为一段标准圆弧。
(3)动力学分析首先进行单侧运动分析。要想保证机器人可以行走,需要前后两足反相运动。运动可以分解为:
① 后足向上托起机器人,同时向后摆,前足离地且向前伸出。由于地面只给后足摩擦力,此时机器人整体向前运动。
② 前足着地,同时向后摆,机器人重心前移,后足向前伸出。由于机器人重心靠前侧,此时前足受的摩擦力大于后足,机器人整体向前运动。
依据前后足的运动学分析,我们的机构满足这样的条件。
其次进行双侧运动分析。四足动物的直线前进的一般运动方式如下:
四足双侧动力学分析
① 左侧后足与右侧前足作为支撑足(图中用红色标记支撑足)向后摆,同时左侧前足与右侧后足离地(或虽与地面接触但压力较小,所受摩擦力可忽略)前伸。
② 与过程1相反,左侧前足与右侧后足作为支撑足,其余过程相似。
为满足这样的条件,需要控制左右两侧双足系统运动相位相反。此条件需要在软件调试时再仔细验证确定参数。
若四足需要进行转弯,则可使一侧双足不动,另一侧作正常前进运动。
3.1.2 机械手
(1)结构介绍
机械手由运动机构和夹取机构组成。运动机构由2个标准电机控制,因此机械手的可工作范围为环线机器人的一个球面。下面着重分析机械手的夹取机构。机械手用1个标准舵机来控制夹取和释放乒乓球,如下图所示,其主要组成有如下三个部分:
① 标准舵机——用来控制机械手张开或闭合一定的角度。
② 连杆组——将电机的运动传动给手指部分。
③ 机械手指——直接夹取乒乓球的机构,附加了海绵以增大接触面积和摩擦力。
机械手结构及演示
(2)运动学分析
对机械手机构进行几何建模如下图所示:
机械手机构几何建模
图中,杆ABC与杆DEF为两个机械手指,分别于A点和D点铰接。O点为舵机中心,OG杆为与舵机固结的连杆。杆K整体为刚性,且由滑移铰限制为只能在Y轴方向运动。其余连杆(图中为黑色连杆)均与相邻杆件铰接。图中绿色虚线圆为辅助圆。
以点G为目标点构造运动,同时跟踪点C、F的轨迹,可得如下轨迹图:
机械手机构轨迹图
由图中可以看出,机械手的两个手指运动同步,且基本对称,可以达到夹取和释放正前方物体的功能。同时可以测得,在两个状态之间标准舵机的转动角度大约为15度。
3.1.3 纸质翻斗
纸质翻斗包含翻斗箱与翻斗盖两部分,该部分用一个标准舵机来控制机械手的开合。
纸质翻斗箱
如图所示,翻斗箱的主体由硬纸版折成,外侧由支架进行加固。底面与水平面呈大约10度角,使得翻斗内的乒乓球可以自由滚下。翻斗与其它机构之前的连接主要靠穿孔后用螺丝拧紧翻斗整体不会运动,与机器人主体固结在一起。
翻斗盖同样由硬纸版折成,底面由支架进行加固。与翻斗箱的接口处采用了1/4圆,以便在保证良好接触的同时防止乒乓球的掉落,翻斗盖的转动角度大约为60度。
纸质翻斗盖
3.2 软件部分
3.2.1 模块结构
软件编程部分的结构主要依据机器人运行的线性步骤来设置。示例程序依据不同的功能模块分为四个部分,其相应函数原型为:int main(); 主函数,依次调用各功能函数并可独立完成判断动作与传感器输入信号的读取和处理。
void origin(void) ; 初始化函数,在程序开始时调用,用于将机械手与翻斗复位。
void walkfwd(int signal1,int signal2); 前进函数,其中的两个参数分别为两个白标传感器的输出状态,可完成自动循迹前进的功能。
void walkback(int signal1,int signal2); 后退函数,两个参数分别为两个白标传感器的输出状态,可完成自动循迹后退的功能。
void load(void); 装载函数,控制机械手完成移动、夹取与释放的全过程。
3.2.2 模块实现要点
① 主函数
main函数依次调用各个功能函数,依次进行的过程为:初始化—等待触碰—前进并等待近红外信号—夹取物体并放至翻斗—后退并延时—停止并释放物体。
② 初始化函数
初始化函数将机械手的三个关节自下而上进行复位。复位结束后机械手与翻斗盖均抬起,手指张开。其复位过程利用for循环及延迟控制复位速度不致过快。
③ 前进函数
通过输入的两个参数调节四足的运动状态。若两传感器都没有检测到黑标,则认为黑标在机器人的中心处,此时两个圆周电机同步运动,机器人向前前进。若有一侧检测到黑标,则该侧双足停止运动,对侧双足做前进运动,实现转弯。
④ 后退函数
实现方式与前进函数类似。
⑤ 装载函数
令机械手旋转至机器人前方,前端向下靠近被抓取物,定位稳定后手指合拢,夹取物体。之后手臂抬起,旋转至翻斗上访,调整到合适角度后松开,物体自由落下掉进翻斗。而后机械手复位。全过程除机械手的合拢动作外,均采用for循环及延迟来控制移动速度。
4. 示例程序
/******************** (C) COPYRIGHT 2012 Robottime ******************** * 文件名 : main.c * 作者 : sinbad * 版本 : V1.0.0 * 日期 : 2012.3.7 * 所属产品 : 探索者ARM7 LPC2138主控制板 * 功能 : 库函数例程三:舵机控制 * 接口/设备: 输出端口1接入标准舵机或圆周舵机 ********************************************************************/
#include "config.h" #include "lib_io.h" #include "lib_arm.h"
void walkfwd(int signal1,int signal2); void walkback(int signal1,int signal2); void origin(void); void load(void); //void unload(void);
int main()//main函数开始 { int i=0; Initial_ARM(); DelayNS(1000); origin(); while(1)//等待触碰开关3 { LedIn(3,1); if(Input(3,1)) { LedIn(3,2); break; } }
while(1)//沿黑标向前走 { walkfwd(Input(1,1),Input(4,1)); LedIn(2,1);//2号灯指示是否正常工作 DelayNS(200); if(Input(2,1)==1)//若检测到近红外传感器信号则停止前进 { LedIn(2,2); Servo(2,82); Servo(3,91); break; } } DelayNS(1000); load(); DelayNS(1000); for(i=0;i<100;i++)//后退100*200/1000=20秒 { walkback(Input(1,1),Input(4,1)); DelayNS(200); } Servo(2,82);//圆周电机停转 Servo(3,91); DelayNS(200); Servo(1,80); DelayNS(200);
}//main函数结束
void walkfwd(int signal1,int signal2)//signal1和2分别对应左右白标传感器 { if((signal1==1) && (signal2==1)) { Servo(3,60); Servo(2,112);//2,3圆周舵机,即左右腿圆周舵机 } else { if(signal1==1){Servo(3,60);Servo(2,90);} else { if(signal2==1){Servo(2,112);Servo(3,90);} } } }
void walkback(int signal1,int signal2) { if((signal1==1) && (signal2==1)) { Servo(2,60); Servo(3,112);//2,3圆周舵机 } else { if(signal1==1){Servo(2,60);Servo(3,81);} else { if(signal2==1){Servo(3,112);Servo(2,91);} } } }//walkfwd,walkback都需要进行微调
void origin(void)//电机自下而上4,5,6进行初始化 { int i; Servo(4,5); DelayNS(200); for (i=0;i<28;++i){Servo(5,(i+4)*5);DelayNS(200);} Servo(6,5); DelayNS(200); Servo(1,159); }
void load(void)//夹取函数 { int i; Servo(6,5);//张开 LedIn(2,1); DelayNS(2000); for (i=0;i<18;++i){Servo(4,(i+1)*5);DelayNS(200);} for (i=28;i>4;--i){Servo(5,(i+4)*5);DelayNS(200);} DelayNS(2000); Servo(6,20); LedIn(2,2); DelayNS(2000); for (i=0;i<28;++i){Servo(5,(i+4)*5);DelayNS(200);}//机械臂变成垂直状态 DelayNS(1500); for (i=18;i<33;++i){Servo(4,(i+1)*5);DelayNS(200);} DelayNS(1500); for (i=28;i>22;--i){Servo(5,(i+4)*5);DelayNS(200);} DelayNS(1500); Servo(6,5);// DelayNS(1000); for (i=22;i<28;++i){Servo(5,(i+4)*5);DelayNS(200);} for (i=33;i>0;--i){Servo(4,(i+1)*5);DelayNS(200);} DelayNS(1500); //for (i=28;i>0;--i){Servo(5,(i+4)*5);DelayNS(200);} LedIn(2,1); } |
* 本项目未获得作者开源授权,无法提供资料下载。
|