理论教育 利用光电传感器的多种应用场景分析

利用光电传感器的多种应用场景分析

时间:2023-06-29 理论教育 版权反馈
【摘要】:答:在奇数次中断到来时点亮所有4个LED灯,偶数次中断到来时关闭所有LED灯。利用光电开关还可以进行产品流水线的产量统计、对装配件是否到位及装配质量进行检测,例如瓶盖是否压上、商标是否漏贴,以及送料机构是否断料等。此外,利用光电传感器可以检测布料的有无和宽度。利用遮挡式光电传感器检测布料的下垂度,其结果可用于调整布料在传送中的张力,利用安装在框架上的光电传感器可以发现漏装产品的空箱,比利用油缸将空箱推出。

利用光电传感器的多种应用场景分析

双足步行机器人是一个集多学科于一体的综合平台,制作双足步行机器人具有很强的实践性,只有读者亲自动手做多学科的相关实验,才能够更加深入地掌握其相关的制作技术。本章通过PIC单片机编程、舵机控制、机械结构设计与认识、动作调试、上位机编程、ZMP实验、多智能体协调控制、语音控制等12个实验,讲授了双足步行机器人具体的制作方法与基本技术。

1)熟悉PIC单片机和MPLAB-IDE编程环境

2)了解MPLABICD2在线调试器的作用及安装,熟悉连接和配置MPLABICD2。

3)学会创建工程文件、编写源文件代码并对源文件进行编译。

4)熟悉使用MPLABICD2在线调试器的调试和下载程序。

PC一台、MPLAB安装软件、MPLABICD2在线调试器、目标电路板。

1.PIC单片机简介

双足步行机器人的控制芯片为Microchip公司生产的PIC系列16F877A单片机,所以下面主要介绍的是PIC中档系列单片机16F877A,16F877A引脚排列如图7-1所示。

PIC共有35条指令,每条指令字长为14位,其指令向上兼容,整个指令系统的指令按操作方式大体可分成3类:

1)字节操作类指令。

2)位操作类指令。

3)立即数操作和控制操作类。

PIC系列单片机是采用精简指令集计算(RISC)结构体系,所以寻址方式既少又简单。寻址方式根据操作数来源不同,可分为立即数寻址、寄存器间接寻址、直接寻址和位寻址4种。每条指令字长为14位,由于篇幅有限,仅在表7-1中列出了设计时所用到的字节操作指令、位操作指令和立即数操作与控制操作指令。表7-2是表7-1操作码字符的说明。

978-7-111-57208-4-Chapter07-1.jpg

图7-1 PIC16F877A引脚排列

7-1 PIC16F877A指令设置

978-7-111-57208-4-Chapter07-2.jpg

注:Z、DC、C分别为状态(Status)寄存器中的零标志位、辅助进位/借位位、进位/借位位。

7-2 操作码字符说明

978-7-111-57208-4-Chapter07-3.jpg

以上都是汇编指令,不易记忆、不易读、不易移植。双足步行机器人采用通俗易懂的C语言来开发。

2.MPLAB-IDE编程环境

MPLAB集成开发环境(IDE)是综合的编辑器、项目管理器和设计平台,适用于使用Microchip公司的PIC系列单片机进行嵌入式设计的应用开发。

3.MPLABICD2在线调试器

ICD2是(in-circuitdebugger)的英文缩写,中文是“在线调试”的意思。数字“2”,是因为它是ICD1的改进版,支持调试更多Flash存储器芯片。ICD2的作用是让用户查看单片机内部的寄存器数据,帮助我们学习及发现程序问题。ICD2本身既是一个调试器,同时也是一个烧入器。因为在线调试本身就是要求通过ICD2把目标代码下载到芯片内部,只不过调试时多写了一部分监控代码而已。如果不需要进行在线调试,就可以把ICD2看作为一个编程工具,把目标代码下载后,拔掉ICD2和目标板的连线,单片机就可以独立运行了。

1.安装PIC单片机MPLAB-IDE编程环境及ICD2在线调试器并创建工程

(1)安装MPLABIDE 从光盘安装,将光盘放入驱动器内,跟随屏幕上的菜单安装MPLABIDE。

也可浏览光盘,打开“softdown”文件夹,解压文件,双击其中的“MPLABv7.50Install.exe”进行安装。

MPLABIDE里没有自带C编译器,安装完MPLABIDE后需要安装Hi-techPICCCompil-er(参考安装说明书安装即可,此软件需自行下载或购买)。

(2)安装MPLAB ICD2 前面,我们已经安装完了MPLAB IDE编程环境,一般在安装目录下,有一个安装MPLAB ICD2的操作指南ezicd2.htm:C:\ProgramFiles\MPLABIDE\Utilities\MPUsbIRU\ezicd2.htm,打开后按照它的说明一步一步地安装即可。如果目录下没有这个文档,则可按照与MPLABICD2配套的安装说明书进行安装即可。

(3)运行MPLABIDE 双击桌面上MPLABIDE的图标978-7-111-57208-4-Chapter07-4.jpg,或者选择Start→Programs→MicrochipMPLABIDE→MPLAB IDE。屏幕上首先会显示MPLAB IDE的商标图案,然后出现MPLAB IDE的主窗口,如图7-2所示。

(4)创建工程

1)在图7-2所示的对话框中,选择菜单Project→Project Wizard,单击“下一步”按钮,选择对话框中的PIC16F877A器件,在出现的如图7-3所示框中,单击“下一步”按钮,出现图7-4所示的对话框。

978-7-111-57208-4-Chapter07-5.jpg

图7-2 MPLABIDE的主窗口

978-7-111-57208-4-Chapter07-6.jpg

图7-3 工程向导选择器件

2)如图7-4所示的对话框中,选择HI-TECHPICC Toolsuite语言工具,单击“下一步”按钮,出现图7-5所示对话框。

3)在图7-5所示对话框中,输入工程名和工程所在的路径,这里我们设工程名为first,保存在D:\frist文件下,单击“下一步”按钮。出现图7-6所示的对话框。

4)此时我们还没有哪些已存在的文件需要添加到工程中,因此直接点击下一步。

978-7-111-57208-4-Chapter07-7.jpg

图7-4 工程向导选择语言工具

978-7-111-57208-4-Chapter07-8.jpg

图7-5 工程名和工程路径设置

5)单击完成,项目工程建立完成。

2.编译程序

1)单击File→New新建一个文件,编写程序代码,如下:

978-7-111-57208-4-Chapter07-9.jpg

图7-6 添加已存在的文件到工程中

978-7-111-57208-4-Chapter07-10.jpg

2)单击File→Save保存这个文件到D:\frist文件下,文件名为first.c。

3)添加first.c到工程中去。

用右键单击Source files,选择“Add Files”,找到first.c,点击“打开”即可,具体操作如图7-7、图7-8所示。

978-7-111-57208-4-Chapter07-11.jpg

图7-7 添加刚编译好的文件到工程中

978-7-111-57208-4-Chapter07-12.jpg

图7-8 完成添加

4)保存工程,单击File→Save Workspace。

5)单击Project→Build All。在Output窗口中可以看到编译结果,如图7-9所示。

978-7-111-57208-4-Chapter07-13.jpg

图7-9 通过Output查看编译结果

假如文件汇编失败,检查下列两项,然后重新编译项目:

①检查编辑器窗口中所输入代码的拼写和格式。如果汇编器在输出窗口中报告错误,则在该错误信息上双击鼠标,MAPLAB会打开源代码窗口,并且在源代码窗口的左边空白处显示绿色箭头标志。

②检查是否为PICmicro器件使用了正确的汇编器。选择Project→Set Language Tool Loca-tions,然后检查显示出的文件路径。如果路径正确,单击“Cancel”按钮;如果路径错误,则更改路径,然后单击OK按钮,如图7-10所示。

978-7-111-57208-4-Chapter07-14.jpg

图7-10 设置语言工具

6)单击View→Program Memory可以观察程序存储器,如图7-11所示。

978-7-111-57208-4-Chapter07-15.jpg

图7-11 程序存储器

3.连接MPLAB ICD2

1)将ICD2通过电缆连接到计算机上。

2)用独立充电电池给目标演示板供电(为单向接插件)。

3)将ICD2连接到目标演示板上(排线中的蓝色线靠近目标板电源)。

4)选中MPALAB IDE的Debugger→Select Tool→MPLABICD2,如图7-12所示。

978-7-111-57208-4-Chapter07-16.jpg

图7-12 选择调试工具

5)进入MPLAB ICD2Setup Wizard一步一步设置,如图7-13所示。

978-7-111-57208-4-Chapter07-17.jpg

图7-13 选择ICD2设置向导

步骤一:选择ICD2的USB连接模式,如图7-14所示。

步骤二:选择ICD2的供电方式,如图7-15所示。

步骤三:使能ICD2和IDE自动连接,如图7-16所示。

步骤四:使能ICD2自动下载所需的操作系统,如图7-17所示。

步骤五:单击“完成”按钮,完成向导设置,如图7-18所示。

6)单击完成后,点击Debugger→Connect,进行ICD2与目标板的通信连接,如图7-19所示。

978-7-111-57208-4-Chapter07-18.jpg

图7-14 选择ICD2的USB连接模式

978-7-111-57208-4-Chapter07-19.jpg

图7-15 设置ICD2的供电方式

978-7-111-57208-4-Chapter07-20.jpg

图7-16 使能ICD2和IDE自动连接

978-7-111-57208-4-Chapter07-21.jpg

图7-17 使能ICD2自动下载

978-7-111-57208-4-Chapter07-22.jpg

图7-18 完成向导设置

978-7-111-57208-4-Chapter07-23.jpg

图7-19 通过ICD2进行连接调试

如果出现了图7-20所示的信息,说明连接成功,可以用来调试了。

978-7-111-57208-4-Chapter07-24.jpg

图7-20 连接成功

4.调试程序

1)设置芯片的配置字,如图7-21所示,单击Configure→Configuration Bits…,严格按照图7-22进行配置。

978-7-111-57208-4-Chapter07-25.jpg

图7-21 选择配置芯片配置字

2)编译程序,单击Project→Build All,如图7-23所示。

下载程序,单击Debugger→Program,如图7-24所示。

3)下载完毕后,可以设置程序断点,观察程序执行情况及变量实时的值。首先单击View→Watch,打开变量监视框,如图7-25所示。

978-7-111-57208-4-Chapter07-26.jpg

图7-22 芯片配置字配置方法

978-7-111-57208-4-Chapter07-27.jpg

图7-23 编译成功

978-7-111-57208-4-Chapter07-28.jpg

图7-24 调试模式下进行程序下载

978-7-111-57208-4-Chapter07-29.jpg

图7-25 调出查看窗口对变量进行监视

比如我们要观察程序运行时变量i值的情况,单击“Watch”窗口的“Add Symbol”按钮,如图7-26、图7-27所示。

设置断点、调试,可以全速运行、单步连续运行、单步跨过运行和复位四种模式来调试。如图中所示的语句处设置断点,则可双击该语句对应的左边灰色区域,则出现断点,然后再通过调试工具栏978-7-111-57208-4-Chapter07-30.jpg中四种调试模式对应的按钮进行断点调试。以本实验为例,设置好断点后,不断点击978-7-111-57208-4-Chapter07-31.jpg可以通过“Watch”窗口看到“i”值的变化情况,如图7-28所示。

978-7-111-57208-4-Chapter07-32.jpg

图7-26 准备添加所要查看的变量到查看窗口

978-7-111-57208-4-Chapter07-33.jpg

图7-27 已添加所要查看的变量到查看窗口

978-7-111-57208-4-Chapter07-34.jpg

图7-28 断点调试并查看变量值的变化

1.创建工程的过程中应注意哪些问题?

答:1)先要检查MPLAB软件是否正确安装完毕。

2)检查HT-PIC软件是否正确安装完毕。

3)在创建工程前确定本工程采用汇编语言还是C语言编写,从而确定是否选择HI- TECH PICC Toolsuite编译器。

4)工程保存路径中不要包含中文字符。

2.安装和配置需要注意哪些问题?

答:1)安装MPLAB-ICD2的驱动程序一定要按照说明文件安装,以免出现不能连接等异常情况。

2)仿真头的接线和单片机上的接头要配合正确,否则容易烧坏仿真器。

3)配置时要注意芯片的类型和设置芯片的配置字是否正确。

3.调试模式和编程模式的切换需要注意哪些事项?

答:1)先关闭掉原来的模式,比如当前是Debug模式,先进Debugger→SelectTools下设成None,再进入Programer去选。

2)切换后芯片的配置字会发生改变,需要重新配置,否则程序可能无法正确运行。

作为感知、采集、转换、传输和处理各种信息必不可少的功能器件传感器,已成为与计算机同等重要的技术工具。本次实验主要让同学们了解超声波传感器、霍尔传感器、温度传感器、红外传感器。

1)熟悉机器人技术中常见传感器的原理和使用。

2)综合使用PIC单片机资源,理解中断定时器的原理。

3)巩固C语言能力,掌握传感器使用的时序关系。

PC一台(MPLABIDE环境)、MPLABICD2一台、实验板一块(集成各种传感器)、供电电源(12V)、万用表一台、示波器一台及数根接插线。

实验板载传感器:超声波传感器(接受探头、发送探头)、温度传感器(DS18B20)、霍尔传感器、光电传感器。

1.霍尔传感器

霍尔传感器有以下几个主要应用:磁场测量、电流测量、转速和脉冲测量、信号的运算和测量、拉力和压力测量。本次试验采用的传感器是磁场测量传感器。它的最简单的原理就是当传感器连接到电路中以后,当其处在强磁场中时它的DQ信号线就会输出低电平,离开强磁场的时候它输出高电平。但是它对磁场的极性是有要求的,必须用正确的极性对准霍尔传感器,它才能输出低电平。我们利用这种特性可以应用在很多地方,比如在机器人的导轨上适当地加上几个霍尔传感器,通过这种方式我们就可以定位出导轨上的机构所在的位置了。它的外观及连线如图7-29所示。

2.光电传感器

对射式光电传感器包含在结构上相互分离且光轴相对放置的发射器和接收器,发射器发出的光线直接进入接收器。当被检测物体经过发射器和接收器之间且阻断光线时,光电传感器就产生了开关信号。当检测物体是不透明时,对射式光电传感器是最可靠的检测模式。

这种遮挡式光传感器可以应用在很多地方,比如电动机转速的测定。安装在门的两侧可以用来防盗。

在对射管没有被不透明物体遮挡时,发射管发出的光线能被接收管接收到,这时对射管的信号线输出低电平,当发射管的光线被不透明的物体遮挡住时,接收管不能接受到信号,这时对射管输出高电平。如图7-30所示。

978-7-111-57208-4-Chapter07-35.jpg

图7-29 霍尔传感器外观及连线图

978-7-111-57208-4-Chapter07-36.jpg

图7-30 光电传感器发射接收端有无遮挡示意图

3.温度传感器

新型数字温度传感器DS18B20具有体积更小、精度更高、适用电压更宽、采用一线总线、可组网等优点,在实际应用中取得了良好的测温效果。

DS18B20的主要特性:

1)适应电压范围更宽,电压范围为3.0~5.5V,在寄生电源方式下可由数据线供电。

2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通信。

3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。

4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只晶体管的集成电路内。

5)温度范围-55~+125℃,在-10~+85℃时精度为±0.5℃。

6)可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。

7)在9位分辨率时,最多在93.75ms内把温度转换为数字,12位分辨率时最多在75.0ms内把温度值转换为数字,速度更快。

8)测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。

9)负压特性。电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。它的外形及连线如图7-31所示。

4.超声波传感器

超声测距是一种非接触式的检测方式。与其他方法相比,如电磁的或光学的方法,它不受光线、被测对象颜色等影响。对于被测物处于黑暗、有灰尘、烟雾、电磁干扰、有毒等恶劣的环境下有一定的适应能力。因此在液位测量、机械手控制、车辆自动导航、物体识别等方面有广泛应用。特别是应用于空气中的测距,由于空气中波速较慢,其回波信号中包含的沿传播方向上的结构信息很容易检测出来,具有很高的分辨力,因而其准确度也较其他方法为高;而且超声波传感器具有结构简单、体积小、信号处理可靠等特点。这种技术常被应用于避障技术中。同学们掌握这个传感器的使用方法,对学习机器人技术是非常有帮助的。

超声波测距的原理如图7-32所示。

978-7-111-57208-4-Chapter07-37.jpg

图7-31 温度传感器DS18B20外观及连线图

978-7-111-57208-4-Chapter07-38.jpg

图7-32 超声波传感器测距原理图

发射探头发射超声波,当超声波遇到障碍物后声波被反射回来,并被接受探头接收到,控制单片机记录超声波从发射到接受超声波的时间,利用超声波在空气中的传播速度就可以计算出障碍物的距离:S=vt/2。

我们使用的超声波传感器是压电式超声波传感器ZR40-16、ZT40-16,它们的原理如图7-32所示,压电式超声波发生器实际上是利用压电晶体的谐振来工作的。超声波发生器内部结构如图7-33所示,它有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之,如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。

978-7-111-57208-4-Chapter07-39.jpg

图7-33 超声波传感器 内部结构图

但是接收到的信号是非常微弱的,所以我们要把它放大,以使单片机能够检测到它的大小。

实验板的布置如图7-34所示。

978-7-111-57208-4-Chapter07-40.jpg

图7-34 传感器实验板布置(正式)图

1.霍尔传感器

要求:连接完整的电路,在单片机上下载程序实现在奇数次中断时(霍尔传感器在奇数次检测到磁场时)所有LED灯循环点亮,偶数次中断时(霍尔传感器在偶数次检测到磁场时)关闭LED。

步骤:

1)给试验板加电(注:电源电压12V,电源极性不能接反,当电源部分指示灯点亮时表明试验板加电正确)。

