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

    

我们要把L型路径写成一个Activity,然后由外部输入这个L的大小,最后这个Activity要能够在完成行走路径时吐出更大的L大小。

完成第一步前进动作:

第一步:拖动一个Activity,改名为RunL,然后把输入定为size,类别为double。而输出是Notification。(因为机器完成时都是使用通知来告诉我们,而我们L型路径的完成也是靠通知才知道)

  

  

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

除了1、前进是靠外部输入驱动以外,2、3、4都是靠Generic
Differential Drive完成通知的,

然后我们靠一个CurrentState的变量来决定我们该进行哪一个动作:

第二步:从Basic
Activity中拖动一个Variable到RunL里面(不是Diagram中)。右边的属性表里可以新增变量,我们新增一个CurrentState,类别是int,如下:

  

第三步:再输入资料时就把一个Data值为1作为该变量的SetValue。

第四步:再把输入size输入给Generic
Differential Drive(配置参考学习二)的DriveDistance设定如下:(以百分之一百的速度前进value这样的距离)

  

第五步:由于等一下还须知道使用者输入的size,所以也顺便把size存储为CurrentSize。现

在RunL的内容应该如下:

  

第六步:在Diagram输入一个0.5的值(value)给RunL的size,如下:

  

(运行起来,机器车可以自动走一小段直线并停止。)

完成接下来的二、三、四步动作:

对于每一个使用者自定义的Activity,都有一个特定的称为“Start”的Activity,它是用来作为通知或者是启动等流程进行编写。在Start里面的流程都没有输出以及输入,但里面的元件可以有Notification。

第一步:为了收到Generic
Differential Drive(配置参考学习二)的通知,我们把Generic
Differential Drive放到Start里面。如下:

  

第二步:接下来,我们打算只收到两种通知,分别是前进(DriveDistance)以及旋转(RotationDegrees),所以放两个If来判断这两个通知,然后将这两个If的判断交给Merge,输出给一个Calculate,填入state.CurrentState+1,再把这个Calculate的结果交给CurrentState变量。如下图所示:

  

这样我们就完成了“收到通知以后,状态+1”的事情。

第三步:“状态+1”以后,根据目前的状态决定该做什么事:设完变量以后,在交给另一个Calculate,填入state.CurrentState。再加上switch判断:

2交给Generic
Differential Drive一个全力(power=1)旋转90度(Degrees=90)

3交给Generic
Differential Drive一个全力(power=1)前进(Distance=state.CurrentSize)

4交给Generic
Differential Drive一个全力(power=1)旋转90度(Degrees=90)

5交给RunL(建议去Diagram)一个size=-1的值,作为结束

如下图所示:

  

第三步:因为设定了size=-1为完成,所以要去Action那头多做一个判断,size=-1时就发出一个通知,如下图所示:

  

第四步:最后,回到Diagram,设定RunL的通知,再透过Calculate将DoneSize+0.3再交给RunL,如下图所示:

  

第四步:保存并运行。

  

(遇到了很多困难,不过都克服了,但是每次保存变量的值都保存不上,解决的方法只是一次设定一次运行,知道如何解决的朋友可以告诉我。)

2016-03-29

(资料整理于百度文库的《Microsoft_Robotics_Developer_Studio中文教程》)

最新文章

  1. linQ学习笔记之三高级语句
  2. Codeforces Round #277.5 (Div. 2) ABCDF
  3. php-empty()
  4. [deviceone开发]-cnodejs论坛移动端App
  5. ios工程中加入.c/.cpp文件
  6. php获得ip地址
  7. HNU 12812 Broken Audio Signal
  8. Android NDK 开发(二) -- 从Hlello World学起【转】
  9. js基础之DOM
  10. Qt Creator调试
  11. 【SPOJ】Transposing is even more fun!
  12. 关于ognl.OgnlException: target is null for setProperty(null的解决方案
  13. Effective Modern C++ Item 37:确保std::thread在销毁时是unjoinable的
  14. 一个JavaScript触发器插件,可通过指定频次、指定时间内触发指定的处理函数
  15. go的net/rpc用法
  16. PowerDesigner逆向生成MYSQL数据库表结构总结
  17. net core体系-web应用程序-4net core2.0大白话带你入门-10asp.net core session的使用
  18. JSTL的比较运算符有哪些,用例说说它们的作用
  19. c# 导出数据到excel
  20. threading实例

热门文章

  1. Linux初学:(一)Linux概述
  2. ASP.NET全局错误处理和异常日志记录以及IIS配置自定义错误页面
  3. Linux下磁盘挂载
  4. 1、策略模式(Strategy)
  5. [django/mysql] 使用distinct在mysql中查询多条不重复记录值的解决办法
  6. C#基础---Attribute(标签) 和 reflect(反射) 应用
  7. 【2016-10-16】【坚持学习】【Day7】【建造者模式】
  8. CRC校验码原理、实例、手动计算
  9. openstack上创建vm实例后,状态为ERROR问题解决
  10. VMware三种上网模型