陈 磊,王志远,黄嘉龙,汤浩楠,陈卫峰
(扬州大学 信息工程学院,江苏 扬州 225127)
近几年,随着科学技术的创新,特别是人工智能技术的发展,机器人技术逐渐应用到人们的生产、生活的各个角落。机器人技术[1-3]是一种集合了机械学、力学、电子学、生物学、控制论、人工智能和系统工程等多种学科于一体的综合性高新技术,随着机器人技术的快速发展与成熟,各式各样的机器人开始融入人们的生活,并且发挥着举足轻重的作用。
机器博弈[4-5]是博弈游戏与计算机技术的结合,是人工智能领域里一个重要研究领域,在国际上已经开展了半个多世纪。中国象棋是从两军对阵中抽象出来的一种博弈游戏,下棋的双方无时不在调动自己的一切智能,进行演绎、推算。在人工智能领域始终将棋类的机器博弈作为最具挑战性的研究方向之一[6]。目前,下棋机器人可采用机器人手臂实现运动结构,控制较为复杂,成本高。棋盘上感知棋子位置,可以在棋子中放入射频芯片,棋盘上放入射频识别芯片读卡器[7],或用多个霍尔传感器实现[8],但应用传感器数量太多,系统硬件实现困难。
本文旨在设计一个小型化、智能化的中国象棋机器人硬件实验平台,平台的上位机可以用树莓派或计算机实现,用摄像头识别棋子位置,机械结构控制方便。系统可以直接与人进行对弈,通过语音进行提示,可以让使用者有较好的临场感。同时基于本实验平台,可以设计验证人工智能中常用的图像识别、深度搜索和人机博弈等算法。
本系统的实现包括机械结构、上位机控制程序和下位机控制程序的设计。下位机通过串口与上位机通信,主要负责棋子取放的运动控制,上位机负责象棋的走棋算法和对棋子、棋盘的图像识别处理等复杂运算功能,对弈过程中的实时信息通过上位机控制音箱进行语音播报。系统结构框图如图1所示。
图1 系统结构框图
中国象棋是一种对弈游戏,棋盘为长方形,决定了象棋机器人的执行结构采用直角坐标控制较为方便[9]。本系统平台采用直角坐标机器人,运动控制系统共有3个方向的运动,每个运动轴分别对应于直角坐标系中的X,Y,Z轴。X,Y轴是水平面内相互垂直的运动轴,Z轴是垂直于水平面的上下方向的运动轴。
通过对X,Y轴运动的控制,可以确定取放棋子的位置,所以X,Y轴要保证运动精度。系统采用42型步进电机带动同步轮,同步轮带动运动履带来实现X,Y方向的精确运动控制[10]。同步轮直径为22.3 mm,步进电机的步进角为1.8°,所以运动精度可以达到每步0.35 mm。Z轴用来控制棋子的拿起和放下,只需要保证拿起棋子时,棋子底面高于其他棋子即可,不需要严格的精度,因而系统采用推杆电机连接微型直流吸盘式电磁铁,实现对棋子的取放功能。
系统由上位机控制固定于棋盘正上方的摄像头获取棋子的位置,与电机的运动控制形成一个闭环运动系统,机械结构如图2所示。
图2 中国象棋机器人机械结构
中国象棋机器人硬件电路的主要功能是实现机械结构的运动控制,由下位机控制实现。下位机的主控制器采用STM32F103RCT6单片机[11-12]。硬件电路框图如图3所示。
图3 硬件电路框图
下位机分别连接3路A4988步进电机驱动模块,驱动X,Y轴步进电机和Z轴推杆电机。X,Y轴步进电机配合摄像头的图像识别进行运动定位,推杆电机用于抓取、移动棋子。推杆电机的行程为10 mm,符合抓取棋子的高度要求。电磁铁连接在推杆电机顶端,通电后产生足够吸力,抓取象棋棋子。
系统软件主要包括3部分:①下位机控制机械结构运动的控制程序;② 上位机对被移动棋子位置的图像识别程序;③ 象棋算法程序。
下位机控制机械结构运动的程序通过STM32单片机用C语言编程实现,主程序流程如图4所示。具体的运动方向和运动距离由上位机通过串口发送来的控制数据实现。
图4 下位机主程序流程
识别棋子运动位置的算法[13-14],是上位机通过控制摄像头捕获棋盘画面,用Python运行OpenCV函数库编程实现。已实现的系统中运用了霍夫圆心检测、HSV颜色提取和归一化数组相结合的算法[15-16],如图5所示。该算法成功的前提是棋盘初始化时棋子要放在正确位置,在对弈过程中,通过检测棋子的圆心,根据棋盘变化来判定对手的棋子如何移动。
图5 进行颜色分割后的棋盘及棋子
象棋的算法是在上位机中通过调用C++编程的中国象棋引擎实现,主要包括局面表示、走法表示及生成、局面评估和搜索算法四大部分。中国象棋引擎棋力的高低主要由搜索算法的搜索深度决定。搜索深度越深,程序的棋力越强。系统中设定的初级、中级和高级不同难度,就是通过改变搜索深度来决定象棋机器人的棋力水平。搜索深度的优先遍历可用递归算法实现,其中搜索深度与棋局结束条件作为递归终点。为了加快搜索速度,本系统使用Alpha-Beta剪枝算法[17]对搜索树进行剪枝。经测算,当搜索6层时,Alpha-Beta搜索算法的效率是普通搜索算法的50~60倍。
系统调试时,几个电机的参数设置对运动定位的精确性非常重要。系统X,Y轴电机是采用42型步进电机,步进角是1.8°,通过对机械结构的设计和反复测试,得到对应步进距离为每步0.35 mm。根据象棋棋盘每格的尺寸,以及步进电机每个步进字对应的行进距离,上位机可以推算出将棋子放置于不同位置需要的步进脉冲数,数据通过串口发送至下位机中进行控制。
上电后系统初始化,电机归位到棋盘一角,以此为基准点,进行后面取放棋子的操作。每次取放结束后,Z轴的推杆电机都由X,Y轴的步进电机归位到棋盘上的基准点位置,保证各步操作不会产生累积误差,从而每次都能正确地取放棋子。对弈过程中,被象棋机器人吃掉的对方棋子,会被放置在棋盘下面的方格区域,以防止对后面的行棋产生影响。
本系统在直角坐标运动系统的基础上,通过摄像头采集图像进行图像识别,得到棋盘中棋子的变化。结合中国象棋引擎实现一个可以与人进行对弈的中国象棋机器人。运动系统采用步进电机实现,保证系统执行中的运动精度。上位机的功能,可以根据需要,采用计算机或树莓派实现。目前系统已实现搜索深度为6步的象棋功能,从而可以控制不同难度等级的对弈机器人模式。系统可以作为人工智能算法的训练实验平台,可以在中国象棋的决策系统、图像识别和视觉技术中进行相应的算法验证。此外,还可以增加语音控制功能,用以设计、验证语音控制算法,实现语音控制对弈象棋的功能。