毕业论文-基于树莓派的Python小车研究与实现_第1页
毕业论文-基于树莓派的Python小车研究与实现_第2页
毕业论文-基于树莓派的Python小车研究与实现_第3页
毕业论文-基于树莓派的Python小车研究与实现_第4页
毕业论文-基于树莓派的Python小车研究与实现_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

四川大学本科毕业论文 基于树莓派的Python小车研究与实现基于树莓派的Python小车研究与实现[摘要]现如今,半导体行业正在日益成熟,我们可以通过许多途径和手段获得强大且低廉的计算资源,我们正在经历一场信息技术的巨大变革:PC时代正在被智能手机、平板设备等其他轻便的设备终端改朝换代。树莓派(RaspberryPi)正是在这样的时代背景下应运而生的。其搭载了ARM架构处理器,运算性能和智能手机相仿。它最大的特点就是成本低廉,功耗小,接口较丰富,因此,其十分合适作为一些小型设备终端的芯片控制模块。综述了树莓派的各项特点并加以利用,对树莓派GPIO接口进行硬件连接各个模块,利用Python语言进行程序设计,搭建完成了一个基于树莓派的可远程控制的Python小车项目。并且,对小车完成后的其他扩展方向进行了讨论,对可能添加的功能进行列举。[主题词]树莓派;GPIO;远程控制

BasedontheresearchandimplementationofRaspberriesPiPythoncar[Abstract]Today,thesemiconductorindustryisincreasinglymature,wecangetpowerfulandinexpensivecomputingresourcesthroughanumberofwaysandmeans,weareexperiencingahugerevolutionininformationtechnology:PCeraisbyanotherportableterminaldevicesmartphone,tablet,etc.regimechange.RaspberryPi(RaspberryPi)Itisinthisbackgroundcameintobeing.ItsequippedwithARMarchitectureprocessor,smartphonesandsimilarcomputingperformance.Itsbiggestfeatureisthelowcost,lowpowerconsumption,richinterfaces,soitisverysuitableasasmallnumberofchipcontrolmoduledeviceterminal.SummaryofthevariousfeaturesofraspberrypieandtakeadvantageoftheRaspberryPiGPIOinterfacehardwaretoconnectthevariousmodulesusingPythonprogramminglanguage,basedonacompletesetupRaspberryPicanberemote-controlledcarPythonproject.And,ontheotherpropagationdirectionafterthecompletionofthecarwerediscussed,maybeaddedtothelistoffunctions.[KeyWords]RaspberryPi;GPIO;Theremotecontrol

目录1.引言 11.1研究背景与意义 11.2研究内容 21.3论文整体结构 22.核心硬件模块与软件模块简介 32.1树莓派 32.2L298N电机驱动模块 32.3车架 42.4Python 52.5SSH协议 62.6GPIO 63.项目需求分析 83.1功能需求 83.1.1控制移动 83.1.2远程控制 83.2性能需求 93.2.1响应时间需求 93.2.2安全性需求 93.2.3可用性需求 93.2.4扩展性需求 93.3前期准备 94.各模块电路 114.1电机电路 114.2L298N模块电路 114.3树莓派电路 124.4整体连接电路 135.编码模块 145.1移动控制模块 145.2远程控制 165.2.1远程控制技术 165.2.2树莓派的远程控制技术 175.3超声波测距模块* 186.项目实现及扩展 206.1小车实现 206.1.1电机连接 206.1.2L298N模块连接 206.1.3树莓派连接 226.1.4完整连接 236.2项目相关扩展 246.2.1小车相关扩展 246.2.2树莓派相关扩展 257.总结 26参考文献 27声明 28致谢 29附录 30译文 30PAGE11.引言1.1研究背景与意义随着当今科技不断地进步,各种有益于人们生活方方面面的技术不断涌现,不断丰富我们的日常生活,不断为我们日常生活添加各种便利。而各样小型的终端设备以更加轻便、便携的优势逐渐取代个人PC在人们心中的重要地位,“卡片电脑”的概念热度上升。树莓派(RaspberryPi)主板可以说是个“微型”的奇迹,它和一张信用卡的大小差不多,却拥有非常强的计算能力。它拥有多种接口模式,支持许多拓展功能。并且,按照官方规定,树莓派把Python作为其最主要的程序设计语言之一。而由于Python本身跨平台性,易于编写阅读的特点,使其更容易受大家接受。总结得出结论,树莓派作为一块简单的开发板备受大家欢迎主要具备以下两大优势[1]:软硬件优势:树莓派之所以在全球范围内备受大家热捧,原因不仅在于支持Python、Java、C等丰富的语言进行开发,并且它所提供的Raspbian操作系统是移植超过1900个Linux软件包的十分强大的操作系统。创始人Eben博士目前任树莓派的主芯片设计公司Boradcom的IC设计主管,可以很好的控制CPU及开发板的性价比和质量(Boradcom是全球领先的通信领域的半导体公司)。因此,树莓派同时拥有CPU、操作系统、应用开发环境三个方面的背景优势。此外,由于内置GPU支持1080P视频硬解码,OpenELEC和RASPBMC操作系统作为界面友好的系统被官方推荐给大众,因此,树莓派可以借助这些优势搭建成家庭媒体中心,成为网络电视机顶盒。资源优势:全球有数以百万计的开发者在为树莓派进行开发,有丰富的软硬件开发资源可供参考与借鉴。软件巨头Oracle推出了基于树莓派和JavaFx的DukePad方案,并开设了互联网免费课程“DevelopJavaEmbeddedApplicationsUsingaRaspberryPi”(使用树莓派开发Java嵌入式应用)。RaspiRobotBoard是一个典型的树莓派扩展板,可将树莓派扩展为机器人控制器,它有专门的Python库支持,支持对机器人的控制。利用它的Python库实现一个简易的“漫步者机器人”只需三十几行代码。考虑到这种种因素,本文研究与实现的应用方式是为大家提供一种树莓派进行编程扩展应用的思路,可以通过为其添加各种模块(在树莓派允许的功率范围内)以便实现更多的功能。通过对树莓派的了解学习,启发自己的程序设计思路,锻炼动手能力。1.2研究内容本项目为基于树莓派的Python小车,小车以树莓派2代B型作为核心控制主体,通过为其连接各模块,编程实现通过远程个人PC控制小车移动。本项目需要进行大量的硬件连接工作,需要使用杜邦线或导线对各个模块进行连接,而在连接处需要使用一些手段加以固定否则在小车移动过程中会发生脱落。本项目大概需要进行的步骤如下:需要利用树莓派本身自带的GPIO接口连接各部分组件,通过杜邦线完成连接,利用L298N模块驱动电机转动。驱动控制部分利用Python代码编写操控程序,利用SSH协议,在Windows下利用PuTTY进行远程Shell控制。1.3论文整体结构论文的第一章描述了论文所研究项目的背景与意义,并对论文研究项目所开发的功能给出了简要描述。第二章给出了项目研究时用到的核心硬件模块与核心软件设计模块的简要介绍。第三章对项目开发所必须满足的条件进行了分析,描述了整个项目所需要进行的所有前期准备工作。第四章从物理层次的角度阐述了各硬件模块间的相互连接关系及其相互作用。第五章描述了整个项目代码部分的设计编写情况,描述了各部分是如何与硬件模块相关联。第六章给出了项目的实现与项目成型后的成果展示。第七章对论文所研究的项目进行了总结分析,并讨论了项目在未来的可扩展性。

