HITGo——智能象棋娱乐平台【2】
第三章 HITGo系统实现
3.1 界面控制系统
系统进程时序如图3-1所示,为了使得用户能够更好地控制本系统的流程,给予用户更好地体验,本系统包含了使用Qt编写的图形交互界面。
Qt是一个跨平台C++图形用户界面应用程序开发框架,拥有诸多的优势:
1、优良的跨平台特性
Qt支持下列操作系统:Microsoft Windows 95/98,Microsoft Windows NT,Linux等。
2、面向对象
Qt的良好封装机制使得Qt的模块化程度非常高,对于用户开发来说是非常方便的。
3、丰富的API
QT拥有友好丰富的界面库,开发起来简单,同时Qt为广大开发者提供了免费而又友好的集成开发环境,也不用承受太大的成本。最终的用户界面如图3-2所示:
图3-2 用户界面
经过设计Qt界面控制系统具有以下功能:
菜单-帮助:介绍整个系统的操作流程和使用步骤。
菜单-关于:关于我们团队的一些基本信息。
新局:在你刚进入界面或者想任意时刻想要重新再来一局的时候,点击新局按钮。
人人对战模式:即用户可以通过互联网和远处使用HITGo APP的友人进行交战。
人机对战模式:控制板会通过算法对用户的走法进行分析,然后做出最好的方案在通过机械手应对。
认输:在对战过程中,你可以选择认输,这时界面弹出“you out!“的对话框,同时程序会自动恢复成新局状态。
难度选择:对战之前,可选择对战难度。
确认:当你下完一步棋后,必须点击确认按钮,这时程序才能启动摄像头对棋盘进行识别,获得用户的走法。
3.2智能着法产生系统
AlphaBeta剪枝算法是当今中国象棋算法中占据主流地位的算法。本作品基于剪枝算法实现了智能着法的产生。
程序的基本框架:
从程序的结构上讲,大体上可以将着法产生部分划分为四大流程:棋局表示、着法生成、搜索算法、局面评估[4],如图3-2所示。
1、棋局表示
对于棋盘的表示,采用了传统的较为简单的“棋盘数组”——即用一个9*10的数组来存储棋盘上的信息。
2、着法生成
采用的基本思想是遍历整个棋盘,当发现有当前下棋方的棋子时就根据它是何种棋子而相应地找出其所有合法着法,然后存入着法队列。“合法着法”包括各棋子按其行子规则行子、行子不能越出棋盘界限、将帅不能碰面等。
3、搜索算法
程序中直接借鉴了Alpha-Beta搜索算法并辅以了历史启发。首先对于棋类游戏存在一棵“博弈树”—树的每一个结点代表棋盘上的一个局面,对每一个局面(结点)根据不同的走法又产生不同的局面(生出新的结点),如此不断直到再无可选择的走法(棋局结束)。这就是“最大-最小”的基本思想。你看到某个局面有可能产生很糟糕的局面时,你应当立刻停止对其剩余子结点的分析,这样一来便可以很大程度上减少搜索的工作量,提高搜索效率。这称为“树的剪裁”。“最大-最小”的思想再加上“对树的剪裁”就是Alpha-Beta搜索算法的核心。
4、局面评估
局面评估则负责对搜索的内容进行判断评价。在中国象棋中所要考虑的最基本的几个因素包括如下四点:
(1)子力总和:子力是指某一棋子本身所具有的价值。
(2)棋子位置:棋子位置是指某一方的棋子在棋盘上所占据(控制)的位置。
(3)棋子的机动性:棋子的机动性指棋子的灵活度(可移动性)。
(4)棋子的相互关系:这一点的分析较为复杂,因为一个棋子与不同的子之间往往存在多重关系
对于子力打分和控制区域打分,只要遍历棋盘,当遇到棋子时简单地去查事先定义好的“子力价值表”和“控制区域价值表”,取出相对应的值进行累加即可对于机动性打分,需要求出各个子总共有多少种走法,然后根据各个子所不同的机动性价值每多一种走法就加一次相应的分数。根据关系表来具体考察棋子的相互关系,进行关系打分。
3.3 棋盘图像处理系统
在本作品中,对用户下棋着法的检测是通过运行于嵌入式系统中的图像处理算法完成的,算法的示意图如图3-2所示。
算法步骤可以归结为:
1、通过USB摄像头获取人走子前棋盘状况以及走子后棋盘状况,存储帧图像。
当用户按下走起确认键确认已经走完子或者机械臂完成动作,程序将从视频流中读取一帧数据,保存作为待处理的源图像。原始帧是用户着子前的图像,对比帧是用户着子后的图像。
2、使用中值滤波算法进行平滑处理,去除噪声影响。
中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术。在本算法中,由于周围环境的缘故,噪声不可避免,比如椒盐噪声等。对转化为HSV的空间原始帧和对比帧三个通道分别进行中值滤波,可有效滤除其噪声。
3、设定阀值,分别对原始帧和对比帧设定阀值进行分类,并通过对棋盘结构定位识别最终得到认得做法。
经过采集、转换色彩空间和中值滤波去除各种扰乱噪声后的图像,将进行阀值设定与判决。通过对单独棋子进行试验,根据用户方棋子的三通道数值实际情况,设定H、S、V三个通道的各自阀值,以便于电脑方的黑子分开。
由于摄像头依靠支架支撑,与亚克力棋盘的相对位置固定,故而各个棋子位置在事先已经可以确定。为每个棋子位置设定相对于图像的范围,设定判决有红子阀值,当某一个位置像素值总和高于此值时,判断为有红子,位置矩阵对应的变量值设为1。当某一个位置像素值总和低于此值时,判断为无红子,位置矩阵相应的变量值设为0。
将对比帧矩阵减去初始帧矩阵,值为1的位置为用户的落脚点,值为-1的位置为用户的出发点。
4、进行识别结果合法性检测,减小错误概率。
由于摄像头本身读取的问题,上述算法有极小的可能性导致矩阵识别错误。需要加入合法性检测的环节。具体检测方法:对比对比帧矩阵减去初始帧矩阵后的结果矩阵,如果有三个或者三个以上元素不为0,则表示摄像头算法部分程序产生问题,重新读取对比帧,再次进行算法整个步骤。
经过摄像头图像处理算法后,用户的走法可以用四个数字表示:出发点的X坐标,出发点的Y坐标,落子点的X坐标,落子点的Y坐标。
3.4 机械臂运动系统
3.4.1导轨滑台的控制
为使机械爪能准确定位到目标棋子位置,需要对X、Y、Z三组导轨滑台进行准确控制,其实质就是对电机的精确控制。
本设计采用的执行部件为57两相混合式步进电机。两相步进电机示意图如图3-3所示,定子上有八个绕有线圈的铁心磁极,八个线圈串接成A、B两相绕组,每个定子磁极边缘有多个小齿。转子由两段有齿环形转子铁心、装在转子铁心内部的环形磁钢及轴承、轴组成,将环形磁钢沿轴向充磁。
初始状态,A相通电产生保持力矩,B相通电,定子磁场旋转90度,吸引转子旋转1/4齿距(30度),/A相通电、/B相、A相通电定子磁场各旋转90度,各吸引转子旋转1/4齿距(30度)。4步一个循环后共转过一个齿距120度,12步后转子旋转一周。每一次仅一相绕组通电,四拍一个循环。称之为单四拍工作状态。同时步进电机还具有双四拍、单八拍、双八拍等工作状态。
在了解两相步进电机控制原理后,需对电机进行驱动。驱动器的原理图如图3-4所示。接口电路用光电隔离方式将运动控制器和驱动器连接起来,避免驱动器中的大电流干扰信号经地线窜入运动控制器电路。环形分配器将脉冲及方向信号按设定的节拍方式,转换为功放管的导通和截止信号,从而控制各相绕组的通电和断电。功率放大器将电源功率转换为电机输出功率驱动负载运动。
在实际制作中,本设计使用型号为ZD-6560-V4C 57步进电机驱动器,驱动器的接口定义如图3-5所示。
实际接线如图3-6所示。只要单片机给驱动器合适的脉冲频率,占空比和输出脉冲的个数,就能精确控制步进电机的旋转角度,从而精确控制导轨滑台的移动距离。
3.4.2机械爪的控制
机械爪的控制实质上就是对舵机的控制。舵机是一种位置(角度)伺服的驱动器,适用于机械爪夹持棋子。
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以本设计使用的180度角度伺服为例,对应的控制关系如表3-1所示。
表3-1 高电平时间与舵机的控制关系
因此,单片机只要给舵机周期为20ms,占空比合适的PWM信号,就能控制舵机转过的角度,从而精确控制机械爪对棋子的夹持状态。
3.4.3系统软件设计
软件整体设计如图3-7所示。X、Y、Z三组导轨滑台和机械爪的整体控制由Genuino开发板完成。上电后,开发板首先进行系统初始化,然后检测各部分是否正常工作,若有故障,则向Intel MinnowBoard Turbot作为系统中心控制设备报错。若正常,则开始通过串口接收来自系统中心控制设备的数据。这里的数据包括包含有棋子走法的数据和一个校验数据。Genuino获得数据后首先对数据进行校验,若数据有丢失或者有错误,则通过串口向中心控制设备报错并请求重发数据,直到得到正确的数据。然后,Genuino通过一系列算法将得到的数据转换位X、Y、Z三组导轨滑台驱动器的输入量和机械爪的输入量。最后,机械臂运动完成后Genuino发送走棋已经完成的标志,然后等待下一次走棋数据的输入。
分享让更多人看到
推荐阅读
相关新闻
- 评论
- 关注