Robotics:编写和测试支持串行通信的VPL服务

正如您所想的,Microsoft Robotics Developer Studio (RDS) 是一个用于进行机器人编程的平台。 RDS 最早在 2006 年发布,最新的版本 RDS 2008 R2 发布于 2009 年 6 月。

RDS 主要由四个组件组成:并发和协调运行时 (CCR)、分散软件服务 (DSS)、可视化编程语言 (VPL) 和可视化模拟环境 (VSE)。

不过,本文主要介绍 VPL。VPL 是一种数据流语言,这意味着您是通过在屏幕上绘制图表来创建程序 的。在运行时,消息从图表中的一个块流向另一个块,这种数据流就是程序的执行路径。由于 VPL 基于 CCR 和 DSS 构建,因此数据流可以异步发生(作为服务通知的结果),也可以并行运行。尽管 VPL 适用 于程序员新手,但是有经验的程序员会发现它对于原型设计也很有用。

本文概要介绍一个简单的 RDS 服务,该服务使用串行端口(也称为 COM 端口)来发送和接收数据。 示例代码演示了编写可重用的 RDS 服务时涉及的一些关键概念。

RDS 服务

RDS 服务使用 CCR 和 DSS 构建。它们在概念上与 Web 服务相似,因为 RDS 拥有一种面向服务的体 系结构 (SOA),该体系结构基于具象状态传输 (REST) 模型,使用分散软件服务协议 (DSSP) 在服务之间 进行通信。仔细推敲这句话,您会发现它意味着您并非直接与 RDS 服务进行通信。实际上,您是向一个 代理发送消息,而该代理担当了服务的外部接口(Web 开发人员熟悉的一种方法)。这也意味着服务可以 分布在网络上的任意位置。

使用代理会产生两个效果。首先,在服务之间发送的消息会在传输之前序列化,并在另一端反序列化 。XML 是用来传输数据的一种有用格式。其次,代理定义了一个约定 - 实际上是向其他服务公开的一组 API。

每个服务都有一个内部状态,您可以通过对该服务进行操作来检索或修改状态。这就涉及了发送请求 消息以及等待响应消息,其过程类似于大多数 Web 服务所使用的过程。

当服务的状态改变时,它可以向订阅者发送通知。这种“发布和订阅”方法使 RDS 服务有别于传统的 Web 服务,因为通知消息是异步发送给订阅者的。

当您构建一个新服务时,该服务会在 VPL 中自动变为可见,因此您可以立即开始使用它。这是 RDS 的一项关键特性,它使测试和原型设计变得非常简单 - 您不需要用 C# 来编写测试工具,因为您可以使 用 VPL。

远程控制机器人

许多简单的教学机器人拥有 8 或 16 位微控制器作为其板载大脑。但由于 RDS 运行在 Windows 上的 .NET Framework 下,它不会生成能直接在这些机器人上运行的代码。因此,必须通过通信链接对它们进 行远程控制。(替代方法是使用板载 PC,例如 MobileRobots Pioneer 3DX。)

由于大部分微控制器都支持串行端口,串行连接是一个显而易见的解决方案。但是,使用电缆来提供 链接并不是理想选择,因为它会限制机器人的移动范围。

另一种方法是通过在机器人上安装串行到蓝牙转换设备,使用蓝牙来创建无线连接。有些机器人(例 如 LEGO NXT)本身就内置了蓝牙;而另一些(例如 RoboticsConnection Stinger)拥有可选的蓝牙模块 。蓝牙是一种不错的选择,因为蓝牙现已成为大多数便携式计算机的标准配备。即使您的 PC 没有蓝牙功 能,您也可以找到价格便宜的现成 USB 蓝牙设备。

一个好消息是您不需要了解蓝牙编程,因为与机器人的连接会显示为虚拟串行端口。您使用的代码与 通过物理电缆提供串行连接时基本相同。唯一的差别是您必须在 PC 与机器人上的蓝牙设备之间建立配对 ,这样才能创建虚拟 COM 端口。

有些机器人控制器板卡拥有固件,能够使用简单的命令语言来接受命令。例如,使用来自 RoboticsConnection 的 Serializer(因使用了串行协议而得名),您可以通过 HyperTerminal 等终端 程序向控制器输入命令。命令都是您可以直接看懂的,并且您通过按 Enter 来结束每个命令。

如果您在为机器人设计您自己的协议,则需要做出一些选择。首先,您必须决定是否要发送二进制数 据。将二进制值转换为十六进制或十进制用于传输,需要更多带宽,并且会增加板载 CPU 的处理开销。 而另一方面,它又使得阅读消息非常容易,您不会由于误解了控制字符而导致任何奇怪的行为。

下一个问题是,您是希望使用固定长度的数据包,还是希望使用更加灵活的可变长度格式。固定长度 更容易解析,最适合十六进制。

当然,您还应该考虑您是否要使用校验和。对于计算机之间的通信,计算校验位非常容易。但是,如 果您希望通过手动输入命令来测试机器人,计算校验位就会变得非常棘手。使用校验和时,通常接收方会 根据命令是否成功到达,回发确认 (ACK) 或否定确认 (NAK)。您对是否使用校验和的决定归根结底取决 于连接的可靠性。

时间: 2024-09-14 11:04:02

Robotics:编写和测试支持串行通信的VPL服务的相关文章

一步步教你编写可测试的Go语言代码_Golang

