Microsoft Robotics Developer Studio 4学习笔记-案例2-开始玩机器人
robot studio 教程

robot studio 教程Robot Studio教程第一章概述1.1 介绍本教程旨在向用户提供有关Robot Studio的全面指南。
Robot Studio是一款强大的仿真软件,可以帮助用户设计、模拟和优化系统。
1.2 安装在本章节中,将介绍如何和安装Robot Studio软件。
包括软件的系统要求,安装步骤以及常见问题解答。
第二章界面导览2.1 主界面这一章节将详细介绍Robot Studio的主界面,包括菜单栏、工具栏、快捷键等,以及如何切换视图,访问不同的功能模块。
2.2 视图控制在本章节中,将提供一些关于如何调整和控制Robot Studio的视图,包括缩放、旋转、平移等操作。
第三章创建模型3.1 建立基本模型这一章节将展示如何在Robot Studio中创建基本的模型,包括添加机械臂、关节、夹爪等组件。
3.2 导入CAD模型在本章节中,将介绍如何导入现有的CAD模型,并将其转换为Robot Studio可识别的格式。
第四章仿真与调试4.1 运行仿真这一章节将详细介绍如何运行仿真,并演示一些常见的操作,如的移动、捡取物体等。
4.2 调试程序在本章节中,将学习如何使用Robot Studio调试程序,检查错误和调整程序逻辑。
第五章路径规划与优化5.1 路径规划算法这一章节将介绍Robot Studio中使用的路径规划算法,包括最短路径、最优路径等。
并提供一些优化建议和技巧。
5.2 优化参数在本章节中,将讨论如何优化的工作参数,如速度、加速度等,以提高的性能和效率。
第六章系统集成6.1 外部设备集成这一章节将介绍如何与其他外部设备进行集成,包括传感器、相机、控制器等。
6.2 与PLC通信在本章节中,将学习如何与PLC(可编程逻辑控制器)通信,实现与生产线的无缝连接。
第七章高级功能7.1 机器学习这一章节将探讨如何在Robot Studio中应用机器学习技术,提高的智能水平和自适应能力。
第17天Microsoft Robotics Developer Studio中文教程--CCR Overview