2)用万用表测量霍尔传感器的信号线,信号线为J1端子中间的插针,地线为J5端子的上测,观察电平值,这时将强磁铁靠近霍尔传感器,观察电压值是否变低了,如果电压值没有足够低,这时把磁铁翻过一面再靠近霍尔传感器,然后再观察霍尔传感器的信号线的电平变化,霍尔传感器的检测结果是否存在极性问题,请同学们在实验室验证。

3)观察实验板原理图,找出单片机的RB0(33号引脚),并用插接线连接霍尔传感器的信号线与单片机的外部中断引脚——RB0。

4)在MPLABIDE环境下利用MPLABICD2把源程序下载到单片机中,步骤如实验一中所叙述,并用磁铁验证该实验。

霍尔传感器在奇数次检测到磁场时如图7-35所示,此时4个灯全亮。

霍尔传感器在奇数次检测到磁场时,此时4个灯全灭。请同学们做完每个实验后将接插线拆除。

5)仔细阅读源代码,并说明源代码实现的功能(完成思考题1)。

6)请同学们试着独立编写程序完成上面要求的功能。

2.光电传感器

要求:用单片机的中断功能记录光电对射管被遮挡的次数,并在四位LED数码管的低两位显示出来。只要求记录99次以下的遮挡次数。

978-7-111-57208-4-Chapter07-41.jpg

图7-35 霍尔传感器实验演示图

步骤:

1)用万用表测量光电传感器的信号线,并观察其电平值,这时用一个纸片挡在发射管与接受管之间,再观察电压值是否变低了,撤离遮挡物以后电平恢复原置值,注意光电传感器的信号线为J1端子右侧第3个插针。

具体操作如图7-36所示。

978-7-111-57208-4-Chapter07-42.jpg

图7-36 传感器操作示意图

2)观察实验板原理图,找出单片机的RB0引脚,然后用插接线连接光电传感器的信号线与单片机的外部中断引脚——RB0,并对照程序与实验板原理图用接插线连接四位LED数码管与单片机,J7端子插针由下向上分别为个、十、百、千,因此J7端子个位插针与单片机RA3(5号引脚)相连,J7端子十位插针与单片机RA2(4号引脚)相连,其他不连,最后运行程序后两位数码管显示出遮挡次数。

3)在MPLAB IDE环境下利用MPLAB ICD2把源程序下载到单片机中,并验证实验。

4)仔细阅读参考源代码并理解每条语句的相关功能(完成思考题2)。

5)独立编写程序完成上述要求的功能。

3.温度传感器

要求:使用温度传感器测定周围环境温度,用摄氏度为单位,并且通过串口通信发送到计算机的串口助手中显示出来,要求波特率为9600bit/s,并且在数码管上显示温度值精确到摄氏度。

步骤:

1)观察温度传感器的外形,这里温度传感器的信号线在J1端子左边第1个插针,同学们在以后的独立开发应用中不要弄错。

2)观察实验板原理图,找出单片机的RA1(3号引脚),用插接线连接温度传感器的信号线与单片机的外部中断引脚——RA1(可以连到其他普通IO口上,本程序以连接到RA1为例),并对照程序用接插线连接四位LED数码管与单片机,J7端子个位与单片机RC1(16号引脚)相连,J7端子十位与单片机RC0(15号引脚)相连。

3)在MPLAB IDE环境下利用MPLAB ICD2把源程序下载到单片机中,并在实验板上验证。

4)仔细阅读温度传感器的源代码,在阅读的过程中,把主要精力放在主函数上,了解温度传感器的操作顺序(命令的发送顺序),各个功能模块函数已经实现,由于同学们的课程时间较紧张,在这里不要求同学们自己编写了,完成思考题3即可。

4.超声波传感器

超声波的发送电路是通过LC振荡实现电压放大的,而在振荡的过程中存在瞬间短路现象,如图7-37所示,当SEND为高电平时,晶体管处于导通状态,这是电源通过电感经过晶体管直接流入地,这个瞬间要求很短,经过一个短暂的瞬态,电感中的电流已经达到了一定的大小,此时SEND变为低电平,晶体管截止,电流不能通过晶体管,但是由于电感的自感效应,会在电容量两端充电,并且电压升到将近30V,如此反复,就在晶体管的集电极形成了振荡的电压,我们给出的SEND端信号为40kHz的方波信号,而在集电极处我们得到了峰-峰值约为30V的振荡电压,我们将这个电压加到超声波的发射探头上就可以发射一定功率的超声波了。

而这种发射电路,就决定了我们绝对不能让SEND端的高电平时间过长,只要不是在发射状态就必须要求SEND端处于低电平状态。

电路示意如图7-37所示。

要求:实现超声波测距,并且在数码管上显示出具体值。

步骤:

1)观察实验板原理图,找出单片机的RB0(33号引脚)与RC2(17号引脚),用接插线将SEND端(JP2端子的下侧插针)与RC2相连(RC2是单片机的PWM输出端),将RECEIVE端(JP2端子的上侧插针)与RB0相连(外部中断)。注意:板子上的SEND和RE- CEIVE写反了。

978-7-111-57208-4-Chapter07-43.jpg

图7-37 超声波传感器振荡电路示意

2)对照程序与实验板原理图用接插线连接四位LED数码管与单片机,J7端子个、十、百、千插针分别与单片机RA3(5号引脚)、RA2(4号引脚)、RA1(3号引脚)、RA0(2号引脚)相连。

3)在MPLAB IDE环境下利用MPLAB ICD2把源程序下载到单片机中,并对照程序与实验板原理图用接插线连接四位LED数码管与单片机。

超声波传感器实验运行结果如图7-38所示。

978-7-111-57208-4-Chapter07-44.jpg

图7-38 传感器实验运行结果

4)用示波器观察发射探头上的波形,认真体会超声波测距的原理。用示波器观察接收端的信号波形,用两路示波器同时观察发送与接收端的波形,体会时差测距的思想。

5)仔细阅读给出的源代码并理解相关语句的功能(完成思考题4)。

1.在霍尔传感器实验中给出的源代码实现的功能是什么?用简洁的语言概括出来。

答:在奇数次中断到来时点亮所有4个LED灯,偶数次中断到来时关闭所有LED灯。

2.设计一个光电对射管的简单应用。谈谈自己的创意

利用光电开关还可以进行产品流水线的产量统计、对装配件是否到位及装配质量进行检测,例如瓶盖是否压上、商标是否漏贴(见图7-39),以及送料机构是否断料(见图7-40)等。

此外,利用光电传感器可以检测布料的有无和宽度。利用遮挡式光电传感器检测布料的下垂度,其结果可用于调整布料在传送中的张力,利用安装在框架上的光电传感器可以发现漏装产品的空箱,比利用油缸将空箱推出。

978-7-111-57208-4-Chapter07-45.jpg

图7-39 瓶子罐装检测示意图

978-7-111-57208-4-Chapter07-46.jpg

图7-40 送料机构检测示意图

3.总结温度传感器的命令发送的顺序?

答:(注:如果命令发送顺序发送不正确,温度传感器不能工作,还有在传输数据的过程中关键部分的延时也是要求很严格的,在应用中如果命令顺序正确而温度值不能读出,大多数情况下都是在数据传输过程中的时间延迟不正确,但是本次试验中的这部分源代码已经给出,要求同学们深刻理解温度传感器的使用方法,做到在以后的应用中会用温度传感器测定环境温度。)

4.在测量距离的过程中,发射探头为什么不能一直都发送超声波,而是采用瞬间发送然后停止发送的方法实现测量距离的功能。

答:超声波传感器在测量较远距离的障碍物是非常有优势的,然而在物体里测量系统非常紧的时候就显得有劣势了。这主要是因为超声波的测距过程是这样的,首先在很短的时间内(0.25ms左右大约发射10个周期的超声波)然后就关闭发射,打开中断等待超声波的发射波。当反射波到来时经过发射电路后,触发单片机的中断,在发射和中断触发这段时间内就是超声波在物体与测距仪间的传播时间,如果我们采用连续发射的方式,在超声波发出并发射回来后,超声波在接收探头处就是连续存在的,这对于单片机来说此种形式的信息里是不存在距离信息的,是不能完成测距的。

1)了解舵机的原理和控制方法。

2)掌握单片机的定时器模块的使用。

3)学会利用定时器来生成PWM波。

PC一台(PC上安装MPLABIDE软件)、在线调试器MPLABICD2、目标电路板、舵机一个。

1.舵机的工作原理

机器人的动力来源都是舵机,嵌入式系统主要控制的对象就是舵机,对舵机必须有一个清楚的认识。舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并具有保持力矩的控制系统。舵机的工作原理是:控制电路板接受来自信号线的控制信号,控制电动机转动,电动机带动一系列齿轮组,减速后传动至输出舵盘。舵机的输出轴和位置反馈电位器是相连的,舵盘转动的同时,带动位置反馈电位器,电位器将输出一个电压信号到控制电路板,进行反馈,然后控制电路板根据所在位置决定电动机的转动方向和速度,从而达到目标停止。

控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电动机驱动芯片,决定电动机的正反转。当电动机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电动机停止转动。舵机内部结构如图7-41所示。

电动机:为舵机提供动力。

减速箱:将电动机的高转速降低,并获得大的转矩。

电位器:为系统提供输出轴的反馈。

电子控制板:用来分析控制信号和反馈位置直接的关系,控制电动机正转、反转还是停机。真正的舵机如图7-42所示。

978-7-111-57208-4-Chapter07-47.jpg

图7-41 舵机内部结构

978-7-111-57208-4-Chapter07-48.jpg

图7-42 真实舵机图片

2.舵机的PWM控制方式

采用的是日本KONDO公司生产的KRS786ICS舵机,这种舵机是专门为双足步行机器人设计的舵机,其具体参数见表7-3。

7-3 KRS786ICS舵机参数

978-7-111-57208-4-Chapter07-49.jpg

舵机的控制信号的特征,如图7-43所示,舵机控制信号为周期从8~20ms可以任意选择的脉宽调制(PWM)信号,脉冲宽度为0.7~2.3ms的范围,对应于-90°~90°的转角范围,如图7-44所示。舵机控制信号的高电平为3~6V,低电平为0~0.8V。

与直流电动机相比较,舵机的控制要简单很多,主要是因为它有一个内置的控制器,于是对嵌入式控制系统的要求就简单很多。只要嵌入式系统获取PC下载给它的数据之后,根据数据值向各个舵机发送周期性脉冲就可以了,只是脉宽不同而已。

978-7-111-57208-4-Chapter07-50.jpg

图7-43 舵机的控制信号

978-7-111-57208-4-Chapter07-51.jpg

图7-44 舵机的角度和脉冲宽度之间的关系图

今后为了运算和使用方便,把舵机的-90°规定为0°,把舵机的90°规定为180°,相当于把参考坐标系向左移动了90°,即如图7-45所示的本系统中使用的舵机角度和脉冲宽度之间的关系图,并且将舵机的控制信号定为周期是20ms的脉宽调制信号,其中脉冲宽度从0.5~2.5ms,相对应舵盘的位置为0~180°,呈线性变化。也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。

3.利用PIC(PIC16F877A)单片机定时器1生成PWM控制信号

PIC单片机有Timer0、Timer1、Timer2三个定时器,双足步行机器人用Timer0做看门狗,以防止程序跑飞;用Timer1来定时比较,生成24路PWM波。下面就介绍一下Timer1(Timer0和Timer2在一些用法方面和Timer1相似)。

Timer1模块是由两个可读写的8位寄存器(TMR1H和TMR1L)组成的16位定时器/计数器。TMR1寄存器(TMR1H:TMR1L)从0000h开始加1记数,一直加到FFFFh后,再加1又循环回到0000h。如果允许Timer1中断,则定时器溢出的时候中断标志位TMR1IF置位,而产生Timer1中断。中断的使能/禁止可以通过置位/清除TMR1IE中断使能位来设置。

T1CON:Timer1控制寄存器,用来控制Timer1的工作模式,其数据位定义如图7-46所示。

978-7-111-57208-4-Chapter07-52.jpg

图7-45 实用的舵机角度和脉冲宽度之间的关系图

978-7-111-57208-4-Chapter07-53.jpg

图7-46 Timer1控制寄存器T1CON的数据位定义

bit7∶6未定义,始终读为“0”。

bit5∶4

T1CKPS1:T1CKPS0:Timer1输入时钟预分频选择

11=1∶8预分频值;

10=1∶4预分频值;

01=1∶2预分频值;

00=1∶1预分频值。

bit3

T1OSCEN:Timer1内部振荡器使能位。

当T1OSCEN=1时:打开内部振荡器,反相放大器工作,需外接晶体产生振荡时钟。

当T1OSCEN=0时:振荡器被关闭。振荡器的反相器和反馈电阻被关。

bit2

T1SYNC:Timer1外部时钟输入同步控制位。

当TMR1CS=1时:不同步外部时钟。

当TMR1CS=0时:同步外部时钟。TMR1CS=0时Timer1使用内部时钟。

bit1

TMR1CS:Timer1时钟源选择位。

当TMR1CS=1时:选择T1OSO/T1CKI引脚的外部时钟(上升沿计)。

当TMR1CS=0时:选择内部时钟(FOSC/4)。

bit0

TMR1ON:Timer1使能位

当TMR1ON=1时:使能Timer1。

当TMR1ON=1时:关闭Timer1。

双足步行机器人用到的是Timer1的定时功能,将TMR1CS(T1CON控制寄存器bit1)清0,选择TMR1工作在定时器模式。在这种模式下,定时器的输入时钟是内部时钟频率的4分频(fOSC/4)。因为内部时钟总是同步的,所以同步控制位T1SYNC(T1CON控制寄存器bit2)此时不起作用。

初始化

978-7-111-57208-4-Chapter07-54.jpg

由于我们使用的舵机控制波形为高电平延时在0.5~2.5ms的方波,我们可以通过Tim- er1定时,比如我们要让某一引脚(如RD1)输出高电平延时为1.5ms,周期为20ms的方波,我们可以这样做:

①RD1=高电平;

②延时1.5ms;

③RD1=低电平;

④延时18.5ms;

⑤重复Ⅰ—Ⅳ。

所以我们只需要再写一个延时函数即可,代码如下:

978-7-111-57208-4-Chapter07-55.jpg

很显然,我们只要知道延时1.5ms,单片机需要运行多少条指令就行了。下面就来详细计算一下:

PIC单片机晶振为20MHz,定时器的输入时钟是内部时钟频率的4分频(fOSC/4),也就是说,一条指令需要(4/fOSC)s=4/20MHz=0.2μs,定时1.5ms就需要执行1.5ms/0.2μs=7500条指令,所以定时器每次重装的计数初值为0xffff-7500,即TMR1=0xffff-7500,从而得出:

TMR1H=(0xffff-7500)/256=HIGH;

TMR1L=(0xffff-7500)%256=LOW;

在程序中:

TIME_CONST_uS_H(x)((0xffff-((x)∗(FOSC/4/1000000)))/256)

TIME_CONST_uS_L(x)((0xffff-((x)∗(FOSC/4/1000000)))%256)来表示x微秒的时间常数。

这样,Delay(TIME_CONST_uS_H(Angle)、TIME_CONST_uS_L(Angle))就表示延时Angle微秒了。

我们要生成连续的周期为20ms、高电平延在0.5~2.5ms的方波来控制舵机就很容易了(因为高电平延在0.5~2.5ms,所以低电平延在17.5~19.5ms),代码如下:

978-7-111-57208-4-Chapter07-56.jpg

978-7-111-57208-4-Chapter07-57.jpg

注意控制舵机必须是连续的方波,一个周期的方波是不行的,所以连续调用PWM()就可以了。

1.运行MPLAB IDE

要启动IDE,安装后双击桌面上的图标。

2.创建项目

具体步骤如下:

1)选择Project→Project Wizard,单击下一步,选择器件PIC16F877A,单击下一步。

2)选择语言工具:在Active Toolsuite框中选HI-TECH PICC Toolsuite,单击下一步。

3)输入工程名和工程所在的路径,单击下一步;这里我们设工程名为frist,存在路径d:\first\下。

4)如果所建工程路径下已经有了写好的C文件,可以直接添加到工程中,若没有,直接单击下一步。

5)单击完成,项目工程建立完成。

3.编写程序

具体步骤如下:

1)单击File→New新建一个文件,编写程序代码,完整代码如下(注意RD1引脚要设为输出):

978-7-111-57208-4-Chapter07-58.jpg

978-7-111-57208-4-Chapter07-59.jpg

978-7-111-57208-4-Chapter07-60.jpg

978-7-111-57208-4-Chapter07-61.jpg

我们通过改变PWM函数的参数在500~2500之间变动就可以实现舵机转角变化了,可以在程序中设置一个i,每20ms加一,到一定时间程序自己改变函数的参数就行了。实现舵机转速的变化也是这个道理,只是改变的时间长短的不同。

2)保存这个文件到d:\first\文件下,文件名为first.c。

3)添加first.c到工程中去,右键单击sourcefiles,选择“addfiles”,找到fisrt.c,加进去即可。

4)保存工程,单击File→Save Workspace。

4.连接MPLABICD2

具体步骤如实验一所示。

5.调试程序

设置芯片的配置字、编译程序和下载程序等如实验一所示,下载完程序之后,将ICD2和目标演示板断开,将舵机连到RD1插口,我们就会看到舵机的舵盘转动起来,先转90°,再转90°,然后再回转180°,用示波器看一下输出的波形对不对。

1.舵机是如何控制的,和普通直流电动机有什么不同?

答:通过周期在20ms左右,高电平在一定范围的PWM波来控制,不同舵机高电平范围不同,具体看舵机参数。直流电动机也可以通过PWM来控制,所不同的是,直流电动机PWM是用来调速的,而舵机则是调位置的,事实上舵机内部也是个小直流,不过在舵机内部还有个用来反馈电路板,通过PWM来调整所要转的角度。

2.简述利用Timer1生成PWM的过程?

答:TIMER1就是用来定时,先将某引脚置高(低),定时一段时间后再将该引脚置低(高),再定时一段时间将该引脚置高(低),如此反复即可。

