成绩智能控制实验实验报告院(系)名称专业名称学生学号学生姓名2016年11月28日实验一机械臂运动控制及基本操作一、实验准备1、描述机械臂坐标空间的定义机械臂通常有两种坐标空间:关节坐标空间和直角坐标空间。关节坐标空间定义:机械臂的空间坐标直接由各个关节的坐标来确定,所有关节变量构成一个关节矢量。所有关节矢量构成的空间称为关节坐标空间。因此关节坐标空间运动运动就是直接操作各个关节的运动来完成机械臂的运动。下图是关节坐标空间的定义。图1机械臂关节坐标空间直角坐标空间定义:机械臂末端的位置和方位通常是在直角坐标空间中描述。当进行机械臂操作任务时,通常采用直角坐标空间更为直观和方便。下图是直角坐标空间的定义。图2机械臂直角坐标空间2、机械臂各轴的最大运动范围、最大运动速度、最大展开半径都是多少?并把最大运动范围各量换算为对应的脉冲数(写出转换公式)。以上参数查看技术手册可得:最大运动范围:关节10-200度关节20-100度关节30-100mm关节40-360度最大运动速度:关节11.57rad/s关节23.14rad/s关节310mm/s关节43.14rad/s最大展开半径:396mm将最大运动范围各量换算为对应的脉冲数如下:增量式编码器为2500P/r,即电机每转一圈为2500个脉冲,GT400-SG运动控制卡有4倍频,故下发10000个脉冲电机转动一周。脉冲数=关节转动角度*(编码器每转对应脉冲**4倍频)*减速器倍率/360脉冲数=关节移动距离*(编码器每转对应脉冲**4倍频)*减速器倍率/导程1关节的谐波齿轮减速器比率为100:1;关节2的谐波齿轮减速器比率为99:1,关节3减速比为1.1175,关节4减速比为800。关节1、关节2、关节4分别转动200、100、360度所对应的脉冲数为:Pulse1=200*10000*100/360=555555.56Pulse2=100*10000*99/360=275000Pulse4=360*10000*800/360=8000000关节3下移100mm对应的脉冲数为:Pulse3=100*10000*1.1175/2.5=4470003、为什么要进行机器人回零?如何通过机械臂标定框进行回零校正?对进行机械臂进行回零的原因:因为机器人测量关节的编码器是增量式而不是绝对式的,因此在每次调用程序时首先必须进行机器人回零。为了在关节坐标空间与直角坐标空间进行转。通过机械臂标定框进行回零校正的操作:①机器人初始回零,假设回零角度分别为α1,α2,定义此时的关节1、2的关节坐标为(0°,0°);②动作关节1、关节2,使其末端位于工作基础平台的机器人标定方框(200,200)处,此时的关节坐标理论上应为(0°,90°),,记录实际的关节坐标为12,,(,);③修正回零角度分别为:,1122090,,;④重新进行机器人回零,定义此时的关节1、2的关节坐标为(0°,0°).4、为什么要进行视场标定?为了标定视场位置与机械臂坐标的对应关系。二、实验结果、数据1、进行多次机器人标定,记录关节1、关节2回零角度,判断机器人控制效果。填写下表:标定次数关节1回零角度关节2回零角度控制效果110.883889.928738关节1、2基本在在同一轴线28.7046112.48513轴2略偏离X轴311.4647210.34421关节1、2基本在在同一轴线关节1回零角度对应的脉冲数=30233关节2回零角度对应的脉冲数=273042、记录视场标定结果坐标轴工作台原点工作台定点视场原点视场定点X-62.552.5227447Y342.5267.5173307Kx=0.568182;Ky=0.5597013、运动控制卡编程及回零操作运动控制卡编程的说明GT-400是用户可编程运动控制器,提供了一套四轴运动控制器及用C和C++语言编写的用户接口函数库。控制轴GT-400运动控制器具有四个步进电机控制通道,可同时控制四个步进电机进行运动,这四个控制通道简称为四个控制轴。命令返回值命令与库函数运动控制器是按照主机发送的运动控制命令工作的。运动控制器配套有C语言函数库(DOS环境)和动态连接库(Windows环境)。用户通过在主机编制程序调用相应的库函数,也就是向运动控制器发出运动控制命令(简称命令)。对于用户通过主机发送的命令,运动控制器在检查、校验后,会给出一个反馈。这个反馈就是命令(库函数)的返回值。每一条库函数指令都会返回一个值,便于用户进行调试。如:rtn=GT_Open();运动控制器初始化GTInitial()voidGTInitial()//运动控制器初始化函数{shortrtn;rtn=GT_Open();error(rtn);//打开运动控制器设备rtn=GT_Reset();error(rtn);//复位运动控制器rtn=GT_SetSmplTm(200);error(rtn);//设置控制周期为200usfor(inti=1;i5;i++;)//屏蔽每一轴的中断{rtn=GT_Axis(i);rtn=GT_SetIntrMsk(0);}}注释:GT_Close(void):关闭运动控制器设备,用户程序结束时必须调用此函数。函数返回0表示成功,非0表示失败。因为运动控制器在控制周期内要完成必要的控制计算,控制周期不能太小,因此设定的范围为48~1966.08微秒。这里设为200微秒。输入信号参数设置InputCfg()voidInputCfg(){shortrtn;unsignedshortLmtSense=0x00FF;//赋值限位开关参数为低电平触发rtn=GT_LmtSns(LmtSense);error(rtn);//设置1~4轴正、负限位开关为高电平触发}注释:函数原型:shortGT_LmtSns(unsignedshortSense);函数说明:该函数设置限位开关有效电平。函数参数:Sense的意义见下表。表中对应位如果设置为零,表示限位开关输入信号为高时触发限位;反之,如果设置为“1”时,表示限位开关输入信号为低时触发限位。控制器上电默认为全“0”,即控制器默认限位开关状态为高电平时触发。在初始化运动控制器时,必须正确给出限位开关有效电平,否则不能保证控制器正常工作或者导致所有轴正负限位开关标志置位。控制轴初始化AxisInitial()voidAxisInitial(){shortrtn;for(inti=0;i4;i++){rtn=GT_Axis(i);error(rtn);//设置第i轴为当前轴rtn=GT_ClrSts();error(rtn);//清除当前轴不正确状态rtn=GT_StepDir();error(rtn);//设置输出脉冲+方向信号rtn=GT_AxisOn();error(rtn);//驱动使能关闭时调用GT_AxisOff()}}注释:运动控制器可以同时控制四个控制轴,并且各控制轴可以独立设置参数。为了提高主机与运动控制器的通讯效率,运动控制器采用控制轴寻址的策略。•用户程序调用的单轴命令,都是作用于当前轴的。运动控制器默认的当前轴为第一轴。要想对其他轴发送命令,首先要调用设置当前轴命令:shortGT_Axis(unsignedshortnum)将参数指定轴设置为当前轴。此后调用的单轴命令都是针对当前轴,直到再次调用该函数将当前轴设置为另一个轴。参数num表示指定的轴号,在1、2、3、4四个数中取值,分别代表第一、二、三、四轴。其他相关函数GT_Axis(num);//设置当前轴GT_SetVel(vel);//设置速度GT_SetAcc(acc);//设置加速度GT_SetPos(pos);//设置目标位置GT_Update();//运动控制器的一些参数设置函数和一些命令函数,采用双缓冲寄存器方式工作。调用GT_Update()函数后,针对当前轴的双缓冲参数和命令才能生效。GT_MltiUpdt(unsignedshortmask);//使多个轴设置的缓冲区命令和参数立即生效。与之不同,GT_Update()函数只使当前轴的设置参数和命令生效。运动控制器为每一个控制轴提供一个16位的状态寄存器。在运动过程中,可以通过调用函数GT_GetSts()查询这些状态全面了解当前轴的运动情况。unsignedshortstatus;GT_Axis(AxisNum);//AxisNum是当前轴号GT_GetSts(&status);//可以用status&0x400判断轴状态寄存器第10位是否为1注意:每次轴运动完毕后要用GT_ZeroPos()清位置。GT_CaptHome(void)该函数设置Home信号捕获位置事件。调用该函数后,位置捕获寄存器将记录Home,信号到来时的实际位置。执行一次GT_CaptHome()只能捕获到一次Home位置信息。回零程序设计思路:四自由度机械臂做回零操作时,关节1和关节2回负限位后反转一定的角度,使得关节1与关节2垂直,关节2与x轴重合,关节3回负限位后再捕获HOME零点,关节4直接回HOME零点。附上回零程序主控制程序代码部分:voidCHahaDlg::OnButtonGoback(){/*shortrtn;longnow_pos,xxx;unsignedshortstr4,status,pos_1;longrtn_pos_1;status=0x400;str4=0;xxx=0;unsignedshorti;*/GTInitial();//运动控制器初始化函数InputCfg();//专用输入信号参数设置AxisInitial();//控制轴初始化函数///以下添加自己的回零程序unsignedshortstr1,str2,str3,str4,Sts1,Sts2,Sts3;unsignedshortflag1=0,flag2=0,flag3=0,flag4=0,test=0;unsignedshortRtn;doublevel;longpos,CaptPos[2];intAxis;//m_PlayFlag=0;/*for(Axis=0;Axis4;Axis++){switch(Axis){case0:GT_Axis(1);break;case1:GT_Axis(2);break;case2:GT_Axis(3);break;default:break;*/unsignedshortstatus;GT_Axis(1);//选择工作轴1GT_SetVel(3);//设定速度GT_SetAcc(0.4);//设定加速度GT_SetPos(-9999999);//设定目标位置GT_Update();//更新轴数据状态GT_GetSts(&status);//获取轴状态while(status&0x400)//判断轴数据是否更新完毕{GT_GetSts(&status);}GT_Axis(2);//选择工作轴2GT_SetVel(3);//设定速度GT_SetAcc(0.4);//设定加速度GT_SetPos(-9999999);//设置目标位置GT_Update();//更新轴数据状态GT_GetSts(&status);//获取轴数据状态while(status&0x400)//判断是否完成轴数据更新{GT_GetSts(&status);}GT_Axis(1);GT_SetVel(3);GT_SetAcc(0.4);GT_SetPos(30233);//根据轴1的回零角度给定脉冲值30233GT_Update();GT_GetSts(&status);while(status&0x400){GT_GetSts(&status);}GT_Axis(2);GT_SetVel(3);GT_SetAcc(0.4);GT_SetPos(27304);//根据轴2的回零角度给定脉冲值27304GT_Update();GT_GetSts(&status);while(status&0x400)