2.核心硬件模块与软件模块简介 2.1树莓派RaspberryPi,中文译名为树莓派,它是一块信用卡大小的卡片式“计算机”,它预装了Linux操作系统,搭载了ARM架构处理器,拥有丰富的接口,理论上具备了计算机的很多功能,玩法多样,在国际上深得业余爱好者及热心DIY的科技迷得喜爱。树莓派以SD/MicroSD卡为内存硬盘,卡片主板周围有1/2/4个USB接口和一个10/100以太网接口,可连接键盘、鼠标和网线,同时拥有视频模拟信号的电视输出接口和HDMI高清视频输出接口。树莓派迄今发布过很多版本,主要分为两种型号A型和B型,区别主要在于B型具备有线网接口,而在今年2月份,发布3代B型。本项目考虑到通用性以及一些其他因素,采用2代B型作为项目搭载主体[2]。树莓派2代B型如图1:图1树莓派2代B型示意图2.2L298N电机驱动模块L298N是SGS公司的产品,内部包含4通道逻辑驱动电路。是一种电机专用驱动装置。L298N电机驱动模块具有以下性能特点[3]:可实现电机正反转及调速启动性能好,启动转矩大工作电压可达到36V,4A可同时驱动两台直流电机适合应用于机器人设计及智能小车设计L298N模块如图2:图2L298N示意图2.3车架小车的车架作为整个小车各部件的模块搭载,考虑经济因素,采用某宝购买的亚力克板。小车车架连接如图3:图3小车车架图2.4PythonPython是一种面向对象、解释型计算机程序设计语言,已经成为最受欢迎的程序设计语言之一。2011年1月,它被TIOBE编程语言排行榜评为2010年度语言。Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。由于Python语言的简洁、易读以及可扩展性,在国外用Python做科学计算的研究机构日益增多。Python可以在基本功能上很好的取代C/C++,易于使用与学习。在本项目中中,需要使用Python中自带的GPIO库,通过树莓派的GPIO针脚进行控制程序设计,考虑通用性及代码复用性,所以选择使用Python2.7版本。2.5SSH协议SSH(SecureShell)协议是建立在应用层和传输层上的安全协议,是目前较可靠,专为远程登录和其他网络服务提供安全性的协议。SSH具有众多优点,包括[4-5]:SSH加密口令及数据可以在不安全的网络上透明地提供强认证和安全通信;SSH不涉及与操作系统核心相关的技术细节,容易实现;利用可靠传输服务实现(比如TCPoverIP)的所有应用,都可以充分利用SSH提供的TCP端口转发功能实现安全防护的目标;SSH协议设计之初充分考虑到了扩展性的问题,很容易嵌入新的密码算法、认证方式以及密钥交换协议等。对于80多个国家的几百万用户来说,它是远程登录的实时标准,越来越多的组织把它作为利用公用网络(如Internet)接入公司内部网络的唯一方式。相信不久SSH将会成为一套行之有效的通用网络安全标准协议。2.6GPIO树莓派提供了一组GPIO(GeneralPurposeInputOutput)接口,其实就是传统单片机上的I/O口,通过这些接口的编程,树莓派就可以实现对外围硬件的控制,比如LED点阵、电机、LCD液晶屏、温度传感器等,可以说,GPIO是树莓派与外界信息交互的重要桥梁之一。树莓派内核中已经编译自带了GPIO的驱动,通过一些第三方写好的库函数来完成具体的操作,比较常见的操作库函数有[6]:PythonGPIO。利用Python作为开发语言,作为树莓派官方资料中推荐且容易上手。PythonGPIO是一个小型的Python库,可以帮助用户完成RaspberryPi相关IO口操作。也作为本项目所选取的库进行代码编写。wiringPi。利用C语言作为开发语言,适合那些具有C语言基础,在接触树莓派之前已经接触过单片机或者嵌入式开发的人群。wiringPi的API函数和arduino非常相似。BCM2835CLibrary。利用C语言作为开发语言,即使用C语言实现的相关底层驱动。BCM2835CLibrary的驱动库包括GPIO、SPI和UART等,可以通过学习BCM2835CLibrary熟悉BCM2835相关的寄存器操作。传统的树莓派具有26针脚的GPIO接口,而本项目采用的树莓派2代B型具有40针脚。树莓派2代B型的GPIO针脚如图4:图4树莓派GPIO针脚图