2. Dispatcher, DispatcherQueue, Task就好比Thread 執行程式碼, 在CCR 當中, 程式的運行是以ITask 作為執行的單位, 而DispatcherQueue 就是以Queue 的方式來存放許多的Tasks (以下我提到Task, 就是代表該class 有支援/實作ITask 的意思) , 最後, Dispatcher 就像是Thread, 用來執行運作DispatcherQueue (當中的Tasks). 不過在極少數的狀況下, DispatcherQueue 也可以被.NET Thread Pool 來運作.而Task 最重要的就是Handler, 就是Programmer 寫的delegate function.至於這許多的Tasks 從何而來, 如何產生, Handler (你的程式碼, delegate function) 何時要被執行, 就是要靠接下來介紹的Arbiter class.3. Arbiter class這是CCR 寫好的一組函式庫, 負責用來撰寫處理訊息所需要用到的協同處理函式. 通常使用者(programmer) 就是透過撰寫delegate function, 然後指定當某種情境發生時(比方說, Receive Task 就是某個Port 收到訊息時), CCR 就會執行該delegate function (透過ITask).以下我開始介紹Arbiter 的所有Member (都是static function, 所以都是直接使用), 這可是CCR 的重頭戲(不過我只介紹基本使用方法, 進階的使用方法就太多了):Arbiter.Recive產生一個Receive Task , 就是當某一個port 收到訊息時, 就執行Handler (某段程式碼).比方說, 以下的程式產生一個Receive Task, 就是當一個Port<int> 收到int 訊息時就把它從Console 輸出. (但是該Task 還不會被執行, 因為我們只是產生了Recive Task)var myport = new Port<int>();var mytask = Arbiter.Receive(true, myport, i => Console.WriteLine(i));其中, 第一個參數如果是true, 表示這個Task 一直都要存在, 不會消失, 如果是false, 則表示僅僅執行一次, 這個Task 就消失.Arbiter.Activate使用某個DispatcherQueue 來執行一系列的Tasks.比方說我們要產生一個DispatcherQueue, 然後利用該DispatcherQueue 來執行一個Receive Task, 就可以寫成下面這樣的code :var taskQueue = new DispatcherQueue("myqueue", new Dispatcher());var myport = new Port<int>();Arbiter.Activate(taskQueue, Arbiter.Receive(true, myport, msg => Console.WriteLine(msg)));如果接下來有程式執行myport.Post(3) , 就會啟動執行Receiver Task, 也就是在Console 印出3 .Arbiter.Choice有點像是switch case , 是屬於Task 的分支流程處理用的, 它會產生一個Choice Task , 而只會處理眾多Handlers 的其中之一(或眾多Tasks 的其中之一個Handler).14. // Persisted Get handler, runs in parallel with all other activations of itself15. // but never runs in parallel with Update or Stop16. Arbiter.Receive<GetState>(true, _mainPort, GetStateHandler)17. ))18.);// activate an Interleave Arbiter to coordinate how the handlers of the service// execute in relation to each other and to their own parallel activationsArbiter.Activate(_taskQueue,Arbiter.Interleave(new TeardownReceiverGroup(// one time, atomic teardownArbiter.Receive<Stop>(false, _mainPort, StopHandler)),new ExclusiveReceiverGroup(// Persisted Update handler, only runs if no other handler runningArbiter.Receive<UpdateState>(true, _mainPort, UpdateHandler)),new ConcurrentReceiverGroup(// Persisted Get handler, runs in parallel with all other activations of itself// but never runs in parallel with Update or StopArbiter.Receive<GetState>(true, _mainPort, GetStateHandler))));而CCR 實現這個Arbiter.Interleave 不是靠傳統的lock, 或是ReaderWriterLock, 而是靠內部的TaskQueue 來實作的, 它也不需要知道哪些資料是你所要保護的, 它只是負責避免哪些程式不可同時執行, 以及允許哪些程式可以同時執行.Arbiter.JoinedReceive假如你想要等候兩個Port 都分別收到訊息時才要作處理(執行Handler) 的話, 這個就是你要的.比方說下面的code:Arbiter.JoinedReceive<int, string>(false, myport, myport2, (intmsg,strmsg) =>Console.WriteLine(intmsg+","+strmsg))就是表示產生一個JoinedReceive Task, 當myport 收到int 訊息, myport2 收到string 訊息, (不管先後順序, 會一直等到兩個都收到訊息), 就在Console 作輸出.Arbiter.MultipleItemReceive跟Arbiter.JoinedReceive 不太一樣的地方在於, 它是看訊息的數量, 當一定數量的訊息送到一個或多個Port 的時候, 就會啟動Handler.比方說下面這個code 就是當累積五個int 訊息送到portInt 的時候, 就會啟動Handler, 把這五個int 輸出到螢幕上.Arbiter.MultipleItemReceive(true, portInt, 5,intArray => Console.WriteLine(string.Join(",", new List<int>(intArray).ConvertAll<string>(i =>i.ToString()).ToArray())));一旦你了解了Arbiter 的函式, 還有DSSP 的類型, 相信你再去看documentation 當中的。
Microsoft Robotics Studio 让机器人学更容易

/roboticsMicrosoft Robotics Studio 讓機器人學更容易________________________________________________________________________Microsoft Robotics Studio 讓在不同硬體平台設計機器人應用變的更容易了。
Microsoft Robotics Studio SDK 是一套簡易但又強大的動態平台,操作編寫及模擬工具時更容易,同時也擁有教學及樣本代碼來協助你開始使用這套軟體。
終端至終端的開發平台Microsoft Robotics Studio SDK 讓開發者可以設計多樣化的機器人硬體應用。
* 利用視覺性程式環境就可以簡單的設計應用。
透過視覺性程式語言(VPL )簡易化程式設計和除錯。
視覺化的服務區塊可被重複使用與堆集。
* 使用以物理為基礎的3D 視覺環境來模擬應用。
微軟Visual Simulation Environment 透過了AGEIA Technologies Inc.的AGEIA TMPhysXTM <來模擬真實世界物理、也可另用硬體加速PhysX 模擬。
* 即使在不同的硬體平台上也能夠輕鬆的更改硬體。
使用簡易的拖曳及丟下介面來更改服務。
* 用Windows 或網路為主的介面與機器人互動。
設計一個可以用Windows 介面或是網絡瀏覽器操控的機器人應用。
好比說:利用HTML 和JavaScript 遠距離的監控機器人的攝影機和感應網絡。
輕量的不同時與服務為重的動態 Microsoft Robotics Studio 擁有先進的服務導向的軟體平台。
* 讓非同步的程式運作變的簡易並行(Concurrency )及Concurrency and Coordination Runtime (CCR)函式庫讓處理多項機器人學感應器的非同步輸入與輸出至馬達和機動器的程式設計變得更簡單。
机器人的“操作系统”