3.Timer1最多能定时多长时间?

答:这需要根据外围晶振的频率来定,我们知道单片机一条指令耗时:(4/fosc)s。Tim-er1是一个16位定时器,所以能从0加到65535,也就是说最多能加65536个指令,当从0加到65535时也就定时了65536∗(4/fosc)s,这也是最大值。比如我们的晶振是20MHz的,所以最多能延时13.1072ms,所以要注意程序中(TIMECONSTuSH(x),TIMECONST uSL(x))的x是有限制的,X≤13107。

1)认识双足步行机器人的自由度。

2)掌握双足步行机器人机械结构。

3)熟悉舵机初始角度和初始姿态对安装机器人的影响。

4)学会组装双足步行机器人。

机器人组装件一套、舵机17台、机器人控制器一个、若干螺钉。

1.关于机器人自由度的说明

自由度从广义上来说就是在某一方向上能够旋转或移动。它是机器人性能中一个重要的参数,和舵机联系在一起,一般来说,有多少个舵机就有多少个自由度。在设计机器人的机械结构时,要考虑到机器人的仿人特点。在每个关节处都要设立自由度,那样才能完成类似人的动作。比如设计机器人腿,至少要有5个自由度,分别是髋关节上的两个自由度、膝关节上的一个自由度、还有踝关节上的两个自由度,这样就可以完成类似人的前进、后退、抬腿、俯身等动作,如图7-47所示。

978-7-111-57208-4-Chapter07-62.jpg

图7-47 机器人自由度说明

2.机器人机械结构配件

图7-48所示的机器人,是将17台舵机以搭积木的方式搭成人形的。机体大部分是由舵机组成的,各个舵机之间是由一些钣金件连接而成。为了保证舵机之间能够有效地连接,同时17个舵机要组装成一个人形,需要有合理的机械配件。图7-49所示的就是机器人所需的配件。

实验(一) 机器人组装

1)用螺钉将安装的配件按图7-50的方式组装在一起,注意有的配件有许多小孔,在组装时,必须按图7-50的方式组装,否则机器人的整体外形将会有变化,不利于原有程序操纵。

978-7-111-57208-4-Chapter07-63.jpg

图7-48 机器人平台

978-7-111-57208-4-Chapter07-64.jpg

图7-49 所需配件

978-7-111-57208-4-Chapter07-65.jpg

图7-50 组装方式示意图

2)用M2×33mm螺钉将配件和舵机组装在一起,如图7-51所示。注意在安装脚部舵机时,首先将舵机的外壳放到里面,然后将舵机的数据线从配件的侧面方孔穿过。这样安装才能不损坏数据线和舵机外壳。

978-7-111-57208-4-Chapter07-66.jpg

图7-51 配件舵机组装示意

3)组装机器人的两个上肢,每个上肢由两个舵机组成,具有2个自由度。安装前将舵机初始的角度设定在90°,这样有利于舵机有摆动的余地。因为此舵机最大动作角度是180°,当把安装角度设在90°时,与配件相配合不会发生运动干涉,可以顺利地完成一些指定的动作,如图7-52所示。

978-7-111-57208-4-Chapter07-67.jpg

图7-52 机器人上肢

978-7-111-57208-4-Chapter07-68.jpg

图7-53 机器人下肢

4)组装机器人的两个下肢,每个下肢由4个舵机组成,具有4个自由度。安装前还是将舵机初始的角度设定在90°,另外注意在安装时,大腿的内侧有配件固定如图7-53所示。

5)组装机器人躯干,由4个舵机组成,具有4个自由度,控制胳膊前后旋转和大腿左右摆动。安装前还是将舵机初始的角度设定在90°,许多配件是由螺钉固定,为了美观和拆卸方便,螺母均放在里面。在安装时,先从一面开始安装,这样有利于紧固螺钉。此处由于受到空间的限制,操作比较困难,那么在安装时一定要注意每个螺钉必须紧固牢靠,防止松懈,如图7-54所示。

6)安装机器人控制器和机器头,此处安装比较容易。先将上肢两个舵机和机器头舵机的数据线放在控制器板的下面,这样有利于整体布置数据线。然后用3个螺钉将控制器固定在板件上。

7)组装成一个整体,分别将上肢和下肢与躯干连接在一起。注意在安装时,大腿是处于并拢状态,胳膊处于伸直状态,如图7-55所示。

978-7-111-57208-4-Chapter07-69.jpg

图7-54 机器人躯干部

978-7-111-57208-4-Chapter07-70.jpg

图7-55 整体组装图

按照以上步骤就会完成机器人机械机构的组装。在组装前,首先要有整体的布局,然后再分步组装。相信通过以上的图片和文字,你一定会成功组装成一个具有17个自由度的双足步行机器人。

实验(二) 舵机初始位置的角度和姿态对调试动作的影响

1)为了表现机器人拟人特性,当通电以后要让机器人处于立正状态也称作初始位置(Homeposition)。初始位置是机器人类似于人类,在重力的作用下,正处于能量最低的消耗状态。在每个机器人组装完毕后,首先调试出的就是初始位置状态。图7-56和图7-57分别是机器人处于初始位置的正面和侧面图。

978-7-111-57208-4-Chapter07-71.jpg

图7-56 机器人正面图

978-7-111-57208-4-Chapter07-72.jpg

图7-57 机器人侧面图

2)舵机的初始角度是在安装时各个舵机所处的角度。一般的情况下,我们都将舵机调节为90°,这样便于安装。安装时,大家可能有这样的体会:不让胳膊处于伸直状态,让它处于垂下状态和躯干上的舵机连接。如果这样就会发现,刚安装的胳膊不能够举过头部,需要重新安装。因为刚才安装的两个舵机发生了运动干涉,各个舵机具有耦合关系,虽然两个舵机均处于90°的状态,但是安装以后两个舵机的活动空间发生了变化。读者可以按照舵机的不同初始角度值来组装机器人,看看产生何种结果?

3)机器人的初始姿态是指将各个舵机连接在一起时机器人所处的姿态。在将胳膊和大腿与躯干连接时,舵机的初始角度都调到90°,但是没有按照图7-55的姿态安装,可能就会产生某一个舵机活动干涉,不能够完成类人动作。读者可以按照不同的姿态安装机器人看看产生何种结果。

1.说一说本实验17个自由度机器人的自由度分别用于控制哪个方向的?

答:

(1)上肢有6个自由度,分别是肩部两个自由度和肘部一个自由度。肩部两个自由度分别控制胳膊前后旋转和上下摆动,肘部一个自由度控制上下摆动。左右肢对称共6个自由度。

(2)下肢共有10个自由度,分别是脚部两个自由度、膝关节一个自由度、髋关节两个自由度。脚部两个自由度分别控制脚前后和左右的摆动,膝关节一个自由度控制小腿前后摆动,髋关节两个自由度分别控制大腿前后和左右摆动。左右肢对称,共10个自由度。

(3)头部一个自由度控制头部的左右旋转。

2.说出Homeposition值和初始角度值的区别?

答:Homeposition值是指当机器人通电以后,要让机器人处于立正状态时,17个舵机的角度值。它是在每个机器人组装完毕后,首先调试出的,然后才能将机器人用于实践操作。

初始角度值是在组装机器人时,为了使17个舵机运动不发生干涉而且具有良好操纵性,将17个舵机的角度值分别调到90°,就是初始角度值。它是在机器人组装时,各个舵机和连接件之间的相对角度。

3.请说出舵机的初始角度为90°和机器人的初始姿态如图7-55所示是不是安装机器人唯一方法?为什么?

答:舵机的初始角度为90°和机器人的初始姿态如图7-55不是安装机器人唯一方法。因为舵机和连接件之间的相对角度可以是任意值,不一定是90°,但是为了容易看到两者之间的角度,也就是垂直或平行关系,一般将舵机在安装时调到90°。

1)掌握双足步行机器人上位机控制软件的操作。

2)熟悉双足步行机器人上位机软件如何控制舵机的转动。

3)学会机器人初始位置Homeposition的调试。

4)学习使用上位机控制软件,完成简单动作——招手的调试,体会速度控制方式不同对动作的影响。

PC一台(装有VC程序,双足步行机器人上位机控制软件)、无线收发装置(包含无线收发盒、串口通信线和USB数据线)一套、类人双足步行机器人一台,7.4V充电电池一块、电池充电设备(包含12V/1A稳压直流电源和平衡充电器)一套。

关于Homeposition的说明:

Homeposition,是机器人良好站立、腿部各舵机受力均匀时的姿态名称。每一个动作数据的开始和最后都是使用的这个姿态。机器人在安装完毕之后,应首先调试出Homeposi- tion。图7-58和图7-59分别是机器人处于Homeposition的正面和侧面图。

978-7-111-57208-4-Chapter07-73.jpg

图7-58 Homeposition正面图

978-7-111-57208-4-Chapter07-74.jpg

图7-59 Homeposition侧面图

因为每一个动作数据的开始和最后都是使用Homeposition这个姿态,它的调试至关重要,调试过程要遵循以下原则:

机器人良好直立、腿部各舵机受力均匀,如图7-59所示肩关节、髋关节、膝关节、踝关节四个舵机侧面的舵盘在同一个直线上,两条腿调试结束后各对应舵机在同一平面上。实验步骤的实验(一)中具体介绍如何调试Homeposition。

978-7-111-57208-4-Chapter07-75.jpg

图7-60 无线发射装置

1)检查机器人电池电量是否充足,用万用表测量电池放电接头两端电压,若小于6V,则需要更换电池,并对原有电池充电。

2)检查机器人各舵机连线,确保完好无损,若发现有连线断接,或者刮破外绝缘皮等现象,则要先进行简单处理,如重新接线、贴绝缘胶布等措施。

3)检查舵机连接件是否变形,若有变形,则需更换该部件。

4)机器人检查完好之后,确保一切正常才可开电,否则后果自负。

5)如图7-60和图7-61所示连接无线收发装置,它共有两条连接线,一端按照图示方式连接,另外一端分别接计算机的串口1和USB接口,连接好之后则指示灯亮,打开上位机软件,界面如图7-62所示,如图7-63所示单击菜单栏“设定串口参数”,弹出如图7-64所示界面,按照图示进行设置,单击“OK”,退出软件并重新启动。启动软件后,用鼠标拖动动作数据滑块中的任意一个,则该装置的指示灯将会如图7-65所示不停闪烁,说明反应连接无误,运行良好。否则,检查连线并重新连接,直到正常为止。

978-7-111-57208-4-Chapter07-76.jpg

图7-61 无线发射装置连接方法

978-7-111-57208-4-Chapter07-77.jpg

图7-62 上位机软件界面

978-7-111-57208-4-Chapter07-78.jpg

图7-63 菜单栏示意图

978-7-111-57208-4-Chapter07-79.jpg

图7-64 串口设置对话框

978-7-111-57208-4-Chapter07-80.jpg

图7-65 无线发射装置正常运行

实验(一) 调试并存储Homeposition

1)如图7-66所示将机器人背部面板上两个小开关同时拨到图示位置,使机器人处于无

978-7-111-57208-4-Chapter07-81.jpg

图7-66 机器人控制电路板

线控制(或同时拨到相反位置并将主机的串口线接到电路板上采取有线方式调节),在此采用无线方式,打开机器人电源,控制板上三个指示灯均亮。

2)清楚掌握各舵机转动角度增大和减小时机器人的动作变化,来填写表7-4,只有掌握这个表,才能自如地通过上位机控制软件来调节机器人的动作。注意我们都以从背面来观察机器人的角度来得到下面各个舵机在度数变化时的转动方向。填写之后通过上位机程序上的滚动条来验证结果。

注意:在表7-4中的第1个与第5个舵机的栏中填入方向为“前后”,第2、3、6、7个舵机的栏中填入方向为“内外”,第4个与第8、13个舵机的栏中填入方向为“左右”,第9、10、11、14、15、16个舵机的栏中填入的方向为“前后”,第12个与第17个舵机的栏中填入“顺逆时针转动”。请同学们认真填写,之后通过上位机程序上的滚动条来验证结果。

7-4 各舵机度数变化的转动方向(从背面看各舵机变化情况)

978-7-111-57208-4-Chapter07-82.jpg

978-7-111-57208-4-Chapter07-83.jpg

图7-67 从机器人背面观察的舵机标号

3)根据图7-67的机器人舵机对应图,通过上位机控制软件的滑块来调节舵机的度数(图7-67中机器人各舵机编号与图7-68动作数据滑块一一对应,例如1号对应与CH1,依次类比下去),调试出机器人初始位置Homeposition。

调试机器人初始位置的方法:

①机器人电路板初次打开电源,各舵机处于保持状态,因此打开电源之前可先手动调整各舵机位置让其有较大的活动范围,避免上电之后调整初始位置时发生堵转。

②读取参考初始位置文件(后缀名为.hos),并设置为现有机器人的初始位置,此时机器人有了粗略的初始位置,由于机器人机械结构的差异,需要对其进行微调。

③调整髋关节左右方向移动的舵机(8号和13号),使得两条腿平行且为竖直方向,同时注意两条腿中间有5mm左右的间隙,避免在做动作时出现摩擦。

978-7-111-57208-4-Chapter07-84.jpg

图7-68 动作数据滑块

④调整踝关节前后转动的舵机(11号和16号),使其与脚底板垂直,接着调整膝关节舵机(10号和15号),使其与踝关节舵机两舵盘连线与脚底板垂直,依次向上调整膝关节和髋关机前后方向转动的舵机(9号和14号),最终使得以上3个舵机,再加上肩部舵机(1号和5号),总共4个舵机的舵盘在一条直线上,并且确保与脚底板垂直。

⑤调整肘关节舵机(3号和7号),使手臂伸直成一条直线,调节肩关节两对舵机(1号和2号、5号和6号)使手臂为竖直方向下垂,调整头部舵机,使其处于正视位置并能左右各摆动90°。

4)最后,观察整个机器人成立正姿势,既不前俯也不后仰,平稳站立,手臂下垂,左右对称,则机器人初始位置调试成功。

5)如图7-69所示,单击“设定初始位置—设定机器人的初始位置”,将机器人的初始位置设定成刚刚调试完成的Homeposition。

978-7-111-57208-4-Chapter07-85.jpg

图7-69 菜单栏中的设定初始位置项

6)单击“设定初始位置—保存初始位置数据”,设置好文件名,后缀为“.Hos”。

实验(二) 设计机器人“招手”动作

1)单击“添加”按钮,将Homeposition数据放置在数据列表框中,作为将要调试的招手动作的开始。

2)先调试手臂抬起动作,拖动动作数据滑块中的CH1(对应于机器人的1号舵机),使机器人手臂上抬,与竖直方向成30°夹角,达到如图7-70所示的招手的动作一,然后单击“添加”按钮,这时数据将自动添加到数据列表框中,位置位于第2行,第1行为Homeposi-tion。

3)再调试招手动作,拖动动作数据滑块中的CH3,使机器人前臂向内弯曲成120°,达到如图7-71所示为招手的动作二,然后再单击“添加”按钮,这时这一行的数据应该再添加到第3行,于是已经完成了3行动作数据的调试。

4)由于招手这个动作是周期重复的,可以将招手动作一与招手动作二作为一个组合,进行周期性的重复,例如双击数据列表框的第2行,然后单击“添加”则生成第4行动作,双击第3行,然后添加为第5行,依次周期性的重复第2行和第3行动作。

5)重复多次之后,即可做出最后一行的数据,调试机器人的动作有这样一条规则:“任何动作的第1行和最后一行都要是Homeposition”。因此最后需要做的就是把Homeposi- tion的数据添加到最后一行。双击数据列表框的第一组Homeposition数据,这样该行的数据都显示在动作数据滑块上,然后单击“添加”按钮,将Homeposition添加到列表框的最后一行,作为招手动作的最后一组动作。

6)动作调试完毕后,就要给机器人发送数据了。如图7-72所示对操作界面中的“组号”进行配置,默认为0,如果不是一套动作要更改组号,以免覆盖已有动作数据。接着如图7-73所示单击下端的“发送”按钮,将已调试好的招手动作发送至下位机,出现对话框后单击“确定”,之后单击“运行”按钮(同样在单击之前也要选择相应的组号),机器人将完成招手动作。

978-7-111-57208-4-Chapter07-86.jpg

图7-70 招手动作一

978-7-111-57208-4-Chapter07-87.jpg

图7-71 招手动作二

978-7-111-57208-4-Chapter07-88.jpg

图7-72 组号配置图示

978-7-111-57208-4-Chapter07-89.jpg

图7-73 发送数据图示

7)修改动作的速度,例如将速度改为6或者7(默认为4),按上述步骤重新调试一遍招手动作,观察不同速度对机器人动作的影响。

实验(三) 设计机器人“蹲下扩胸”动作

1)单击“添加”按钮,将Homeposition数据放置在数据列表框中,作为将要调试的蹲下扩胸动作的开始。

2)先调试机器人下蹲动作。手持机器人腰部,拖动动作数据滑块中的CH11和CH16(对应机器人踝关节11号和16号两舵机),使两脚平面平行,且使双腿与两脚平面成45°夹角;再拖动CH15和CH10,使膝关节15号和10号两舵机与脚平面垂直;进一步拖动CH14和CH9,使本来向后倾斜的上半身挺直,也就是与脚平面垂直。到此整个蹲下动作完成,单击“添加”,成为第2行数据。在此应注意重心问题,若太前倾则机器人会倒下;若后仰则机器人就不美观。

3)接着调试机器人扩胸动作,该动作只用改变了胳膊的舵机转动角度,而下半身仍保持原有姿态。拖动CH1和CH5,使双臂向前平举,接着拖动CH3和CH7,使前臂向内弯曲,两个肘关节成120°,到此扩胸动作第1步完成,添加为第3行动作。

4)第4行的动作是扩胸的第2步,拖动CH2和CH6,使上臂与肩成120°夹角,添加为第4行动作。

