北华大学-北华翔龙-创意组技术报告20 1_第1页
北华大学-北华翔龙-创意组技术报告20 1_第2页
北华大学-北华翔龙-创意组技术报告20 1_第3页
北华大学-北华翔龙-创意组技术报告20 1_第4页
北华大学-北华翔龙-创意组技术报告20 1_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十四届全国大学“恩智浦”杯智能汽车竞赛技术报告学校:北华大学队伍名称:北华翔龙参赛队员:王贤龙,王健,刘铮带队教师:陈广大,姚欣 II 摘要 本文介绍的智能车系统是为本届飞思卡尔创意组比赛设计制作的,我们采用恩智浦公司 i.MX6Q 芯片作为处理器,通过 OpenCV 处理摄像头采集到的 April Tags tag25h9 码、棋子和障碍信息,通过 pycharm 处理棋盘信息并规划路径,将路径指令通过串口发送给恩智浦公司的 MK60DN512ZVLQ10 芯片作为控制器的智能车,通过控制器判断当前指令内容并运算来实现智能车的控制。我们智能车的运动通过麦克纳姆轮来实现,该系统可以实现在平面

2、内全向自由移动,为了保证智能车的稳定运动并按照规划路线行进我们使用了编码器来确定小车各轮速度,并用陀螺仪矫正方向。我们使用了电磁铁作为抓取棋子和障碍的机构。经过大量测试证明了该方案的可行性,可以实现八皇后自主识别并归位以及步步为营对弈,在智能车图像识别、运动控制和物体抓取等方面有一定的应用前景。 I 目 录第一章 引言1 第二章 系统总体方案设计2 2.1 设计思路2 2.2 技术方案2 第三章 机械结构设计3 3.1 车模整体效果图3 3.2 车轮选型5 3.3 底盘设计6 3.4 棋子和障碍移动机构设计8 第四章 硬件系统设计及实现9 4.1 主控选型及供电设计9 4.2 电机驱动模块设计

3、10 4.3 主控板电路设12 4.4 继电器电路设计13 第五章 视觉部分14 5.1 图像处理问题分析14 5.2 处理方法14 第六章 八皇后问题相关设计20 6.1 机械部分20 6.2 程序设计20 第七章 对抗策略方面的特殊工程设计24 7.1 机械设计24 7.2 程序设计24 第八章 参考文献27 附录28 II 第一章 引言 随着机器视觉,全向平台等方面的发展,智能车的应用领域会越来越大, 智能车将会应用到物流运输,无人驾驶等方面,本届恩智浦创意竞赛要求设计一台可以进行 April Tags tag25h9 码识别,赛道内棋子及障碍识别、定位与搬运。使用机械结构和数控算法相互

4、配合来完成全自动的八皇后识别与最优路径排序以及步步为营的对弈。 机械结构方面使用了铝型材和亚克力板作为能车的主体框架,采用可以全向移动的麦克纳姆轮作为智能车车轮。棋子及障碍摆放采用电磁铁来实现。 运动控制方面我们采用了恩智浦公司的 MK60DN512ZVLQ10 芯片作为运动控制芯片,自行制作主控板和电机驱动板来控制电机的转动。 机器视觉和图像处理方面使用 USB 工业摄像头采集图像信息传递给恩智浦公司的 i.MX6Q 芯片进行处理得到智能车和棋子障碍当前在棋盘的高精度位置。 算法方面在八皇后一题中使用了贪心算法找出当前棋子位置与八皇后 92 种解之一的最优移动解法来实现最短路径匹配,从而最大

5、化减少八皇后归位时间。在围追堵截的下棋策略方面使用 AlphaZero 算法结合蒙特卡罗树算法并进行了相应的改进使评估函数有效的进行筛选最佳决策。 1 第二章 系统总体方案设计2.1 设计思路由于创意组的赛道是一块 8*8 的方形赛道所以我们选取了可以全向移动的麦克纳姆轮结构移动平台,为了便于移动棋子和放置障碍使用电磁铁来进行抓取,遵照赛方要求微控制器必须为 NXP 公司的微控制器系列产品我们使用了NXP 公司的 MK60DN512ZVLQ10 芯片核心板作为运动处理器,NXP 公司的 i.MX6Q 芯片为 CPU 的开发板作为决策和视觉处理器,通过摄像头返回赛道图像信息传递给 i.MX6Q