3.项目需求分析3.1功能需求本项目所要完成的核心功能为远程控制使小车完成移动,主要功能可以大致划分成控制移动和远程控制两大部分。逻辑关系如图5:图5逻辑关系图3.1.1控制移动 这部分内容需要在完成代码编写的基础上,通过利用树莓派的GPIO针脚,利用Python的GPIO库编程,对树莓派GPIO接口完成信号输入。通过利用电高低电平控制方式来实现电机是否工作,进一步实现小车前进、左转、右转和后退的控制。3.1.2远程控制为了方便实时控制小车的移动轨迹,需要引入远程控制的方法,可以使在有效距离之内能通过其他终端控制小车移动。在本项目中选择使用了个人PC作为远程控制终端。而远程控制树莓派主要具有两种方式,一种是远程登录到树莓派的shell中进行命令行操作,而另一种则是连接到树莓派的Xwindows中。3.2性能需求3.2.1响应时间需求项目采用远程控制小车移动,需要对终端发出的指令进行响应,响应时间和所采用的远程控制方式以及距离有很大关联,为此,选择了其中一种被广泛使用的。相对安全的方式:SSH(SecureShell)。3.2.2安全性需求本项目所涉及到的安全性主要是指硬件连接方面对于硬件的保护。由于项目会使用到许多硬件模块连接到树莓派上进行功能扩展,而不恰当的接线方式会使整个小车发生短路等各种问题。因此在接线是需要注意避免一些没有经过降压处理或者接线错误发生的问题。3.2.3可用性需求由于整个小车是通过SSH协议进行远程控制,因此只需要为树莓派设置SSH服务开启后,Windows系统下采用SSH客户端,比如一些商业软件:XShell、PuTTY、Tunnelier等,MacOS系统下可以直接使用系统自带终端提示符输入命令访问树莓派Shell。3.2.4扩展性需求由于树莓派具有各种非常多的接口类型,因此非常方便进行模块扩展,这也是广大DIY爱好者十分喜爱树莓派的原因。借用面包板或者其他PCB,连接上新的模块,编写程序即可。而在小车成型的基础上,还可以再为其添加摄像头等等硬件,连线,设计新的功能,实现一些其他的功能或者性能需求。3.3前期准备由于本项目是在硬件连接之后进行程序设计控制小车移动,所以需要在开始之前把所需用到的工具准备完毕。所需准备的工具及硬件如下:树莓派,考虑通用性,本项目选用了树莓派2代B型;小车车架,小车车架主要需要考虑材质问题,本项目选用了亚力克板子;L298N模块,这作为一个电机驱动模块有很多种版本,选择最通用版本;电池盒,或者供电模块,这里指的是为L298N电机驱动模块供电的设备。最好选取自带开关的模块,方便对L298N进行控制,预防一些操作失误引起的短路,过载等问题;便携网卡,由于本项目是通过Internet进行远程控制,所以需要为树莓派准备网卡接入网络,最好使用免驱动的网卡,方便使用;电机,也就是俗称的马达,采用小型直流式电机4个;杜邦线、导线若干,进行连接;螺丝刀工具包。在把所有硬件都准备好之后,由于小车主体是树莓派,所以需要启动树莓派,为其安装系统,进行基本设置,安装编程工具及库文件。

4.各模块电路4.1电机电路直流电机驱动电路使用最广泛的就是H型全桥式电路,这种驱动电路可以很方便实现直流电机的四象限运行,分别对应正转、正转制动、反转、反转制动。它的基本原理图如图6所示:图6电机电路原理图全桥式驱动电路的4只开关管都工作在斩波状态,S1、S2为一组,S3、S4为另一组,两组的状态互补,一组导通则另一组必须关断。当S1、S2导通时,S3、S4关断,电机两端加正向电压,可以实现电机的正转或反转制动;当S3、S4导通时,S1、S2关断,电机两端为反向电压,电机反转或正转制动[7]。由于本项目采取H型全桥式驱动电路,因此需要两侧电机两两并联,再与L298N模块相连。左侧两电机并联连接L298N模块输出A端,右侧两电机并联连接L298N模块输出B端。4.2L298N模块电路该L298是在一个15引脚Multiwatt和PowerSO20包集成单片电路。它是一种高电压,大电流的双全桥驱动器设计成接受标准TTL逻辑电平驱动感性负载,如继电器,螺线管,DC和步进电机。两个使能提供的输入独立于输入信号的开启或关闭该设备。每个桥的下部晶体管的发射极被连接在一起,并相应的外部终端可以用于外部感测电阻器的连接。提供了一种额外的电源输入,使得所述逻辑工作在一个较低的电压。它的模块电路图如图7[8]:图7L298原理电路图L298N模块作为连接各硬件部分的中心,十分重要,其负责把树莓派所传输的信号经过内部电路处理后输出表现为高或低电频,以此来控制电机转动。4.3树莓派电路树莓派系统的核心部分使用的是一个称之为BroadcomBCM2835的片上系统(System-on-chip,SoC),BCM2835集成了CPU和GPU。这是一种多媒体处理器系统,意味着绝大部分系统组件,包括中央处理单元、图形单元以及音频和通信硬件,都可以集成在一块芯片上,并位于主板中央的一块256MB内存芯片之下。它还使用了ARM指令集结构作为处理器设计。由于树莓派可以看做是一个完整的“电脑”,因此它各部分都具有很多的电路原理图,在这就只列出其中一个。电路原理图如图8:图8树莓派电路原理图[9]树莓派在其中主要通过对GPIO口的编程结果,运行代码后产生电信号传输至L298N模块。4.4整体连接电路之前三节所叙述的为各模块的内部逻辑电路图,电路图为辅助完成画出连接电路图,再根据电路图连接各硬件部分。L298N模块作为其中核心部件,各其余部件都是围绕其连接。实际的连接操作见第六章内容。实际连接简易电路图如图:图9整体连接简易电路图

