《人工智能技术应用(第三版)》课件 2.4 搬运工_第1页
《人工智能技术应用(第三版)》课件 2.4 搬运工_第2页
《人工智能技术应用(第三版)》课件 2.4 搬运工_第3页
《人工智能技术应用(第三版)》课件 2.4 搬运工_第4页
《人工智能技术应用(第三版)》课件 2.4 搬运工_第5页
已阅读5页,还剩61页未读, 继续免费阅读

下载本文档

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

文档简介

第2章

初识Python——04搬运工1场景导入2知识小百科3AI实验室4分享评价1场景导入2020年1月,广东省某医院两名特殊的机器人员工“平平”和“安安”正式上岗,用以迅速准确地完成对物资配送,降低病毒交叉感染的风险。机器人(Robot)是自动执行工作的机器装置,随着人工智能技术、工业自动化、计算机网络等的发展,机器人已被广泛应用于各行各业。在咖啡店,机器人可以根据程序执行自动研磨咖啡的操作;在餐饮店,机器人可以执行上菜、收餐盘的工作;在工厂,机器人可实现物品的搬运、码垛功能。想象一下,如果你拥有一台机器人,应该如何编写程序来让机器人实现物品的搬运、堆叠工作呢?如图所示为机器人自动码垛操作。1场景导入机器人码垛实验2知识小百科活动目标:学习系统内置函数学习自定义函数了解类的基础知识了解机械臂的原理及使用实现机械臂的码垛操作程序中有时会反复使用功能相似的代码,若重复编写,则程序显得冗长、不精练。可以将此功能编写成一个通用的独立代码段,即函数,其可被反复使用。通俗来讲,函数就是指为一段实现特定功能的代码“取”了一个名字,以后即可通过该名字来执行(调用)该函数。函数的使用可以大大提高代码的重复利用率,简化程序,使程序具有更高的可读性。Python为我们提供了很多非常便捷实用的系统函数,它们通常被称为“内置函数”,例如在前面章节中(一)什么是函数家已经遇到过的print()函数、input()函数和随机函数等。用户也可以自己创建函数,即用户自定义函数。特别说明:所有函数在被调用和执行的时候,都有一对小括号(),小括号中的内容就是需要用户传入的参数,即便没有任何参数传入,小括号也是不能省略的!(一)什么是函数1、print()函数print()函数的作用就是将小括号中传入的参数(也可以理解成数据)打印在控制台输出并显示出来,大家在前面的章节中已经学过了,例如print("HelloPython!")的执行结果就是在控制台上显示HelloPython!当然,除了可以传入字符串作为参数,还可以传入数字、变量、列表、元组、字典等等,下面介绍print()内置打印函数两个重要的内容:(二)内置函数(1)参数格式化这一点类似于C语言中的printf()函数,可以简单地理解成“先挖一个坑,再在后面填一个坑”,例如下面这个例子:name=“小明”age=19hobby="踢足球"print("我是%s,我今年%d岁了,我喜欢%s"%(name,age,hobby))运行结果为:我是小明,我今年19岁了,我喜欢踢足球(二)内置函数print()函数中小括号中的内容被%分成了两部分,前面部分是需要输出的内容,其中%s、%d、%s是“挖好的坑”,它们的具体内容由%后面部分小括号中的三个参数name,age,hobby来进行“填坑”。%s表示格式化字符串,%d表示格式化整数,其他更多格式化参数,读者可以自行深入研究。(二)内置函数(2)end的作用print()小括号中的end参数,功能是“以什么内容”结尾,举个例子:运行结果为:在上述例子中,2个print()分别以end中的内容结尾,并且打印输出的内容不再换行,如果需要换行,那么需要在另外书写转义字符。print("小明",end='19岁')print("小红",end='16岁')小明19岁小红16岁(二)内置函数2、min()函数顾名思义,min的意思是最小值,min()的作用就是获得小括号中多个数据的最小值,例如:运行结果为:运行结果为:value=min(2,2,5,4,1,6)print(value)1(二)内置函数3、id()函数id()内置函数提供了查询数据内存地址的功能,这一功能对于分析代码逻辑与数据信息是非常有帮助的,例如:运行结果为:num1="你好"num2=123print(id(num1))print(id(num2))1814730912080140704242171984(二)内置函数运行结果为从运行结果可以看到,num1和num2指向内存中两个不同的地址。