5)第5行的动作是扩胸的第3步,即拖动CH2、CH3、CH6、CH7,将双臂打开成水平一线,添加为第5行动作,而腿部舵机转动角度没有改变。到此整个扩胸动作完成。

6)从第6行开始,各行都作是对第3、4、5行扩胸动作的周期重复。例如,双击数据列表框中的第3行,单击“添加”,生成第6行动作,然后双击第4行同理添加为第7行,双击第五行添加为第8行。类似多次重复,生成第9、10、11行等。

7)当做完扩胸运动之后,机器人放下双臂,腿仍然保持蹲下的姿势,这与第2行的下蹲动作相同,双击数据列表框的第2行,单击“添加”按钮,生成新的一行动作。

8)最后一行仍然是Homeposition,双击第1行,单击“添加”按钮,生成最后一行,这样所有的动作都完成了。

9)为了检验动作的好坏,需要先进行单步检验,首先机器人上电,连接好串口,将刚才得到的蹲下扩胸的数据,从头到尾,双击每一行,每当双击该行时,机器人就会实时地做出相应的动作。

10)当单步检验都通过时,我们再将整个动作完整地发送到下位机。方法与实验二招手动作中图7-74相同。

978-7-111-57208-4-Chapter07-90.jpg

图 7-74

1.请列出用上位机控制软件的滚动条进行简单动作调试的优缺点。

答:当用上位机控制软件的滚动条进行简单动作调试时,

优点:调试方法简单易行,不需要具有复杂的技术和编程知识,也可对机器人进行动作操作,适用于各个年龄段的用户。在机器人已有动作的前提下,可采用临摹法,一步一步调出,使得新的机器人也具有同样的动作,简单方便。

缺点:效率不高,所有的动作数据要逐行写入。精确度不够,因为这种方法大部分是通过观察体会,难免会受到主观因素和环境因素的限制,导致动作不够规范。特别是如:“行走”“上楼梯”等精确度要求很高的动作,用该方法实现难度较大。

2.我们有1~7共七个速度,哪个速度舵机速度是最快的?具体调试动作时,根据什么选取合适的速度位?

答:我们有1~7共七个速度,7号速度是速度最快的。反之,1号速度是速度最慢的。那么,4号速度是我们默认的普通速度。

具体调试动作时,要根据具体动作的情况来决定速度的大小。如果编写的动作是普通动作,对稳定性要求不高时可以选择4号普通速度,或5号及6号的高速度,这样机器人的动作速度加快,增加了机器人动作的美感。对稳定性要求很好时,可以选择2号或1号低速度,来保证动作的顺利进行。总而言之,视具体动作的具体要求,选择合适的速度。

3.上位机控制软件中“添加”和“插入”按钮的作用有何区别?

答:如图7-74所示,添加按钮的作用是将滚动条当前显示的数据,添加到列表框的最后一行,若再添加,就会添加到刚才的那行的下一行,简而言之,添加按钮永远将数据加到最后一行。插入按钮的作用是将滚动条当前显示的数据,插入到列表框光标所停的那一行的前一行,数据列表框光标所停的那一行可以通过单击鼠标左键来选择,注意不要用鼠标双击,如果双击的话,动作数据滑块的就会同步更新为数据列表框中选中的哪一行的数据,如果正在保持良好通信时,则会执行该行动作。

4.为什么在调动作时,要先保证单步运行顺利,再将数据发送到下位机,进行整体运行。如果跳过单步运行,直接整体发送和运行,会有什么后果?

答:如果跳过单步运行,当然可以直接整体发送和运行。但是带来的结果都不是我们所预料的那样,由于对于动作本身,一个连续的动作都是由各个静态的动作组成,如果单步的某个动作不是很稳定,试问整体动作一起运行怎么会成功呢。

所以我们规定在调动作时,除一些极其简单动作之外,都要先保证单步运行顺利,再将数据发送到下位机,进行整体的数据运行。这样才能保证动作的稳定,但这样也不是充分的,还要看连贯的动作是否顺利进行。这里要指出的是:“一般来讲,单步运行不稳定,连续整体运行一定不稳定;但单步运行稳定,连续整体运行也不一定稳定。”因为这里涉及单步动作衔接的问题,就好比两个没有关联的动作,每个都通过了单步运行,但整体运行一定不成功,因为它们没有衔接。所以在单步运行之后,还要考虑动作衔接的问题,这样才能保证我们所调试出的动作在整体运行时达到万无一失的效果。

1)进一步熟悉上位机软件对类人双足步行机器人的控制。

2)掌握机器人的动作数据得来的方法以及镜像法的思想。

3)巩固学生C++编程的能力。

PC一台(装有VC程序,双足步行机器人上位机控制软件,机器人动作数据文件),无线通信模块/串口通信线,类人双足步行机器人一台,电源(7.4V锂电池),电池充电设备一套。

当我们在编排机器人动作的时候,经常会发现一些动作是和前面所做过的动作有对称的关系,比如:当我们编排机器人上楼梯的动作,如果在我们已经成功地完成机器人用右脚踏上楼梯的第一个台阶的基础上,我们就可以用镜像法来精巧地得到对称的动作数据。由于下一个动作肯定是要让机器人在右脚的支撑下,伸出左脚踏上第二个台阶,这样的动作就是完全地与前面一个动作相对称,我们就可以利用镜像法,计算并调试出动作数据。

下面介绍一下镜像法:

对于两个动作,如果左右完全对称(第一个动作左边的形态与第二个动作右边的形态完全对称,第二个动作就好像是第一个动作在镜子中的镜像,故称此法为镜像法),则只需先调通一个动作即可。对于另一个动作,利用镜像法就可调出。这里需要注意的是前后动作是否对称,都是以Homeposition的动作作为参照。

当了解到镜像法的原理之后,我们所要做的就是找出左右舵机的对应关系,这在我们上次的舵机调试的实验课上已经得到了,这里我们就可以直接运用。

当然,即使我们了解了舵机的镜像对应关系,也知道如何改前面的动作数据成为新的动作数据,但如果在动作特别复杂,数据特别长的条件下,我们的工作量难免就要大很多,为了提高效率,我们可以考虑编写一个简单的C++程序,来实现对新的动作数据的计算。

最后将我们所得到的镜像的动作数据存放起来,并用双足步行机器人上位机控制软件来发送这些数据,机器人顺利完成动作,方可达到要求。

本实验是利用VC软件平台,编写镜像法程序,在给出机器人招左手的第一个动作的前提下,通过镜像法完成机器人招右手的第二个动作。

1)首先在实验前要清楚哪两个号的舵机互相对称,这是要做镜像法的前提。

2)清楚掌握各舵机转动角度增大和减小时机器人的动作变化,这里由于我们在上次的舵机调试的实验课里已经得到了结果,见表7-5。同时注意都以背面观察机器人来得到相应各个舵机的转动方向(从背面看各舵机变化情况)。

7-5 各舵机镜像对应关系表

978-7-111-57208-4-Chapter07-91.jpg

3)清楚掌握舵机的镜像对应关系与舵机的转动方向之后,我们就可以掌握当机器人做左右对称动作时,各个对应的舵机所转的角度的关系,从而可以为写镜像法程序打好基础。通过表7-4与表7-5可以了解到,当机器人抬左手时,某号舵机转动了一个角度;然后机器人复位,之后再抬右手且姿势刚好与左手所抬的高度一样时,镜像对应的舵机转动了相同的角度,只是存在正负号的问题。请同学们将所有两两对应的舵机都通过上位机控制机器人,来得到镜像对应的舵机转动角度正负号的关系,然后填入表7-6,因为如果弄错一个正负号的话,结果就大相径庭了(在表中填入舵机转动角度的正负号,其中,正号表示舵机角度增大,负号表示舵机角度减小)。

7-6 左右对称动作时各镜像舵机转角度正负号对应关系表

978-7-111-57208-4-Chapter07-92.jpg

4)这样我们的准备工作大致就完成了。一套完整的镜像动作以Homeposition开始,此时舵机的转动角度为H;最终达到的动作状态所对应的舵机转动角度为A;中间过渡过程中每一个动作状态所对应的舵机转动角度为R。请同学们将三者的关系填入机器人动作时的度数公式:

____+____=____(7-1)

5)由公式(7-1)来推导公式(7-2)。公式(7-2)已知机器人实际动作以后,最终达到的原像舵机转动角度A1(8个舵机的度数)与开始动作时原像舵机的Homeposition转动角度H1(8个舵机的度数),机器人做对称动作后的镜像对应舵机的转动角度A2(另外8个舵机的度数)与开始动作时镜像舵机的Homeposition转动角度H2(另外8个舵机的度数)四者的关系,请同学们将四者的关系填入机器人动作对称时前后度数之间的对应关系式:

____-____=____-____(7-2)

之后我们就得到重要的式(7-2)的推论,机器人动作对称时舵机转动角度之间的镜像关系式:

A2=____+____-____(7-3)

6)下面我们开始利用VC软件平台来编写镜像法函数。主要思想就是在已经给定的动作数据的条件下,利用公式(7-3)计算出对称的动作数据。这个计算通过编写函数来实现,避免每行数据用手算的工作量,达到提高效率的作用。我们在这里要求同学利用C++函数,直接在VC里生成C++源文件,而无须利用MFC。如图7-75所示。

978-7-111-57208-4-Chapter07-93.jpg

图7-75 创建C++源文件界面

7)直接生成C++文件,其中文件名随意起,之后在源文件中进行C++编程,主要是利用函数实现动作数据的计算。这里不用子函数,只利用main函数实现其功能就可以。由于我们利用C++的输入输出流,所以要加入<iostream.h>头文件。如图7-76所示。

在编写镜像法程序前,首先我们要填写两个表。打开上位机软件,在给定的机器人动作数据文件中调出该台机器人的初始位置。将机器人在初始位置时各舵机的转动角度值填入表7-7和表7-8。

978-7-111-57208-4-Chapter07-94.jpg

图7-76 操作界面

7-7 机器人初始位置时各舵机的角度值

978-7-111-57208-4-Chapter07-95.jpg

7-8 机器人初始位置时各舵机的角度值

978-7-111-57208-4-Chapter07-96.jpg

镜像法函数

978-7-111-57208-4-Chapter07-97.jpg

978-7-111-57208-4-Chapter07-98.jpg

978-7-111-57208-4-Chapter07-99.jpg

程序备注:

H1[i]代表H1的第i号舵机的转动角度;H2[j]代表H2的第j号舵机的转动角度。

上面所列的函数需运行两次才能得到对称动作的完整数据。例如:运行第一次时先利用对称动作前的1、2、3、8、9、10、11、12号舵机度数来算出对称动作后的5、6、7、13、14、15、16、17号舵机度数,再运行一次利用对称动作前的5、6、7、13、14、15、16、17号舵机度数算出对称动作后的1、2、3、8、9、10、11、12号舵机度数。

8)在main函数里编写对称动作数据转化的角度计算,其中函数的重要部分就是利用式(7-3)的推论。在这里,我们已经给同学们一些已经存在的动作数据,这个数据是机器人招手的动作,但只是其中左手招手的动作,这里要求同学们利用函数得到右手招手的动作。若函数编写成功,我们立即将编写好的VC源代码直接生成出相应的工程,然后应该出现图7-77所示的界面。

978-7-111-57208-4-Chapter07-100.jpg

图7-77 原像及镜像舵机角度转换界面

9)在上位机软件中调出机器人左手招手动作,并在动作数据列表框当中显示出。把数据列表中的第2行ch1、ch2、ch3、ch8、ch9、ch10、ch11、ch128个舵机的数据,在图7-77所示界面“请输入各舵机起始度数:”部分中,填入原像舵机的起始度数,然后按回车,运行程序。其中,图7-78实例中的“1/5”代表这个初始位置既可以先规定为1号舵机的度数,也可以规定为5号舵机的度数,因此我们规定在界面中“请输入各舵机起始度数:”的部分,在“/”前面的数字为要输入起始角度的舵机号,对其输入角度值即可,直到全部8台原像舵机起始角度都输入完,才可输出结果,如图7-78界面中的“经换算后各舵机角度为:”部分。在此部分中“/”前面的数字号表示镜像舵机的转动角度值。直到全部8台镜像舵机的角度值都输出显示为止。之后再运行一次程序,在界面中“请输入各舵机起始度数”的部分,输入“/”后面的数字号的舵机转动角度,对应地在界面中的“经换算后各舵机角度为:”部分,输出的结果也是对应“/”后面的数字号的舵机应当转动的角度。在此,由于动作2的数据另外8行都是保持在初始位置没动,因此就不用再通过镜像函数来计算了,因为即使计算了,得到的8行镜像数据组(由前八行的原像舵机角度计算出来后8行的镜像舵机角度,就称之为镜像数据组)也还都是初始位置。

978-7-111-57208-4-Chapter07-101.jpg

图7-78 数据计算后显示的界面

10)如图7-78所示,由前8行的原像舵机角度计算出来后8行的镜像舵机角度,并记录下这8个镜像舵机角度,称之为动作2的镜像数据组。再回到步骤9中数据列表框第3行,按照生成动作2的镜像数据组的方法,生成动作3的镜像数据组。通过观察上位机的动作数据文件,我们可以发现,以后的第4行和第5行以及第6行和第7行动作其实就是动作2和动作3的简单重复,因此没有必要再计算了。下面我们再双击上位机的第8行动作数据,然后单击添加按钮,连续单击8下,向动作数据文件再添加进去8行动作数据,这些数据每一行都是机器人的初始位置,下面我们来修改这些数据。首先双击第10行的动作数据,通过拉动ch5、ch6、ch7、ch13、ch14、ch15、ch16、ch17的角度条,把我们前面记下的动作2的镜像数据组改到相应的舵机上,然后单击修改,即完成了第10行动作数据的调整。再通过同样的方法把记下的动作3的镜像数据组修改到第11行动作数据中。根据前面招手动作采用的简单重复办法,我们分别把第10行和第11行的动作数据修改到第12行和第13行,以及第14行和第15行,最后一行保持初始位置不变。这时我们就得到一个完整的招手的数据,如图7-79所示。

11)运行上位机程序,对机器人进行操作,若得到的数据正确,则我们能看到机器人能够成功的用右手向我们打招呼,这就是我们需要得到的动作,它正好是和机器人的招左手的动作是对称的,这样就达到了实验要求。

最后感兴趣的同学可以继续做下去,可以让机器人多实现几个对称的动作。

978-7-111-57208-4-Chapter07-102.jpg

图7-79 数据插入到上位机后的界面

1.我们一共有几种方法可以得到双足步行机器人的动作数据?

答:(1)最普通的方式,就是利用上位机里面的滚动条手动调出动作数据,该方法效率不高,但简单易行。

(2)通过仿真来得到动作数据,这种方法完全抛开机器人本体,直接在虚拟的方针平台上来对机器人进行数据调制,得到机器人的动作数据。

(3)通过编程来得到动作数据,这种方法往往是当机器人的动作有取巧之处时,我们可以知道下一个动作与前面的某个动作有一定的对应关系,比如周期性、对称性等。该方法效率高,但有一定的难度。

(4)通过行为数据库来得到机器人的动作数据,行为数据库里装满了机器人的各个动作的元素,合理的组合编排即可得出机器人的动作数据,该方法效率高,且简单易行,是现在比较流行的方法。

2.除了上楼梯,还有那些动作可以利用镜像法来编排动作?

答:如果熟悉了镜像法的原理,不难发现只要编排的机器人动作里面有对称的关系,都可以利用镜像法来得到。比如:向左侧滚翻如果已经得到了,那么向右侧滚翻就可以用镜像法得到;还有有关前进时往前迈的左右腿都是对称的关系;还有一些舞蹈动作的编排,需要对称时,都可以利用镜像法来得到。

3.除了镜像法,你还能总结出什么快捷简便的方法来得到数据?

答:(1)周期法,当机器人的动作是周期性反复的话,就没有必要一帧一帧地编写,可以完全编写好一个完整周期后,即可利用周期法实现想要的动作。

(2)倒序法,在机器人已有的动作前提下,我们可以利用倒序法来得到一些新的动作。例如:将机器人的前走,一帧一帧地倒写,就可以得到机器人的后走;将机器人向左侧翻,一帧一帧地倒写,就可以得到机器人的向右侧翻。

(3)文件转化法,在机器人已有的动作的前提下,想得到另一个机器人的相同动作的数据,可以利用文件转化法来得到,但需要微调一下,计算往往会出现一两度的偏差。

(4)临摹法,对于一些简单的动作且在机器人已有的动作的前提下,想得到另一个机器人的相同这样动作的数据,可以用临摹法,让已经有动作的机器人做“模特”,一帧一帧地摆动作,让其他机器人学习动作,达到实现动作的目的。

1)掌握VisualC++开发工具的基本使用方法。

2)了解和掌握Visual C++工具编写基于MFC Windows应用程序的方法。

3)熟悉和掌握几种控件的使用。

PC一台(装有Visual C++)。

在本实验中,我们将通过开发一个基于MFC的Windows应用程序,来了解Visual C++开发对话框程序的基本方法和步骤,为进一步开发机器人的上位机控制程序打好基础。这个程序的基本功能是:通过滚动条控制文本框显示的数值。

MFC是微软开发的一个类库,它提供了开发Windows应用程序需要的基本框架,利用它可以极大地方便程序员开发Windows程序。MFC以其强大的功能和灵活的编程方式成为大多数程序开发人员最经常使用的一种编程方式。我们使用的开发工具是Visual C++6.0,用这个微软提供的集成开发环境开发对话框类型的应用程序,只需要借助它提供的向导就可以方便地产生一个对话框程序的雏形,留给开发人员的工作就是各种控件的使用。例如在本实验的示例程序中大部分功能实际是在MFC的CWinApp和CDialog等基类中完成的,在编程时,只需在派生类中编写少量功能代码(这在下面的内容中会得到验证),C++允许以这样的方式借用基类中的大量代码而无须复制代码。应用程序框架负责提供程序的结构框架,开发人员在此基础上为其添加相应的实现代码,从而可以非常方便地完成一个完整的应用程序。应用程序框架不仅定义了应用程序的结构安排,实际上还包含了更多的C++基类。