5.编码模块5.1移动控制模块通过调用Python的GPIO库对树莓派GPIO接口进行操作,遵循电机的真值逻辑进行代码编写。真值表如图:图10电机真值表[10-11]该模块代码如下[17-19]:importRPi.GPIOasgpioimporttimeimportsysimportTkinterastk#选取树莓派GPIO接口时,选取了11、12、13及15IN1=11IN2=12IN3=13IN4=15#初始化接口definit():GPIO.setup(IN1,GPIO.OUT)GPIO.setup(IN2,GPIO.OUT)GPIO.setup(IN3,GPIO.OUT)GPIO.setup(IN4,GPIO.OUT)#前进defforward(tf):GPIO.output(IN1,GPIO.HIGH)GPIO.output(IN2,GPIO.LOW)GPIO.output(IN3,GPIO.HIGH)GPIO.output(IN4,GPIO.LOW)time.sleep(tf)gpio.cleanup()#后退defreverse(tf):GPIO.output(IN1,GPIO.LOW)GPIO.output(IN2,GPIO.HIGH)GPIO.output(IN3,GPIO.LOW)GPIO.output(IN4,GPIO.HIGH)time.sleep(tf)gpio.cleanup()#左转defturn_left(tf):GPIO.output(IN1,False)GPIO.output(IN2,False)GPIO.output(IN3,GPIO.HIGH)GPIO.output(IN4,GPIO.LOW)time.sleep(tf)gpio.cleanup()#右转defturn_right(tf):GPIO.output(IN1,GPIO.HIGH)GPIO.output(IN2,GPIO.LOW)GPIO.output(IN3,False)GPIO.output(IN4,False)time.sleep(tf)gpio.cleanup()#键盘输入控制部分defkey_input(event):init()print'Key:',event.charkey_press=event.charsleep_time=0.03#利用WASD进行方向控制,可以通过长按保持一个方向移动ifkey_press.lower()=='w':forward(sleep_time)elifkey_press.lower()=='s':reverse(sleep_time)elifkey_press.lower()=='a':turn_left(sleep_time)elifkey_press.lower()=='d':turn_right(sleep_time)else: pass#命令执行调用command=tk.Tk()command.bind('<KeyPress>',key_input)command.mainloop()5.2远程控制5.2.1远程控制技术随着Internet接入的普及,网络与人们的工作和生活紧密结合,越来越多的网络技术在平常工作和生活中得以普及。如果当您所在的公司或单位在进行服务器租用或者服务器托管之后,除非重装操作系统等特殊情况,都不需要进入机房,而直接在本地进行远程管理。如果你的朋友在上网冲浪时,遇到了难以解决的电脑问题是,只要网络连通,都可以通过远程控制,来帮助他解决问题。远程控制技术指的是将控制网络与Internet相结合,实现对远程受控端(如计算机、生产设备、电器等)的监视和控制;现阶段很多数据处理系统都采用开放系统结构的客户机/服务器(Client/Server)网络模型,即客户机向服务器提出请求,服务器对请求做相应的处理并执行被请求的任务。其工作原理如图所示[12-15]:图11远程控制原理图常用远程控制关键技术主要由以下几种:1、命令行方式(Shell方式):Shell方式通常要求使用者对计算机有比较高的熟知程度,更具体地来说,应该是RemoteShell。对于Linux来说,图形桌面只是Linux的一个应用程序,Linux的所有功能都可以在Shell中完成。2、桌面方式(Desktop方式):指的就是通过图形方式的远程控制工具,像VNC、PCAnywhere等优秀的图形化远程控制工具完全还原远程主机桌面,由于图形界面技术已经非常成熟,并且具有操作简便、直观、易学等诸多优点被普遍采用。3、[21]无盘工作站方式(Non-OS方式):所谓Non-OS,就是在计算机的操作系统启动之前对机器进行一些基本的操作。例如:关机、重启、获得一些硬件信息以及BIOS信息等。这种方式在一般的PC机上的应用比较少,在网络上相关的数据也比较少。Non-OS可以通过Serial/Modem方式连接入网进行数据传输。5.2.2树莓派的远程控制技术要实现远程控制树莓派,主要有两种方式,通过Shell进行命令操作,或是通过远程桌面操控[15-16]。远程登录到树莓派Shell方式有很多种,比如传统的Telnet,还有一种广泛使用的方式就是SSH。由于树莓派的Raspbian系统是属于Linux操作系统,所以通过Shell方式键入命令更为方便(不用安装更多应用或进行配置),因此本项目采用的是通过Shell的SSH方式操作。需要为树莓派配置SSH,启用SSH服务后在Windows端通过软件控制。这里选用了开源的PuTTY作为SSH客户端,它只有500kb,简单实用。只需要获取了树莓派的IP地址,连接树莓派,输入树莓派的用户名及密码,就可以得到一个远程Shell。登录界面如下:图12PuTTY登录界面5.3超声波测距模块*本模块为为树莓派小车的扩展功能模块,能是小车队对于障碍有所感应,测算距离墙壁的距离,距离误差大约1-3cm,有效范围大约为10m。但是由于不知道哪里出现问题,并未实现该功能。代码如下[17-19]:importRPi.GPIOasgpioimporttime#测距defdistance(measure='cm'):gpio.setmode(gpio.BOARD)gpio.setup(7,gpio.OUT)gpio.setup(16,gpio.IN)gpio.output(7,False)whilegpio.input(16)==0:nosig=time.time()whilegpio.input(16)==1:sig=time.time()tl=sig-nosigifmeasure=='cm':distance=tl/0.000058elifmeasure=='in':distance=tl/0.000148else:print('improperchoiceofmeasurement:inorcm')distance=Nonegpio.cleanup()returndistanceprint(distance('cm'))

6.项目实现及扩展6.1小车实现由于项目实现的为远程控制小车移动,硬件连接方式在其中处于很重要的地位,因此,下面介绍硬件的连接。6.1.1电机连接小车采用的是4电机驱动方式,采用的是同侧电机并联的方式,再分别与L298N模块的输出A/B端连接。两个电机之间通过导线并联,最好是使用焊机防止导线脱落,由于各方面因素限制,采用通过打火机烘烤加固的方式。电机连接如图:图13电机连接示意图6.1.2L298N模块连接L298N模块作为电机的驱动模块把L298N的输出A端作为IN1、2,和小车的左端相连,输出B端作为IN3、4,和小车的右端相连。+5V供电端和树莓派2号针脚相连,GND端接电池盒负极相连,+12V端和电池盒正极相连,利用电池盒(4节1.5V电池进行供电),为L298N模块供电。逻辑输入和树莓派相接。由于本项目没有涉及到PWM调速控制功能,所以没有用到使能A/B端。L298N模块接线如图:图14L298N模块连接示意图6.1.3树莓派连接树莓派的连接主要为GPIO引脚的连接,本项目采用了40个针脚中的4个作为逻辑输出与L298N模块相连,选取了PIN11,PIN12,PIN13以及PIN15针脚进行编程。选取针脚理论上可以选取任意的GPIO口作为信号输入,但是考虑之后的连接便利以及项目后期扩展,最好选取通用的GPIOPIN针脚(GPIO端口提供了7个通用管脚针:PIN11、PIN12、PIN13、PIN15、PIN16、PIN18和PIN22),并且连接时注意避免混淆针脚以及接地问题。所以采用PIN11和PIN13连接L298N的IN1和IN3逻辑输入端口,作为小车前轮。另外两个作为小车的后轮。连接如图:图15树莓派连接示意图6.1.4完整连接各部件连接之后如图:图16连接图上图还有多个部件进行过优化,使得连接更加美观,简洁。优化过后整个小车连接完成后效果如图所示:图17整体连接示意图(优化后)6.2项目相关扩展由于树莓派具备多种接口,如果不够还可以使用其他PCB进行扩展,因此,树莓派具备理论上很大可扩展的空间,实际可能由于功率问题限制一些功能实现。6.2.1小车相关扩展本项目所设计的小车实际上属于智能机器人中的移动机器人分类,主要是为了实现其移动的功能。然而,实现移动的功能仅仅是实现了当代智能小车的最基本功能,它还具有十分强大的扩展空间,完全能够实现更多的功能以满足人们对于小车的更高的期望。就本项目而言,可以在已经完成的小车基础上充分利用已有模块所自带的其他功能或添加其他模块进一步优化小车各项能力,以下为几种扩展思路:由于本项目利用的电机为减速直流电机,因此可以利用L298N本身自带的使能端为电机实现PWM调速[21-22];可以为其配备一个CSI摄像头,实现移动中图像的传输;添加避障功能,增强小车稳定性。经过查阅资料,小车可扩展最多情况为搭载不同传感器,实现一些数据传输,和危险环境侦测,方便人们简化数据采集的部分工作,辅助进行数据分析。6.2.2树莓派相关扩展树莓派作为当今十分火热的开发板芯片,正是因为其在理论上具备了计算机的所有基本功能情况下,还能够根据用户自己的需要进行扩展设计。利用树莓派进行更多的应用开,并且十分易于上手,根据实际情况进行调整,达到设计目标。从功耗上来看,树莓派的功耗仅为4~5W(国内爱好者实测),如此低的功耗更是为各种家庭影院、移动应用创造了天然条件(省电)。常见的几种应用方式如下:媒体娱乐中心(MediaCenter):树莓派高度集成GPU使得其对于硬件的高清解码、网络、挂载USB存储等功能支持。简易网络存储(NetworkAttachedStorage):树莓派可以通过USB挂载移动硬盘,扩展容量;再通过配置Linux的Samba组件,利用树莓派搭建文件服务器,实现Windows对Linux文件系统的访问。搭建网站:树莓派一个很明显的用处就是作为网站的后台服务器。树莓派有足够的能力来处理静态网站,一些web框架也不成问题。树莓机器人(Rapiro):树莓派能作为智能小车的核心芯片,当然也具有作为智能机器人核心的能力。来自日本的发明家翔太石渡就设计了一款声控机器人—Rapiro。它通过WiFi和蓝牙等传输方式,可以实现由手机或手柄控制。配合摄像头传输图像,通过内置红外LED,控制电视或空调。

