现在的位置: 首页 > 专题 > 机器人 > Robotics Studio > 设计中心 > 文档 > 专题 > 机器人 > 正文

Robotics Studio学习教程:第四天——行走机器人

2014年04月20日 Robotics Studio, 文档, 机器人 ⁄ 转载:原文链接 ⁄ 共 2905字 ⁄ 字号 暂无评论 ⁄ 阅读 961 次
Microsoft Robotics Studio

Microsoft Robotics Studio

继之前分享的一篇《Robotics Studio学习教程:第三天——Activity介绍》,我们将继续分享下一篇《Robotics Studio学习教程:第四天——行走机器人》,让我继续开始我们学习Visual Programming Language,以及使用Robotics Studio学习开发机器人应用的道路吧。

[Robotics Studio] 自走型机器车 -- Day4

之前写的程序只能算是遥控器而已啊~

现在我们要开始写一个自己会动作的机器车子, 这样才符合 Robotics 这样的主题啊~

从简单的写起, 先写一个由自己的所在开始, 探索自己周围的简单机器车子吧, 假设车子的行走路径如下:

clip_image002[1]

就是一个越来越大的 L 型路径, 所以我们只要把 L 型路径写成一个  Activity, 然后由外部输入这个 L 的大小, 最后这个 Activity 要能够在完成行走路径时吐出更大的 L 大小, 就大致完成这样的程序了.

根据这个构想, 拖一个 Activity 来, 改名成为 RunL , 然后把输入定为 size , 类别是 double, 至于输出, 考虑这个情境的输出应该算是 Notification , 为什么是通知而不是输出呢?

最主要是因为机器完成时都是使用通知来告诉我们, 而我们的 L 型路径的完成也是靠通知才知道的, 所以这个例子的输出是 Notification, 如下

clip_image004[1]

clip_image006[1]

现在开始构思该如何写里面的流程,  根据 GenericDifferentialDrive 可以接受的指令, 只有前进一段距离, 以及旋转一个角度,  所以我们的 L 型路径应该由 1.前进 , 2.旋转 90 度, 3 前进, 4.旋转 90 度 (为了下一次的 L) 四个部分来组成.  而每一个部分的完成都是靠通知来完成, 并不是靠当下 GenericDifferentialDrive 的输出, 所以当我们收到通知时, 有必要知道 目前我们处于哪一个状态, 而决定应该如何进行下一个步骤, 这个在离散数学上就算是 Finite State Machine , 在 VPL 处理 FSM的问题就是靠变量 (Variables) , 所以, 除了 1. 前进是靠外部输入驱动以外,  2,3,4 都是靠 GenericDifferentialDrive 的完成通知啰.

然后我们再靠一个 CurrentState 的变量, 来决定我们该进行哪一个动作. 当我们拖拉一个 Variable 到 RunL 里面时, 看右边的属性表, 可以从那里新增一个变量, 我们新增一个 CurrentState, 类别是 int, 如下

clip_image008[1]

然后在输入数据时, 就把一个 Data 值为 1 的作为该变量的 SetValue,  再把输入的 size 输入给 GenericDifferentialDrive 的 DriveDistance, 设定如下:

clip_image010[1]

意思是以 100% 的速度前进 value 这样的距离.

因为等一下还需要知道使用者输入的 size, 所以也顺便把 size 储存为 CurrentSize (用 Variable 的 属性表当中的 Add 就可以新增一个变量) 现在 RunL 的内容应该如下:

clip_image012[1]

然后我们在 Digram 输入一个 0.5 的值给这个 RunL 的 size, 如下

clip_image014[1]

现在请记得把 RunL 里面的 GenericDifferentialDrive 设定为 use a Manifest, 我们仍然可以使用 LEGO.NXT.Tribot.Simulation.Manifest.xml 这个设定, 你可以试跑看看, 是否会跑一个小直线呢?

现在我们要接着完成 2. 旋转, 3. 前进, 4. 旋转, 5. 通知完成 这样的步骤, 对于每一个使用者自定义的 Activity, 都有一个特定的称为 "Start" 的 Activity, 这个的目的就是用来做为通知, 或是启动等等的流程撰写, 在 Start 里面的流程都没有输出以及输入, 但是里面的组件可以有 Notification, (Diagram 里面的也可以有).

为了要收到 GenericDifferentialDrive的通知, 所以我们要把 GenericDifferentialDrive 的组件放到 Start 这个 Activity 当中, 你可以在活动编辑红色按钮左边看到 Action 下拉按钮, 当中就有 "Start" , 如下:

clip_image016[1]

建议先从原本 (Action) 当中复制 GenericDifferentialDrive 组件, 切换到 Start Action 后, 贴上 GenericDifferntialDrive 组件 (当然也可以拖拉一个 GenericDifferentialDrive 组件上来, 但是要注意设定要选为 use a Manifest, LEGO.NXT.Tribot.Simualtion.Manifest.xml ), 你会注意到组件右边有红色圈圈, 那个就是 Notification (通知), 由于我们要打算只收到两种通知, 分别是完成前进 (DriveDistance) 动作以及完成旋转 (RotationDegrees)动作, 所以我们放两个 If 来判断这两种通知.

接收 DriveDistance 的 If 要写 value.DriveDistanceStage == DriveStage.Completed , 而接受 RotationDegrees 的 If 就写 value.RotateDegreesStage == DriveStage.Completed , 然后将这两个 If 的判断 Merge 以后输出给一个 Calculate, 当中填入 state.CurrentState + 1 , 再把这个 Calculate 的结果喂给 CurrentState 变量, 如下:

clip_image018[1]

这样我们就完成了 "收到通知以后, 将状态 + 1 " 这件事情. 但我们还要完成一件事情就是 "将状态 + 1 以后, 根据目前状态决定该做甚么事"。所以, 设完变量以后, 再喂给另一个 Calculate, 此次我们填入 state.CurrentState , 然后后面再加上 Switch 判断:

2 的时候就喂给 GenericDifferentialDrive 一个全力 (power=1)旋转 90 度,

3 的时候就喂给 GenericDifferentialDrive 一个全力 (power=1)前进 (Distance= state.CurrentSize)

4 的时候就喂给 GenericDifferentialDrive 一个全力 (power=1)旋转 90 度,

5 的时候喂给 RunL  (建议可以去 Diagram 复制一个来用) 一个 size = -1 的值, 当作结束.

现在程序如下:

clip_image020[1]

因为我们设定了 size=-1 为完成, 所以还要去 Action 里头多做一个判断, 当 Size=-1 就发一个通知 (Notification) 值可以设为 state.CurrentSize , 如下:

clip_image022[1]

最后, 我们再去 Diagram 设定 RunL 的通知再透过 Calculate 将原本的 Size + 0.3  再喂给 RunL 如下:

clip_image024[1]

终于赶在午夜 12:00 以前完成今天的程序 (我又不是灰姑娘)

等一下可以紧接着在明天做更好的修正啰^ ^

 

让我们继续一下章教程:

《Robotics Studio学习教程:第五天——MSRS 概况 (Overview)》

fgx

分享到:

Wopus问答

×