(二)内置函数4、random()随机函数常用的随机函数包括random()和randint()。random()“函数”的功能是获取一个0~1之间的随机小数,但不能直接使用它,因为它属于系统中一个叫做random的模块中,因此它是random模块中的random函数,需要先导入random模块(importrandom),再使用random函数。调用模块中的函数,需要使用“.”语法来进行操作,关于模块的使用及函数与方法的区别,参考本节后续内容,这里仅举一个例子:(二)内置函数(二)内置函数importrandomnum1=random.random()num2=random.randint(0,10)print(num1)print(num2)运行结果为:0.200017616195571578上面例子中randint(0,10)的作用是获得0~10之间的一个随机整数。以上列举了4个较为常用的python内置函数用法,其他的内置函数还有很多,希望同学们参考python的API文档,验证其他的内置函数用法。

(二)内置函数自定义函数和内置函数都属于函数,因此它们在本质上是一样的,区别在于:内置函数的运算逻辑已经由python开发者们写好,直接使用就行了,而自定义函数就需要用户自己来写函数的运算逻辑。如完成机器人搬运物品这个功能,就要使用“搬运”的相应函数或方法,可是内置函数中有没有提供这样的函数或方法,那用户既可以自己定义一个相关功能的函数。1、自定义函数的组成、格式与调用程序中使用一个自定义函数,就像现实生活中雇佣一个人一样。首先函数必须要有一个名字(即函数名);