本程序中用到的其他控件的使用,如文本框、滚动条等,可以参考相关的书籍,这方面的书籍很多,所以这里就不再说明了。

1.建立一个基于对话框的工程

利用VisualC++的向导建立一个基于对话框的应用程序,具体操作是:文件→新建,打开新建对话框,如图7-80所示。选择MFC AppWizard(exe),设置好工程名和路径,单击确定,就进入了应用程序向导,如图7-81所示,按照提示操作就生成对话框程序的基本框架。一般情况下,我们采用向导中的默认设置即可,不需要任何修改,所以直接单击“确定”及“完成”就生成了我们需要的工程。

978-7-111-57208-4-Chapter07-103.jpg

图7-80 新建工程对话框

2.利用资源编辑器生成“上位机程序实验”界面

如图7-82所示,我们应该在窗体中添加这些控件:两个静态文本框,一个可编辑文本框,一个滚动条控件。完成这些操作也很简单,控件工具栏中选择相应的控件,然后按住鼠标左键拖拽即可完成摆放控件的工作。

3.设置控件属性

在资源编辑器中,选中相应的控件,然后单击鼠标右键,选择“属性”,如图7-83所示。打开图7-84所示的属性设置对话框。

设置静态文本框的标题分别是:舵机角度和舵机角度控制;设置可编辑文本框的ID为IDC_EDIT_DSHOW;设置滚动条的ID为IDC_SCROLLBAR_DCTRL。其他属性不用修改,采用默认的设置即可。

978-7-111-57208-4-Chapter07-104.jpg

图7-81 应用程序向导

978-7-111-57208-4-Chapter07-105.jpg

图7-82 程序界面

4.在类向导中添加变量和函数

通过菜单“查看→类向导”或者直接用快捷键“Ctrl+w”打开类向导,如图7-85所示。选择“Member Variables”标签,为可编辑文本框和滚动条添加变量,如图7-86、图7-87所示。m-DShow的类别选择Value,变量类型选择int;m-DCtrl的类别选择Control,变量类型选择CScrollBar.在MFC中,变量与控件之间通过一定的映射机制关联,我们通过变量来操纵控件的行为。如我们通过mDShow修改文本框控件显示的内容;通过mDCtrl控制滚动条的动作。

978-7-111-57208-4-Chapter07-106.jpg

图7-83 打开属性对话框的方法

978-7-111-57208-4-Chapter07-107.jpg

图7-84 各个控件的属性对话框

978-7-111-57208-4-Chapter07-108.jpg

图7-85 类向导对话框

978-7-111-57208-4-Chapter07-109.jpg

图7-86 添加变量对话框

978-7-111-57208-4-Chapter07-110.jpg

图7-87 添加变量对话框

下面打开Message Maps标签,为主对话框的WM_HSCROLL消息添加函数,如图7-88所示。这样,当用户拖动滚动条时,就会产生WMHSCROLL消息,通过信息映射机制(MFC已经自动为我们做好这个映射),程序就会调用OnHScroll函数。下一步我们将把控制文本框显示的代码放到OnHScroll函数中实现,就可以实现拖动滚动条控制文本框显示的目的了。单击“确定”完成所用的设置。

5.添加自己的代码

找到TestPDlg.cpp文件中的OnInitDialog函数,在如图7-89所示的位置添加如下代码:

978-7-111-57208-4-Chapter07-111.jpg

图7-88 类向导对话框—添加消息函数

978-7-111-57208-4-Chapter07-112.jpg

图7-89 OnInitDialog函数中位置

OnInitDialog函数将在显示对话框之前调用,完成一些初始化工作。如上面的代码将使文本框显示为90,滚动条位于中间位置。记住要给NMin、NMax进行声明,否则程序在编译的时候就会报错。

#define NMax 179

#define NMin 1

找到TestPDlg.cpp文件中的OnHScroll函数,在如图7-90所示的位置添加如下代码:

978-7-111-57208-4-Chapter07-113.jpg

978-7-111-57208-4-Chapter07-114.jpg

图7-90 OnHScroll函数中位置

6.编译、构建并执行程序

通过菜单:编译→构建,建立工程;编译→执行,执行工程。或者通过工具栏进行这些操作,如图7-91所示。

978-7-111-57208-4-Chapter07-115.jpg

图7-91 编译工具栏

程序运行后的界面如图7-92所示,同学们可以拖动滚动条看看文本框内容的变化。

1.用自己的话概述消息处理的过程?

答:在Window操作环境下,无论是系统产生的行为或用户运行应用程序产生的行为都称事件产生的消息,消息处理函数处理消息的过程一般归纳为接收消息、分发消息、处理消息和用户交互。

978-7-111-57208-4-Chapter07-116.jpg(www.daowen.com)

图7-92 程序界面

2.总结OnHScroll函数的用法?

答:当用户拖动滚动条时,就会产生WMHSCROLL消息,通过信息映射机制(MFC已经自动为我们做好这个映射),程序就会调用OnHScroll函数。

1)了解串口通信的基本原理。

2)了解双足步行机器人读取初始位置时的通信协议格式。

3)了解VC串口通信控件的应用。

4)学习机器人的上位机和下位机是如何实现交互从而控制机器人的。

有串口的PC一台(装有VC编程环境及机器人上位机软件)、双足机器人一台、串口通信线一条。

串口通信的基本原理及VC串口编程:

1.串行通信的基本原理

所谓“串行通信”是指外设和计算机间使用一根数据信号线,数据在一根数据信号线上按位进行传输,每一位数据都占据一个固定的时间长度。当数据从CPU经过串行端口发送出去时,字节数据转换为串行的二进制位。在接收数据时,串行的二进制位被转换为字节数据。在Windows环境(Windows NT、Win98、Windows2000)下,串口是系统资源的一部分。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。

2.串口信号线的接法

一个完整的RS-232C接口有22根线,采用标准的25芯插头座(或者9芯插头座)。25芯和9芯的主要信号线相同。以下的介绍是以25芯的RS-232C为例。

(1)主要信号线定义

2脚:发送数据TXD;

3脚:接收数据RXD;

4脚:请求发送RTS;

5脚:清除发送CTS;

6脚:数据设备就绪DSR;

20脚:数据终端就绪DTR;

8脚:数据载波检测DCD;

1脚:保护地;

7脚:信号地。

(2)电气特性 数据传输速率最大可到20kbit/s,最大距离仅15m。

(3)接口的典型应用 大多数计算机应用系统与智能单元之间只需使用3~5根信号线即可工作。这时,除了TXD、RXD以外,还需使用RTS、CTS、DCD、DTR、DSR等信号线(当然,在程序中也需要对相应的信号线进行设置)。

以上接法,在设计程序时,直接进行数据的接收和发送就可以了,不需要对信号线的状态进行判断或设置(如果应用的场合需要使用握手信号等,需要对相应的信号线的状态进行监测或设置)。

3.在MFC下的32位串口应用程序

32位串口通信程序可以用两种方法实现:利用ActiveX控件;使用API通信函数。使用ActiveX控件,程序实现非常简单,结构清晰,缺点是欠灵活;使用API通信函数的优缺点则基本上相反。

在此,我们是用MSComm控件实现。我们上位机所要作的工作是利用VC里的MSComm控件的方法来进行双向的单线程串口通信。

这牵扯到数据协议的制定和编程的实现。上位机与下位机的通信方式有有线和无线两种,有线方式已经比较成熟,无线方式需要对单向的传输增加握手协议,使下位机可以向上位机反馈信息。由于不管是采用有线还是无线方式,上位机都是通过串口与下位机通信,所以编程部分只需要根据串口协议的变化做出相应的调整就可以了。

1.了解双足机器人的通信协议格式

数据包格式:0xff,0xfe+数据帧+校验和。

数据帧格式:地址码+控制命令+0x00,…,0x00。

控制命令:0x01:主机读回Homeposition数据。

机器人返回数据:地址码+数据标签+相关参数(4字节)+Homeposition(17字节)。

数据标签:0x00:Homeposition数据(主机读Homeposition时)。

2.编写串口监视软件

1)创建工程,单击File→New,产生如图7-93所示窗口,在左边选择“MFC AppWizard[exe]”,右面“Project name”处填写项目名称为:CommShow,选择保存路径,单击下一步。

978-7-111-57208-4-Chapter07-117.jpg

图7-93 工程设置

2)将项目设置为Dialog based,如图7-94所示,然后单击完成。

978-7-111-57208-4-Chapter07-118.jpg

图7-94 MFC应用程序向导步骤

3)在Dialog资源中加入如下控件:添加Static box和EditBox控件各两个,Botton控件一个,并通过在控件上单击右键,选择“Properties”进行控件属性设置,改变Staticbox的Cap- tion为“发送显示”和“接收显示”;将Botton控件的Caption改为“发送”;EditBox控件处设置它们的ID分别为IDC-EDIT1和IDC-EDIT2,并在属性窗口的“Style”选项卡中,作如图7-95所示设置。

978-7-111-57208-4-Chapter07-119.jpg

图7-95 EditBox控件属性框

全部设置完成后如图7-96所示。

978-7-111-57208-4-Chapter07-120.jpg

图7-96 控件设置完成后界面

4)单击Project→Add To Project→Components and Controls,准备添加串口通信控件。

5)查找范围选择Registered ActiveX Controls,在Registered ActiveX Controls文件夹下,找到Microsoft Communications Control控件,单击“Insert”按钮如图7-97所示,弹出如图所示对话框,单击“OK”,之后单击“关闭”。

6)将通信控件978-7-111-57208-4-Chapter07-121.jpg拖动,添加到对话框中,并单击右键,选择Properties项,设置如图7-98所示。

978-7-111-57208-4-Chapter07-122.jpg

图7-97 添加串口通信控件到基本工具栏中

978-7-111-57208-4-Chapter07-123.jpg

图7-98 设置串口通信控件ID号

7)在Dialog资源中单击右键,选择ClassWizard,为各资源加入变量如图7-99所示。

通过“MFCClassWizard”对话框上面的选项卡,选择Member Variables,通过双击控件的ID弹出Add Member Variable对话框来添加控件的变量,如图7-100所示。

978-7-111-57208-4-Chapter07-124.jpg

图7-99 选择ClassWizard进入类向导

978-7-111-57208-4-Chapter07-125.jpg

图7-100 为各控件添加成员变量

添加后的结果如图7-101所示,之后单击“OK”退出。

978-7-111-57208-4-Chapter07-126.jpg

图7-101 完成添加全部成员变量后界面

8)在MFCClassWizard界面中,选择Message Maps选项卡,单击IDC-MSCOMM1和Mes-sages框中的OnComm,当两条都被选中时,单击右面的“Add Function”按钮,准备加入消息响应函数OnComm(),如图7-102所示。

978-7-111-57208-4-Chapter07-127.jpg

图7-102 准备添加消息响应函数OnComm()

弹出如图7-103所示对话框,进行如下设置后,单击“OK”按钮。

978-7-111-57208-4-Chapter07-128.jpg

图7-103 设置成员函数名

9)双击“Member functions”框中的OnComm函数(见图7-104),在弹出的CommShowD-lg.cpp文档(见图7-105)的OnComm函数中加入如下代码。

978-7-111-57208-4-Chapter07-129.jpg

图7-104 成员函数OnComm()设置完成

978-7-111-57208-4-Chapter07-130.jpg

图7-105 弹出的CommShowDlg.cpp文档

978-7-111-57208-4-Chapter07-131.jpg

978-7-111-57208-4-Chapter07-132.jpg

10)在BOOL CCommShowDlg::OnInitDialog()函数的//TODO:Add extra initialization here代码后加入程序初始化代码,进行串口初始化。

978-7-111-57208-4-Chapter07-133.jpg

m_Comm.GetInput();//先预读缓冲区以清除残留数据

11)双击“发送”按钮,添加发送函数:双击后,在弹出的对话框中单击“OK”按钮,之后进入函数内加入代码。

978-7-111-57208-4-Chapter07-134.jpg

12)通过依次单击菜单或工具栏中978-7-111-57208-4-Chapter07-135.jpg978-7-111-57208-4-Chapter07-136.jpg按钮,进行编译并执行程序。将程序编译并执行之后界面如图7-106所示。

978-7-111-57208-4-Chapter07-137.jpg

图7-106 程序编译执行结果

3.连接好机器人

采用有线方式,机器人背部电路板上两个模式拨码开关均拨到下方,串口选择COM1控制,单击“发送”按钮。利用实验步骤1中的预备知识并通过软件观察数据的格式,了解上位机和下位机具体是如何利用串口进行通信的。

1)打开编写的软件。

2)单击“发送”按钮,通过软件观察数据,如图7-107所示。

978-7-111-57208-4-Chapter07-138.jpg

图7-107 程序运行结果

1.回顾实验过程中,上下位机的通信过程,总结上位机是如何通过串口与机器人实现通信的?

答:通过软件上下的显示,可以看出上位机先发出了机器人控制信息,如:机器人工作状态、下位机存储的动作数据组号、数据帧、舵机角度及校验等信息。下位机在收到数据后验证校验和,并且给上位机相应的反馈。由此,保证上下位机之间正确、可靠的通信。

2.思考使用多线程进行上下位机同步通信的意义?

答:多线程提高了程序执行的效率,提高了编程的灵活性。在串口程序中,有很多应用多线程设计的地方,例如:为了实现串口接收的事件驱动方式,可以考虑单独建立一个工作线程。在该线程中循环检测串口事件,但是不会造成程序界面的假死;在使用多个串口时,也可以使用多线程编程。

1)掌握杆件位姿矩阵的建立方法。

2)了解ZMP理论及其在机器人控制中的重要意义。

3)了解使用MATLAB对ZMP理论的验证做出仿真。

双足步行机器人一台、PC一台(装有MATLAB,上位机控制软件)。

978-7-111-57208-4-Chapter07-139.jpg

图7-108 机器人受力分析与ZMP点的确定

1.ZMP点计算及步行稳定条件

双足步行机器人研究的一个关键问题是实现其稳定的行走。目前世界上大多数双足步行机器人系统都采用ZMP作为稳定行走的判据。ZMP即零力矩点(Zero Moment Point)的简称,是由南斯拉夫学者Vukobratovic(简称伍氏)提出的关于步行稳定性的经典理论,具体描述为:指重力与惯性力的合力的延线与地面的交点,在该点处,合力对x轴和y轴的力矩为零,如图7-108中合力F与地面的焦点就是ZMP点。这个ZMP点的位置直接影响到了机器人的稳定性,即机器人是否能够稳定的站立。

双足步行机器人在步行过程中机体的ZMP点是随时变化的,我们将ZMP离支撑面边缘的最短距离定义为稳定裕度,当在其内时为正,是稳定的,反之为负,是不稳定的。

步行机器人在步行时,作用在其上的外力为重力、摩擦力和惯性力。按行走的动态平衡理论,ZMP点的规划直接影响到步行机器人的稳定性、补偿运动的大小、关节驱动力矩的大小,所以在规划时应在保证动态平衡、行走稳定的前提下,使补偿运动、关节驱动力矩尽量减小,从而减小步行机器人的能量消耗,提高步行效率。

根据Vukobratov提出的ZMP理论,当支撑脚与地面多点接触时,ZMP点的位置坐标为

978-7-111-57208-4-Chapter07-140.jpg

式中 m,-各部分的质量:X,、F、Z,-各部分的质心。

当机器人做静态步行时,978-7-111-57208-4-Chapter07-141.jpg

所以有:

978-7-111-57208-4-Chapter07-142.jpg

式中 XcYc——双足机器人质心的坐标。

即,双足机器人的质心即为ZMP点。因此只要使重心落在脚面上,就可保证双足步行机器人稳定的静态步行。因此复杂的ZMP点求解的任务变成了求解重心点的任务。

2.建立连杆坐标系,确定位资矩阵

双足步行机器人为多杆系统,两杆间的位姿矩阵是求解双足步行机器人各个质点位姿矩阵的基础。两杆间的位姿矩阵取决于两杆之间的结构参数、运动形式和运动参数,以及这些参数按照不同顺序建立的几何模型。

为了描述每个连杆与相邻连杆之间的相对位置关系,需要在每个连杆上定义一个固连坐标系。根据固连坐标系所在连杆的编号对固连坐标系命名,因此固连在连杆i上的固连坐标系称为坐标系{i}。

通常按照下面的方法确定连杆上的固连坐标系:坐标系{i}的Z轴称为Zi,并与关节轴i重合,坐标系{i}的原点位于公垂线ai与关节轴i的交点处。Xi沿ai方向由关节i指向关节i+1。

ai=0时,Xi垂直与ZiZi+1所在的平面。按右手定则绕Xi轴的转角定义为αi,由于Xi轴的方向可以有两种选择,因此αi的符号也有两种选择。Yi轴由右手定则确定,从而完成了对坐标系{i}的定义。图7-109所示为一般连杆坐标系{i-1}和{i}的位置。

在研究机器人运动学问题时,我们都会选取一个参考坐标系,并在找个参考坐标系中描述所有其他连杆坐标系的位置。

参考坐标系{0}可以任意设定,但是为了使问题简化,通常设定Z0轴沿关节轴1的方向,并且当关节变量1为0时,设定参考坐标系{0}与坐标系{1}重合。

978-7-111-57208-4-Chapter07-143.jpg

图7-109 空间相邻的两相邻杆件

如果按照上述规定,则连杆参数规定如下:

αi-1=沿xi-1轴,从zi-1旋转到zi的角度,记作Rot(xi-1αi-1);

αi-1=绕xi-1轴,从zi-1移动到zi的距离,Trans(xi-1ai-1);

di=沿zi-1轴,从xi-1移动到xi的距离,Trans(zidi);

θi=沿zi-1轴,从xi-1旋转到xi的角度,Rot(ziθi)。

旋转(αi-1)→平移(αi-1)→平移(di)→旋转(θi),变换矩阵是:

