Microsoft Robotics Studio中文教程1

发布时间 : 星期一 文章Microsoft Robotics Studio中文教程1更新完毕开始阅读

第四章 基于Microsoft Robotics Studio的机器人避障的实现 31

首先我们建立一个Activity框体,这个框体包括了激光传感器自身循环检测和数据前期处理与输出组件,我们将该模块命名为LaserRangeFinder。

图4.5 LaserRangeFinder的命名

我们将在这个窗体里建立激光测距传感器的数据预处理,,所以我们需要设定该模块的输入数据的数据类型和名称,在这里我们设置了六个输入量,分别是(括号中代表其数据类型):

i (int) 该数据代表激光传感器检测角度 Data (List of int) 该数据代表所测得的数据量表 Increment (int) 该数据代表步进的角度数

Nearest (int) 该数据代表一个用来记录所测量中的最小值的变量 Label (string) 该数据为字符型量,作为输出的数据标签 Limit (int) 该数据设定了检测角度的最大量

图4.6 LaserRangeFinder输入数据定义

基于Microsoft Robotics Studio的机器人设计 32

接下来我们将在Start标签页下建立最基础的服务,将激光测距传感器的数据传输到数据预处理组件中。我们将激光传感器按角度分为三个部分,分别赋予标签Label的值为Right、Center、Right,角度范围在输出端有专门的名称DistanceMeasurement.Length,我们将设定: 右侧(Label=Right)

0 < I < 3/8DistanceMeasurement.Length,

中部(Label=Center)

3/8DistanceMeasurement.Length < I < 5/8DistanceMeasurement.Length

左侧(Label=Left)

5/8DistanceMeasurement.Length < I < DistanceMeasurement.Length

我们将i的初始值设定成为每个标签中角度的最小值,同时将Limit的值设定为各标签中的最大值,作为各标签的界限。

同时我们设定三个标签下的角度步进量(Icrement)为12,这样检测的时候激光传感器会以12度的步进速度进行距离检测。Nearest的初始值我们统一设定为8000,这个值超出判断条件很多,不会引起误判断。Data值直接设定为激光测距传感器的测量数据列表。

图4.7 三个循环模块的初始值设定

第四章 基于Microsoft Robotics Studio的机器人避障的实现 33

现在我们对FindNearest这个分页面开始进行编辑,这个分程序是用来进行数据预处理的,该程序实现对每个角度范围内的障碍物到传感器最小值进行记录并赋到Nearest这个输出量上。

我们将刚才激光测距传感器输入的测量数据和预设值输入该模块,使用一个判断语句,若i+Increment>Limit则输出当前的Nearest值和标签Label;若这个条件不成立时将当前的测量数据Data[i]与Nearest的值进行比对,如果当前Data[i]值小于当前Nearest的值则将Data[i]的值赋到Nearest的值中,同时使i的值增加12度进行循环,这样在循环中程序可以输出在每个分割的范围中障碍物与传感器间最小值并输出到FoundNearest。

图4.8 分支程序FindNearest的程序设定

下面我们开始设计主程序,主程序的功能是将LaserRangeFinder输出的数据进行处理,同时将这些数据综合输入驱动模块。

在LaserRangeFinder中我们输出了三个标签和各自的数据,这些数据的同步性没有办法保证,所以我们使用主程序来进行处理,读出各标签所包含的数值。我们建立了两个变量Left和Right,这两个变量使用int的数据类型,将各个标签下的Nearest值读出后使用Join组件更改数值名输入驱动模块。

基于Microsoft Robotics Studio的机器人设计 34

图4.9 主程序的设定

最后我们将设计驱动模块,驱动模块包含了对传感器数据的处理和对驱动器行为的设定。

驱动模块的输入有三个数值:Right、Center、Left,这些数值是由

LaserRangeFinder组件读取的三个角度部分中的障碍物到传感器的最小值。我们在这个模块中使用了一个子变量State,这个变量设定为一个字符型变量,我们可以根据不同的输入数据设定该变量的数值,使其改变驱动器的状态。

当数据输入时,会分到三个判断中,第一个判断获得输入的数据,如果Center<1500则设定为向前驱动的同时将变量State赋值为Turn;第二个判断读取变量State的当前值,并判断State的值是否为Forward,如果State的值为Forward则转到第一个判断程序,如果否则转向第三个判断;第三个判断Center的数据是否大于2000,如果是则设定State的值为Forward,如果否则读取input.Left和input.Right的值的大小,若input.Left>input.Right则向左转,反之向右转。

联系合同范文客服:xxxxx#qq.com(#替换为@)