7.总结本文从项目的应用前景及意义阐述树莓派小车远程控制的功能模块、各硬件关系、硬件的连接方式和项目的最终实现过程。项目考虑当前时代发展的脚步和方向,智能化系统将作为未来发展的重要方向,人们可以远程终端进行更多的设备控制,数据收集将变得更加便捷。并且考虑到树莓派现作为备受大家关注的一个轻便式卡片电脑,其功能强大,价格低廉,完全能够满足日常学生们对于程序设计的基本需求,以及,Python语言的易用性,广泛性。因此利用树莓派进行相关硬件连接之后作为一个远程控制的小车,通过Python脚本实现其控制移动功能。论文还就小车之后可扩展性进行了讨论,给出了几种相关的扩展功能思路。整个小车设计的难点在于硬件的连接,十分考验个人动手能力,在此期间,由于操作不当,树莓派的亚力克外壳及风扇已经被我玩坏,板子由于接线问题也差点被烧坏。各硬件间线路我也做过多次调整使整个小车相对简洁。由于,我所购买的电池盒不带开关,也并没有购买降压模块,为L298N模块供电时有些时候会发生电压不稳定。最终,论文,结合之前所提到的部分完成小车设计,实现了小车的远程控制。本项目仍然存在需要改进的地方,包括性能与功能上,可以在多个地方进行修改以获得更多的附加功能,项目后期可以针对如下几点进行进一步的优化[23-24]:小车的移动速度固定,这对于一些需要慢速或是加速的需求无法满足,这样就可以充分利用L298N的使能端,设计PWM调速程序,使小车控制更加灵活。远程控制方式为SSH连接Shell,这样控制虽然广泛多用,但是极度依赖网络的支持。因此可以考虑利用蓝牙或者声波等一些其他手段方式进行远程控制。小车树莓派部分需要一个电源为其供电,而L298N模块以及电机本分由于所需电压的问题,需要额外的电源。因此可以考虑引入一个电源通过不同电压输出同时实现供电。小车各部分硬件的固定和可拆卸能力较差,线路繁琐复杂。因此针对这样问题,可以定制小车各个模块,通过利用模块化手段,使得各部分更方便拆卸。

参考文献[1]李文胜.基于树莓派的嵌入式Linux开发教学探索[J].电子技术与软件工程,2014,09:219-220.[2]陈建皓.RaspberryPi入门指南.第一版.人民邮电出版社,2014[3]L298N驱动模块的应用,/u/2163965613[4]张杰,戴英侠.SSH协议的发展与应用研究[J].计算机工程,2002,10:13-15.[5]郑小宁.基于因特网的远程控制技术研究[D].西北工业大学,2002.[6]树莓派GPIO控制,/[7]减速电机驱动电路/[8]L298N模块说明书L298N_datasheet[9]树莓派2代电路图Raspberry-Pi-R2.0-Schematics-Issue2.2_027[10]树莓派论坛/[11]twbs/bootstrap./twbs/bootstrap[12]眭春辉.浅谈计算机远程控制技术及常见软件应用[J].电脑知识与技术,2010,27:7654-7655.[13]郑昌波,秦前清,袁军,简化.计算机远程控制技术研究及实践[J].计算机工程与设计,2005,06:1636-1638.[14]华龙.计算机远程控制技术的原理与实现[J].天津农学院学报,2007,03:42-48.[15]EbenUpton,GarethHalfacree.树莓派用户指南.第三版.北京:人民邮电出版社,2016[16]AlexBradbury,BenEverard.树莓派Python编程指南.北京:机械工业出版社,2015[17]RuthSuehle,TomCallaway.树莓派实战秘籍.北京,人民邮电出版社,2015[18]卢布诺维克.Python语言及其应用.北京:人民邮电出版社,2016[19]戴维I.施奈德.Python程序设计.北京,机械工业出版社,2016[20]MagnusLieHetland.Python基础教程(第2版.修订版).人民邮电出版社,2015[21]DouglasBrooks.PCB电流与信号完整性设计.北京:机械工业出版社,2015[22]肖雪耀.电机驱动与调速.北京:化学工业出版社,2015[23]刘佳诞,周琦.使用树莓派实现主机远程断电重启.江苏电机工程第33卷第6期,2014[24]张森炜,朱晓民,张乐剑.基于WI-FI的环境监测与危险场所作业的智能小车.中国通信学会信息通信网络技术委员会2015年年会论文集

声明本人声明所呈交的学位论文是本人在导师指导下进行的研究工作及取得的研究成果。据我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得四川大学或其他教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示谢意。本学位论文成果是本人在四川大学读书期间在导师指导下取得的,论文成果归四川大学所有,特此声明。学位论文作者(签名) 论文指导教师(签名) 2015年06月01日