6、芯片,通过 opencv 算法对 April Tags tag25h9 码值、赛道边框、棋子和障碍分布进行系统分析并规划路径,将处理结果传递给 MK60DN512ZVLQ10 芯片来控制平台执行相应任务。 2.2 技术方案我们使用了行星减速电机和麦克纳姆轮,并自行切割了亚克力板和 2020 型号铝型材作为智能车整体底盘保证车体尺寸符合要求,精确计算轮胎轴距为后续棋子移动和障碍摆放预留足够空间。 我们选用了 0.5mm 厚直径为 30cm 的圆形镀锌板贴上白色壁纸作为棋子,用电磁铁定高固定在小车底盘,经过磁力和高度的计算与调整实现了快速吸取和放置棋子。 我们选取了 1mm 厚长 30cm 宽 1

7、0cm 的镀锌板贴上红色壁纸作为障碍,为了连续放置两块障碍我们在智能车两侧安装了两个大吸力电磁铁配合陀螺仪和自制灰度传感器实现精确障碍摆放。 主控芯片方面我们分别选取了 i.MX6Q 芯片和 MK60DN512ZVLQ10 芯片, i.MX6Q 芯片作为图像和 AI 算法处理芯片通过串口收发信息与 K60 通信,通过 4 个 USB 摄像头返回图像与陀螺仪和编码盘相互矫正达到精确识别赛场上各种位置信息,驱动模块采用 BTN 驱动并隔离了驱动芯片和 K60 芯片。 我们还加装了 10.1 寸电容屏,并设计了上位机和下位机方便程序及参数调试。 2 第三章机械结构设计3.1车模整体效果图图3-1-1

8、 正视图3 图3-1-2 侧视图 图3-1-3 俯视图4 3.2 车轮选型 经过对赛场场地的分析,为了更加精准迅速的让移动平台进行移动更适合使用麦克纳姆轮,所以我们选购了直径为 152mm 的麦克纳姆轮,为提高麦克纳姆轮移动平台移动的可靠性和准确性,在分析了麦克纳姆轮全向移动的原理和运动模型的基础上,发现麦克纳姆轮移动平台中如果四个的转速控制不理想或某个打滑,造成了移动平台的移动不稳定。采用模糊 PID 控制算法,实现了对麦克纳姆轮的 4 个的转速精确控制,解决了麦克纳姆移动平台运动的不稳定性和运动方向偏离。通过 MATLAB 仿真实验和测试实验表明,模糊PID 算法对麦克纳姆移动平台的控制具

9、有很好的鲁棒性。 R 表示全向轮轴心到轮外廓圆周面的距离即轮的半径; VixVix 为第 i 轮沿 X 轴方向的分速度,m/s; ViyViy 为第 i 轮沿 Y 轴方向上的分速度,m/s, VgVg 为辊子的速度,m/s;辊子轴线与全向轮轴线夹角为 ; ii 为全向轮绕轮轴的转速,rad/s。i=1、2、3、4,分别代表了左前轮、右前轮、左后轮、右后轮。 5 通过对单轮的运动学分析,可以得出: 式中:当 i=1、4 时, 取 45;当 i=2、3 时, 取45。 将 i=1、2、3、4 带入式(1)后联立方程组可得: 式中: l0=W+Lcosl0=W+Lcos ,其中 W 为移动平台宽度,