机器人的“操作系统”:Microsoft Robotic Studio――让你的机器人像个人电脑一样众所周知,微软公司(Microsoft Corp.)的Windows系列操作系统已经在个人电脑领域占据了主导地位。
无论您的机器是何种品牌、何种型号、何种配置,Windows操作系统都能够轻松应对并为您提供想要的服务。
同时,友好的用户界面也赢得了广大用户的青睐,使Windows成为个人电脑领域最受欢迎的操作系统。
如今,这一传统正在进入欣欣发展的机器人行业,而且不仅仅局限于家用机器人领域,在工业机器人领域也已经崭露头角。
这就是微软机器人工作室推出的机器人操作系统――Microsoft Robotic Studio。
在目前机器人行业的生产和开发过程中,还没有统一的平台和标准,不同公司按照不同的标准和技术路线生产和开发机器人设备。
对于机器人的初学者而言进入的门槛过高,每一个开发人员都要从底层硬件入手再到上层的控制软件,大量的人力物力消耗在了重复的设计中,为了改变这一局面,为机器人开发人员能减少一些麻烦的工作和创建不同类型硬件的标准,简化对机器人的编程,把更多的精力投入机器人智能领域的研究,2006年6月微软公司推出了“Microsoft Robotic Studio”机器人开发软件,迈出了向机器人行业进军的第一步。
微软公司于2008年5月19日在匹兹堡举办的 RoboBusiness Conference and Exposition(机器人商业大会暨展览会)上首次发布了其机器人技术编程平台的最新版本 Microsoft Robotics Developer Studio 2008 的社区技术预览版 (CTP)。
Microsoft Robotics Developer Studio 2008 包含对齐运行时间性能、分布式计算功能以及工具的改进。
这个被称为“Microsoft Robotics Studio”(微软机器人技术工作室)的新平台主要用于机器人技术的开发,适合学术、理论和商业研究等领域。
第20天Microsoft Robotics Developer Studio中文教程--Sumo[II] - 开始动手写相扑机器人
![第20天Microsoft Robotics Developer Studio中文教程--Sumo[II] - 开始动手写相扑机器人](https://img.taocdn.com/s3/m/280e82fb941ea76e58fa04ff.png)
2./// This is the default drive configuration for wander mode3./// </summary>4.private void SetWanderDrive()5.{6. _state.SumoMode = SumoMode.Wander;7. InternalDrivingMilliseconds(250, 175, 250.0);8.}/// <summary>/// This is the default drive configuration for wander mode/// </summary>private void SetWanderDrive(){_state.SumoMode = SumoMode.Wander;InternalDrivingMilliseconds(250, 175, 250.0);}是不是很簡單呢, 它只做一個小幅度的繞圈圈...設定左輪的速度為250, 右輪的速度為175 , 然後等到250 ms 之後再進行新的決定.怎麼改會比較好?老實說我也不知道, 不過可以隨便亂改啊, 所以先改為原地順時鐘繞圈圈看看:InternalDrivingMilliseconds(250, -250, 250.0);然後讓mysumo 跟SumoPlayer (原本內定的機器人) 對打...有沒有發現我們的機器人大半的時候都是在原地旋轉呢?!有沒有發現我們的機器人似乎明明看到對手, 卻往前衝一下就停止, 繼續旋轉??所以, 下次我們來試試看Tracking Mode 到底在幹啥...在此之前, 你可以亂改SetWanderDrive 玩看看...你應該會有一些心得, 像是速度太快的話, 根本看不到對手... 就算你把反應時間調快也沒用.這是因為架構上是利用TimerHandler 這個函式去處理的, 而該函式預設是200 ms /4 = 50 ms 觸發一次...更何況預設是每200 ms 才去處理一次圖像...(這樣fps 才5 ... 你能想像5 fps 的射擊遊戲是甚麼樣子吧?)-->。
Microsoft Robotics Developer Studio 4学习笔记-案例2-开始玩机器人

Microsoft Robotics Developer Studio 4学习笔记案例2:开始玩机器人1.为了看见车子,我们从“Service”中选择“Simulated Generic Differential Drive”放在“Diagram”上;①对“Simulated Generic Differential Drive”右击,选择“Set Configuration”;②跳到“Simulated Generic Differential Drive”的设定界面,选择“Use a manifest”;③选择“Import Manifest”,导入虚拟机器人;④选择“LEGO.NXT.Tribot.Simufation.Manifest.xml”⑤现在保存文件,运行后就能看到“乐高”虚拟机器人了。
2.为了操控虚拟机器人,从“service”中拖一个“Direction Dialog”到“Diagram”中,这个“Direction Dialog”会在系统中产生一个有上下左右及Stop的五个键,让我们可以编程后控制里面的机器人。
3.在“Basic Activities”中找到“Calculate”,把“Calculate”拉到“Diagram”中;①把“Direction Dialog”的“Notification(右下方的红圈)”拉到“Calculate”,表示把“Direction Dialog”的通知传递给“Calculate”,这时会弹出“Connections”对话框。
②选择“ButtonPress”表示:当鼠标被按下时。
③“DirectionDialog”跟“Calculate”连接后,在“Calculate”中间下拉选择“Name”,表示要从“ButtonPress”信息中,拆解出“Nmae”这个信息(被按下的按钮名称),这个被按下的按钮会被输出到“Calculate”的右端。
第8天Microsoft_Robotics_Developer_Studio中文教程--Hello_World_Again!_(DSS_Service_version)
[Robotics Studio] Hello World Again! (DSS Service version) --Day8编辑整理<杜毓聪duyucong@ >太混了,第八天还在Hello World !事实是,我们开始往更深入的技术迈进啰,如果想要更深入了解RDS (Microsoft Robotics Developer Studio) ,我们要开始了解DSS (Decentralized Software Services)以及CCR (Concurrency And Coordination Runtime) ,虽然DSS以及CCR是随着RDS而出现,但其实它们可不需要限定于RDS才能使用欧,虽然我目前没有在.NET Framework 4.0当中发现他们的身影,但是随着多核心系统的进展,软件当然也是要能够发挥多核心的长处,随之而来的平行处理问题,当然是程序人员要面对的课题,有了CCR以及DSS这样的Framework ,开发平行处理程序时将会采用不同的逻辑思考与概念.如果你已经写了很多年的程序,相信对于之前的VPL觉得有些不太习惯,现在我要弄点程序人员习惯的东西,就是用Visual Sutdio 2008 (or VS 2008 Express Edition)来开发程序.但是我还是不会脱离VPL这个接口.为什么我要贴着VPL这个接口呢,因为RDS教学套件中有相当多关于DSS与CCR信息,但却都是单纯的Visual Sutdio操作,鲜少提及如何跟VPL整合,但我认为VPL才是适合初学者的良好接口,所以对于初学者而言,能够与这个接口整合,应该比较能够提起写code的兴趣.这就如同一开始如果教学采用Unix Command Line模式,相信很多人都受不了.但是如果一开始采用拖拉视觉操作系统方式,相信很多人都比较容易有兴趣,等到有了兴趣,再介绍更强大的命令列模式,就比较不会觉得排斥.况且,良好的视觉操作系统有时候比起命令列模式还棒,这点只要你看过VPL开发的程序经过Compile转成C#的程序后,你会承认VPL有时候是比较好的(当然不是所有状况,而是各有优缺点).OK!写了很多废话才开始写程序,这大概是年纪大了(爱碎碎念)才会这样吧??首先,在你安装完RDS以后,如果你有Visual Studio 2008 (or Express Edition) ,你应该可以在新增项目当中看到Microsoft Robotics Express ,像这样:按下确定以后,你会看到一个对话框:这是对话框可以让你输入DSS的名称,日期(用以跟其它同名的DSS区别),还可以输入Partners (一起合作的DSS Service) , Alternate Contracts (替代协议)我们可以都用预设的,因为我们现在只要写Hello World嘛...不过在开始撰写DSS Service之前,我想要先讲解DSS Service的大体架构:(这张图来自RDS官方文件)所以每一个DSS实体(Instance)都会有一个唯一的Service Identifier,你可以看成是变量名称(Variable Name) ,不要跟Contract Identifier搞混了, Contract Identifier的格式会是像这样: / [year]/[month]/[name].html (这样你知道刚刚对话框要你填日期以及Organization Domain是要干啥用了吧),它才是这个DSS Service的功能名称,你可以看成是类别名称(Class Name).每个DSS都会有一个状态(State),也会有一堆程序代码(Service Handlers)负责对外沟通(Main Port) ,还可以有通知(Notifications) ,然后可以有协同运作的Service (Partners)这几大块.完成以后你会看到Visual Studio帮你生了一个项目像是这样:其中DSSService_HelloWorldType.cs放的是宣告的程序代码, DSSService_HelloWorld.cs则是主体程序代码(当然事后你可以乱改..)为了完成Hello World,我们来把这个DSS的State加上一个字符串的数据成员(Data Member)吧,你可以在DSSService_HelloWorldTypes.cs当中找到下面这段程序代码:/// <summary> ///DSSService_HelloWorld state ///</summary>[DataContract]public class DSSService_HelloWorldState{}我们加上一个字符串成员的宣告如下:/// <summary> ///DSSService_HelloWorld state[DataContract]public class DSSService_HelloWorldState{[DataMember]public string StrData { get; set; }}每个DSS Service在启动的时候,会呼叫Start()这个函式,所以你在DSSService_HelloWorld.cs当中可以找到它: /// <summary> ///Service start ///</summary>protected override void Start(){// // Add service specific initialization here //base.Start();}现在我们加上_state.StrData = "Hello World";如下:/// <summary> ///Service startprotected override void Start(){// // Add service specific initialization here //base.Start();_state.StrData = "Hello World";}Ok,现在我们完成一个DSS Service,这个Service的状态有一个StrData ,而启动以后会放入"Hello World",透过VS 2008建置以后,它自动会放在你的VPL bin目录下面,像是这样:所以你打开VPL ,就可以看到Services 多了一个DSSService_HelloWorld,把它拖来到Diagram当中,连上SimpleDialog,你会从DSSService_HelloWorld看到Get-Success 联机(这表示你想要取得该DSS Service的状态(state)),连接设定如下:现在你的VPL程序如下:好啦,一周后我们又回到了Hello World ...-->2008/12/25 01:37|阅读数: 1045 |我要推荐| 8 Comments | |订阅DotBlogs Tags: Robotics关连文章•[Robotics Studio]改良自走型机器车[III] --Day7• [Robotics Studio]改良自走型机器车[II] --Day6• [Robotics Studio] MSRS概观(Overview) --Day5• [Robotics Studio]自走型机器车--Day4• [Robotics Studio]介绍Activity --Day3• [Robotics Studio]开始玩机器人啦--Day2• mxymxy 2009/1/22下午03:49回复# re: [Robotics Studio] Hello World Again! (DSS Service version) --Day8我有Visual Studio 2008 (or Express Edition) ,但我不可以在新增项目当中看到Microsoft Robotics Express,为什么• laneser 2009/1/22下午06:17回复# re: [Robotics Studio] Hello World Again! (DSS Service version) --Day8to mxymxy :我的顺序是:先安装VS 2008 ,再安装robotics developer studio .• mxymxy 2009/1/22下午08:09回复# re: [Robotics Studio] Hello World Again! (DSS Service version) --Day8重装了一遍,成了,不过只有C#,不是能用C++吗?谢谢• laneser 2009/1/23下午12:00回复# re: [Robotics Studio] Hello World Again! (DSS Service version) --Day8to mxymxy : Express 只有C# , Standard版本才能用C++,或其它语言(希望M$下次能发发善心)• Comix 2009/1/30上午01:03回复# re: [Robotics Studio] Hello World Again! (DSS Service version) --Day8Laneser你好!我是一名初学者,不知用C#编写DSS SERVICE需要多少C#基础啊?谢谢!祝新春快乐!• laneser 2009/1/31下午12:38回复# re: [Robotics Studio] Hello World Again! (DSS Service version) --Day8to Comix :我觉得C#写DSS还算有点深度,所以,个人建议有以下基础后再学比较不会遇到困难(由浅至深):1.基本的C#观念2.泛型(Generic)3.多执行绪(Multi-thread)4. Enumerator (yield),以及因为Enumerator所造成的deferred execution概念不过,如果很有兴趣,也可以摸索前进,倒不一定要循规蹈矩,只要有热情跟谦逊,遇到问题就想办法了解并解决就好啰.DSS以及CCR都有点算是新的工具用来解决以前遇到的问题,所以对于初学者或是老手,都算是从头学起,顶多是老人比较占一点点优势(对于旧问题),新手的优势就是没有包袱(就像张三丰教太极,你已经忘光了XD)...• tinghoo 2009/2/25上午04:37回复# re: [Robotics Studio] Hello World Again! (DSS Service version) --Day8“”请好,请问那个新增专案是在哪,我找不到我现在把所有的都卸载掉,那具体应该都安装哪些呢,顺序?麻烦你了• tinghoo 2009/2/25上午05:53回复# re: [Robotics Studio] Hello World Again! (DSS Service version) --Day8我知道了,原来是因为大陆的台湾的翻译不一样,麻烦了。
第24天Microsoft Robotics Developer Studio中文教程--DSS System Services
這個我們之前玩過了, 可以透過它來產生其他的DSS Service, 還可以看到系統存在的DSS Service, 正在執行的DSS Service, 以及可以手動停止DSS Service.第三個是Service Directory :透過它, 可以知道目前正在執行的DSS Service , 以及它們的Partners.(不過寫DSS Service 的人也可以故意不跟它註冊, 據說這樣就不會列在這個表當中)接著是Debug and Trace Messages , 這個是由Console Output Service 來執行的:你的 DSS Service 自然也可以透過它來輸出debug 訊息歐.. Manifest Load Results , 是由Manifestloaderclient 執行的這裡可以看到Manifest loader service (另一個DSS System Service)載入manifest 的結果, Security Manager , 是由Security Manager Service 執行的:主要就是讓你可以控制這個DSS Node 的權限, 像是連上此Node 是否需要認證, 以及一些角色的設定等等, 如果你連不到某個DSS Node, 要先看看該DSS Node 的Security Manager 是否有設定正確才是.Resource Diagnostics Service 負責顯示這個DSS Node 目前正在運作的每個service 的資料狀態(portmessage queue), 以及執行中的task dispatcher其他不在表列當中, 但是也是DSS System Services 的, 有Consturctor Service : 提供給其他Service 用來Create Service 的介面, 通常Manifest loader service 就利用它.Mountpoint service :其他DSS Service 可以透過Mount point service 來存取檔案, 但只限於安裝目錄下的部分目錄. Constract Directory Service : 用來揭露哪些目錄存放DSS Service 的執行檔案:Embedded Resources Services : 用來揭露DSS 內嵌的資源:Subscription Manager Service : 用來協助註冊通知的Service, 雖然是DSS System Service , 但是它通常是每個Service 自己有一份實體,只是用來協助DSS Service 處理註冊通知相關事宜, 免得大家(每一個DSS Service)都要寫一份code .Partner Manager Service : 類似 Subscription Manager service, 也是所謂的helper service , 用來處理partner service 相關處理事宜.以上, 就是全部的 DSS System Service (目前這個RDS 2008 版本啦, 下一版可能會更多?!).-->。
第3天Microsoft Robotics Developer Studio中文教程--介绍 Activity
現在你已經有一個自訂的活動了, 看起來就像是這樣:對它點兩下, 你會進入編輯畫面,讓我們回到剛剛的Diagram , 把原本中間的一堆元件複製過來這個RobotControl Activity. 如下:現在你看到一堆驚嘆號了, 這代表有些小問題需要解決.移動到每一個小驚嘆號, 都會告訴你發生了甚麼問題, 首先, 我們要先宣告這個活動的介面,也就是定義這個活動的輸出以及輸入. 點擊上方的紅色編輯紐, 或者使用下拉選單的Edit/ Actions and Notifications, 你會看到這個對話框:主要分為兩大區塊, Actions 代表你可以定義的反應, 所謂的Action, 是指需要輸入一個訊息, 然後該Activity 會經過一些處理以後(包括做了一些整體環境上的改變), 最後吐出一個訊息, 而Notifications 就比較簡單, 是自動自發的吐出訊息, 不需要輸入訊息. 所以通常一個流程的最前面的元件往後吐出訊息的是Notification.再回到Actions, 我們可以看到下方有三排Add,Delete, 由左至右分別代表你新增刪除定義的Actions, 新增刪除輸入的訊息組合內容, 新增刪除輸出的訊息組合內容. 每一個Action 你都可以定義個別的輸出入內容, 而且每一個Action 都是一個獨立的編輯元件畫面歐.讓我們定義一個Action, 取名為ControlDirection, Input values 需要一個PressButton, Type 是String, Output values 則是LeftDriverPower, RightDriverPower, Type 都是double, 如下:之後, 我們把左邊的輸入拉到原本的Calculate 這個元件.為了要統一輸出, 所以我們還要多拉一個Join, 把"Stop", "Fowards", "Backwords" 產生出來的訊息經由Merge 後再一次Join, 一樣在Join 裡面填入left, right , 如下:然後把這個Join 輸出給"Left", "Right" 的 Merge,最後把這個Merge 輸出給Result, 整體的流程就像下面這樣:當你把Merge 的結果輸出給Result 時, 會跳出Data Connections 對話框, 此時你要指定輸出的LeftDriverPower, RightDriverPower 為何,因為透過Merge, Visual Programming Language Express Edtion 無法計算出正確的下拉選單給你選(你只能選value), 但是其實要輸入的值應該是value.left, value.right (因為Merge 之前的訊息是Join 吐出來的), 所以你要勾選下方的Edit Values Directly, 自己輸入正確值(但系統會提示你),如下:這樣你就完成了一個Activity (其中的一個Action) 的定義囉!讓我們回到原本的Diagram, 刪除那些被你複製到Activity 當中的元件, 改用這個Activity 取代,當你把DirectionDialog 的Notifications 拖到這個RobotControl 的Activity 時, 會出現Connections 對話框,我們當然選擇ButtonPress , 如下:接著出現Data Connections 對話框, 要選而當你把這個RobotControl Activity 的輸出丟給GenericDifferentialDrive 的時候,又出現Connections 對話框, 輸出要選SetDrivePower,Data Connections 對話框設定如下:現在整體的元件流程就像下圖:這樣看起來清爽多了吧.那我們之前複製的一個分身GenericDifferentialDrive 也就不需要了.不過, 暫且不要刪掉它, 還記得昨天你玩車子的時候, 按下去就一直跑了, 直到按Stop, 是有點不方便.現在我們改為放開就停止, 這樣還不錯玩.所以我們再複製一個DirectionDialog (請注意, 它還是該DirectionDialog 的分身囉),然後把Notification 直接拖到另一個分身GenericDifferentialDrive,在Connections 對話框設定ButtonRelease 給SetDrivePower,在Data Connections 對話框設定兩個值都是0這樣你的整體元件流程如下:好啦, 可以試玩看看是不是好多了? 比較不會翻車囉?撞到東西還是會翻啦XD有了自訂Activity, 就像是可以自己定義積木, 我們就可以邁向更複雜的人生啦...(啊?!)-->。
第1天Microsoft Robotics Developer Studio中文教程
然後我們要做一些設定, 把Data 的類別改為String,
, 然後在中間填入Hello World , 變成如下的畫面.
接著, 我們把這個資料輸出到一個Service, 選擇左邊的Service, 找到Simple Dialog 這個元件.如果你覺得不好找, 可以在Find Service 當中輸入Simple , 如下:
這樣就只會過濾到剩下有Simple 文字的元件,
就可以容易找到Simple Dialog 這個元件.
把Simple Dialog 拖到右邊的Diagram 當中.
現在我們要做最後一步啦, 把這兩個元件串起來, 點選Data 元件的右邊(Outgoing Response) , 拖到Simple Dialog,
就會彈出Connections (Simple Dialog 的)對話框啦, From 沒得挑, 因為就是DataValue, To 我們選"AlertDialog",
點選OK , 又彈出Data Connections 的對話框, 這次我們要把Value 下拉, 選出value 這個值.
再一次點選OK,
噹噹! 我們寫完了Hello World 程式了.
雖然沒啥大用處, 但是還是可以執行看看囉,
執行之前Visual Programming Language Express Edition 會要求你存檔, 執行結果如下:
OK. 很簡單的程式, 所以我相信應該沒甚麼問題的.
一步一步來, 這樣很快就可以玩到機器人了?!(應該吧)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Microsoft Robotics Developer Studio 4
学习笔记
案例2:开始玩机器人
1.为了看见车子,我们从“Service”中选择“Simulated Generic Differential Drive”放在“Diagram”上;
①对“Simulated Generic Differential Drive”右击,选择“Set Configuration”;
②跳到“Simulated Generic Differential Drive”的设定界面,选择“Use a manifest”;
③选择“Import Manifest”,导入虚拟机器人;
④选择“LEGO.NXT.Tribot.Simufation.Manifest.xml”
⑤现在保存文件,运行后就能看到“乐高”虚拟机器人了。
2.为了操控虚拟机器人,从“service”中拖一个“Direction Dialog”到“Diagram”中,这个“Direction Dialog”会在系统中产生一个有上下左右及Stop的五个键,让我们可以编程后控制里面的机器人。
3.在“Basic Activities”中找到“Calculate”,把“Calculate”拉到“Diagram”中;
①把“Direction Dialog”的“Notification(右下方的红圈)”拉到“Calculate”,表示把“Direction Dialog”的通知传递给“Calculate”,这时会弹出“Connections”对话框。
②选择“ButtonPress”表示:当鼠标被按下时。
③“DirectionDialog”跟“Calculate”连接后,在“Calculate”中间下拉选择“Name”,表示要从“ButtonPress”信息中,拆解出“Nmae”这个信息(被按下的按钮名称),这个被按下的按钮会被输出到“Calculate”的右端。
4.在“Basic Activites”中拉一个“Switch”元件。
通过“Switch”左下方“+”增加信息分岔点,一共要五个,这五个按钮的名称分别为“Stop”,“Forwards”,“Backwards”,“Left”,“Right”(要求首字母大写,名称有双引号),然后把“Calculate”右边讯息串送给“Switch”。
5.从“Basic Activities”当中拖拉7个“Data”活动,属性都是“double”,属性值分别设定为0,0.8,-0.8,0.6,-0.6,0.6,-0.6,然后逐一设定连线,把“Stop”连到0,“Forwards”连到0.8,“Backwards”连到-0.8,“Left”连到0.6,-0.6两个“Data”,“Right”连到另一组0.6,-0.6两个“Data”。
6.通过“Jion”,“Merge”输出信息。
把0,0.8,-0.8三个参数传递给“Merge”,把0.6,-0.6两个参数传递给“Join”,然后分别填上“left”,“right”。
(向左转弯,右正转左负转,向右转弯,右负转左正转)
7.把“Merge”传递给模拟机器人“Simulated Generic Differential Drive”,在弹出对话框中,把“Merge”输出对应到车子的油门“SetDrivePower”;
按下“OK”后弹出另一个对话框,分别指定左、右轮子的油门,通通设为“value”。
现在已完成前进、后退,以及停止的操控了,可先按F5(Run菜单下的Start)测试。
8.把“Left”,“Right”设定好,把这两组“Join”好的资料串入“Merge”;
复制模拟机器人“Simulated Generic Differential Drive”,把“Left”,“right”两组Join好的资料通过“Merge”串递“Simulated Generic Differential Drive”,在“Connections”对话框中,选择“SetDrivePower”,接着的“Data Connections”对话框设定如下。
到此为止,机器人可以前进、后退、停止、左右转弯,完整程序图如下。