Tii-1=Rot(xi-1αi-1)Trans(zi-1αi-1)Trans(zidi)Rot(ziθi)即:

978-7-111-57208-4-Chapter07-144.jpg

确定位姿矩阵参数的步骤如下:

1)找出各关节轴,并标出(或画出)这些轴线的延长线。在下面的步骤2到5中,仅考虑两个相邻的轴线(关节轴ii+1)。

2)找出关节轴ii+1之间的公垂线或关节轴ii+1的交点,以i+1之间的交点或公垂线与关节轴的交点作为连杆坐标系{i}的原点。

3)规定Zi轴沿关节轴i的指向。

4)规定Xi轴沿公垂线的指向,如果关节轴ii+1相交,则规定Xi轴垂直于关节轴ii+1所在的平面。

5)按照右手定则确定Yi轴。

6)当第一个关节变量为0时,规定坐标系{0}和{1}重合。对于坐标系{N},其原点的方向可以任意选取。但是在选取时,通常尽量使连杆参数为0。

注意:按照上述方法建立的连杆固连坐标系并不是唯一的。首先,当选取Zi轴与关节i重合时,Zi轴的指向有两种选择。此外,在关节轴相交的情况下(这时ai=0),由于Xi轴垂直与Zi轴与Zi+1轴所在的平面,因此Xi轴的指向也有两种选择。当关节轴ii+1平行时,坐标系{i}的原点位置可以任意选择(通常选取该原点使之满足di=0)。

3.重心坐标的确定

根据机器人各个关节的质量和它的位姿矩阵(在此不做推导),我们可以求出机器人各个关节质点相对于坐标原点(头部)的坐标,并且可进一步求出机器人的重心坐标。重心坐标的求解公式如下:

978-7-111-57208-4-Chapter07-145.jpg

式中 Oz——重心的位置;

Oi——第i个舵机质点的位置;

mi——第i个舵机质点的质量。

978-7-111-57208-4-Chapter07-146.jpg

式中 POOA——OA点的径向POA在坐标系SO中的表示,是一个3×1列阵(位置矩阵);

RAO——坐标系SA在坐标系SO中的表示,是一个3×3的方阵(姿势矩阵);

TAO——称为位姿矩阵,用4×4的方阵同时把位置和姿态表示出来。

1.简化连杆模型的坐标系建立

1)根据连杆模型Ⅰ(见图7-110),将参数值填入表7-9中,并写出其对应的位姿矩阵。

7-9 连杆模型参数值表

978-7-111-57208-4-Chapter07-147.jpg

将其参数值带入式(7-7)中:

978-7-111-57208-4-Chapter07-148.jpg

带入结果为

978-7-111-57208-4-Chapter07-149.jpg

2)连杆模型Ⅱ(见图7-111)将参数值填入表7-10中,并写出其对应的位姿矩阵。

978-7-111-57208-4-Chapter07-150.jpg

图7-110 连杆模型Ⅰ

978-7-111-57208-4-Chapter07-151.jpg

图7-111 连杆模型Ⅱ

注:图7-111中Zi-1轴与Zi轴是垂直的。

7-10 连杆模型参数值

978-7-111-57208-4-Chapter07-152.jpg

978-7-111-57208-4-Chapter07-153.jpg

图7-112 机器人自由度配置图

将其参数值带入公式(7-7)中:

978-7-111-57208-4-Chapter07-154.jpg

带入结果为

978-7-111-57208-4-Chapter07-155.jpg

2.机器人连杆坐标系的建立

我们的实验用双足机器人有着17自由度,具体自由度配置(对每一个舵机进行了编号,以便操作和控制。头部舵机本为4号,但在连杆坐标系的建立过程中,我们将头部作为了参考坐标系,为便于理解,因此将序号设为0。如图7-112所示。

图中,978-7-111-57208-4-Chapter07-156.jpg表示舵机在水平面转动;

978-7-111-57208-4-Chapter07-157.jpg表示舵机在垂直面转动。

下面,我们以右臂为例,建立其坐标系,并列出对应的位姿矩阵。

根据图7-113,将参数填入表7-11中。

978-7-111-57208-4-Chapter07-158.jpg

图7-113 右臂部分坐标系

7-11 右臂参数值

978-7-111-57208-4-Chapter07-159.jpg

将表7-11中的参数带入式(7-7),则

978-7-111-57208-4-Chapter07-160.jpg

T03=T01T21T23=T02T23。注:3号质点相对于{0}的位姿矩阵。

3.使用MATLAB编写机器人模型程序

1)如图7-114所示,启动MATLAB应用程序,在Current Directory窗口中列出了MAT-LAB默认路径中包含的所有文件,其中有一个robot1.m文件。选择此文件双击,或者在MATLAB主窗口中选择打开,然后选择robot1.m文件打开。

2)如图7-115所示,在robot1.m文件中,编写右臂的位姿矩阵部分代码。

3)打开上位机控制软件,在界面中单击“浏览”按钮,选择一个机器人行为数据,例如,走.dat文件。选择文件后的界面如图7-116所示。

978-7-111-57208-4-Chapter07-161.jpg

图7-114 启动并打开MATLAB模型文件

978-7-111-57208-4-Chapter07-162.jpg

图7-115 编写机器人位姿矩阵代码

978-7-111-57208-4-Chapter07-163.jpg

图7-116 上位机控制软件界面

这些数据是已有的机器人行为数据,因此每一组数据都应满足稳定性条件,用MATLAB仿真,则ZMP点都应落在稳定裕内。我们随意选择其中的一组数据,例如第2组,则舵机数据为

[13,19,97,179,168,98,97,85,72,115,95,100,99,116,74,92]

从上面的数据可以看到,我们在选择舵机数据时没有包括CH4的数据,这是因为CH4是头部的舵机,而我们将头部作为了重心模型的坐标原点。

4)如图7-117所示,在MATLAB的命令窗口中输入

robot1(13,19,97,179,168,98,97,85,72,115,95,100,99,116,74,92)

回车后,观察其仿真结果。

5)输入命令后回车,将会出现MATLAB仿真图形,并根据仿真图形完成以下结论。

结论:①输入的角度数据在下载到机器人中时,机器人是否处于稳定状态。即,数据本身是否是可以让机器人稳定的数据。(是或否)

978-7-111-57208-4-Chapter07-164.jpg

图7-117 在MATLAB主界面输入命令

②仿真图形中,重心在稳定域中的投影是否在稳定域之内。(是或否)

6)当我们改变行为数据中的一个或多个数据后再输入到MATLAB中进行验证,看看改变后的行为数据是否还能满足稳定性条件。例如,我们将上面的数据改为:robot1(13,19,97,179,168,98,97,10,30,115,95,100,99,116,74,92),改变了两个数据后再次进行仿真。

结论:①输入的角度数据在下载到机器人中时,机器人是否处于稳定状态。即数据本身是否是可以让机器人稳定的数据。(是或否)

②仿真图形中,重心在稳定域中的投影是否在稳定域之内。(是或否)

1.选择头部作为坐标原点有什么好处?

答:对于本文中研究的每一个模型,坐标系建立是非常重要的,它的选取直接影响到整个模型的计算量大小、模型的实现、模型的稳定性,所以坐标系的建立在整个模型中是非常基础的,在重心模型中之所以选取头部为坐标系的原点,是基于以下两点原则选取的。

1)由于重心模型的建立是为了以后更好地实现步行控制,那么在步行控制中,坐标原点应选取在机器人的某个位置,这样可以使计算量尽可能小,否则,如果选取地面上的某个位置作为坐标原点,随着机器人的运动,机器人的每一点的坐标的绝对值将增大,这样模型的计算量就会大大增加。

2)在机器人的步行运动过程中,头部一般只是较之前一状态发生平移,不发生旋转,所以选择头部为坐标系原点,计算量就会尽可能减小。

2.机器人有17台舵机,在用MATLAB仿真行为数据的稳定性时,为什么输入的舵机角度参数只有16个呢?

答:我们在选择舵机数据时没有包括CH4的数据,这是因为CH4是头部的舵机,而我们将头部作为了重心模型的坐标原点。

3.建立基础坐标系时,XYZ轴的方向选取是唯一的吗?选择的不同会有什么影响?

答:建立的坐标系中轴方向的选取并不是唯一的,不过根据基本的规则去选择轴的方向会减少很多不必要的计算量,简化模型。并且结果不会受到影响。

1)进一步熟悉上位机软件对类人双足步行机器人的控制。

2)掌握多智能体控制的思想。

3)发挥同学们的创作能力,编排经典的“千手观音”部分动作。

PC一台(装有VC程序,双足步行机器人上位机控制软件)、无线通信模块/串口通信线、双足步行机器人一组五台、充电电池五套。

智能体Agent是指那些宿主于复杂的动态环境,自主感知环境中信息,自主采取行动,并实现一系列预先设定的目标或任务的计算机系统。它具有推理和学习能力、自主与协同工作能力以及在所处环境中的灵活访问和迁移机制以及同其他智能Agent的通信和协调机制,概括起来就是智能性、代理性和机动协调性。该技术最早出现在人工智能领域,其最大特点是具有一定的智能及良好的灵活性和坚定性,特别适合处理复杂、难以预测的问题。基于智能体的控制模型是一种拟人化的模型,可将控制系统的行为和其他扩展单元的行为统一起来构成分布式多智能体系统。

多智能体系统(Multi-Agent System)是由多个可计算的智能体组成的集合,它能协调一组自主体的行为(知识、目标、方法和规划等),以协同地动作和求解问题。学习是多智能体系统的重要特征之一,多智能体学习可以看做是多智能体系统和机器学习等研究领域的交叉。强化学习是一种以环境反馈作为输入的适应环境的机器学习方法。它不需要对环境的先验知识具有无监督的自适应能力,因而被认为是设计智能Agent的核心技术之一。

多智能体系统是针对一群不同种类的、自治的智能体的群体行为所进行的研究,这些智能体可能为同一目标共同工作,也可能为存在潜在冲突的各自不同的目标工作。在具体的研究工作中,多个智能体之间如何协调运用各自的知识、目标、技能和计划共同采取行动、解决问题是一个重要的研究内容。多机器人系统为多智能体系统理论应用于实际环境中提供了实验平台,同时多智能体系统理论的研究为多机器人系统和多机器人协调协作提供了理论基础。

对于多个机器人的控制,就涉及多智能体(MultiAgent)控制的思想。每个机器人其实对应的就是其中的单个智能体,我们通过上位机程序和无线通信模块来对多个机器人进行控制,实现了一对多的多智能体控制。

机器人都有自己的ID号,每个ID号就如同它们自己的名字。在上位机界面中,当我们输入ID号时,相应的机器人就会按照所设定的动作组号做出相应动作,这就实现了“一对一”的控制。那对于一对多的控制,我们规定了机器人公用的ID号,当我们输入公用ID号时,所有开启电源的机器人都会受到控制,这就是所谓“一对多”的控制。本实验分为实验(一)和实验(二),实验(一)体现了一对多智能控制的延时协同控制;实验二体现了一对多智能控制的实时协同控制。

在做这个实验的时候,我们要求同学分组,每组六名,并且配备五台双足类人机器人。动作数据调试完毕之后,将五台双足类人机器人按一列站位,这也就是表演“千手观音”的站位,如图7-118所示。

978-7-111-57208-4-Chapter07-165.jpg

图7-118 双足机器人表演“千手观音”的站位示意图

实验(一) 编排千手观音动作之一“开佛手”

1)对于千手观音的表演来说,最吸引人的莫过于“开佛手”,如图7-119、图7-120所示的是千手观音中开佛手的动作,具有观赏性,有比较好的演示效果。

2)关于“开佛手”的动作,我们通过看图片,就可以发现每个机器人的动作其实是一样的,都是将双臂慢慢展开到头上方形成拱形,然后再将双臂放下。那么如何使得每个机器人的动作都会一致呢?

978-7-111-57208-4-Chapter07-166.jpg

图7-119 双足机器人表演“千手观音”之“开佛手”示意图一

3)如果要让5个机器人的动作能一致,就只有临摹法(即用一个机器人来做模板,其他机器人照样子学,机器人站立顺序可由动作编排者自行排列)。先将第一个机器人设计展开佛手的动作,这个时候只考虑这个机器人,不要考虑其他机器人。我们可以直接将机器人的“开佛手”动作分为几部分。

动作一:初始位置(Homeposition),它是每个动作最开始的准备部分。具体操作步骤:单击“设定初始位置→读取初始位置数据”,打开初始位置为名的文件夹,读取第一个机器人的初始位置数据(如1.hos),注意在上位机程序界面中速度控制设为4,单击“添加”按钮,将初始位置数据放置在数据显示区域中,作为将要调试的开佛手动作的开始。

动作二:拖动2、3、6、7号舵机对应的滑块将机器人双臂举到头顶,形成如图7-120所示第一个机器人的拱形动作,注意在上位机程序界面中速度控制设为4,单击“添加”按钮,将动作二的数据放置在数据显示区域中。

动作三:初始位置(Homeposition),它又是每个动作的最末端的结束部分,具体操作步骤如动作一。

978-7-111-57208-4-Chapter07-167.jpg

图7-120 双足机器人表演“千手观音”之“开佛手”示意图二

我们先把第一个机器人的这三个动作实现了。然后单击“保存”按钮,将此数据以“开佛手”为名保存在以机器人ID号(如1号)为名的文件夹中。

4)接下来,我们将第一个机器人作为模板,让其他4个机器人所编的动作一、动作二都和第一个机器人的动作相同,速度控制也设为4,重复“步骤3”。在这个环节,要求5个机器人上述“步骤3”的动作二相同,基本没有偏差。具体作法:读取第一个机器人动作二的数据,让其做动作二,然后将第一个机器人断电使其保持动作二,然后以第一个机器人作为模板来调其他4个机器人的动作二。同时我们将上位机程序里的ID号设为公共ID号127,使得5个机器人一起做动作二。

5)最后是要把延时加入动作中,因为“开佛手”需要每个机器人的动作有一定的延时性,这样才保证具有图7-120的效果。首先对于第一个机器人,要将动作二的动作数据持续八行,使得动作二能持续一段时间。而动作一、动作三都为初始位置,不需要加延时,只要一行就够了。具体操作步骤:单击“浏览”按钮,在以机器人ID号(如1号)为名的文件夹中读取第一个机器人“开佛手”的动作数据,双击动作二对应的动作数据行,然后再单击动作二对应的动作数据行,再单击“插入”按钮,然后再单击刚刚插入的动作数据行,再单击“插入”按钮,如此进行下去插入7行,将动作二的动作数据持续8行。延时加完之后,将数据保存后,将该组开佛手的动作数据通过无线或是有线的方式发送给第一个机器人,单击上位机控制界面下端的“发送”按钮[在单击发送之前要对控制界面中的“组号”进行配置,组号可以自行设定,如“开佛手”的动作组号设为6,ID号为第一个机器人的ID号(如1号)],将已调试好的开佛手动作发送至下位机,出现对话框后单击“确定”,之后单击“运行”按钮(同样在单击之前也要选择相应的组号),第一个机器人将完成开佛手动作。

6)对于第二个机器人,它是紧跟第一个机器人做动作的,这时需要在动作一中有持续,来实现机器人动作的延时。于是,将第二个机器人的动作一的动作数据持续15行,达到延时效果,具体操作步骤:单击“浏览”按钮,在以机器人ID号(如2号)为名的文件夹中读取第2个机器人“开佛手”的动作数据,双击动作一对应的动作数据行,然后单击第一行数据,再单击“插入”按钮,然后再单击刚刚插入的动作数据行,再单击“插入”按钮,如此进行下去插入14行,将动作一的动作数据持续15行。然后将动作二还是持续8行,即双击动作二对应的动作数据,然后再单击动作二对应的动作数据行,再单击“插入”按钮,然后再单击刚刚插入的动作数据行,再单击“插入”按钮,如此进行下去插入7行,将动作二的动作数据持续8行。动作三还是保持一行不变。延时加完之后,将数据保存后,将该组开佛手的动作数据通过无线或是有线的方式发送给第2个机器人,发送时组号可以自行设定,但必须为0~20之间未用过的数字(如“开佛手”的动作组号设为6),ID号为第2个机器人的ID号(如2号)。

7)对于后面的第3个、第4个、第5个机器人,同样的需要将动作一分别持续25行、35行、45行,分别实现延时的效果。而对于这后面的3个机器人,动作二都需要持续8行,动作三都还保持一行不变,具体操作步骤如步骤6)。

8)最后将5个机器人摆放成前面所调的机器人的顺序站成一行,并且打开电源,即如图7-118所示的“千手观音”的站位队列,程序界面的ID号设置成公共ID号127,然后运行,我们可以看到“千手观音”之“开佛手”动作就会表演出来。

9)当然如果效果不是最佳,可以考虑在某个机器人要持续的动作的行数上改动几行(增加或减少几行),因为每个机器人都会存在差异,效果如图7-120所示为最佳。

实验(二) 编排千手观音动作之二“展臂”

1)对于千手观音的表演来说,“展臂”也是很重要的一环,要求所有机器人同时做动作,而且每个机器人向不同方向展臂,如图7-121、图7-122所示。

978-7-111-57208-4-Chapter07-168.jpg

图7-121 双足机器人表演“千手观音”之“展臂”示意图一

978-7-111-57208-4-Chapter07-169.jpg

图7-122 双足机器人表演“千手观音”之“展臂”示意图二

2)关于“展臂”的动作,我们通过看图片,就可以发现每个机器人的动作是不一样的,都是瞬间从初始位置转到一定方向,让手臂保持某个特定动作一段时间,然后再将双臂转回初始位置。

3)我们可以直接将机器人的“展臂”动作分为4部分。

动作一:初始位置,它是每个动作的最开始的准备部分,如对第一个机器人具体操作步骤如“实验(一)”中步骤3)的动作一。