10、L 为其前后轮轴距;而 取 45,其正负号已被提出,不再区分正负。 其逆运动学方程为: 式中 K 为逆运动学的雅可比矩阵,由运动学可知,当雅可比矩阵不满秩事时,系统存在运动学奇异点,此时系统失去可控性。而本设计中, 取44 , WLWL ,此时雅可比矩阵的秩为 rank(K)=3,所以 4 个全向轮的转速和移动平台的运动呈一一对应的关系。可以看出,若要实现移动平台的不同运动状态,只要调节各全向轮的转速便可实现。13.3 底盘设计小车底盘主要以铝型材作为框架,使用链接件紧固,因为铝型材有质轻稳固且便于切割安装的特点,以亚克力板作为底板,便于随时改进且可以起到绝缘作用,该智能车拥有上下两层底板为智

11、能车各功能模块的放置预留了足够空间。 6 图 3-3-1 小车底盘设计 3.4 棋子和障碍移动机构设计经过对机械臂抓取和车底抓取的多次测试得出将棋子及障碍的抓取结构放置在智能车底盘可以更加精确及迅速的抓取和放置障碍,为了保证电磁铁有足够吸力将棋子吸起,我们采用多组电磁铁联合吸取棋子的方法,电磁铁采用 12V 直流电池供电,总吸力最大可达 195kg。该结构通过继电器控制可以实现快速吸取和放置棋子节省了大量移动棋子时间。 图 3-4-3 吸取棋子状态图 3-4-1 棋子吸取机构 图 3-4-2 吸取棋子状态 规则要求智能车需要拥有储存两块障碍且连续摆放的能力所以我们分别在智能车前后两侧底盘加装了

12、 12V 最大吸力为 15kg 的电磁铁来吸附障碍挡板,通过摄像头、陀螺仪和灰度传感器相互配合迅速且精确的实现障碍的摆放。这种放置障碍的方法经过大量测试与调整已经足够稳定迅捷,完全可以达到决赛对障碍放置的精度要求。 7 图 3-4-4 障碍摆放机构图 3-4-5 吸取障碍状态 图 3-4-6 吸取障碍状态8 第四章 硬件系统设计及实现 4.1 主控选型及供电设计根据创意组规则要求,我们选用恩智浦公司的 K60 微控制器作为运动控制芯片,并使用了龙邱的核心子板 ,供电部分分别选用了 LM2596S-5.0 和AMS1117-3.3 来为 k60 核心板、电机编码器、陀螺仪、LCD 液晶屏、灰度传

13、感器和继电器等模块供电。 图 4-1-1 k60 核心板 图 4-1-1 供电模块电路图 我们在对比多款恩智浦公司微处理器性能和参数后选择了 i.MX6Q 系列主控板作为视觉和策略处理器,i.MX6Q 是 Freescale 推出的一款 Cortex A9 架构的四核 ARM 芯片。该芯片主频最高可达 1.2G,具有 ARMv7TM、Neon、VFPV3 和Trustzone 支持。该处理器为 64/32 位总线结构,32/32KB 的一级缓存,1M 二级缓存,可实现 12000DIPS 的高性能运算能力。集成 3D 图形加速引擎,88M 的图像多边形生成率,像素填充率可达 1.066G 像素

14、/秒,2D 图形加速最大支持4096x4096,视频编解码可支持 1080p30fps,支持 HDMI。这款芯片性能高,功耗低,可以应用于消费电子、工业控制和车载娱乐等领域。2 9 图 4-1-2 i.MX6Q 主控板4.2 电机驱动模块设计我们选择了功率较大且更加稳定的 BTN7971B 驱动芯片来驱动 24V 电机,使用 pwm 脉冲信号控制电机转速,为了方便维修和节省模块资源我们将驱动模块设计为一块四电机驱动且驱动模块上增加了 5V 供电模块方便为其他模块供电。 图 4-2-1 驱动模块电路图10 图4-2-1 驱动模块实物图 11 4.3 主控板电路设计 主控板采用两块 k60 对称排

