Microsoft Robotics Studio可以使你在pc上创建程序来远程控制机器人,当然我们知道,微软的机器人软件开发平台是架构在.NET和.NET CF平台下的,如果你的机器人自身安装了.NET 或.NET CF的话,那么就机器人就可以脱机跑了,本文所说的方法是针自身没能够安装.NET和.NET CF平台的机器人的哦。
这个实例主要讲解怎样为你的远程连接(有线或无线)机器人实现一个PC端的控制接口,实际上我们要实现一个负责和机器人通信的服务,为了使这个服务更加通用,这个服务需要实现Microsoft Robotics Studio中所定义的通用协议,例如为Motor,Bumper,Contract,sonar等传感器,Microsoft Robotics Studio为这些传感器定义了统一通信协议,包括消息类型,消息体等,这些协议在 Robotics Common找到,这些协议使得我们隐藏机器人的细节,实现了这些协议,就可以在VPL中使用一致的操作方式使用这些模块了。
这个实例主要有以下几个方面:
* 在机器人一端创建一个远程通信的接口
* 在PC端创建一个和机器人硬件交互的接口
* 使用Brick Service
* 实现一个通用的服务
准备:
硬件:这个实例目的是帮助msrs不支持的硬件开发服务,你可能会发现,使用下面的平台会来学这个实例比较有帮助的。
* LEGO MINDSTORMS NXT
* fischertechnik
* iRobot Create
硬件制造商通常会为自己的平台提服务供支持,在为这些硬件写服务的时候可以看下官方网站或论坛,可有这样的服务已经有人写好了哦。
软件:这个实例是为使用Visual C#的开发人员提供的,你可以使用下面的开发工具:
* Microsoft Visual C# Expss Edition
* Microsoft Visual Studio Standard, Professional, or Team Edition.
开始
这个实例由C#语言编写,你可以在下面的MSRS目录中找到这个实例的项目文件。
Samples\RoboticsTutorials\Tutorial6\CSharp
概述
这个实例通过分析LEGO NET机器人的服务来让大家了解一个通用的、一个很有用的架构,架构图如下所示:
图1-PC和机器人远程连接
图2-LegoNxt机器人的服务架构
第一步:在机器人上为远程通信开发通信接口
你的机器人需要为外界提供接口,通过这个接口我们可以获取机器人的传感器和电机的信息,接口相应的程序必须运行在机器人自身系统上,比如单片机、arm等,如果机器人已经提供了远程通信的接口(比如iRobot Create•,LegoNXT等机器人已经实现了这样的接口),那么你可以跳过此步了哦。
假如你的机器人不包括一个通信接口,你需要用自己去开发这样的接口,通过机器人所支持的开发工具开发程序,这些程序可以监视传感器的改变,并且向一个连接的PC端发送回消息,它应该也可以很好的处理所接收的马达消息请求,这些程序应该是一个循环类的程序。
第二步:
现在把精力集中在运行在PC端的代码上,这些代码和远程的机器人接口通信,代码所实现的服务通过其他的协助服务或C++/CLI库来实现,这个实例中的 Brick Service完全负责和机器通信,这个Brick Service可以认为是机器人在mrds平台的一个抽象实体,所有和机器人的交互将由Brick Service实现,mrds通过Brick Service来控制机器人,Brick Service的状态应该包含最新的马达和传感器信息。
LEGO NXT机器人使用一个蓝牙接口,当连接蓝牙后,它会呈现为PC的一个串口提供给用户使用,下面的代码段实现了如何读写串口,这一步最重要的两个部分是:1、确保有权限使用这个串口;2、在合适的位置处理从串口输入的数据。
如何设置串口:
SerialPort serialPort = new System.IO.Ports.SerialPort();
void Open(int comPort, int baudRate)
{
serialPort = new SerialPort("COM" + comPort.ToString(), baudRate);
serialPort.Encoding = Encoding.Default;
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
serialPort.Open();
}
//Send data that your robot understands
void SendData(byte[] buffer)
{
serialPort.Write(buffer, 0, buffer.Length);