动作二:如图7-123所示每个机器人对应的动作。如对于第一个机器人,拖动2、3、6、7号舵机对应的滑块将机器人双臂竖直举过头顶,形成如图7-123所示第一行机器人的动作,单击“添加”按钮,将动作二数据放置在数据显示区域中。

动作三:如图7-124所示每个机器人对应的动作。如对于第一个机器人,拖动2、3、6、7号舵机对应的滑块将机器人双臂举平,形成如图7-124所示第一行机器人的动作,单击“添加”按钮,将动作三的数据放置在数据显示区域中。

978-7-111-57208-4-Chapter07-170.jpg

图7-123 5个机器人动作二的正面示意图

978-7-111-57208-4-Chapter07-171.jpg

图7-124 5个机器人动作三的正面示意图

动作四:初始位置,它又是每个动作的最末端的结束部分,如对于第一个机器人具体操作步骤如“实验(一)”中步骤3)的动作三。

然后单击“保存”按钮,将此数据以展臂为名保存在以机器人ID号(如1号)为名的文件夹中。同理,其他四个机器人也如上述4个部分来编排展臂动作,不同的是他们的动作二、动作三应分别对应图7-123和图7-124所示的每个机器人的动作来调。

4)由于“展臂”需要5个机器人同时做动作,所以这里规定每个机器人都要遵守下列规定:动作一要保持的行数为4行(速度控制设为4),动作二要保持的行数为40行(第一行速度控制设为7,其余都设为1),动作三要保持的行数为40行(第一行速度控制设为7,其余都设为1)、动作四要保持的行数为1行(速度控制设为7),按照上述规编定写动作,将体现一对多智能控制的实时控制。

例如对于第一个机器人,要将动作一的动作数据持续4行,具体操作步骤:单击“浏览”按钮,在以机器人ID号(如1号)为名的文件夹中读取第一个机器人“展臂”的动作数据,双击动作一对应的动作数据行,速度控制设为4,然后再单击动作一对应的动作数据行,再单击“插入”按钮,然后再单击刚刚插入的动作数据行,再单击“插入”按钮,如此进行下去插入3行,将动作一的动作数据持续4行。要将动作二的动作数据持续40行,双击动作二对应的动作数据,速度控制设为7,然后再单击动作二对应的动作数据行,单击“修改”,然后再速度控制设为1,单击动作二对应的动作数据行(速度控制已设为7)的下一行,再单击“插入”按钮,然后再单击刚刚插入的动作数据行,再单击“插入”按钮,如此进行下去插入39行,将动作二的动作数据持续40行,同理为动作三按上述规则加延时。最后将动作四的数据速度控制修改为7。延时加完之后,将数据保存后,将该组展臂的动作数据通过无线或是有线的方式发送给第一个机器人,发送时组号可以自行设定,但必须为0~20之间未用过的数字(如“展臂”的动作组号设为7),ID号为第一个机器人的ID号(如1号)。其他机器人同理。

5)关键部分在于每个机器人动作二、动作三的编写。每个机器人的动作二、动作三都不同,且要求在编写动作二时,五个机器人虽然动作不相同,但总体上看,如图7-121所示,手臂的空间分布上下均匀。动作三同理。

6)在本实验中,特定的动作二、动作三不拘泥于一种形式,也就是同学们编写的时候,可以不参照图7-121与图7-122,自己编写,但要总体上遵循手臂的空间分布上下均匀,具有层次感,这样效果才会更好。在此注意一点,对于同一个机器人,动作二、动作三应该对应:比如动作二机器人手臂上抬,动作三机器人手臂就下垂。

7)当每个机器人都编排好动作后,将5个机器人摆放成前面所调的机器人的顺序站成一行,并且打开电源,即如图7-118所示的“千手观音”的站位队列,然后程序界面的ID号设置成公共ID号127,接着运行,我们可以看到“千手观音”之“展臂”动作就会表演出来。

8)当然如果效果不是最佳,可以考虑在某个机器人要持续的行数上改动几行(增加或减少几行),因为每个机器人都会存在差异。

1.机器人的“千手观音”动作表演中的延时是怎样实现的?

答:在机器人“千手观音”动作表演中的延时是通过对上位机界面中的某行数据进行复制,达到动作持续的效果。在这里,我们一般会用到两种按钮:“插入”、“添加”。

其中“插入”按钮用得最普遍,当我们要复制某行数据时,首先先双击这行数据,这时发现滚动条也随之显示该行数据,然后单击要插入的位置的下一行,再单击“插入”按钮,想要复制的行就复制了一行,由此想要复制几行,就单击“插入”按钮几下。实现动作的延时,当然复制的行数越多,延时越长。

“添加”按钮用得很少,一般都是在要插入的位置后面已经没有任何数据的前提下,单击“添加”按钮,想要复制的行就在数据的最后一行复制了一行。由此想要复制几行,就单击“添加”按钮几下,注意的是每次添加的行都是在最后一行,以前复制的行都向上推进。

2.我们是如何用一个上位机程序来同时控制多个机器人的?

答:对于一个上位机程序对多个机器人的控制,我们规定了机器人公用的ID号,当我们输入公用ID号时,所有开启电源的机器人都会受到控制,这就实现了一个上位机程序对多个机器人的控制。

3.我们从机器人的“千手观音”动作中的“开佛手”和“展臂”可以得出什么结果,利用这个结果,我们如何编排新动作?

答:对于机器人的“千手观音”动作中的“开佛手”,我们可以得到5个机器人依次延时地做动作时,动作变化的具体行数,也就是说,当我们设计新的动作,而且这个动作要求机器人是依次延时地去做,我们可以直接利用“开佛手”得到的结果,知道每个机器人在具体哪一行要换动作的前提下,将动作数据编写上去就可以了。

同理,对于机器人的“千手观音”动作中的“展臂”,我们可以得到五个机器人同时做动作时,动作变化的具体行数,也就是说,当我们设计新的动作,而且这个动作要求机器人是同时地去做,我们可以直接利用“展臂”得到的结果,知道每个机器人在具体哪一行要换动作的前提下,将动作数据编写上去就可以了。

这样,我们可以利用“开佛手”和“展臂”的结果,编排任何动作,包括延时地和同时地做动作。

4.机器人团队除了“千手观音”动作之外,还适合做什么样的团队表演,发挥想象列举一些其他的团队表演。

答:机器人团队除了“千手观音”动作之外,还可以表演一些团队表演,例如团队街舞表演、团队体操表演、团队扭秧歌表演、团队抬花轿表演、团队武术表演、团队打太极表演、团队踢球表演、团队竞赛类(跑步、翻跟头、俯卧撑)表演、团队拔河表演等。

1)进一步熟悉双足步行机器人上位机控制平台的操作。

2)学习用上位机软件,完成复杂动作——爬楼梯的调试,学会机器人复杂动作的调试方法。

3)掌握发送多组数据的方法。

4)掌握动作编排的方法。

PC一台(装有VC和双足步行机器人上位机控制软件)、无线通信模块/串口通信线、双足步行机器人一台,电池、充电设备各一套。

1.复杂动作的调试方法

在简单动作实验里面,我们已经学会了利用上位机来完成招手动作的调试,接下来我们来介绍一组复杂动作的调试过程。

所谓复杂动作,就是指整个动作全部完成,需要很多帧数据,这些帧顺序执行,可以形成一组比较完整并稍微复杂些的动作。一般,复杂动作中除机器人上肢运动以外,通常会涉及跨部及下肢各舵机的运动,这样就存在机器人重心偏移后各舵机如何相互配合仍使机器人在完成每一帧数据后保持所需平衡的问题。这里需要注意的是在复杂动作中,机器人完成每一帧动作后都需处于一个稳定的状态(即能维持平衡),并且帧与帧之间的动作差别不应过大,而且在速度位的设置上也需配合动作需要,过快可能造成机器人由于惯性失去平衡,过慢则导致动作的可观赏性下降。

2.让机器人执行多组动作的方法

多动作实际上是由多组简单和复杂动作按照我们事先设计的规则顺序执行的过程。

首先,我们需要把已经调试好的各个动作,顺序地发送到机器人下位机存储器的不同区域中,然后通过上位机软件自带的动作编排窗口进行所需顺序的动作编排,之后单击“顺序”按钮,就可以执行我们所需要的动作序列了。具体的设置方法参见下面的实验步骤。

1.调试一组复杂动作爬楼梯(这里我们只以上一级台阶为例进行讲解,上多级台阶方法可由一级台阶调试方法进行推广)

1)打开机器人电源开关,上电后机器人处在初始位置(双脚直立状态),先将机器人放在自制的楼梯前,做好下一步调试准备,并单击上位机界面上的“设定初始位置”→“读取初始位置”调出已调试好的机器人初始位置数据,并单击“添加”按钮,把初始位置数据作为机器人爬楼梯动作的第1帧,如图7-125所示。

2)将头脑中人类爬楼梯的动作分解成一个个更细小的动作,也就是我们这里指的“帧”。首先假设我们人直立站在楼梯台阶前,下一步动作应该是抬脚,即一只脚抬起来,另一只脚站立,且要保持平衡。双足机器人也是一样,下一帧数据就是要让机器人一脚站立,另一只脚离开地面,这中间不可能只有离开地面的那个舵机在动,因为要平衡,另一只脚胯部舵机,脚腕部舵机等都需要调整。调整完这一帧数据后,机器人仍需保持平衡不倒。

这里,我们首先令右脚作为机器人支撑脚,左脚抬起,作为爬楼梯动作第2帧。

要完成这个动作,我们分别通过滑块修改左腿跨部舵机CH8、右脚跨部舵机CH13参数,修改范围大约为95~110之间,使机器人重心转移到右腿上。然后修改左腿腿部各舵机CH9、CH10、CH11、CH12和右腿腿部各舵机CH14、CH15、CH16、CH17参数,使机器人左腿抬起且右腿能够作为支撑腿保证机器人单腿站立而不倒。调试完成后,单击“添加”按钮,将这一帧添加到数据显示区域中,如图7-126所示。

3)修改左腿腿部各舵机CH9、CH10、CH11、CH12参数,使机器人完成“右腿不动,左脚放在台阶上”的动作,作为第3帧数据添加到数据显示区域,方法同上。

4)修改左腿跨部舵机CH8、右脚跨部舵机CH13参数,修改范围大约为70~85之间,使机器人重心转移到左腿,并修改左腿腿部各舵机CH9、CH10、CH11、CH12和右腿腿部各舵机CH14、CH15、CH16、CH17参数,令机器人完成“重心由台阶下的右脚转移到台阶上的左脚”的动作,作为第4帧数据添加到数据显示区域。

978-7-111-57208-4-Chapter07-172.jpg

图7-125 设置机器人初始位置为爬楼梯动作第一帧

978-7-111-57208-4-Chapter07-173.jpg

图7-126 添加抬腿动作作为爬楼梯动作的第二帧

5)修改右腿腿部各舵机CH14、CH15、CH16、CH17参数,使机器人完成“左脚不动,台阶下的右脚抬起”的动作使右脚离开地面,整个机器人由台阶上的左腿单独支撑。将调试好的数据作为第5帧数据添加到数据显示区域。

6)修改右腿腿部各舵机CH14、CH15、CH16、CH17参数,使机器人完成“将已抬起的右脚放到台阶上”的动作,此时机器人重心仍在左腿上,右脚轻放在台阶上,不作支撑机器人重量使用。将调试好的数据作为第6帧数据添加到数据显示区域。

7)将机器人的初始位置(双脚直立状态)数据,作为上台阶动作的第7帧添加到数据显示区域,方法同第一帧数据的添加方法。

调试一个复杂动作的过程就是上面的一个过程。

8)我们在调试完整个分解过程后,就需要把这些分解后的动作连起来,也就是我们把整个一组数据发到单片机里后,看看效果如何。

首先单击“发送”按钮,将动作数据下载到机器人处,然后单击“复位”按钮让机器人先复位到初始位置,最后单击“运行”,察看所调试的完整动作。

有时你会发现,单个动作都没有问题,但连起来会出问题,也就是衔接不好。这可能是两方面的原因:

①动作分解得不够细,中间动作丢失,失去了衔接;

②动作速度位不对,比如由一组动作切到另一组,由于速度太快,机器人有惯性,也会失去平衡。

在这种情况下,继续细调数据,使之更好地衔接并使速度设置更合理些即可。

同样的,有时由于动作分解过细,也会出现很多冗余帧,使数据量变大。实际上没有这些数据,机器人同样可以很好地完成动作,为了简单化,应删掉多余的数据帧。

调试过程中,有时不知道该给每个舵机调多少才能到达某种状态并保持平衡,我们可以采取先断电,用手把机器人扳倒那种状态,大概观察下舵机的位置,然后再通电,利用上位机同步模式来拉动滑块,使舵机到达记录的那种状态,之后再进行细调。

9)调试好的动作,单击“保存”按钮,弹出如图7-127所示对话框,将文件名设定为“上台阶.dat”,然后单击右边的“保存”按钮。

2.让机器人执行多组动作

(1)多组动作发送 多动作也是复杂动作的一种,比如我们想让机器人先走路,再爬楼梯,再翻跟头等等,这就需要我们事先调试好这些单独的动作,再依次发到单片机里,我们注意到上位机程序右上角有个组号,这个组号就是表示数据在下位机中存放的区域,如图7-128圈中标注所示。

1)先向单片机里发送第一组数据:走路。方法如下:单击“浏览”,选择已经保存好的走路数据,之后单击“打开”按钮,如图7-129所示。

2)然后单击“发送”按钮,将走路数据发送到下位机第0号数据存储区域中。

3)同上述步骤,再向下位机第1号动作存储区域中发送爬楼梯数据。唯一不同的是在单击“发送”按钮之前,要把组号框中的“0”改成“1”,之后再单击“发送”以后各动作以此类推,均发送到不同的指定区域中。如果不改组号,则存储区域中的数据将被新发送过来的数据所覆盖,以最后一次发送的动作为准。

978-7-111-57208-4-Chapter07-174.jpg

图7-127 保存已调试好的机器人动作数据

978-7-111-57208-4-Chapter07-175.jpg

图7-128 上位机软件组号标注

978-7-111-57208-4-Chapter07-176.jpg

图7-129 打开走路数据文件

(2)动作组编排 将已经存储到机器人下位机中的各组动作,通过动作组编排方式,以我们所需要的顺序,控制机器人来执行。比如我们存放时顺序为:1、走路;2、爬楼梯;3、翻跟头;4、踢球;5、鲤鱼打挺;6、招手;7、摇头;8、俯卧撑(注意:走路为第1套动作,其存放在第0组,即组号为0。依此类推,第8套的俯卧撑存放在第7组中,组号为7)。现在让它执行6、招手→1、走路→7、摇头→4、踢球。方法如下:

1)单击菜单中的“设置”→“动作顺序”,弹出如图7-130所示窗口。

2)依次双击左侧框中的“动作6”、“动作1”、“动作7”、“动作4”即可,注意左边框里数据的变化,右下角的重复框中,填入“1”如图7-131所示。

978-7-111-57208-4-Chapter07-177.jpg

图7-130 动作执行顺序编排窗口未进行设置

3)编排窗口右面1~4区域中对应的数据为6、1、7、4,然后单击“确定”。回到主界面,再单击上位机软件下部的“顺序”按钮,机器人即可按要求依次执行6、1、7、4四个动作。

1.调试出一个复杂动作的方法有哪些?

答:(1)通过已经有的机器人录像进行动作分解,单个调试分解动作,然后再在各分解动作中间插入必要的衔接动作。

(2)不加电自己将机器人摆成所调试动作中关键的几帧,目测每一帧中各个舵机位置,然后加电修改舵机角度,到达这些位置,最后再在中间插入必要的衔接动作。

2.如何发送多组数据到单片机?

答:修改上位机软件中的数据组号,然后一组组发送即可。

978-7-111-57208-4-Chapter07-178.jpg

图7-131 动作执行顺序编排窗口设置完成

3.怎样让机器人按设定的动作顺序运行动作?

答:通过动作顺序调试设置运行“顺序”即可。

1)掌握双足步行机器人上位机语音控制平台的安装。

2)学会语音控制平台的设置和调试。

3)应用机器人语音控制平台控制机器人完成动作。

4)编写语音识别程序,并调试。

硬件设备:

PC一台(要求:内存:256MB及以上、CPU:1.8GHz、声卡:独立多功能声卡、麦克:质量中上等的麦克)、串口通信线、双足步行机器人一台、充电电池一块、语音识别加密狗一个。

软件设备:

Windows2000/NT/XP或以上版本操作系统、语音识别SDK(语音识别库——Mandarin8kHz3.0、asrapi.dll、ASRAPI.h、asrapi.lib)、语音识别加密狗驱动程序、语音合成服务器系统InterPhonic CN Rev1.0版。

1.语音识别原理

语音识别分为预处理、特征提取、模式匹配三部分,如图7-132所示。

978-7-111-57208-4-Chapter07-179.jpg

图7-132 语音识别算法原理框图

不同的语音对应着不同的波形,预处理过程把声音转换成相应的波形,特征提取模块提取波形的波长,频率等特征,如“招手”和“下蹲”这两句话预处理完之后对应着完全不同的波形,根据提取的特征和模型库中的模型进行匹配,得到相应的文字,这样就完成了整个语音识别的过程。

2.双足机器人语音识别功能模块

双足机器人语音识别功能模块利用语音识别产品Pattek ASR SDK在Visual C++6.0环境下进行开发。

模式语音ASR是国内首屈一指的整套语音识别解决方案,具备中文、英文等多种语言的连续语音识别以及听写功能,适合于开发计算机、电话、嵌入式终端等各种设备上的语音应用程序。