15、布同时将 OLED 屏幕放置在核心板上节省空间,屏幕用来观测各模块参数方便调试及检查模块工作状态,主控板主要由稳压电路、按键及液晶屏、陀螺仪电路和各种传感器插接孔构成。加装电压测量模块方便检测当前电池电压及时更换电池。 图4-3-1 主控板电路图 图4-3-2 主控板实物图12 4.4 继电器电路设计 由于电磁铁需要 12V 电压来使其工作,所以我们使用了 SRD-06VDC-SL-C 型号电磁铁并通过三极管驱动继电器来控制电磁铁工作状态。 图4-4-1 继电器电路图图4-4-2 继电器实物图 13 第五章 视觉部分5.1 图像处理问题分析经过对赛题要求的分析得出需要通过摄像头获取赛场图像并通

16、过处理器处理以下问题: 【棋盘上的 April Tags tag25h9 码识别】 由于棋盘主要元素为 April Tags tag25h9 码所以要识别 April Tags tag25h9 码信息来判断当前位置参数从而控制小车移动方向。 【棋盘上棋格方框识别】由于棋盘上方框为普遍元素所以便于通过识别方框来矫正小车方向。【棋盘上棋子位置识别】智能车需要自行识别棋子在棋盘上的位置并规划最佳匹配路径【棋盘上障碍识别】智能车需要自行识别位于棋格边框上的红色挡板并返回相应位置信息。5.2 处理方法对于 April Tags tag25h9 码的识别采用调用 OpenCV 库中相应函数来实现April

17、 Tags tag25h9 码内容和三维坐标等参数的反馈通过变换得出智能车在棋盘上的相对位置,通过对面前最近方框进行多边形逼近并通过像素的 RGB 转换到 HSV 色域滤除障碍等干扰项,得到准确当前坐标,如果坐标偏移执行坐标矫正程序,如果方向漂移执行陀螺仪矫正程序,以保障智能车可以精确的执行棋子及障碍的移动和摆放。 棋子识别方式采用先计算出图像中的待检测位置,提取图像中矩形棋格, 分析棋子周围 April Tags tag25h9 码的值得出棋子在棋盘中的位置,然后对棋格内白色像素占比进行分析得出当前位置是否有棋子。 障碍识别方式和识别棋子的方法大致相同采用通过在棋盘内寻找红色矩形并与周围 A

18、pril Tags tag25h9 码的内容和相对位置对比来判断障碍位置。 14 图 5-2-1 坐标反馈调节上位机15 图 5-2-2 智能车路径反馈16 图 5-2-3 摄像头获取到的图像 图 5-2-5 April Tags tag25h9 码识别及棋子识别 图 5-2-6 竖线障碍识别17 图 5-2-8 滤除障碍 图 5-2-4 二值化处理后的图像 图 5-2-7 边缘检测及边框提取 18 图5-2-9 边框拟合提取顶点 图5-2-10 运行效果 19 第六章 八皇后问题相关设计6.1 机械部分由于棋子都摆放在每个棋格的中心位置经过测试机械臂抓取棋子和电磁铁吸取棋子的时间综合分析得出

19、使用位于智能车底盘中心的电磁铁组来吸取棋子可以更加迅速的拾取和摆放棋子,在拾取棋子和摆放的同时还可以对小车位置进行校正为接下来的移动做好准备,经过大量机械测试调整我们可以实现极为精确迅速的棋子抓放,为小车移动等步骤节省了大量时间。 6.2 程序设计经过查阅网上资料我们了解到八皇后共有 92 种固定解法,然后我们将这92 种解法通过二维数组方式储存起来,通过智能车上的摄像头返回的图像经过OpenCV 快速处理从而获取棋盘上所有白色棋子位置分布,转化为数组形式,由于小车底盘面积和棋子面积的限制,我们只能每次移动一个棋子,由于我们首先需要识别棋盘上所有棋子的位置所以我们先进行了识别棋子的路径规划,因

