第4章 控制系统软件
以上完成了机器人的本体设计和控制系统硬件的搭;,下面将通过设计控制软件,使计算机通过数据采集卡有条不紊地向外部发送指挥信号,最终驱动机器人各个关节的运动,使之按照人的意愿“工作”。
4.1预期的功能
(1)实时显示各个关节角,并且可以防止各个关节的运动角度超出预定的关
节角范围内;
(2)实现直流电机的伺服控制;
(3)实现电机的自锁;
(4)实现示教编程及在线修改程序;
(5)可以设置参考点,使机器人在空间有一个固定的参考位置,可以回参考
点。
4.2 实现方法
以模块化程序设计思想为指导,以预期要实现的功能作为各个模块,设计控制软件。
从图3.1可以看出,工控机通过数据采集控制 。编程的任务其实就是用计算机控制数据采集卡使之发出或获取一系列数字量、模拟量。
研华公司的数据采集卡驱动程序中,附带许多与板卡相关的函数和数据结构以供使用,极大的方便了程序编写。
s文采用了Visual C++作为编程工具。
4.2.1实时显示各个关节角及运动范围控制
在BOOL CRobotDlg::OnInitDialog()函数中,
设置定时器SetTimer(1, gwScanTime, NULL),
然后在void CRobotDlg::OnTimer(UINT nIDEvent)函数s,
通过调用bool CRobotDlg::position_now(USHORT ka1_chan),采样电位器输出电压,通过前面的电位器标定函数,换算出各个关节的角度,并显示出来。
在void CRobotDlg::OnChangeAngle?Edit()函数中(?表示1,2,3,4,5),
将换算出的角度与该关节预设的运动范围作比较,看其是否在此区间内,否则弹出警告对话框,并且自动停止该关节的运动。
4.2.2直流电机的伺服控制
对于大功率的直流电机,一般采用PWM控制来调节运行速度,这样可以提高电路及电
的运行效率,而本文中的电机功率并不是很大,为方便期间,采用了线性控制方法来调速。
以关节1为例,与该模块相关的函数有OnZ1Button(), OnF1Button(), OnT1Button(),它们分别表示用来控制电机的正转、反转和停止,其中电机的运行速度靠输入的电压值调节;另外一个函数OnRun1Button()是用来实现电机的位置伺服控制,在预定的关节角范围内,电机可以运行到任何一输入的位置停止。
4.2.3电机的自锁
前面在2.7节中讲到该机器人关节上未装制动器,所以必须通过软件程序实现关节的缢,尤其是肩关节和肘关节的自锁。
解决思路:大臂和小臂在电机运转时不会由于重力而掉落,在电机停止的时候却会下落,因为电机一旦停止,就失去了驱动力矩,因此若想让大臂和小臂停止在预定位置,应该在此位置给关节电机施加一个电压,让它担负绱蟊刍蛐”郏而不让其由于重力而下落。但是,在不同的位置,重力对大臂或小臂的力矩不同,应提供给电机的电压也不同,如何选取电机的电压呢?
提供给电机的电压小了,不足以抵抗重力的力矩;提供给电机的电压大了,会使电机转动,使大臂或小臂上升;所以,最好缤ü程序来自适应选择这个制动电压,方法有多种,下面是本文的设计过程。
程序设计方法一:
在调用在OnT2Button()或OnT3Button()函数时,先给电机一个0电压,使电机失去驱动力矩,同时调用position_now(USHORT ka1_chan)缡获得此刻的关节位置,然后延时一段时间比如0.1s,再给电机一个小电压,形成一个小的制动力矩,通过采样此刻位置看其是否能使关节制动;如果不能,则使该电压值按照一定的步长线性增加,以增大制动力矩;这通过一个while()循环实现,如果采样位置不再减小,则表示大臂或小臂已停止下落,可跳出循环。
下图为程序流程图:
方法一验证:
用方法一编写的程序,调用OnT2Button()或OnT3Button()函数后,对于正在上升的臂可以实现很好的制动,而对于下降的臂则不可靠,有时候下降的臂停止下落后会反弹又向上运动。
定性分析其原因是由于上升的臂在电机失去驱动力矩后,在重力作用下会慢慢下落,下落初速度为0,静止后的速度变化不大,制动时间短,容易制动;而下降的臂失去驱动力矩后,在重力作用下仍以原来的速度下落,静止后的速度变化较大,制动时间长,很容易使制动电压的线性增长时,超过平衡重力所需要的电压,从而导致反弹现象的发生,其实质是由于电压的超调造成的。
此后,针对这种反弹现象对程序作过多次修改,结果都不太理裕所以就尝试换一种方法。
程序设计方法二:
方法二采用传统的PID控制,电压超调后还可以减小,可以避免反弹现象的发生。
下图为程序流程图:
|
|
|
|
|
|
|
|
|
用for函数控制循环次数,经过n此循环后,跳出循环,大臂或小臂已停止下落实现制动
|
|
方法二验证:
由于方法二采用PID控制,需要选择合适的比例、积分、微分系数;另外还要选择for()循环中的延时时间t和循环次数n。
选择结果:kp=2.0, ki=0.02, kd=0.04,
t=10, n=10;
所以最终制动时间为n*t=100ms
总结:
对于方法二,其控框图如图4.1所示:
图4.1
4.2.4示教编程及在线修改程序
设计方法:当机器人停止在某个位置时,可以记录下在该位置所对应的一组关节角,这一组关节角用一个结构体存储
struct position
{
float Voltage1;
float Voltage2;
float Voltage3;
float Voltage4;
float Voltage5;
struct position *next;
}
记录的位置同时显示在列表框中,记录位置不超过1000个。
为了便于对这些位置作修改,本文采用链表来动态存储这些&构体。
当记录结束以后,就可以运行刚才记录的一系列位置了,由于采用链表结构存储程序,所以取用这些程序很方便,只需用一个指针从链表首部开始取程序,逐行运行,至到链表末尾即可。
程序运行的时候,机器人各个关节同时运动,工作效率高;正在&行的那行程序,以高亮状态显示。
另外,对于记录的位置可以做删除、清空等操作。
4.2.5设置参考点及回参考点
程序启动或退出的时候,机器人应停留在预设的参考点上,这个参考点在初始对话框函数BOOL CRobotDlg::OnInitDialog()中预先设置。在程序运行期间,使用者也可以自行设置。
回参考点的程序和回放示教程序一样,不过回参考点只是运行到一个位置。
第5章 总结
5.1 所完O的工作
(1)对实验平台的改造
本文利用的是报废的焊接机器人,要改造成送料机器人,不但要对末端执行机构进行重新设计,还要重新布线。
(2)对关节轴电位器进行重新标定
由于标定电压O同,标定曲线和所得的函数关系就不同,本文选用的是10v电压。
(3) 设计端子板电路及驱动电路
端子板是计算机、板卡控制信号端与机器人电路端的“桥梁”,承担着信号调理、驱动放大等任务。
(4)控制软件的设计
软件是机器人的“大脑思维”,软件的设计就是将人的意志赋予机器人的“大脑”。
5.2 设计经验
(1)底座设计成长方体不合理
当腰关节在不同的位置时,肩关节运动的下限不同,不便于编程;最好将底座设计成圆柱体,并且下面带有法兰支撑。
(2)最好安装机械制动装置
仅依靠程序来实现制动并不可靠,例如突然掉电,将无法制动。
(3)电机上应安装放电回路
电机相当于一个线圈,在没启动或者停止瞬间,会产生很高的感应电动势,很可能会对电路中的元器件造成破坏,所以要加上稳压或者续流元件。
(4)电位器输出电压会在一定范围内会有无规则的波动
由于电位器材料电阻率分布的不均匀以及电刷滑动时接触电阻的无规律变化,会引起所谓的“滑动噪声”。这导致电位器反馈电压并不准确。
(5)关节角的方向及电位器的安装
关节角最好符合关节角坐标系,并且电位器输出电压最好随关节角的增大而增大,这样便于编程。
5.3 误差分析
本文中每个关节的角度误差在±2°左右,由于是开环机构,所以综合叠加起来,末端误差可能会较大,并且重复精度不够。
下面简要分析一下误差的来源:
(1)工作台、基座的上下表面平行度误差,腰关节转轴的垂直度误差,以及其它关节之间的平行度误差
(2)齿轮、轴承的间隙,齿形带的变形不均匀
(3)装配误差
(4)各关节轴的回转误差,各连杆的受力变形误差;
(5)运行时,机械部分的振动
(6)电位器的滑动噪声,以及电源的不稳定都会导致反馈电压的不准确
(7)用程序实现制动不如机械制动装置反应快
5.4 可以继续探索的方向
(1)对于本文中的示教编程部分,将程序稍作修改,就能实现对示教程序的保存和离线修改,进而也容易实现离线编程。
(2)可以用Opengl或者ADAMS订作一个虚拟场景,进而实现虚拟示教编程,这样会更加安全和方便。当然手工编写的程序代码也可以在此虚拟场景中运行,以验证其合理与否。
(3)通过虚拟场景和网络,也可以进一步实现对机器人的远程监测和控制。
(4)还可以尝试在原有实验平台上加上视觉反馈。
(5)控制界面如果用LabView设计,可能会更方便些。
(6)通过进一步完善控制方式和控制结构,可以将控制系统的软件嵌入到嵌入式系统上去。
致 谢
附件下载