(三)自定义函数其次告诉这个人工作的相关信息,即这个函数还要有参与运算的数据(即形式参数),当然这个参数可以是空参数(即没有参数);第三,这个人如果已经完成任务了,需不需要回馈结果呢?如果需要,函数还要有执行完毕的结果(即返回值);如果不需要运算结果,也可以让函数不返回运算结果。综上所述,一个基本的自定义函数组成包括函数名、形式参数和返回值,其中形式参数可以为空,也可以没有返回值。其语法格式如下:(三)自定义函数(三)自定义函数def函数名(形参列表):函数体return返回值特别说明:(1)函数的定义必须是def开头。(2)函数名的命名规则参考变量名的命名规则,为了提高代码的可阅读性,建议使用驼峰命名法或混合命名法(具体内容自行查阅相关文档)。(3)小括号不能省略!形参列表可以为空或者多个,如有多个形参,用逗号隔开(例如:arg1,arg2,arg3),一旦定义了形参列表,在使用函数时必须要传入参数。(4)小括号后的冒号不可以省略。(5)函数体与return前面必须有缩进。(6)如果需要运算返回值,return语句必须写,否则return语句可以不写。(7)函数体内的多条逻辑仍然按照从上往下的顺序进行运算。(三)自定义函数(8)必须遵循先定义、后调用的原则!即定义函数必须写在调用函数之前,否则报错。说明事项看上去好像有点复杂,其实只要多练习几次就熟练了。练习一下计算两个数的和与差,代码如下:(三)自定义函数#定义两个数相加的函数,函数名为add,形参为num1,num2,返回num1+num2defadd(num1,num2):returnnum1+num2(三)自定义函数#定义两个数相减的函数,函数名为sub,形参为num1,num2,返回num1-num2defsub(num1,num2):returnnum1-num2#打印输出3+7与3-7的结果,3和7为实参print(add(3,7))print(sub(3,7))运行结果为:10-4其实,python中函数的使用就是这么简单。调用自定义函数只需要按照“函数名”+“(实参1,实参2,实参3......)”的格式使用就可以啦!(三)自定义函数2、形参中的*args与**kwargs*args可以将传入的多个实参转换为元组,结合元组的相关操作,就可以方便的对可变长度的参数进行操作了,例如,获得所有实参的和,代码如下:(三)自定义函数#定义所有实参求和的函数,函数名为add,args为所有实参的元组形式defadd(*args):#遍历args,求和并返回求和结果sum=0foriinrange(len(args)):sum+=args[i]returnsum(三)自定义函数#打印2,2,3,4,4的求和结果print(add(2,2,3,4,4))运行结果为:15**kwargs可以将传入的关键字参数转换为字典,结合字典的相关操作,就可以方便的对可变长度的关键字参数进行操作了,例如,打印转换后的字典数据:deffunc(**kwargs):print(kwargs)func(a=1,b=2,c=3)(三)自定义函数运行结果为:{'a':1,'b':2,'c':3}上例中可以看出,传入的关键字参数a=1,b=2,c=3被转换成字典被打印出来。因此,合理运用*args与**kwargs接收可变长度的实参数据进行运算,对于自定义函数来说是非常方便实用的。3、基本数据类型与复杂数据类型基本数据类型在前面学习过了,主要包括整型、浮点型、布尔型等;复杂数据类型包括字符串、列表、元组、字典等(即基本数据类型之外的);基本数据类型与复杂数据类型在赋值的过程中,有一些区别和值得注意的地方:(1)基本数据类型的赋值属于值赋值,可以理解成数据直接赋值给变量;(2)复杂数据类型的赋值属于引用赋值,可以理解成将数据存放的地址赋值给变量;由于以上原因,使得基本数据类型与复杂数据类:(三)自定义函数型在赋值的过程中需要保持头脑清醒,否则容易造成数据的读写错误,但是程序不会提示任何错误,以下通过两个案例进行说明,案例1代码如下:(三)自定义函数a=0 #将0赋值给ab=a #将a赋值给b,此时b=0,a=0b=999 #将999赋值给b,此时b=999,a=0print(a)运行结果为:0说明:案例1中a与b的赋值均为基本数据类型,因此属于值赋值,即直接将变量赋值为整数,当b赋值为999时,并没有修改a,因此a的值仍为0;但是如果将a的赋值修改为列表,结果便有所不同了。如下所示为案例2代码:(三)自定义函数a=[0,1,2,3]#将列表[0,1,2,3]赋值给a,但这是一个引用赋值b=a #将a赋值给b,此时a与b同时指向[0,1,2,3]的内存地址b[0]=999 #将999赋值给b[0],此时b=[999,1,2,3]print(a) #打印a的数据运行结果为:[999,1,2,3]说明:案例2中a虽然看起来从头到尾都没有被重新赋值,但因为a的赋值是引用赋值,即该值为列表[0,1,2,3]的引用地址,b=a语句使得b的值也为列表[0,1,2,3]的引用地址,随后通过b[0]=999语句将列表[0,1,2,3]中的0修改为999,因此a通过其引用赋值访问该列表时,获得的列表数据即为修改后的[999,1,2,3],而并非[0,1,2,3]。如果有些我们需要用到的控制命令(自定义函数)封装在一个叫做“类”的东西里面了怎么办呢?接下来咱们一起走进“类”的世界吧。(三)自定义函数类的使用在面向对象的编程过程中,是很重要的,而且比较抽象和复杂,这里重点认识一下什么叫做类及其简单应用。当然,在学习完本节知识之后,同学可以继续深入了解类的相关知识。(四)类的基础知识1、什么是类和对象无论是python还是其他的面向对象编程语言,类和对象的概念基本上是一样的。为了更好地理解类,我们先来了解一下什么是对象,简单地说,万物皆对象。一台机器人是一个对象、马路边停着的一辆汽车是一个对象、隔壁老李是一个对象、地球是一个对象......,任何一个对象都会有其相应的属性,例如:隔壁老李这个对象,他有哪些属性呢?属性1:姓名,属性2:年龄,属性3:性别,属性4:电话号码,属性5:住址......(四)类的基础知识如果你的程序中仅涉及到老李这一个对象,那么你只需要将老李的这些属性定义成变量进行使用就可以了,但是如果还涉及到老张、老陈、老王、老周等等很多人呢?而且有些人重名了怎么办呢?如果还是用变量的方式去完成,这将是一个很复杂、很容易出错的变量表。因此,我们可以将老李、老张、老陈等对象涉及到的属性全部抽象出来,建立一个person的类,person类中包含了姓名(name)、年龄(age)、性别(sex)、电话号码(tel)、住址(addr)等属性,当我们需要使用老李这个对象的时候,只需要从person类生成一个老李对象出来,并给这些属性赋予(四)类的基础知识老李的信息就可以了(这一过程被称为实例化),当程序中不需要用到老李这个对象时,可以销毁该对象释放内存。下面用一个图来表示上述内容(假定住址都是AAA小区):(四)类的基础知识(四)类的基础知识类与对象实例化模型在类中定义的函数,不能再称为函数了,而应称之为“方法”。此时,有两种调用方式:(1)使用类的属性或方法,采用“类名.属性名”或“类名.方法名”的方式调用;(2)使用对象的属性或方法,采用“对象名.属性名”或“对象名.方法名”的方式调用。(四)类的基础知识2、类和对象的基本使用举例说明类与对象的基本使用,不涉及到类的封装、继承和多态等更加复杂的知识。要求定义一个Person的类,包括前述addr、name、age、sex属性,以及类方法PersonSpeak()和实例方法ObjectSpeak(),示例代码如下:(四)类的基础知识(四)类的基础知识#定义Person类classPerson:#address为类属性address='AAA小区'#__init__为对象初始化方法,接收实例化对象时传入的实参def__init__(self,name,age,sex):=nameself.age=ageself.sex=sex#ObjectSpeak()为普通方法,通过"对象名.ObjectSpeak"的方式调用(四)类的基础知识defObjectSpeak(self):print('我是%s,今年%d岁,性别为%s'%(,self.age,self.sex))#PersonSpeak()为类方法,可以访问类属性@classmethoddefPersonSpeak(cls):print('我们都住在%s'%(cls.address))#调用类方法PersonSpeak()Person.PersonSpeak()#实例化老李和老张laoLi=Person("老李",60,"男")(四)类的基础知识laoZhang=Person("老张",65,"女")#打印老李的姓名与老张的年龄print(laoL)print(laoZhang.age)#调用老李的实例方法laoLi.ObjectSpeak()#调用老张的实例方法laoZhang.ObjectSpeak()运行结果为:我们都住在AAA小区老李(四)类的基础知识65我是老李,今年60岁,性别为男我是老张,今年65岁,性别为女特别说明:address这种直接定义在类中的属性称为类属性,通过Person.address的方式调用。__init__为对象初始化方法,接收实例化对象时传入的实参,该方法中的self指向所实例化的那个对象。@classmethod为装饰器,表明紧跟着的方法为类方法,方法中默认的参数为cls(通过cls获取类中的类属性)。类和对象的概念较为抽象,同学们可以尝试着创建一个机器人类或汽车类,来巩固和加深对类与对象的理解。(四)类的基础知识1、坐标系机器人搬运时会往返于取货点和码垛点之间,拿起物品和放下物品。可以简化理解为两个方面:第一从空间中的一个点移动到另一个点,即点对点的移动;第二是移动到目标点后如何进行相应的控制。如何来确定点的位置呢?通常,坐标系是为了确定机器人的位置和姿态而在机器人或空间上定义的位置指标系统。(五)机械臂原理及使用笛卡尔坐标系:又称机器人直角坐标系,将机器人所在空间中的某个点作为空间坐标原点(通常为机器人基座的位置)。本教材相关任务都选用国产小型机械臂来完成。该机械臂提供了非常完整、丰富的控制指令系统,而且与python语言编译环境兼容性非常好,底层逻辑开源程度较高,非常适合作为人工智能研究及创新创业项目的执行终端。(五)机械臂原理及使用2、外观及构成机械臂是一款桌面级智能机械臂,如图所示,主体结构有底座、大臂、小臂及末端工具,其中末端工具有多种类型,如画笔、柔性手爪、吸盘等,为你提供非常棒的创作体验。(五)机械臂原理及使用(五)机械臂原理及使用机械臂外观结构3、运动模式机械臂点到点的运动模式有三种方式,分别是直线运动、相对运动、绝对运动。控制点到点运动在Python中对应的控制指令是:dexarm.move_to(x,