依托中国科学院自动化研究所在语音识别研究上二十年的技术积累,Pattek ASR具有易用性强,识别率高的特点。用户无须进行训练,引擎的设计已经保证了非特定人这一重要特点;API提供的管理工具可以使得用户可以自如地定义自己所需的词表和语法,以便应付不同的应用需求。API就是应用程序编程接口。它是能用来操作组件、应用程序或者操作系统的一组函数。典型的情况下,API由一个或多个提供某种特殊功能的DLL组成。(Java中有所不同,但大同小异)。DLL是一个文件,其中包含了在Microsoft Windows下运行的任何应用程序都可调用的函数。运行时,DLL中的函数动态地链接到调用它的应用程序中。无论有多少应用程序调用DLL中的某个函数,在磁盘上只有一个文件包含该函数,且只在它调入内存时才创建该DLL。

双足机器人语音识别功能模块的程序流程图如图7-133所示。

978-7-111-57208-4-Chapter07-180.jpg

图7-133 语音识别模块流程图

3.双足机器人上位机语音识别程序框架

在程序的开始,首先要利用SDK提供的Asr_SetSystemDir()函数设置识别引擎工作的系统目录,主要是指定声学模型所在的目录,然后利用Asr_SysInit()初始化语音识别系统。

如果语音识别系统初始化成功,则可以利用Asr_LineInit(ResultProc)函数来创建一个识别引擎hLine,并指定该引擎将结果识别出来时的回调函数以及用户定义数据。

在本文中我们对语音识别回调函数定义为

DWORD ResultProc(HASRLINEhLine,const PASR_NOTIFY pNotify,DWORD dwUserDa-ta);

其中pNotify是回调通知,它的结构体如下:

978-7-111-57208-4-Chapter07-181.jpg

这个结构在回调函数中返回与语音以及语音识别结果相关的数据,其中NotifyType为通知类型,包括:

NOTIFYRESULT 1 //识别结果

NOTIFYVOICELEVEL 2 //声音大小

NOTIFYUTTBEGIN 3 //一句话开始

NOTIFYUTTEND 4 //一句话结束

data:当NotifyType为NOTIFY_VOICE_LEVEL时,data表示当前录音的大小,Notify-Type为其他值时,data无意义。

dwReserve:保留,无意义。

然后我们创建录音回调函数,录音回调函数用来记录语音数据形成数据问件,供语音识别回调函数调用。录音回调函数如下:

978-7-111-57208-4-Chapter07-182.jpg

成功创建一个识别引擎后,利用Asr_GrammarLoad()函数来导入语法规则文件中的语法规则,并对语法规则进行设置。语法规则文件可以由用户按照语法规则的要求根据需要自己编写,语音识别所需要用到的语法规则,遵循ABNF范式(Augmented BNF),兼容W3C语法定义。语法规则的结构体如下所示:

978-7-111-57208-4-Chapter07-183.jpg

978-7-111-57208-4-Chapter07-184.jpg

我们可以使用该结构来设置、切换、关闭识别引擎对应的语法规则。其中:nNum是语法规则的数量;szRuleName是语法规则的名字,一个语音识别引擎可以设置多个语法规则。

成功导入语法规则后,我们利用AsrGrammarActivate()函数来激活语法规则,设置AsrRecSetAutoWork(true)函数由引擎内部自动采集语音数据,然后调用Asr_SetParam()函数设置录音以及引擎相关的参数,最后调用函数Asr_RecStartX(hLine)开始自动识别。

端点检测到语音大于系统设置的起始话音音量并进行录音,当语音小于设置的结束音量停止录音。语音识别系统对语音进行识别,通过回调函数得到回调通知,利用Asr_GetNBe-stResult()函数获得识别结果。

如果不再需要语音识别,利用Asr_RecStopX(hLine)函数停止由Asr_RecStartX函数开启的识别任务,利用Asr_LineRelease(hLine)函数关闭hLine语音识别引擎,并且释放其相关的资源,利用Asr_SysRelease()函数退出系统,清除识别系统申请的资源。

实验(一) 安装语音控制平台

1)安装语音合成软件InterPhonic CN Rev1.0版,安装iFlyTTSSDK,安装加密狗配置程序(在安装盘中)。

2)在系统DSN里注册数据源,选择驱动Microsoft access driver(∗.mdb)建立数据库ShuangZudb.mdb。具体操作步骤如下:

打开控制面板→管理工具→数据源(ODBC)→系统DSN→添加→选择Microsoft access driver(∗.mdb),单击“完成”后→在数据源名里输入dashendb,同时单击数据库“选择”按钮,在目录项中选择相应路径(如D:\......\语音控制实验\Data)下的Shuang-Zudb.mdb,并在数据库名的编辑框中填入ShuangZudb.mdb即可。

3)把串口1和无线发射器连接起来。

4)插上传声器(即麦克风)。

实验(二) 熟悉语音控制平台

1.界面设置

打开文件“语音控制实验”→“语音控制平台”→RobotSoft.exe,就会出现如图7-134的主界面。

菜单栏主要包括登录选项、功能设置、界面设置、版本信息、退出(退出密码:000)。

状态栏主要包括成功语音识别初始化信息、语音合成初始化信息、视频初始化信息。

当用户对着话筒按照界面左侧移动的字幕讲话时,如:一号跳街舞,通过语音识别就可以命令机器人做各种动作。

注意:当讲完话后机器人没有任何反应时,可能有两个原因:①串口不一致。解决方法:若有两个串口,必须连接至串口1上,若因特殊原因连接至串口2上,打开“语音控制平台”文件夹,打开文件“ComSet.ini”,将“nPort=1”改成“nPort=2”,之后保存即可。②必须用音效较好的传声器,且不能将音量控制中的传声器的音量调制得太高。一般还要在传声器的“高级”设置里将“Mic Boost”复选上,有少数情况下(如计算机差异的原因)不能复选。

2.识别语音设置

打开菜单项“登录选项”,单击“登录”,在弹出的对话框中输入登录密码(000),单击“登录”即可看到图7-135。

系统默认得起始音量是100,最高音量是300。用户可以根据需要自由设置音量大小(起始音量<最高音量),只要用户说话得音量在这两个数值之间,系统都能成功识别。

978-7-111-57208-4-Chapter07-185.jpg

图7-134 主界面

978-7-111-57208-4-Chapter07-186.jpg

图7-135 语音识别音量设置

实验(三) 编程实现语音识别模块

1)编写语音识别模块VC控制平台程序。

打开Microsoft Visual C++6.0,新建一个工程:选Win32 Console Application,工程名可写为“Yysb”,Location可以根据需要自己设定,单击OK,选择“A‘Hello,World!’appli-cation.”,然后单击“Finish”,单击“OK”。单击工作区中的Class view选项卡中的Yysb classes前的“+”,再单击Globals前的“+”,然后双击Globals中的成员函数。然后在右边的代码编辑器中,将注释号“//”下面的内容删除掉,然后编写语音识别模块VC控制平台程序。

语音识别模块VC控制平台程序示例:

#include978-7-111-57208-4-Chapter07-187.jpgstdafx.h978-7-111-57208-4-Chapter07-188.jpg

#include978-7-111-57208-4-Chapter07-189.jpgstdio.h978-7-111-57208-4-Chapter07-190.jpg

#include978-7-111-57208-4-Chapter07-191.jpgiostream.h978-7-111-57208-4-Chapter07-192.jpg

#include978-7-111-57208-4-Chapter07-193.jpgasrapi.h978-7-111-57208-4-Chapter07-194.jpg

#include978-7-111-57208-4-Chapter07-195.jpgwindows.h978-7-111-57208-4-Chapter07-196.jpg

#defineONLINETEST

HASRLINEhLine;

//录音回调函数

int cb(constchar∗pbuf,int size)

978-7-111-57208-4-Chapter07-197.jpg

978-7-111-57208-4-Chapter07-198.jpg

978-7-111-57208-4-Chapter07-199.jpg

978-7-111-57208-4-Chapter07-200.jpg

2)编写语法规则。新建一个记事本命名为test.grm,在里面写入:

978-7-111-57208-4-Chapter07-201.jpg talk=(∗∗∗|...)<0->978-7-111-57208-4-Chapter07-202.jpg talks(∗∗∗|...)<0->;

978-7-111-57208-4-Chapter07-203.jpg talks=

你好|

你会唱歌吗|

你多大了;

注:test.grm文件增加语法的规则:若“978-7-111-57208-4-Chapter07-204.jpg talks=”后面增加要识别的语句,则需另起一行并且顶行开始以“|”结尾,每一条语句为一行,文件的最后一条语句以“;”结尾。否则不能进行识别!

然后再新建一个记事本命名为test.lec,test.lec是注音文件,其中第一行的数字是要注音的语句的个数。在里面写入:

3

你好ni 3hao3

你会唱歌吗ni3 hui4 chang4 ge1 ma1

你多大了ni3 duo2 da4 le1

3)把Mandarin_8KHz3.0、asrapi.dll、ASRAPI.h、asrapi.lib(D:\......\语音控制实验\所需复制的文件\bin中)、test.grm、test.lec文件复制到当前程序所在的目录下。

4)打开VC++6.0建立的语音识别控制台程序,设置link库文件:打开工程(project)菜单->setting…打开工程设置(project setting)对话框,选择link选项卡,在object/library modules编辑框中添加asrapi.lib(注:如果有多个link库文件,文件之间要用空格隔开),单击OK。

5)在工程中加入ASRAPI.h文件:单击工作区中的fileview选项卡,右击HeaderFiles->Add files to folder…打开选择文件对话框选中ASRAPI.h文件,单击确定。

6)最后对程序进行编译和运行,就会出现如图7-135的界面,然后对着传声器说你好、你会唱歌吗,你多大了,即可以识别,若要增加识别语句,可以在遵循语法规则在test.grm文件和test.lec文件里增加。

1.简述语音识别的原理,并想象语音识别在现实中可应用在哪些方面?

答:语音识别分为预处理、特征提取、模式匹配三部分。预处理过程把声音转换成相应的波形,特征提取模块提取波形的波长,频率等特征,根据提取的特征和模型库中的模型进行匹配,得到相应的文字,这样就完成了整个语音识别的过程。语音识别适合于开发计算机、电话、嵌入式终端等各种设备上的语音应用程序。

2.利用编好的语音识别模块,使之能够和使用者进行简单的语音互动,如编写一个记事本程序用语音控制字符的输出等。(选做)

如图7-136所示为语音识别模块VC控制平台运行结果。

978-7-111-57208-4-Chapter07-205.jpg

图7-136 语音识别模块VC控制平台程序运行结果

语音识别模块函数详细说明:

Asr_SetSystemDir

•函数原型:

ASRERROR ASR_API_Asr_SetSystemDir(constchar∗psDir);

•输入参数:

psDir:声学模型所在的目录。

•输出参数:

无。

•返回值:

返回错误码,ASRERROR_OK表明操作成功。

•描述:

设置识别引擎工作的系统目录,主要是指声学模型所在的目录。在调用初始化函数Asr_SysInit之前应该先调用此函数。

Asr_SysInit()

•函数原型:

ASRERROR_ASR_API Asr_SysInit(const char∗sInCfgFileName=NULL);

•输入参数:

sInCfgFileName:资源配置文件名,默认为NULL。

•输出参数:

无。

•返回值:

返回错误码,ASRERROR_OK表明操作成功。

•描述:

识别系统的初始化函数。

Asr_LineInit(ResultProc)

•函数原型:

HASRLINE ASR_API Asr_LineInit(FNRESULTNOTIFY fnNotify,DWORD

dwUserData=NULL);

•输入参数:

fnNotify:回调函数,识别结果等信息通过此函数返回给用户,详见结构

说明。

DwUserData:用户自定义数据。

•输出参数:

•返回值:

引擎句柄,详见结构说明

•描述:

创建一个语音识别引擎,并指定该引擎识别结果出来时的回调函数以及

用户定义数据。

Asr_GrammarLoad()

•函数原型:

ASRERRORASR_APIAsr_GrammarLoad(HASRLINE hAsrLine,const char

∗sInGrammarFileName,int nCode=CHARACTER_GBconst char∗szLexi-

conName=NULL);

•输入参数:

hAsrLine:识别引擎的句柄,由引擎初始化函数Asr_LineInit得到。

sInGrammarFileName:语法规则文件名。

nCode:字符编码,默认为GB2312。

szLexiconName:注音文件名。

•输出参数:

无。

•返回值:

返回错误码,ASRERROR_OK表明操作成功。

•描述:

导入语法规则文件中的语法规则。如果语法中有非标准发音字符或者多音字,可以在第二个参数中提供注音文件,这个文件是文本文件,第一行为符号个数,以后每行为一个词或者符号,然后是空格,后面接发音,多个发音之间用“|”分隔。当这个参数为空时,将尝试查找和语法规则文件名相同,后缀为“lec”的文件。注音规则是:如果注音文件里提

供,直接采用注音文件里的发音,否则尝试自动注音,自动注音失败将

返回错误。

Asr_GrammarActivate

•函数原型:

ASRERROR_ASR_API Asr_GrammarActivate(HASRLINEhInAsrLine,const

char∗pGrammar);

•输入参数:

hAsrLine:识别引擎的句柄,由引擎初始化函数得到。

pGrammar:语法规则名。

•输出参数:

无。

•返回值:

返回错误码,ASRERROR_OK表明操作成功。

•描述:

设置识别引擎的语法规则。必须首先使用Asr_GrammarLoad或Asr

GrammarLoadFromBuffer函数载入到系统中。

Asr_RecStart

•函数原型:

ASRERROR ASR_API Asr_RecStart(HASRLINE hInAsrLine,int nWave_

Format);

•输入参数:

hAsrLine:识别引擎的句柄,由引擎初始化函数得到。

CWaveFormat:待识别语音的格式,见头文件定义。

•输出参数:

无。

•返回值:

返回错误码,ASRERROR_OK表明操作成功。

•描述:

在这一识别引擎中开始等待填充语音数据进行识别。调用此函数必须编

写程序采集语音数据,接着调用Asr_RecFillWaveBuffer填充语音数据。

当数据足够产生结果的时候引擎将会自动结束并返回结果。如果数据已

经全部输入还没有得到结果,或者想立即得到结果,可以调用Asr_Rec-

Stop主动结束并返回结果。

Asr_SetParam

•函数原型:

ASRERROR_ASR_API Asr_SetParam(HASRLINE hInAsrLine,int type,

DWORDdata);

•输入参数:

Type:设置参数的类型。

Data:参数的值。

•输出参数:

无。

•返回值:

返回错误码,ASRERROR_OK表明操作成功。

•描述:

设置录音以及引擎相关的参数,type取值以及含义如下:

5:是否连续录音识别。如果为1表示连续的录音和反馈识别结果,中间不需要干预。如果为0表示每次识别出一个结果后将停止录音,需要再次调用AsrRecStartX才能进行下一次识别。

8:设置在录音的时候是否检测前端点,如果不进行前端点检测,将从调用AsrRecStartX之后,认为所有的声音都为说话声,录音数据送入识别引擎进行识别。

Data不为0表示不进行端点检测,0为端点检测。默认为进行端点检测。

9:是否进行尾端点检测。在检测前端点的前提下,可以进一步决定是否进行尾端点检测。如果进行尾端点检测,在开始说话后停顿一定的时间就认为该句话结束,停顿时间由本函数type为13设定。

10:起始话音音量,默认为100。

11:说话结束音量,默认为300。

12:起始话音长度,如果超过这个时间,认为说话开始,单位为毫秒,默认为120。

13:词之间最长停顿时间,如果超过这个时间,将视为说话结束,单位为毫秒,默认为360。

15:设置录音长度,一旦录音超出这个时间,将强制结束并识别,单位为毫秒。

Asr_RecStart

•函数原型:

ASRERROR ASR_API Asr_RecStart(HASRLINEhInAsrLine,int nWave-Format);

•输入参数:

hAsrLine:识别引擎的句柄,由引擎初始化函数得到。

CWaveFormat:待识别语音的格式,见头文件定义。

•输出参数:

无。

•返回值:

返回错误码,ASRERROR_OK表明操作成功。

•描述:

在这一识别引擎中开始等待填充语音数据进行识别。调用此函数必须编写程序采集语音数据,接着调用Asr_RecFillWaveBuffer填充语音数据。

当数据足够产生结果的时候引擎将会自动结束并返回结果。如果数据已经全部输入还没有得到结果,或者想立即得到结果,可以调用AsrRec-

Stop主动结束并返回结果。

Asr_GetNBestResult()

•函数原型:

HASRLINE hAsrLine,int& nCount,char∗ ∗& result,int∗& Confidence

•输入参数:

hAsrLine:识别引擎的句柄,由引擎初始化函数得到。

nCount:根据打分由高到低能够获取的识别结果的个数。

Result:识别结果字符串指针。由result[0]到result[nCount]依次为最好的结果,次好的结果等。

Confidence:识别结果打分。由result[0]到result[nCount]依次为最高分,次高分。

•输出参数:

无。

•返回值:

返回错误码,ASRERROR_OK表明操作成功。

•描述:

获取按照准确度排序的识别结果以及打分。参数内存分配和释放由sdk

内部维护。

Asr_RecStop

•函数原型:

ASRERROR ASR_API Asr_RecStop(HASRLINE hInAsrLine);

•输入参数:

hAsrLine:识别引擎的句柄,由引擎初始化函数得到。

•输出参数:

无。

•返回值:

返回错误码,ASRERROR_OK表明操作成功。

•描述:

停止这一个引擎的识别任务,可以在Asr_RecStart函数执行后任何时候

执行此函数,此函数执行后要再次识别时需重新调用AsrRecStart函数。

Asr_LineRelease(hLine)

•函数原型:

ASRERROR Asr_LineRelease(HASRLINEhAsrLine)

•输入参数:

hAsrLine:识别引擎的句柄,由引擎初始化函数Asr_LineInit得到。

•输出参数:

无。

•返回值:

返回错误码,ASRERROR_OK表明操作成功。

•描述:

关闭这一个语音识别引擎,并且释放其相关的资源。

Asr_SysRelease()

•函数原型:

ASRERROR ASR_API Asr_SysRelease();

•输入参数:

无。

•输出参数:

无。

•返回值:

返回错误码,ASRERROR_OK表明操作成功。

•描述:

系统退出时调用,清除识别系统申请的资源。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