20、为可以使用多个摄像头同时识别 8 排棋子所以从棋盘一侧中心位置发车小车沿中心线直线移动到另一侧的中点完成识别任务。(如图 5-2-1 所示) 20 图 5-2-1 识别棋子路径规划 智能车将识别的棋子位置返回给上位机,上位机对数据进行接收并且处理, 由于机械结构和运动算法的上的缺陷,我们选择在移动最少的棋子的情况下,采用贪心算法,来降低运算时间。贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。每一步只考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数

21、据枚举完,或者不能再添加算法停止。3 由运用该算法对 92 种解法进行遍历计算得出最佳匹配解法并得出最短路径发送给运动控制器,由小车各部分相互配合完成八皇后归位。 6.3 测试软件设计为了方便程序的测试我们还自行设计了上位机测试软件,测试软件可以快速发现程序中存在的 bug 并加以改正,通过上位机的多次测试可以保证程序及系统的稳定性,对于八皇后的测试软件我们分别设计了人工输入测试和串口自动输入测试上位机。 21 图 6-3-1 八皇后上位机界面 图 6-3-2 八皇后初始输入状态 22 图 6-3-3 八皇后最优解法路径23 第七章 对抗策略方面的特殊工程设计7.1 机械设计由于决赛阶段需要连

22、续放置两块障碍挡板,所以我们分别在小车前后两侧加装了两个电磁铁和自制的灰度传感器通过摄像头、陀螺仪和灰度传感器三者的相互矫正可以做到极为精确的障碍摆放。 7.2 程序设计对于对抗策略我们按照游戏规则使用 pycharm 自行设计了步步为营决策系统,在对抗决策方面我们使用了蒙特卡洛算法,蒙特卡洛( M o t e a l o)方法,是一类通过随量 的统计试验、随机模拟,求解数学物理、工程技术问题近似解的数值方法。通过构建决策树分析多层收益对不利收益进行剪枝,得出综合路径、时间和胜率等方面综合加权平均计算出收益最大的决策,最大化节约时间并对对手收益进行减损评估,我们设计了可以在 i.MX6Q 处理

23、器 Ubuntu系统畅运行的决策界面通过串口接收和发送指令给 K60 核心板执行对抗决策,接入 AI 训练系统对失败和胜利进行评估并存储失利构架参数避免多次同样错误决策。 7.3 测试软件设计针对决赛的对抗我们同样设计了专为其定制的上位机界面,通过不断对程序的优化我们可以做到让上位机和单片机之间保持最佳通信状态,对上位机做出的决策快速执行大大节约决赛用时。 图 7-3-1 先后手选择 24 图 7-3-2 上下方选择 图 7-3-3 对弈初始状态 25 图 7-3-4 对弈进行中 26 第八章 参考文献1 张忠民, 郑仁辉. 基于模糊 PID 的麦克纳姆轮移动平台的控制算法.44(6), 53

24、-59. DOI: 10.11991/yykj.201701003.应用科技, 2017,2 i.MX6Q 技术手册3 贪心算法的探讨与研究 .中国知网 27 附录一.八皇后部分程序:from tkinter import * import threading import serialimport serial.tools.list_portsfrom calculate import *class Tkinter_Gui:def init (self): self.Gui_init() self.init_flag() self.Canvas_init() self.Button_init