y,

z,feedrate)参数解释如下页表所示。(五)机械臂原理及使用控制点到点运动指令参数说明dexarm使用

Rotrics库的对象,不需要修改move点到点的运动模式(x,y,z)笛卡尔直角系中机械臂的坐标feedrate运动速度(1)

直线运动直线运动以两点之间的最短路径进行移动,根据两点之间线段最短,因此,移动方式为沿着两点之间的直线运动。(2)

相对运动相对运动是相对于当前位置进行移动。(3)

绝对运动绝对运动是移动到空间绝对坐标的位置。(五)机械臂原理及使用4、坐标获取获取机械臂当前坐标的指令为:dexarm.get_current_position()返回值为坐标队列。(五)机械臂原理及使用4、吸盘控制以吸盘作为末端工具,控制机械臂拾取、放置、复位的指令是:

dexarm.air_picker_pick() #吸盘拾取 dexarm.air_picker_place() #吸盘放置 dexarm.air_picker_stop() #吸盘复位(五)机械臂原理及使用3AI实验室(一)任务发布目标1.利用机械臂实现单个方块来回搬运2.利用机械臂搬运3*3矩阵的不同颜色的方块进行码垛要求(1)熟练运用机械臂的点到点运动指令和气泵控制指令;(2)实现机械臂搬运3*3矩阵的不同颜色的方块分别码垛到A、B、C三点位置,如图所示。示意图本任务软件环境需要配置好python3.x语言环境,并安装有相应的编程集成开发环境,本书使用VScode集成开发环境(Windowsx64UserInstaller版本)硬件环境如下表所示:(二)任务环境硬件图示名称数量机械臂1台USB串口通信线1条电源适配器1套搬运物品模型若干1、实现单个方块来回搬运(1)利用机械臂实现单个方块来回搬运,先从A点位置搬运到B点位置,然后再从B点位置搬运到A点,重复三次后回到初始位置。特别说明:本任务控制系统中,主要通过dexarm.move_to(x,y,z,feedrate)函数控制机械臂的移动轨迹,通过dexarm.air_picker_pick()、dexarm.air_picker_place()函数控制吸盘拿起、放下物品。因此,程序中的坐标点位置需要根据实际情况进行设置。(三)任务实施(2)代码分析#机械臂控制类frompydexarmimportDexarm#通信类importsocket#连接机械臂,并初始化dexarm=Dexarm("COM3")#移动到安全位dexarm.go_home()print('Starting...')(三)任务实施#定义来回搬运单个方块函数#

创建变量i=3#循环while(i>0):

i-=1

print('机械臂移动到A点上方')

dexarm.move_to(64,278,0)

print('机械臂移动到A点')

dexarm.move_to(64,278,-47)(三)任务实施

#拾取物品

dexarm.air_picker_pick()

print('机械臂从A点移动到B点上方')

dexarm.move_to(-58,278,0)

print('机械臂移动到B点')

dexarm.move_to(-58,278,-47)

#放置物品

dexarm.air_picker_place()

print('机械臂移动到B点上方')

dexarm.move_to(-58,278,0)(三)任务实施

#延时2秒

dexarm.dealy_s(2)

dexarm.move_to(-58,278,0)

print('机械臂移动到B点')

dexarm.move_to(-58,278,-47)

#拾取物品

dexarm.air_picker_pick()

print('机械臂从B点移动到A点上方')

dexarm.move

温馨提示

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

评论

0/150

提交评论