您的位置:首页 > 其它

微软机器人开发套件教程翻译-教程2

2006-06-28 16:03 375 查看
微软机器人开发套件教程翻译
Microsoft Robotics Studio Tutorials
 
教程2    协调服务
在前一课程中,我们演示了如何访问一个简单服务,以及当其它服务有动作发生时,服务是如何被通知的。在本教程中,我们将扩展这个话题,我们将使用一个接触传感器启动和停止一个马达。以教程1为起点,我们将修改程序,以达到按下接触传感器时,可以开启或关闭马达。
 
 
在本教程中,你将会学习:
1,添加马达服务访问支持
2,为马达服务创建一个服务端口(port)和一个前向器(forwarder)
3,当接触传感器按下时向马达服务发送启动或停止命令
4,修改显示消息
 
当你运行本教程时,按下接触传感器应当启动马达,并在控制台显示“Motor on”;再次按下时,应停止马达并显示“"Motor off”。
 
前提
本教程以教程1中建立的服务为起点。文中建立的服务名为MyRoboticsTutorial2,你可以自由选择建立新项目或者在教程1的项目中修改,但注意有些地方在名字上的区别。
 
硬件
本教程是基于以下机器人硬件平台的,SDK中提供了针对这些硬件的服务。你也可以使用提供了同等服务的硬件。
n         LEGO® MINDSTORMS® RCX
n         fischertechnik®
 
你需要一个微控制器(microcontroller,brick),一个接触传感器以及一个简单的马达。依照你的硬件要求连接传感器、马达到微控制器。
 
要设置硬件以及这些硬件与PC的通讯,见前一节“硬件设置”。
 
软件
本教程使用C#, 你可以使用Visual Studio 2005简易版、标准版、专业版和团队版软件进行开发。
 
开始
步骤1 添加项目引用
在前一教程中,已经在项目中添加了对MRS运行时库的引用。如果使用的是教程代码的拷贝,你应确认是否存在引用。可以通过查看项目属性以确认引用存在。
 
[align=center]Ccr.Core.dll[/align]
[align=center]DssBase.dll[/align]
[align=center]DssRuntime.dll[/align]
[align=center]RoboticsCommon.Proxy.dll[/align]
[align=center]System.Runtime.Serialization.dll[/align]
[align=center]System.Xml.dll[/align]
 
同上一个教程一样,在MyRoboticsTutorial2.cs的开始,需要添加using语句以便在代码中访问引用。此处,我们将增加对马达服务的引用。
 

usingmotor = Microsoft.Robotics.Services.Motor.Proxy

 
下面建立与马达服务的关联关系。关联关系描述了两个服务之间的关系。将下面高亮部分代码插入在建立项目时生成的MyRoboticsTutorial2类代码中。
 


 

[Partner("motor", Contract = motor.Contract.Namespace,

     CreationPolicy = PartnerCreationPolicy.UseExisting)]

private motor.MotorOperations _motorPort = new motor.MotorOperations();

 






 
步骤2订阅接触传感器服务
这部分与教程一中的代码完全相同。
 
void SubscribeToBumpers()

{

    // Create bumper notification port
    contactsensor.ContactSensorArrayOperations bumperNotificationPort = new contactsensor.ContactSensorArrayOperations();

 

    // Subscribe to the bumper service, send notifications to bumperNotificationPort
    _bumperPort.Subscribe(bumperNotificationPort);

 
    // Start listening for Bumper Replace notifications
    Activate(

        Arbiter.Receive<bumper.Replace>

            (true, bumperNotificationPort, BumperHandler));

}

 
步骤3 修改传感器事件处理器
上一教程中已经创建了一个传感器事件处理方法,现在修改处理内容,以便使用传感器启动或关闭马达。
 
首先,打开MyRoboticsTutorial2Types.cs,添加数据成员(DataMember)到服务的状态类型(StateType)。状态类型是服务的缺省数据契约(DataContract),其中包括我们运行服务所需的所有状态。增加一个叫做“MotorOn”的bool型数据成员以便跟踪马达开启或关闭的状态。
 
[align=left][DataContract()][/align]
[align=left]    public class StateType[/align]
[align=left]    {[/align]
[align=left]        [DataMember][/align]
[align=left]        public bool MotorOn;[/align]
[align=left]    }[/align]
 
现在重写事件处理方法,根据当前的MotorOn状态控制马达。在处理方法流程中添加如下代码。
 
[align=left]///<summary>[/align]
[align=left]  /// Handle Bumper Notifications[/align]
[align=left]  ///</summary>[/align]
[align=left]  ///<param name="notification"></param>[/align]
[align=left]  private void BumperHandler(bumper.Update notification)[/align]
[align=left]  {[/align]
[align=left]      string message;[/align]
[align=left] [/align]
[align=left]      if (!notification.Body.Pressed)[/align]
[align=left]          return;[/align]
[align=left] [/align]
[align=left]      // Toggle the motor state[/align]
[align=left]      _state.MotorOn = !_state.MotorOn;[/align]
[align=left] [/align]
[align=left]      // Create a motor request[/align]
[align=left]      motor.SetMotorPowerRequest motorRequest = new motor.SetMotorPowerRequest();[/align]
[align=left] [/align]
[align=left]      if (_state.MotorOn)[/align]
[align=left]      {[/align]
[align=left]          // Set the motor power on[/align]
[align=left]          motorRequest.TargetPower = 1.0;[/align]
[align=left]          message = "Motor On";[/align]
[align=left]      }[/align]
[align=left]      else[/align]
[align=left]      {[/align]
[align=left]          // Set the motor power off[/align]
[align=left]          motorRequest.TargetPower = 0.0;[/align]
[align=left]          message = "Motor Off";[/align]
[align=left]      }[/align]
[align=left] [/align]
[align=left]      // Send the motor request[/align]
[align=left]      _motorPort.SetMotorPower(motorRequest);[/align]
[align=left] [/align]
[align=left]      // Show the motor status on the console screen[/align]
[align=left]      LogConsole(message);[/align]
[align=left]  }[/align]
[align=left] [/align]
在代码中,首先检查接触传感器是否按下,如果该事件通知为传感器被释放,则立即返回。否则翻转马达状态标志,并根据马达的新状态标志,创建控制命令将马达设置到0%或100%功率状态。最后发送命令(SetMotorPower)并将动作显示在控制台。
 
试试看
保存该项目,按F5(或点击Debug菜单,选择开始Debug)编译运行MyRoboticsTutorial2服务,反复按下和释放接触传感器
 
[align=left] [/align]
[align=left] Motor On[/align]
[align=left] Motor Off[/align]
[align=left] Motor On[/align]
[align=left] Motor Off[/align]
[align=left] [/align]
[align=left] [/align]
 
如果一切正常,马达将启动或停止,并且在控制台显示相应的动作
 
在/RoboticsTutorials目录下可以找到完整的代码,以便与你的代码进行比较。
 
总结
在该教程中,你应学到
n         建立一个访问两个服务的应用程序
n         利用一个服务(接触传感器)的事件通知去影响另外一个服务(马达)的状态
 
LEGO and MINDSTORMS are trademarks of the LEGO Group. © 2006 The LEGO Group.
fischertechnik is the trademark of fischertechnik GmbH.
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息