25、() self.root.mainloop()def Button_init(self):self.BeiHua_Label = Label(self.FrameCanvas,text=北华翔龙 2019, font=(方正舒体, 30).place(x=910, y=30)28 self.BeiHua_Label = Label(self.FrameCanvas,text=UART, font=(方正舒体, 35),).place(x=930, y=110)Button(self.FrameCanvas, text=, bd=7,command=self.Next_Down, font=(方

26、正舒体, 15). place(x=1110, y=110, relx=0.01,rely=0.01, relwidth=0.03, relheight=0.05) Button(self.FrameCanvas, text=SEEK,bd =10,command = self.Seek_Uart,font=(楷书, 25). place(x=910,y = 170,relx=0.01,rely=0.01, relwidth=0.20,relheight=0.06) Button(self.FrameCanvas, text=打开 串口,bd=10,command = self.Open_Cl

27、ose_Uart,font=(方正舒体, 30).place(x=910, y=230, relx=0.01, rely=0.01, relwidth=0.20,relheight=0.10)Button(self.FrameCanvas, text=导入单片机, bd=10,command = self.Send_At,font=( 方 正 舒 体 , 30).place(x=910, y=330, relx=0.01,rely=0.01, relwidth=0.20,relheight=0.10)29 Button(self.FrameCanvas, text=计-算,bd=10, com

28、mand=self.Calculate, font=(方正舒体, 30). place(x=910, y=435, relx=0.01, rely=0.01, relwidth=0.20, relheight=0.10)Button(self.FrameCanvas, text= 移 - 除 , bd=10, command=self.Remove_cheese, font=(方正舒体, 30). place(x=910, y=540, relx=0.01, rely=0.01, relwidth=0.20, relheight=0.10)self.Tip_Label = Label(self

29、.FrameCanvas, font=(方正舒体, 30),).place(x=910, y=650, relx=0.01,rely=0.01, relwidth=0.23, relheight=0.05)def Remove_cheese(self):self.cv.delete(ALL)self.image_file = PhotoImage(file=78.gif)打开一张图片 2self.cv.create_image(0, 0, anchor=NW,image=self.image_file)#30 self.cv.place(relx=0.01, rely=0.025,relwid

30、th=0.8, relheight=0.98)self.path = self.Local = def Calculate(self):if len(self.Local) = 8: print(self.Local)self.path = Calculate(self.Local) print(1)self.draw_arrows()self.Tip_Label = Label(self.FrameCanvas, font=(方正舒体, 30), text = 计算 成功). place(x=905, y=650, relx=0.01, rely=0.01, relwidth=0.23, r

31、elheight=0.05)else:self.Tip_Label = Label(self.FrameCanvas, font=(方正舒体, 30),text = 计算 失误 ). place(x=905, y=650, relx=0.01, rely=0.01, relwidth=0.23, relheight=0.05)self.root.update()31 def Open_Close_Uart(self):if self.Button_OPEN_CLOSE_Flag = True: try:self.ser = serial.Serial(str(self.port_listsel

32、f.Uart_Number)0:5, 115200)self.Tip_Label = Label(self.FrameCanvas, font=(方正舒体, 30),text = 串口打开成功 ). place(x=890, y=550, relx=0.01, rely=0.01, relwidth=0.23, relheight=0.05)self.Button_OPEN_CLOSE_Flag =Falseself.Button_OPEN_CLOSE() except:self.Button_OPEN_CLOSE_Flag =Trueself.Button_OPEN_CLOSE() self

33、.Tip_Label =Label(self.FrameCanvas, font=(方正舒体, 30), text=串口打开失败). 32 place(x=890, y=550, relx=0.01,rely=0.01, relwidth=0.23, relheight=0.05) else:try:self.ser.close() self.Tip_Label =Label(self.FrameCanvas, font=(方正舒体, 30), text=串口关闭成功). place(x=890, y=550, relx=0.01, rely=0.01, relwidth=0.23, relh

34、eight=0.05)self.Button_OPEN_CLOSE_Flag =Trueself.Button_OPEN_CLOSE() except:self.Button_OPEN_CLOSE_Flag =Falseself.Button_OPEN_CLOSE() self.Tip_Label =Label(self.FrameCanvas, font=(方正舒体, 30), text=串口关闭失败). place(x=890, y=550, relx=0.01, rely=0.01, relwidth=0.23, relheight=0.05)33 def Send_At(self):i

35、f self.Button_OPEN_CLOSE_Flag != True: self.path.pop(-1)for i,j,z in zip(self.path,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,range(16):aaa = (i % 8 + 0.5)* 10 bbb = (i / 8 + 0.5) * 10 if aaa 10:aaa = str(0)+str(int(aaa) else:aaa = str(int(aaa) if bbb 10:bbb = str(0)+str(int(bbb) else:bbb = str(int(bbb) print(

36、aaa,bbb)if z%2 = 0:temp = aaa+bbb + P else:temp = aaa+bbb + M34 temp = + j + str(temp) + #self.ser.write(bytes(temp,encoding=utf-8)def Seek_Uart(self):self.port_list = list(serial.tools.list_ports()self.Uart_Number = 0if len(self.port_list) != 0: self.BeiHua_Label =Label(self.FrameCanvas, t

37、ext =# 端口列表str(self.port_listself.Uart_Number)0:5, font=(方正舒体, 35), ).place(x=930, y=110)else:self.BeiHua_Label = Label(self.FrameCanvas, text= QAQ , font=(方正舒体, 35), ).place(x=930, y=110)self.root.update()35 def Next_Down(self):self.port_list = list(serial.tools.list_ports() 口列表self.Uart_N

38、umber += 1# 端if len(self.port_list)-1 = self.Uart_Number:self.Uart_Number = 0self.BeiHua_Label = Label(self.FrameCanvas, text=str(self.port_listself.Uart_Number)0:5, font=( 方正舒体, 35), ).place(x=930, y=110)self.root.update()def init_flag(self):self.Local = self.Maipox = 43, 154, 263, 367, 476, 584,69

39、0, 802self.Maipoy = 46, 158, 268, 379, 494, 603,714, 823self.port_list = self.Uart_Number = 0 self.path = self.Button_OPEN_CLOSE_Flag = True36 self.Remove_Flag = Falsedef Button_OPEN_CLOSE(self):if self.Button_OPEN_CLOSE_Flag = True:Button(self.FrameCanvas, text=打开串口, bd=10, command=self.Open_Close_

40、Uart, font=(方正舒体, 30). place(x=910, y=230, relx=0.01, rely=0.01, relwidth=0.20, relheight=0.10)else:Button(self.FrameCanvas, text=关闭串口, bd=10, command=self.Open_Close_Uart, font=(方正舒体, 30). place(x=910, y=230, relx=0.01, rely=0.01, relwidth=0.20, relheight=0.10)self.root.update()def Gui_init(self):s

41、elf.root = Tk()self.root.title(北华翔龙 - 2019 ) self.root.geometry(1180x920) self.root.attributes(-alpha, 0.92)37 self.root.resizable(0, 0)self.FrameCanvas =Frame(self.root).pack(fill=BOTH, expand=1)def Canvas_init(self):self.cv = Canvas(self.FrameCanvas) self.image_file = PhotoImage(file=78.gif)打开一张图片

42、 2self.cv.create_image(0, 0, anchor=NW, image=self.image_file)self.cv.place(relx=0.01, rely=0.025, relwidth=0.8, relheight=0.98)self.cv.bind(, self.Maipo)#def draw_arrows(self):print(self.path)for i in range(len(self.path)-2):xy0, xy1 = int(self.pathi), int(self.pathi+ 1)print(xy0,xy1)if i%2 = 0:38

43、self.oval =self.cv.create_oval(self.Maipoxxy1%10 - 20,self.Maipoyxy1/10 - 30, self.Maipoyxy1%10 + 20, self.Maipoyxy1/10 +30, fill=white)self.cv.create_line(self.Maipoxint(xy0%10),self.Maipoyint(xy0/10), self.Maipoxint(xy1%10),self.Maipoyint(xy1/10),fill=blue, width=10, arrow=LAST,arrowshape=20 20 10

44、)def Maipo(self,event):#print(event.x,event.y)for i, X_LEN in zip(self.Maipox, 0, 1, 2, 3, 4,5,6,7):# 遍历 x 轴像素的位置for j, Y_LEN in zip(self.Maipoy, 0, 1, 2,3, 4, 5,6,7):# 遍历 y 轴像素的位置if math.fabs(math.sqrt(event.x - i) *2 + (event.y - j) * 2) 30 and len(self.Local) 8:39 if Y_LEN*8 + X_LEN not inself.Lo

45、cal:self.Local.append(str(Y_LEN)+ str(X_LEN)self.oval =self.cv.create_oval(self.MaipoxX_LEN - 25, self.MaipoyY_LEN-25,self.MaipoxX_LEN +25, self.MaipoyY_LEN+25 ,fill=red)# 画一个红色的圆tk = Tkinter_Gui()二.对弈部分程序:from AStar import *class Check():def init (self): self.Cheese_layout_init()#返回 棋盘 中 双方玩家位置*40

46、def Return_Player_Local(self,Flag):fn = lambda x,Who: j%13,j/13 for i,j in zip(x,range(170) if i = Whoreturn L : fn(Flag, L )0, M : fn(Flag, M)0# 返回棋盘 双方棋子 可以动的位置*def Return_Player_Can_Move(self,Board):Player_Local = self.Return_Player_Local(Board)Local_L = i00,i01 for i in get_adjacent_nodes(Player

47、_Local L 0, Player_Local L 1,Board)Local_M = i00,i01 for i in get_adjacent_nodes(Player_Local M 0, Player_Local M 1,Board)return L :Local_L, M : Local_M# 返回玩家 可以摆放位置的位置 *def Return_Player_Can_Put(self,BOARD): Baffe_X, Baffe_Y = , for x in range(1, 12, 2):41 flag = Falsefor i in range(11):if flag and

48、 BOARD(i+1) * 13 + x = :flag = Falsecontinueif BOARDi * 13 + x = BOARD(i + 2) * 13 + x = | and BOARD(i+1) * 13 + x = :Baffe_Y.append(str(x) / 2) +str(i + 1) / 2)flag = Truefor x in range(1, 12, 2):flag = Falsefor i, z in zip(BOARDx * 13:(x + 1) * 13,range(12):if flag and i = : flag = False continuei

49、f i = and BOARDx * 13 + z - 1 = - and BOARDx * 13 + z + 1 = -:42 Baffe_X.append(str(z / 2) +str(x) / 2)flag = TrueBaffe_Flag_X = str(i) + str(j): True for i inrange(6) for j in range(6)志位# 初始化 横向 挡板摆放标Baffe_Flag_Y = Baffe_Flag_X.copy()for key in Baffe_X: Baffe_Flag_Xkey = False Baffe_Flag_Ykey = Fal

50、seBaffe_Flag_Xstr(int(key0)-1) + key1 =FalseBaffe_Flag_Xstr(int(key0)+1) + key1 =Falsefor key in Baffe_Y:Baffe_Flag_Xkey = False Baffe_Flag_Ykey = False Baffe_Flag_Ykey0 + str(int(key1) - 1)= False43 Baffe_Flag_Ykey0 + str(int(key1) + 1)= Falsereturn Baffe_X: Baffe_Flag_X, Baffe_Y:Baffe_Flag_Y# 挡板 摆

51、放def Change_Can_Put_Bstacle(self,Flag): # Flag = Do: PutH/PutS,Where: x 坐标,y 坐标Temp_Board = FlagBoard.copy() if FlagDo = PutH:Temp_BoardFlagWhere0*2 + (FlagWhere1*2 + 1) * 13 = -Temp_BoardFlagWhere0*2+2 + (FlagWhere1*2 + 1) * 13 = -else:Temp_BoardFlagWhere0*2 + 1 + (FlagWhere1*2) * 13 = | Temp_Board

52、FlagWhere0*2 + 1 +(FlagWhere1 *2+ 2) * 13 = | FlagBoard = Temp_Board44 whobaffe = L_Count if FlagWho = L else M_CountFlagwhobaffe = Flagwhobaffe-1 return Flag#棋子移动def Change_Cheese_Move(self,Flag): # Flag =Who: L / M ,Do: Move, Where: x 坐标,y 坐标 fn_scratch = lambda x: str( ) + str(x) + str( )if x 10 else (s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论