第一个测试 "Hello Test!" 首先,在我们$GOPATH/src目录下创建hello目录,作为本文涉及到的所有示例代码的根目录. 然后,新建名为hello.go的文件,定义一个函数hello() ,功能是返回一个由若干单词拼接成句子: package hello func hello() string { words := []string{"hello", "func", "in", "package&q

《编写可测试的JavaScript代码》——导读

前言编写可测试的JavaScript代码既然要对代码进行测试,那么为什么不让这一过程变得尽可能简单和轻松呢?JavaScript客户端代码测试之所以尤其困难,是因为我们几乎无法控制代码运行的环境.多种类型的操作系统.多个版本的操作系统.多种类型的浏览器.多个版本的浏览器,更不用说插件.扩展.多语言版本和缩放大小了,还有一些未知内容,所有这些因素交织在一起,阻碍着应用程序的性能.这些因素会导致程序变慢.中断.崩溃,最终覆灭.这里面的内容纷繁复杂!服务端JavaScript给了我们更多的控制权,以便

使用MVVM编写可测试的表示层

在使用 Windows 窗体时代的传统应用程序的情况下,标准测试做法是布局一个视图,在该视图的代 码隐藏文件中编写代码,然后运行该应用程序以进行测试.幸运的是,在那以后,相关做法有了一些变 化. Windows Presentation Foundation (WPF) 的出现将数据绑定概念提升到了一个全新的水平.它使得 一种称为"模型-视图-视图模型"(MVVM) 的新设计模式得到发展.通过 MVVM,您可以将表 示逻辑与实际表示分离开.基本上,这意味着您可以在极大程度上避免在视图的

编写可测试的 JavaScript

Twitter 的工程师文化要求进行测试,许多的测试.在进入 Twitter 之前我还未有过测试 JavaScript 的经验,所以在这之后我学习到了很多.特别是学到了许多过去我使用.书写和鼓励使用的代码其实是不利于书写可测试的代码的.所以我觉得在此分享我所学习到有价值的,如何书写可测试的 JavaScript 几条最重要的原则.这里提供的这些示例虽然基于 QUnit,但是也应该适用于其他的 JavaScript 测试框架. 避免单例 我最受欢迎的博文中的其中一篇就是关于如何使用 JavaScr

编写Android测试单元该做的和不该做的事

在本文中, 我将根据我的实际经验,为大家阐述一个编写测试用例的最佳实践.在本文中我将使用 Espresso 编码, 但是它们可以用到单元测试和仪器测试(instrumentation test)当中.基于以上目的,我们来研究一个新闻程序. 以下内容纯属虚构,如有雷同纯属巧合 :P 一个新闻 APP 应该会有以下这些 activity. 语言选择 - 当用户第一次打开软件, 他必须至少选择一种语言.选择后,选项保存在共享偏好中,用户跳转到新闻列表 activity. 新闻列表 - 当用户来到新闻列

编写 android 测试单元该做的和不该做的事

一个新闻 APP 应该会有以下这些 activity.   语言选择 - 当用户第一次打开软件, 他必须至少选择一种语言.选择后,选项保存在共享偏好中,用户跳转到新闻列表 activity.   新闻列表 - 当用户来到新闻列表 activity,将发送一个包含语言参数的请求到服务器,并将服务器返回的内容显示在 recycler view 上(包含有新闻列表的 id, news_list). 如果共享偏好中未存语言参数,或者服务器没有返回一个成功消息, 就会弹出一个错误对话框并且 recycle

《编写可测试的JavaScript代码》——1.4 小结

1.4 小结 编写可测试的JavaScript代码,并不能自动从敏捷.瀑布.TDD.BDD或任何其他软件开发方式中产生结果.可测试的JavaScript是编写短小.松耦合.独立的简单小块代码的一个保证.如何编写这样的代码取决于我们自己.希望本书能够帮助大家了解编写这种代码的方式. 编写可测试的代码会让我们的工作以及后续者的工作变得更加容易.从更少的Bug到更容易修复的Bug,从容易测试到简单调试,编写可测试的JavaScript是让我们保持清醒的方式. 最重要的是,不要忘记我们是为人编写代码,而

《编写可测试的JavaScript代码》——第1章 可测试的JavaScript

第1章 可测试的JavaScript 每个人的想法都是独一无二的,但代码不是.几乎每个行业都完成了机器革命,然而奇怪的是,计算机科学行业并没有.程序员基本上是在做已经做了40年的同样的事情.手工编写代码,接着这些代码被编译或解释,然后执行.看看输出结果,再确定是否需要再改代码.计算机科学的黎明到来之前,这种开发周期就一直这样保持不变.我们的机器在几何级变快,内存和二级存储大小是无限制的,且这样发展下去软件越来越复杂.但我们仍然一个字母一个键地手工编写着代码.我们依然滥用着"print"

《编写可测试的JavaScript代码》——第1章 可测试的JavaScript 1.1 现有技术

第1章 可测试的JavaScript 每个人的想法都是独一无二的,但代码不是.几乎每个行业都完成了机器革命,然而奇怪的是,计算机科学行业并没有.程序员基本上是在做已经做了40年的同样的事情.手工编写代码,接着这些代码被编译或解释,然后执行.看看输出结果,再确定是否需要再改代码.计算机科学的黎明到来之前,这种开发周期就一直这样保持不变.我们的机器在几何级变快,内存和二级存储大小是无限制的,且这样发展下去软件越来越复杂.但我们仍然一个字母一个键地手工编写着代码.我们依然滥用着"print"