致谢经过大四一年的学习,我学会了相当多的专业知识,本次毕业设计更是对我大学学习生活的总结,我运用了自身所学,也运用了这四年来培养出的专业思维。这几个月的毕业设计,让我受益颇丰,更为今后的工作带来了非常多的好处。我在这里要感谢所有给过我帮助的人。通过本次毕业设计完整的项目设计过程与编写,我对硬件连接编程,电路控制都有巨大收货,更增强个人的动手能力。感谢陈润老师三个月多的悉心指点,从选题到项目设计,环境搭配,代码编写直至最后的论文定稿,都提供了非常大的帮助。最后我要感谢大学四年里,给予我指导的每一位老师。感谢四川大学,为了提供了这样一个良好的学习平台,扩展了我的视野。大学四年的学习与生活,必然使我受益终身,我会带着川大人的精神,走向社会,走好接下来的每一步。

附录译文评估Python语言在编程中的复杂性桑杰·米斯拉,FeridCafer[摘要]在本文中,为Python语言的复杂性度量制定。因为Python是一种面向对象的语言,本度量能够评价任何面向对象的语言。我们确认我们的度量与案例研究,比较研究和实证检验。该案例研究是在Python,Java和C++和结果证明,Python是比其他面向对象的语言更好。后来,我们凭经验验证度量一个真正的项目,该项目开发中Python。1.介绍软件度量确定软件产品的可维护性程度,这是一个影响任何一种软件的质量的重要因素。此外,软件度量提供了有用的反馈给设计者来影响决定在设计,编码,构造,或规范阶段期间。如果没有这样的反馈,很多决定是在由特设的方式决定。芬顿测量定义过程,其中数字或符号被分配给实体的属性,在现实世界,以这样一种方式,根据明确定义明确的规则描述它们[6]。在软件工程软件中指标是控制软件的质量的唯一工具。此外,要求提高软件质量是首要目标,这促进了软件度量的技术研究。如果代码是复杂的,它总是很难控制质量。复杂的代码总是创建问题软件社区。这是很难审查,测试,维护以及管理这些代码。因此,那些障碍增加维修成本和产品的成本。由于这些原因,强烈建议从软件开发过程的开始控制代码的复杂性。软件度量有助于实现这一目标。事实上,没有严格的规定,能够证明代码是好还是坏。一些研究人员提出了不同的标准制定好,高质量的软件。虽然他们认为质量有一点不同的方面是在所有的标准,即通用的代码应该是灵活的[31]。特别地,在面向对象的软件开发,这在过去二十年不平凡的验收,这是必须的。换句话说,将码应写入的,因为它应该被重复使用,并通过这样的方式。如果代码是不灵活的话,就很难更换(添加或删除)模块,并会浪费软件人才的时候。它也影响可维护性方面。在过去,研究者提出他们的方法用于评估代码,所记载的过程语言[12],如C语言,后来,研究主要集中在面向对象(OO)对象的编程语言,例如C++的[1,2,3]和Java[35,36]。其他语言和技术,如XML和Web服务[13,14和24]的软件度量也可以在文献中找到。然而,评估所用Python编写的语言代码一直没有找到适当的关注,因为我们的预期。事实上,今天,Python是不如Java和C流行++但由于其独特的功能,它是软件开发更舒适的语言。它在软件社区日益普及。一些会议和研讨会专门的Python包括SciPy的2009年印度[16],09RuPy波兰[17],09FRUncon美国[18],ConFoo.ca加拿大2010[19],被证明的Python的重要性。它不是Python的成功故事的结尾。这是相较于其他面向对象的语言非常可以理解的,因此较少的维护费用昂贵。知名企业如谷歌和YouTube选择使用Python。评估Python代码的复杂性的一种方法是通过对程序语言开发的指标。然而,所有的可用指标仅覆盖语言的特定功能。例如,如果我们应用的代码行,然后只有大小被覆盖,类似McCabe的复杂性的度量仅覆盖所述程序的控制流。一般来说,适用于过程语言的指标不适合现代OO语言如C++[3]。此外,大多数现有的度量和模型为面向对象的语言的适用面向对象的代码完成或即将完成时。因此,它们提供信息来不及在改进代码的质量来帮助。面向对象的方法需要显著努力开发生命周期的早期识别对象,类,属性的操作和他们的关系。封装,继承和多态需要设计人员仔细结构早期阶段[32]的设计。因此,可用的指标,适用于的代码的完成,是不适用在面向对象的环境中。通过将所有这些问题的考虑,在目前的工作中,我们通过识别所有的因素,这可能会在代码的复杂性发挥重要作用评估Python代码的复杂性。需要注意的是Python是一种面向对象的语言是很重要的,它包括了大多数的其他面向对象语言的特点;然而,发生在主程序体的差异。除此之外,执行和动态类型提供对Java大生产率的提高;Python程序需要更少的外部努力(即更干净的代码)[21]。在这方面,Python是一种非常有用和重要的语言,该语言的正确指标仍然没有开发。这个因素促使我们进行这项工作,并产生这样的指标,它可以涵盖的Python的所有功能,以及涵盖所有复杂的方面。因此,一种新的方法,这是所有属性的统一,提出。作为这项研究的初步工作,度量呈现在2010ICCSA[33]。在目前的工作中,我们扩展我们的会议演示和验证通过实证检验我们的工作,其中包括案例研究,比较研究和适用性上一个真正的项目。在三个不同的面向对象的语言我们的案例研究评估。此外,我们应用在实际项目中我们的指标来证明其真正的适用性和实用性。论文以下列方式组织。我们讨论的Python语言和这种语言可用的指标在第2节。此之后,我们在第3节提出我们度量。在第4节我们证明了编程示例公制。我们通过实证案例研究验证了我们的度量标准,比较研究并通过在第5节对这项工作得出的结论一个真正的项目是在第6节。2.文献综述Python是一种编程语言,可以让程序员更快速更有效地工作[10,11]集成系统。这是一个免费的商业用途语言。它运行在所有主要的操作系统包括Windows,Linux/Unix,MacOSX上,也已经被移植到Java和.NET的虚拟机[10]。除了这些功能,Python是一种有效的语言特别是对软件开发的嵌入式系统。它也可以在web开发中使用的[4,5]。这是解决问题的理想语言,尤其是在Linux和UNIX,在自然语言中生命科学的研究和开发,加工生成软件应用[7-9]。在嵌入式系统中,在那里廉价的组件和维护要求的情况下,Python可以提供最佳的解决方案。通过Python,可以实现小尺寸,高可靠性和低功率消耗方面这些目标。此外,谁拥有Java,C或VisualBasic的背景下,开发商[4]可以快速学习它。事实上,它提供了混合的编程语言的特征。它以功能强大且简单的方式提供了大部分面向对象语言的特点。除了这种语言的这些强大的功能,没有适当的技术可以评估Python代码的质量为我们所知。在一些网上的文章,我们只能找到单一指标的发布表单[25-30]。这些可用的文章都涉及到可用的工具,它被限制为计算简单的指标。例如,Pythius[26]的工具,通过计算简单的指标,如行代码,模块和功能尺寸的意见比例计算的Python代码的复杂性。另一个工具“snakefood”由马丁·布莱文[27]提供了Python中的依赖关系图。它可以计算McCabe's的圈复杂度对Python代码非常有用。大卫·斯坦尼克[28]开发Pygenie工具还计算麦凯布对Python代码圈复杂度。瑞格·查尼还开发了名为PyMetrics一个开源代码的复杂度测量工具[29],它能够计算下列指标:块数,最大块的深度,对于Python类文档字符串数,类数,评论数,内联的注释,文档字符串的总数,文档字符串的功能数,函数数量,使用的关键字数量,行数,字符数及多接口功能的数量。另一个工具可在网上为Pyntch[30]。(抓取Python类型检查器)是一种静态代码分析,这实际上运行的代码之前,检测可能存在的运行时错误。上述所有工具都有效评估Python语言的质量最多只能在一定程度上。他们中的大多数都仅限于计算简单的指标,这给只对某些特定属性的想法;他们都不是能够在一个单一的指标来评价多数属性。3.提出度量如果我们分析面向对象软件,我们会发现软件由主程序几类。因此,面向对象的代码的复杂性取决于类的复杂性和主程序的复杂性。是很常见的观察,大多数可用的指标不关心在面向对象的系统主程序的复杂性。在我们的提议,我们考虑所有的因素,负责增加的复杂性以及主程序的类。其实主程序是主要的组件,它区别与其他面向对象的Python语言。我们将证明我们的索赔经验验证,第五节。此外,系统的复杂性取决于以下因素:复杂性取决于类。类是面向对象软件开发的基本单位。所有的函数分布在不同的类。进一步类面向对象的代码在继承层次结构或明显的分布。因此,复杂的继承层次结构中的所有类是由于类和复杂的不同的类。复杂性取决于全局变量:第二个重要的因素,通常被忽视的面向对象的代码,在计算复杂性是全局变量在主程序的复杂性。复杂性取决于耦合:耦合是增加面向对象代码的复杂性的重要因素之一。其他因素,如内聚和方法被认为是类中的复杂因素。因此,我们建议Python代码的复杂性定义为:Python的软件度量(SYMPy)=CIclass+CDclass+Cglobal+Ccoupling,(1)CIclass=复杂性取决于集继承CDclass=复杂性取决于不同的类Cglobal=全局复杂性Ccoupling=复杂性取决于类之间的耦合.计算继承和不同类的复杂性之前,我们会估计一个类,它以后将成为继承层次或不同类的一部分的复杂性。因此,我们将首先计算命名为Cclass的简单类的复杂性。Cclass可以被定义为Cclass=权重(属性)+权重(变量)+权重(结构)+权重(对象)-权重(内聚)在那里,属性的权W(属性)的定义为:W(属性)=4*和+MND(2.1)AND=任意不同命名的变量/属性数MND=有意义的命名变量/属性数变量W(变量)的权被定义为:W(变量)=4*AND+MND(2.2)表格1值的结构任意和有意义的变量和属性都是复杂性的原因之一。此外,如果一个变量的名称是任意给定的,则该代码的可理解性将会降低[20]。因此,类变量和属性应该有有意义的名称。虽然,建议的变量的名称应以这样的方式来选择,这是在编程有意义,还有谁不遵守这个建议严格的开发者。如果变量名任意取,如果开发者自己评估的代码可能不会是一个严重的问题。然而,这不是在现实生活中的情况。该系统的开发后,尤其是在维修时间,任意命名的变量可能比有意义的名称增加四倍理解难度[20]。结构W(结构)的权被定义为:W(结构)=W(BCS)(2.3)在这里,BCS是基本的控制结构。序列的复杂性依赖于它的数学表达式[15]。功能帮助代码保持整洁。此外,他们可能会增加代码的可重用性。但是每个函数调用扰乱阅读代码循环流畅度被用来重复语句超过一次,虽然,他们降低特别是计算性能,更多的嵌套循环有,更多的时间花费运行代码。此外,人的大脑在解释数据与电脑相似[22,23]使用了条件语句来使程序的动态。另一方面,通过提供多个组合它们减少抓取程序的完整性的容易程度。因此条件语句可以被认为是在不同的可能的情况下建立起来的序列。如果条件的情况下被嵌套,则复杂度变高得多。在异常的情况也类似。我们为每个基本控制结构接着王[15]的类似的方法分配的权重。证明和分配的权重为子意识功能,元认知功能和更高的认知功能分别作为1,2和3。虽然我们遵循与王某类似的方法,我们做了一些基本控制结构的重一些修改,如图1标签结构/基本控制结构(BCS的):物体W(对象)的权被定义为:W(对象)=2(2.4)创建一个对象被算作2,因为在创建函数的构造函数被自动调用。因此,它是与调用的函数或创建一个对象。这里是指是一个类中创建的对象。内聚的权定义为:W(内聚)=MA/AM(2.5)在那里,MA=其中属性用于AM的方法数=计算没有任何意义的AND或MND的内部方法属性数。笔记:函数调用:继承过程中,调用父类的构造函数不计算在内。全局变量:静态属性被算作一个全局变量。Cglobal可以定义为:Cglobal=W(变量+结构+对象)(3)变量W(变量)的权被定义为:W(变量)=4*AND+MND(3.1)该变量是全局定义。结构W(结构)的权被定义为:W(结构)=W(BCS)+obj.method(3.2)在这里,BCS是基本的控制结构,这些结构在全球范围内使用。“obj.method”呼叫使用一个对象类的方法访问。“obj.method”被算作二,因为它调用由程序员编写一个函数。物体W(对象)的权被定义为:W(对象)=2(3.3)创建一个对象,因为它是上述计为2。在这里,它的目的是为全局范围或者不属于任何类的一部分,任何函数内部创建的对象。注:例外:在计算的trycatch语句,如2“try”本身不计入只有“catch”的数进行计数。有两种情况,用于计算依赖于架构继承类的复杂性:如果类都在同一水平,那么它们的权重被添加。如果它们是一类孩子那么它们的权重相乘,因继承财产。如果有在面向对象的代码深度的水平和级别都有类则系统由于继承的复杂性被给定为:CIclass可以定义为:CDclass类可以被定义为:CDclass=Cclass(x)+Class(y)+…(5)注:所有类,既不是继承,也从另一个来源,是CDclassd的一部分即使他们与其它类一起造成的耦合。耦合被定义为:耦合=2C(6)C=连接数一种方法,它调用的另一种方法在另一个类,创建耦合。然而,如果一个类的方法调用其超类的方法中,那么它不被认为是耦合。为了提供一个连接有必须要两个实体。它意味着一个连接是在两个点之间。因此,该基数被取为2的另一个原因是函数调用具有2的值;是从一个方法到在另一个类的其他方法(多个)制成连接的总数。它被作为“电源”,因为每个连接使得在软件认知可理解为一个显著增量。4,度量的证明我们已经证明我们提出的复杂度由Python编写语言编程的例子由式(1)给出。这个编程示例的类图,图1给出了该程序的完整代码在附录A。此外,基本控制结构的权重计算都还展示在AppendixB被给出(表10)图1形状-类图表2类复杂性FThe提出的例子有八类。我们对所有类度量的组分概括于表2,并基于我们计算Cclass,CIclass,CDclass,Cglobal,系统的耦合值,这些值在标签3.非类作为全局的。值得一提的是继承的复杂的计算过程中,我们应该在CIclass的计算小心。我们在同一水平与他们的父类中添加的类的复杂性并且仅乘法,如示于下计算。Cclass(彩色)=21Cclass(形状)=7Cclass(图1P)=7Cclass(方形)=29Cclass(圆)=29Cclass(图2P)=11Cclass(矩形)=29Cclass(椭圆形)=29表3非类的复杂性CIclass=形状*(图1P*(广场+圈+2P图*(矩形+椭圆形)))=7*(7*(29+29+11*(29+29)))=34104CDclass=21Cglobal=24SMPY=CIclass+CDclass+Cglobal+耦合=34104+21+24+24=34165计算如下1.每个类的复杂计算。属性,方法,变量,对象,结构和内聚都包括在内。2.全局结构的复杂计算。变量,对象结构,功能,和主要功能都包括在内。3.类分离的内部继承且不同。4.继承复杂性的计算。超类乘以类,这是从它派生的总和。5.继承,不同类的复杂性,全局结构的复杂性,以及耦合的复杂性的总和达到SMPY的结果。五.实证验证度量的实证验证是通过一个案例研究,比较研究和应用指标在实际项目中进行。正在审议的案例研究是考虑到三种不同的语言。我们比较我们与最常用的度量CK度量套件。案例研究,比较研究以及实际项目的意见分别体现在5.1节,5.2和5.3。5.1案例分析对于我们的度量标准的实用性,我们选择了一个案例研究。我们衡量一个代码,它涵盖的内聚,耦合,继承,多态,属性,方法,变量等此代码,其中涵盖了大多数的可能的编码特点,在三种不同语言的尝试;C++,Java和Python。它的UML图在图1中给出。换句话说,我们尝试开发了一种系统,三种不同的语言,然后估算在三种不同的语言的同一系统的复杂性。该系统是相同的,这是我们考虑在部分4,我们在相同的部分已经计算了系统的复杂性在Python语言度量的示范。现在我们估计在C++和Java同样的例子的复杂性。它们的类的复杂性和非类复杂分别给出低于和在表4和5。因此对于C++的度量值:Cclass(色彩)=21Cclass(形状)=7Cclass(图1P)=7Cclass(正方形)=29Cclass(圆)=29Cclass(图2P)=11Cclass(矩形)=29Cclass(椭圆形)=29表4非类的复杂性CIclass=形状*(图1P*(正方形+圈+2P图*(矩形+椭圆形)))=7*(7*(29+29+11*(29+29)))=34104CDclass=21Cglobal=71JAVA总的系统复杂性=CIclass+CDclass+Cglobal+耦合=34104+21+71+24=34212图2语言之间的比较从上述实验中得到的数据提供有关的度量非常有价值的信息,以及语言的特性。我们可以很容易观察到,在所有三种语言类的度量值是相同的,分别是:21,7,7,29,29,11,29和29类的颜色,形状,图1P,正方形,圆形,图2P,矩形和椭圆形。然而,对于在Python,C++和Java对整个系统的复杂性是不同的,是34165,34173和34212分别为(图2)。这里需要注意的是在类级别的复杂性值相等,发生在主程序的差异是很重要的。这就是为什么在同一个项目的复杂性是在三个不同的语言中的不同的原因。对于整个系统,该系统的复杂性是在Python语言最少。它证明了Python语言的独特性。5.2与其他指标的比较我们比较熟知的CK度量所提出的指标。我们应用对正在审议的案例研究的类中的所有指标。为不同类别的量度值总结于表6。表6指标的比较当我们比较我们与CK指标对比,我们发现,对于SMPY度量值比所有CK措施越高。这是因为这一事实,即SMPY包括所有的参数,这是负责对系统的复杂性。然而,所有这些参数都在CK度量套件单独计算。换句话说,我们可以说,SMPY是超级组合Chidamber等人提出的所有措施。[3]。5.3一个真正的项目一项新措施的实用性离不开正确的经验证实,其中包括对实际项目的度量标准的适用性得到证实。为此,我们选择在Web上提供的一个开源项目。我们认为,开放源代码是为读者更为有利,因为他们也可以评估原作者做了同样的方式该项目。该项目是一个跨平台的一套专为编写视频游戏[34]Python模块。它包括计算机图形和设计为与Python编程语言中使用的音色库。它是建立在简单直接媒体层(SDL)库,在允许实时计算机游戏开发无需C编程语言及其衍生物的低级别机制的意图。这是基于该内部游戏(主要是图形部分)的最昂贵的功能可以完全由游戏逻辑本身抽象,从而有可能使用高级语言如Python构建游戏的假设。我们独立估计每个类的复杂性。通过继承和消息呼叫:类通过两种方式结合。通过继承再加类的继承层次显示在图三。一些类是独立的,因此,不会因继承影响,并且在图4中示出。表7类复杂性在选项卡。如图7所示,每个类的复杂性被示出。在第一列中的类的名称中给出。为了影响的类即属性,变量,结构,对象和凝聚力的复杂性不同的参数量度值在柱中给出2-7Cclass由方程2计算。这是很容易观察到的类的复杂性在很大程度上取决于它的参数。最高Cclass为按钮类,它是48,6由于它的方法复杂的结构,属性的数目,和可变的数。最低值是对于已经最简单的结构,例如类状态,Floortile和Proptile这些类。非类的复杂性,定义为Cglobal的复杂性是由于全局变量的结构和对象,并在表8.计算它可以很容易观察到,总的复杂性也起着增加总体复杂了重要的作用表8全局复杂性图3继承1还有在这个项目中不同的类层次结构。第一类层次结构示于图3。在该层次结构中两类按钮与方向按钮是在同一水平上,并从类的控件继承

温馨提示

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

评论

0/150

提交评论