基于OpenMv视觉识别的自主投篮机器人实现
2020-07-20顾祯婕高宇杰
顾祯婕,文 哲,高宇杰
(中国民航大学,天津 300300)
华北五省机器人比赛的竞技体育项目是一项适合刚入门学习单片机的学生参加的比赛,本文针对其中类人机器人的投篮项目展开研究。OpenMV作为一种可编程的视觉模块,得到广泛应用,其成本低廉,操控简单,应用广阔,能够实现智能化、自动化。类人机器人在救援探险等领域有广泛应用需求,备受青睐,机器人研究是当今热门课题之一。目前,类人机器人凭借其自身优势得到广泛的研究、应用。机器人工作范围广泛、所需要的人力资源少等优点使得各式各样的机器人深入研究层出不穷。研究目的是能够运用一个新型类人机器人,连接OpenMv摄像头,完成摄像头对篮球、篮筐底座等相关物体的识别,使机器人自主完成抓球与投篮的动作,保证投篮率,验证了基于OpenMv的投篮机器人可以完成自主投篮,为实现机器人的智能化、人性化提供了新的思路[1]。
1 类人机器人介绍
1.1 类人机器人基本结构
本次用到的机器人有17个自由度,手臂各3个,左、右腿部各5个,头部一个,其中,头上的舵机用来放OpenMv摄像头。每个自由度由一个LDX-218型舵机控制,通过PCA9685舵机扩展板发送每个关节的指令[2]。
1.2 PCA9685舵机扩展
PCA9685舵机扩展可同时控制8个舵机。若把PCA9685舵机扩展板背部焊点连接起来,如图1右上方框内部分所示,更改I2C协议的地址,可以控制更多的舵机。两个舵机拓展板叠插使用最多可以同时控制16个舵机,以此类推。
舵机采用4.8~6 V的电源供电,也可以采用4节或者5节干电池来供电,在考虑了机器人整体轻便性与动作灵活性的基础上,建议采用7.2 V锂电池。务必注意不能直接使用3.7 V的锂电池来供电,会使舵机供电不足而缺乏扭矩[3]。
1.3 舵机调试上位机软件
机器人共有17个舵机,只需要用到其中的17路[4]。在Robot上位机软件中,找到每个舵机对应的编号,拖动滑块使舵机转到对应的角度,更新动作后保存即可。完成投篮任务需要的动作有直走、左转、右转。需要注意的是,起始点、捡球点、篮筐三点直线,因此直走需要调得越直越好。把这3个动作下载到相应的动作组里,在程序中调用即可。
图1 叠插扩展板需要连接的引脚
2 LAB颜色识别原理简介
将人的视觉感应使用数字化的方法来描述。如果L,A,B变化的幅度一样,那么给人带来视觉上的变化幅度也差不多。
L表示亮度,从0~100逐渐变亮(0表示黑色,100表示白色)。A表示红绿属性的色相,0代表灰色,从负值到正值时,对应颜色即从绿色变到红色。B表示黄蓝属性的色相,0代表灰色,从负值到正值时,对应颜色即从蓝色变到黄色。
3 硬件设计— OpenMv与PCA9685舵机扩展板的连接
只用一个PCA9685舵机扩展板时,不需要焊接背部的焊点,直接插在OpenMv上即可。注意对接的引脚和插入的方向,舵机引脚方向与摄像头相反。如果控制8个以上的舵机,可以叠插第二个舵机扩展板,但是此时需要连接图1右上方框内的两个引脚。
在连接电源时,直接将扩展板上VCC,GND引脚接入电源的正负极,通入4.8~6 V的电压即可。如图1的左侧和下方的两个矩形框所示,舵机扩展板上每列插针从上往下依次为PWM,VCC,GND,分别对应舵机的PWM,VCC,GND,数字编号表示对应的8个舵机依次排列[5]。
4 软件设计
4.1 开发环境与基本函数
OpenMv有其专用的开发软件:OpenMv IDE,可直接使用Python对其编程。OpenMv IDE的编程使用的是Python语言。
投篮机器人的OpenMv中频繁使用的函数如表1所示,主要用于标记识别出的色块区域,在色块中心部位画出一个十字,便于进行后续工作。
表1 标记色块的函数
4.2 I2C通信协议的使用
PCA9685舵机扩展板采用的是I2C通信协议。对于OpenMv与舵机扩展板的通信,首先,需要有一个PCA9685的模块,再对模块定义一个类;其次,需要定义一个servos类来对舵机进行实例化,在servos.py舵机控制算法里引入PCA9685。
在main.py主程序里可以直接引用I2C协议和时钟。关于PCA9685的I2C协议的地址可查询为0x40,即def __init__(self, i2c, address=0x40);若叠插使用,即背部引脚焊接,则地址address为0x60。
若一次性扩展两个舵机扩展板,则在main.py函数中使用两次servo,可标记为servo1,servo2。相应地,根据所需要舵机的运动顺序情况来标记主函数中servo.position(i, 0)。
4.3 运用IDE调节色域阙值
(1)threshold函数。选取阈值需要用到threshold函数,数组里的阈值需要自行调整。通常采用的是LAB色彩模式。(2)阈值编辑。打开IDE中的阈值编辑器,选择LAB色彩模式,拖动下方的滑块,使右方二值化图像中出现明显的球形状,把所得的阙值复制到threshold函数里即可。(3)框出色块。画框需要用到的函数在上面Python语言已给出,再使用以下算法将所选色域画框并在中心标记十字:
此时就可以知道是否有识别到小的色块,若白框没有出现,说明阈值发生错误,需要重新调整。
5 实验验证
5.1 舵机调试实验
完成机器人整体改装后,将PCA9685舵机扩展板连接上位机,用上位机调试舵机的角度,反复调试出捡球前的直走、左转、右转动作;捡球动作;捡球后的直走、左转、右转动作。其中直走需要调整得很精细,左移、右移、左转、右转不必过于精细,过于精细会消耗过多转弯时间。
5.2 视觉识别实验
检查程序的完整性,看是否有错误。以橙黄色篮球为例,用阈值编辑器得到橙黄色的阈值,填入程序对应位置中。运行程序,若屏幕中橙黄色区域周围有一个矩形框,矩形框正中心有十字,则颜色识别正确。
5.3 根据色块位置调用动作组实验
当色块位置在屏幕上方区域内时执行“直走”动作;色块位置在屏幕下方区域时执行“捡球”动作;色块位置靠近屏幕左边缘时执行“左移”动作;色块位置靠近屏幕右边缘时执行“右移”动作。应多次实验检测该功能的稳定性。
6 结语
室内或室外、有灯光或无灯光、LED灯或白炽灯等因素很容易对色块的识别产生影响,需要在不同环境下对阙值做出调整。
单独的色块识别功能不够稳定,若加入测距模块,则识别更加准确。捡起球之后,需要识别篮筐或篮筐底部,单单用色块识别功能,很难找到距离远的篮筐底,这一问题仍然是下一步需要研究的。