使用弯曲传感器的机器人手势控制系统设计
2018-09-07,,,
, , ,
(常州刘国钧高等职业技术学校,常州 213025)
引 言
当前,工业机器人的操作方法大概可以分为离线编程和示教再现两种。示教再现又可以分为人工导引和用示教盒控制来使机器人完成预期的动作等方式。人机交互是工业机器人发展的明显技术特征之一[1-3]。若能通过人类手部动作直接控制机器人运动,则可以使得机器人的控制变得更加直观和清晰。
本文设计了一种基于弯曲传感器的机器人手势控制系统。该系统通过弯曲传感器捕捉人体手指的动作,然后将这些动作转化为电压量,作为开源平台Arduino UNO R3的模拟输入信号;经Arduino UNO R3进行算法处理后,控制3路舵机运动,实现了利用手指动作驱动机器人关节运动的目的。
1 总体设计
图1 机器人实物图
该机器人由机器人本体、电源、主控制系统和手势信号采集系统等部分组成,如图1所示。机器人本体部分采用3D打印技术制作的开源EEZYbotARM,驱动动力来源于3个舵机,分别控制机器人的大臂旋转、小臂旋转和夹爪张合。该结构可保证机械手在工作时,末端执行器底面始终与底座底面保持平行[4]。
2 控制系统硬件电路设计
控制系统硬件电路主要包括电源、主控制系统和手势信号采集系统等部分。主控制系统采用的是Arduino UNO R3控制板,电源采用12 V锂电池供电,手势信号采集系统的核心部件为弯曲传感器。
2.1 Arduino UNO R3 介绍
Arduino是一种开源的电子原型平台,可以连接各类传感器、马达等电子元件。Arduino UNO R3采用ATmega328作为核心CPU,具有6路模拟输入接口和14路数字I/O接口,含有6路PWM输出。Arduino编程使用Arduino IDE软件,由于其基于C语言,因此控制系统的开发过程变得更加简洁和方便。近几年,Arduino开源电子原型平台在各类电路设计中的应用越来越广泛[5-6]。
2.2 手指动作采集原理
弯曲传感器是一种简单测量弯曲强度的传感器,可以将它固定在被测曲面上,配合模拟输出,方便将弯曲信息采集并处理[7-8]。弯曲传感器的电阻值与弯曲角度之间的关系如图2所示。
图2 弯曲传感器的电阻值与弯曲角度之间的关系
通过3D打印技术制作的弯曲传感器固定夹将弯曲传感器固定在指上,以用于采集手指的弯曲动作,如图3所示。在本设计中,共采用了3组手指屈伸动作信号采集电路,各路弯曲传感器与Arduino Uno R3联接电路如图4所示。
图3 弯曲传感器固定夹
图4 控制系统总体电路结构
各路传感器采集的手指屈伸动作信号经集成运算放大器LM339处理后,传递给Arduino Uno R3主控板进行处理,每路手指屈伸动作信号采集电路的原理图如图5所示,主控板输入端的端口电压值如下所示:
(1)
其中,Vcc为电源电压,Rf为弯曲传感器电阻值,R2为分压电阻阻值。
图5 手指屈伸动作信号采集电路
3 程序设计
3.1 移动平均滤波算法
常用的数字滤波算法包括中位值平均法、限幅法、移动平均滤波算法等。在本设计中,采用了移动平均滤波算法,这是一种滤除信号中高频尖峰脉冲(干扰或频繁随机起伏)的简捷而有效的滤波方式,其实质是对信号波形的平滑处理,属低通滤波[9]。移动平均滤波的卷积实现形式如下:
(2)
其中,x[i+j]为输入信号,y[i]为输出信号,M是求平均时所使用的点的数量。移动平均滤波的原理是:将连续的采样数据看成一个长度固定为M的队列,队列中的数据为x[i],x[i+1],…,x[i+M-1];在一次新的测量之后,将上述队列的首数据去除,剩余(M-1)个数据依次前移,并将新的采样数据插入作为新队列的尾,得到新的队列数据为x[i+1],x[i+2],…,x[i+M];对该队列中的数据进行算术运算,并将运算结果作为本次测量的结果:
(3)
只要采样率足够高,就能得到较为理想的测量结果。图6和图7为一组弯曲传感器采集的手指弯曲信号滤波前后的波形对比。可以看出,通过移动滤波算法,原始输入信号中的随机噪声得以消除。通过后续的测试试验证明,滤波后舵机的抖动明显减弱。
图6 移动滤波前输入信号
图7 移动滤波后输入信号和上下阈值
3.2 阈值算法
为方便舵机控制,结合实验数据,本文取3.5 V电压值作为下阈值,取4 V电压值作为上阈值,如图7所示,即认为当传感器获取到的电压值在3.5~4 V范围内时,输入信号有效[10]。
3.3 舵机控制
舵机转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的。在本设计中,通过analogRead()函数读取Arduino Uno输入的模拟值,经过滤波和阈值判断后,通过map()函数将上下阈值范围内3.5~4 V 的电压值映射为舵机0°~180°旋转角度,从而控制机器人的运动。该部分程序控制流程图如图8所示,具体实现代码如下:
int value=analogRead(A0); //读取A0口输入的模拟值
pos=map(value,3.5,4,0,180);
//将读到的模拟值3.5~4映射为0°~180°
myservo.write(pos);
//舵机转动到相应角度
delay(100);
//延时一段时间让舵机转动到对应位置
图8 舵机控制程序流程图
3.4 主控制程序设计
图9 总体控制 程序流程图
控制程序采用Arduino IDE软件对程序进行编写,图9为控制系统主程序流程图。由于Arduino Uno的时钟周期较短,因此在本设计中,采用循环扫描、顺序执行的方式控制3路舵机驱动的运行。
4 试验测试
图10和图11为利用手指动作控制夹爪张合的测试画面。测试结果表明,随着手指弯曲程度的增大,夹爪逐渐闭合;手指逐渐伸直,夹爪也慢慢张开,整个过程中,舵机运行较为平稳。图12为利用手指动作控制机器人抓取物料的画面,测试过程中机器人的动作与手指的动作吻合,机器人运行平稳,控制准确可靠。
图10 夹爪张开
图11 夹爪闭合
图12 综合测试
结 语
刘天宋(助教),主要研究方向为机械设计与仿真。