本文將介紹以下內容:
構建機器人動畫
構建環境
驅動機器人或模擬
創建實體
本文使用以下技術:
C#、Robotics Studio
目錄
什麼是模擬?
入門
運行模擬
實體及實體類型
以編程方式添加新實體
在 VSE 中定義新實體
創建實體類
創建網格
將網格轉換為二進制格式
創建模擬服務
填充模擬場景
創建清單
運行模擬
構建不帶有差動式驅動的實體
不要被它的名稱騙了,Microsoft® Robotics Studio (MSRS) 可不單單能 夠掌控機器人。MSRS 大約在兩年前由 Microsoft Research 發布,可用於為多種 硬件設備構建基於服務的應用程序,但實際上卻被日常業務應用程序開發人員忽 略了。此工具包中提供的運行庫應立即為 Windows® Communication Framework (WCF) 開發人員所熟悉。另外,它還具有可視化編程語言 (VPL) 工具 和 Visual Simulation Environment (VSE)。
MSRS 提供了面向服務的運行庫,以及設計和部署基於機器人的應用程序所需 的工具。工具包中提供了面向首次涉足機器人世界的開發人員的可視化創作工具 、教程和文檔。商業開發人員必須支付少許費用購買此工具包,但愛好者和學術 研究人員可以免費下載使用。
MSRS 運行庫提供了兩個基於 CLR 2.0 的較低級別的運行庫。這兩個運行庫分 別是分散軟件服務 (DSS) 以及協調和並發運行庫 (CCR)。DSS 是一種面向服務的 輕型運行庫,基於具象狀態傳輸 (REST) 原理,用於啟動 Web。CCR 是一個 Microsoft .NET Framework 庫,支持異步處理。對於機器人應用程序而言,這非 常重要,因為要不斷在大量傳感器和傳動裝置上發送和接收數據。
除運行庫外,MSRS 工具包中還包括一個 VPL 工具。借助此工具,您只需將元 素拖放到設計平面中即可構建機器人應用程序。MSRS 中還提供了 VSE,可用於體 驗涉及多個機器人和障礙物的復雜模擬。MSRS 的這部分功能是本文的重點。我將 介紹可視模擬環境,並逐步介紹如何使用新的機器人實體創建模擬。值得高興的 是,您無需借助機器人來使用本文中的代碼。這也是模擬最具吸引力之處;借助 模擬,您無需在昂貴的硬件上投入資金即可達到學習的目的。
什麼是模擬?
如果您不熟悉模擬,可以想象一本翻頁的書 — 如果一本小書中的每頁 上都有一個圖像,那麼當連續快速地翻頁時,您會發現這些圖像在“移動 ”。模擬的工作方式與此類似。模擬包含一個或多個實體,每個實體都在幀 內部呈現。幀即等效於翻頁書中的一頁紙,而幀的呈現速率取決於主機的圖形卡 。
翻頁書和模擬之間的根本區別是,翻頁書是靜態的或可預測的,而模擬則不是 。模擬的每個幀都是動態呈現的,實體在每一幀內部的受力並不總能提前獲知。 模擬的有用之處也正體現在這裡。您可以使用機器人執行一個方案,然後查看機 器人如何與現實世界交互。
入門
如果您尚未下載和安裝 MSRS 工具包(位於 go.microsoft.com/fwlink/? LinkId=113902),請下載並安裝。目前,MSRS 網站可提供其 1.5 版本的全新安 裝。這包括 MSRS 1.5 的完整版本以及所有可用更新。
雖然 MSRS 提供的一些模板是針對 Visual Studio® 2005 的,但即便您 的計算機運行的是 Visual Studio 2008,也可以運行本文中提供的示例。您開發 所用的計算機需要使用與 DirectX® 9.0 兼容的圖形卡。特別值得一提的是 ,圖形卡必須支持頂點著色器 VS_2_0 或更高版本,以及像素著色器 PS_2_0 或 更高版本。對於大多數高端桌面和便攜式計算機而言,只要能夠運行如今的圖形 游戲,一般即已滿足此配置要求。
如果您不能確定自己的圖形卡支持什麼配置,請訪問 go.microsoft.com/fwlink/?LinkId=113904 獲取圖形卡的列表及其支持的著色器 。此外,您還可以在 VSE 中安裝 MSRS,並使用幫助菜單查看支持的像素著色器 和頂點著色器。如果您嘗試運行隨 MSRS 提供或本文中包含的某個模擬,但您的 屏幕顯示為空白,則表示您的圖形卡不兼容。
MSRS 使用 AGEIA PhysX 引擎為模擬環境提供物理支持。如果沒有物理支持, 模擬將沒有任何用處,因為它無法表示自己嘗試模擬的世界。例如,如果沒有重 力,實體就會四處飄蕩。如果閱讀 MSRS 隨附的文檔,您會發現其中介紹了由 AGEIA(請參見 ageia.com)提供的可選加速卡的用途。您不必專門為使用本文中 提供的模擬而購買和安裝此物理卡;AGEIA PhysX 軟件引擎同樣可以為您的模擬 提供物理支持。
運行模擬
此時,您可能很希望看到模擬。在創建自己的模擬之前,您應嘗試運行 MSRS 隨附的某一個模擬。安裝後,MSRS 將創建一個包含七個模擬的菜單文件夾。 “基本模擬環境”是此文件夾中的第一個模擬,可呈現與圖 1 類似的 場景。
圖 1 基本模擬環境
您可能認為基本模擬僅包括兩個實體:地球儀和箱形物體。實際上,模擬場景 中還包括用來代表主攝影機、地面、天空和太陽的實體。您可以通過在 VSE 菜單 中依次單擊“模式”和“編輯”來查看場景中包含哪些實 體。
在圖 2 所示的編輯模式下,您可以在左窗格中修改與各個實體相關的屬性。 借助這些屬性即可完全控制實體,從名稱到在模擬環境中的位置,無所不包。此 外,您還可以通過這些屬性精確控制實體的呈現方式,進而影響該實體在模擬中 的顯示方式。
圖 2 可修改實體屬性的編輯模式
返回到運行模式後,即可使用鼠標或箭頭鍵來回移動模擬。這會更改主攝影機 的視點,而此視點就是您查看模擬的視點。此處還需要重點提及的是,VSE 允許 您使用不同的模式呈現場景。可視模式為默認模式,是模擬場景的真實視圖。不 過,“呈現”菜單項提供了線框、物理、組合或無呈現模式,可供您 選擇。
之所以提供“無呈現”選項,是因為呈現只是模擬的一個方面。運 行模擬的最大價值在於實現各個實體之間的交互。因為從資源角度來講,呈現模 擬場景中的實體的費用非常昂貴,因此當場景中包含大量實體時,“無呈現 ”選項就會非常有用。
實體和實體類型
通過實體類型,您可以為特定類型的實體定義新實例。例如,基本模擬環境中 的地球儀就是一種形狀實體類型。實體類型充當新實體的模板,其中指定了與特 定實體類型相關的屬性。創建實體後,即可更改這些屬性的值,但實體中包含哪 些屬性卻是由實體類型定義的。
VSE 需要使用實體類型來向模擬添加實體。例如,若要添加一個機器人(如 iRobot 公司的 Create 機器人),您需要在 VSE 處於編輯模式時依次單擊 “實體”和“新建”,從而在其中添加一個新實體。這將 打開一個“新建實體”對話框(請參見圖 3)。
圖 3 在“新建實體”對話框中插入新實體
iRobot 公司的 Create 機器人由 MSRS 提供實體類型,因此您只需使用 “新建實體”對話框即可向模擬中添加新的 Create 機器人。在 “新建實體”對話框中,您應在“類型”中選擇 “iRobotCreate”,然後輸入唯一的名稱,例如“創建實 體”。單擊“確定”後,Create 機器人將出現在模擬場景中。
以編程方式添加新實體
MSRS 提供了多種創建和使用模擬的方法。除 VSE 之外,您還可以通過創建 DSS 服務項目以編程方式向模擬中添加實體。MSRS 提供了一個 Visual Studio 模板,可用於新建 DSS 服務。安裝 MSRS 後,在創建新的 Visual Studio 項目 時,只選擇 Simple Dss Service (1.5) 作為模板(請參見圖 4)。
圖 4 在 Visual Studio 2005 模板中新建 DSS 服務
使用模板新建 DSS 服務會隨之創建兩個類文件。實現類默認與項目同名,您 可以在其中添加代碼來創建新實體。以編程方式創建的模擬要求能夠訪問 Simple DSS Service 模板外部的程序集。因此,您將需要添加對圖 5 中所列程序集的引 用。
圖 5 模擬項目附帶的程序集
程序集名稱 說明 PhysicsEngine 提供對基本 AGEIA 軟件物理引擎的訪問。 RoboticsCommon 提供對 PhysicalModel 命名空間的訪問,此空間用於定義機器 人的物理特征。 SimulationCommon 提供對使用模擬和物理引擎時要用到的類型定義的訪問。 SimulationEngine 提供對模擬引擎的訪問。 SimulationEngine.proxy 代表模擬引擎的代理,當加載模擬引擎作為合作伙伴時會用到 此代理。
添加引用後,您還需要在實現類文件中添加下列命名空間聲明:
using Microsoft.Robotics.Simulation;
using Microsoft.Robotics.Simulation.Engine;
using engineproxy = Microsoft.Robotics.Simulation.Engine.Proxy;
using Microsoft.Robotics.Simulation.Physics;
using Microsoft.Robotics.PhysicalModel;
要了解模擬中需要哪些代碼,應首先查看隨 MSRS 提供的模擬教程。MSRS 安 裝程序的\samples\simulation教程目錄下提供的示例對應於 MSRS 安裝的菜單中 的模擬。例如,基本模擬環境與 SimulationTutorial1 項目相同。
如果使用 Visual Studio 2005 打開 SimulationTutorial1 項目,就可以查 看用於創建基本模擬環境的代碼。首先要注意的就是 Start 方法,啟動服務後將 自動調用此方法:
protected override void Start()
{
base.Start();
// Orient sim camera view point
SetupCamera();
// Add objects (entities) in our simulated world
PopulateWorld();
}
您可以在 Start 方法中添加代碼來定義模擬環境。對於 SimulationTutorial1 項目,這包括設置攝影機和使用實體對象填充模擬場 景。
除了主攝影機外,基本模擬環境中還包含用於代表天空、地面、箱形物體和地 球儀的實體。用於插入地球儀(或帶有紋理的球體)的代碼已在圖 6 中列出。
圖 6 插入地球儀
void AddTexturedSphere(Vector3 position)
{
SingleShapeEntity entity = new SingleShapeEntity(
new SphereShape(
new SphereShapeProperties(10, // mass in kg
new Pose(), // pose of shape within entity
1)), //default radius
position);
entity.State.Assets.Mesh = "earth.obj";
entity.SphereShape.SphereState.Material =
new MaterialProperties("sphereMaterial", 0.5f, 0.4f, 0.5f);
// Name the entity
entity.State.Name = "detailed sphere";
// Insert entity in simulation.
SimulationEngine.GlobalInstancePort.Insert(entity);
}
AddTexturedSphere 方法中的第一行代碼用於創建 SingleShapeEntity 的一個實例。此類型代表具有單一幾何形狀的實體(例如球形),當需要添加具 有非常簡單的物理幾何體的實體時,它將非常有用。這樣,我就可以創建重 10 千克或大約 4.5 鎊的實體。
分配到此實體的網格是一個擴展名為 .obj 的對象文件。此對象文件使用 3D 圖形編輯工具創建,並以別名對象格式導出。MSRS 要求網格對象文件采用此格式 。您需要在 AddTexturedSphere 方法中實現的最後一項操作是向模擬環境插入球 體實體。
在 VSE 中定義新實體
現在,我們來創建一個新的機器人實體,並用它來代表 Parallax 公司的 Boe-Bot 機器人。Boe-Bot 是一種支持兩輪差動式驅動系統的小輪機器人(照片 見圖 7)。有關 Boe-Bot 的詳細信息,請訪問 Parallax 的網站,網址為 parallax.com。
圖 7 Parallax 公司的 Boe-Bot
Boe-Bot 是 MSRS 支持的現有的幾種機器人平台之一。這意味著 MSRS 安裝中 會包括一些基本服務,用於操縱 Boe-Bot 的驅動系統以及內置接觸傳感器。盡管 MSRS 中提供了適用於 Boe-Bot 的平台服務,但實際上並不包括 Boe-Bot 實體類 型。
創建實體類
要創建適用於 Boe-Bot 的新實體類型,我需要添加一個派生自 DifferentialDriveEntity 的類。由於添加的類是從 DifferentialDriveEntity 類派生而來,因此我能夠重用定義 Boe-Bot 在場景中來回移動時的行為方式的代 碼。用於創建 BoeBot 實體類型的代碼如圖 8 所示。
圖 8 創建 BoeBot 實體類型
[DataContract]
public class BoeBot : DifferentialDriveEntity
{
Port<EntityContactNotification> _notifications =
new Port<EntityContactNotification>();
// Default constructor, used for creating the entity from XML
public BoeBot() { }
// Custom constructor for building model from hardcoded values.
// Used to create entity programmatically
public BoeBot(Vector3 initialPos)
{
MASS = 0.454f; //in kilograms (around 1 pound)
// the default settings approximate the BoeBot chassis
CHASSIS_DIMENSIONS = new Vector3(0.09f, //meters wide
0.09f, //meters high
0.13f); //meters long
FRONT_WHEEL_MASS = 0.01f;
CHASSIS_CLEARANCE = 0.015f;
FRONT_WHEEL_RADIUS = 0.025f;
CASTER_WHEEL_RADIUS = 0.0125f;
FRONT_WHEEL_WIDTH = 0.01f;
CASTER_WHEEL_WIDTH = 0.008f;
FRONT_AXLE_DEPTH_OFFSET = 0.01f; // distance from center of robot
base.State.Name = "BoeBot";
base.State.MassDensity.Mass = MASS;
base.State.Pose.Position = initialPos;
// chassis position
BoxShapeProperties motorBaseDesc =
new BoxShapeProperties("BoeBot Body", MASS,
new Pose(new Vector3(
0, // Use 0 for X axis offset
CHASSIS_CLEARANCE + CHASSIS_DIMENSIONS.Y / 2,
0.03f)), // minor offset in the z/depth axis
CHASSIS_DIMENSIONS);
motorBaseDesc.Material =
new MaterialProperties("high friction", 0.0f, 1.0f, 20.0f);
motorBaseDesc.Name = "Chassis";
ChassisShape = new BoxShape(motorBaseDesc);
// rear wheel is also called the castor
CASTER_WHEEL_POSITION = new Vector3(0, // center of chassis
CASTER_WHEEL_RADIUS, // distance from ground
CHASSIS_DIMENSIONS.Z / 2); // at the rear of the robot
RIGHT_FRONT_WHEEL_POSITION = new Vector3(
+CHASSIS_DIMENSIONS.X / 2,// left of center
FRONT_WHEEL_RADIUS, // distance from ground of axle
FRONT_AXLE_DEPTH_OFFSET); // distance from center, on z- axis
LEFT_FRONT_WHEEL_POSITION = new Vector3(
-CHASSIS_DIMENSIONS.X / 2,// right of center
FRONT_WHEEL_RADIUS, // distance from ground of axle
FRONT_AXLE_DEPTH_OFFSET); // distance from center, on z- axis
MotorTorqueScaling = 30;
// specify a default mesh
State.Assets.Mesh = "boe-bot.bos";
}
BoeBot 類的構造函數用於為在 DifferentialDriveEntity 類中定義的多個變 量設置值。例如,將質量值設置為 0.454,代表質量以千克為單位。另外,使用 寬度、長度和高度來定義 Boe-Bot 底盤。這些測量值通過稱取機器人的實際重量 、使用公制尺進行實際測量獲得。
Boe-Bot 的位置通過一組坐標值進行定義,這組坐標值在創建實體時傳入。這 些坐標值代表 X、Y 和 Z 軸上的點。MSRS 模擬引擎使用右手坐標系,這會影響 Z 軸上的點的朝向。
BoeBot 構造函數還可定義底盤和實體中輪子的位置。 DifferentialDriveSystem 類假定您的機器人將使用兩個主輪和一個主要起平衡 作用的小後輪。功率將分配到用於控制主輪的左、右馬達。通過為每個輪子分配 不同的功率級,可以確定各輪將向前、向後、向左還是向右移動。這與驅動物理 機器人的方法相同。
模擬最具吸引力的一點就是:理論上,無論您的機器人是虛擬的還是真實的, 驅動機器人和從傳感器接收數據使用的代碼都是相同的。用於模擬項目的部分代 碼同樣可以重用於實際機器人。現在,您可能已注意到我說的是“理論上 ”。這是因為模擬技術無法完全模擬實際環境。模擬無法對干擾做出解釋, 此處的干擾是指一些出乎您意料的事情,如將障礙物的位置放錯。
模擬的作用是讓您非常真實地體驗新機器人的設計效果,或模擬多個機器人的 交互。這非常適用於資源有限而學員數量龐大的學術環境。
創建網格
每個實體都可以與網格關聯,從而使實體呈現真實的外觀。以地球儀為例,網 格可以使地球儀實體顯示為行星地球的外觀。嚴格來說,沒有必要將實體與網格 關聯,但對於復雜實體(例如機器人),則應該首選網格對象。
幾乎任何 3D 圖形編輯工具都可用於創建網格。在撰寫本文時,我很幸運地獲 得了同事 Steve Grand 的幫助,他使用 3D 包 SoftImage(有關此工具的詳細信 息,請參見 softimage.com)為我創建了 Boe-Bot 網格。與此網格相關的文件均 包含在本文隨附的可下載的 .zip 文件中。要跟隨本文的進度,請下載此 .zip 文件並提取上述文件,然後將 Boe-Bot 文件夾中的內容復制到 /store/media 目 錄下,此目錄與本地 MSRS 安裝相關。
SoftImage 能夠將圖像導出為 .obj 格式。並非所有包都有此功能。例如, MSRS 在其 Channel9 Wiki (go.microsoft.com/fwlink/?LinkId=114031) 中建議 使用 3D 包 SolidWorks(請參見 solidworks.com)。但遺憾的是,SolidWorks 無法將圖像導出為 .obj 格式,因此它建議使用 Blender (blender.org) 工具執 行實際轉換。當選擇使用圖形包創建網格文件時,請牢記這一點。
有關創建 Boe-Bot 網格的細節問題不在本文討論范圍之內,但您應知道它是 通過連接多個多邊形網格形狀創建的。例如,金屬底盤開始時是一個立方體形狀 ,經修改後用於表示 Boe-Bot 的大小和形狀。然後,添加其他圓柱體形狀來代表 各個輪子。建立結構,以將輪子與底盤綁定並允許整個對象作為一個單一形狀來 發揮功能。最終效果(如圖 9 所示)是一個代表實際 Boe-Bot 的圖像。
圖 9 使用 SoftImage 創建 Boe-Bot 網格文件
將網格轉換成二進制格式
MSRS 提供了一個命令行工具,可將 .obj 文件轉換成經過優化的二進制文件 ,擴展名為 .bos。此文件類型的優點是加載速度比 .obj 文件快。您可以使用 MSRS 安裝附帶的命令提示符菜單項來訪問命令行工具 Obj2bos.exe。
使用網格時,一定要記住:所有材料都用於為物理對象著色,並且每個實體都 可以與一個或多個材料關聯。因此,當創建 .obj 文件時,很可能需要包括擴展 名為 .mtl 的其他材料文件。此外,還可能要包括用於創建紋理的圖像文件。這 些文件都必須復制到與 .obj 文件位置相同的位置,才能使用網格轉換工具。
.obj 文件及所有關聯文件都應放在與本地 MSRS 安裝相關的 /store/media 目錄下。由代碼下載附帶的與 Boe-Bot 網格關聯的文件有:Aluminum.png、Boe -bot.mtl、Boe-bot.obj、BoebotWheel.png 和 Pcb.png。添加到 media 目錄下 之後,請打開 MSRS 命令提示符鍵入以下內容:
Obj2bos.exe /i:"store\media\Boe-bot.obj"
轉換工具將創建一個名為 Boe-bot.bos 的文件,該文件位於 media 目錄下。 保留該文件的位置不動,因為稍後將引用此文件。
創建模擬服務
現在我已准備好創建 Boe-Bot 模擬服務。如果您遵從隨本文下載的代碼中的 內容,請確保已經安裝 MSRS,並將下載的代碼添加到本地 MSRS 安裝的 \samples 文件夾下。
若要從頭創建項目,則需要使用 Visual Studio 2005 模板創建一個新的 DSS 服務。您可以將該項目命名為 SimulatedBoeBot。除了之前提到的程序集引用外 ,您還需要添加對 Microsoft.Xna.Framework 的引用,並在 SimulatedBoeBot.cs 類文件的頂部添加以下命名空間引用:
using xna = Microsoft.Xna.Framework;
using xnagrfx = Microsoft.Xna.Framework.Graphics;
using xnaprof = Microsoft.Robotics.Simulation.MeshLoader;
Xna 框架供 MSRS 用於呈現實體。Xna 引用將用在定義 Boe-Bot 實體類型的 代碼中。MSRS 隨附的所有實體類型都包含在 Microsoft.Robotics.Simulation.Engine 命名空間中。
填充模擬場景
每項模擬服務都有一項主要任務,就是向模擬場景中插入實體。此任務應在啟 動服務時執行,因此對 PopulateWorld 方法的調用通常添加到 Start 方法中。 對於 Boe-Bot 模擬,PopulateWorld 方法如下所示:
private void PopulateWorld()
{
AddSky();
AddGround();
AddBoeBot(new Vector3(1, 0, 1));
AddBox(new Vector3(2, 1, 1));
}
AddSky 和 AddGround 方法用於設置 BoeBot 周圍的環境。AddSky 方法將創 建一個新的 SkyDomeEntity 類型,並將其插入模擬中。此外,還要向模擬中插入 有向光線,用以代表太陽光(此方法的代碼如圖 10 所示)。
圖 10 添加天空
void AddSky() {
// Add a sky using a static texture. We will use the sky texture
// to do per pixel lighting on each simulation visual entity
SkyDomeEntity sky = new SkyDomeEntity("skydome.dds",
"sky_diff.dds");
SimulationEngine.GlobalInstancePort.Insert(sky);
// Add a directional light to simulate the sun.
LightSourceEntity sun = new LightSourceEntity();
sun.State.Name = "Sun";
sun.Type = LightSourceEntityType.Directional;
sun.Color = new Vector4(0.8f, 0.8f, 0.8f, 1);
sun.Direction = new Vector3(0.5f, -.75f, 0.5f);
SimulationEngine.GlobalInstancePort.Insert(sun);
}
AddGround 方法使用 HeightFieldEntity 類型在零海拔處創建廣闊的地面。 隨 MSRS 安裝提供的紋理圖像用於代表地面。此方法的代碼如下所示:
void AddGround()
{
// create a large horizontal plane, at zero elevation.
HeightFieldEntity ground = new HeightFieldEntity(
"simple ground", // name
"03RamieSc.dds", // texture image
new MaterialProperties("ground",
0.2f, // restitution
0.5f, // dynamic friction
0.5f) // static friction
);
SimulationEngine.GlobalInstancePort.Insert(ground);
}
下一個要添加的是 Boe-Bot 實體。AddBoeBot 方法接受傳入 Vector3 參數, 此參數用於表示機器人的位置。此位置將傳遞給先前創建的 BoeBot 實體構造函 數。AddBoeBot 方法也將啟動模擬的 Boe-Bot 驅動器服務作為實體合作伙伴。此 方法的代碼如下所示:
void AddBoeBot(Vector3 pos)
{
BoeBot boeBot = new BoeBot(pos);
boeBot.State.Name = "SimulatedBoeBot";
// Start simulated Boe-Bot Drive service
CreateService(
drive.Contract.Identifier,
Microsoft.Robotics.Simulation.Partners.CreateEntityPartner (
"http://localhost/" + boeBot.State.Name));
SimulationEngine.GlobalInstancePort.Insert(boeBot);
}
最後一個要添加的實體是一個實心箱形物體,用於代表障礙物。AddBox 方法 將基於 SingleShapeEntity 類型創建一個箱形實體。此方法的代碼如圖 11 所示。
圖 11 創建箱形實體
void AddBox(Vector3 position)
{
Vector3 dimensions =
new Vector3(0.2f, 0.2f, 0.2f); // meters
// create simple movable entity, with a single shape
SingleShapeEntity box = new SingleShapeEntity(
new BoxShape(
new BoxShapeProperties(
100, // mass in kilograms.
new Pose(), // relative pose
dimensions)), // dimensions
position);
box.State.MassDensity.Mass = 0;
box.State.MassDensity.Density = 0;
// Name the entity. All entities must have unique names
box.State.Name = "box";
// Insert entity in simulation.
SimulationEngine.GlobalInstancePort.Insert(box);
}
創建清單
多數服務都將與其他服務結成合作伙伴來訪問本服務所需的功能和數據。在實 現類的頂層使用合作伙伴屬性引用這些合作伙伴服務。例如,Boe-Bot 模擬服務 將與模擬引擎服務成為合作伙伴。包括此合作伙伴聲明的此代碼如下所示:
//Simulation Engine Port
[Partner("Engine",
Contract = engineproxy.Contract.Identifier,
CreationPolicy = PartnerCreationPolicy.UseExistingOrCreate)]
private engineproxy.SimulationEnginePort _engineStub =
new engineproxy.SimulationEnginePort();
DSS 服務使用基於 XML 的文件(稱為清單)列出與基本服務相關的合作伙伴 服務。這可以告知 MSRS 運行庫基本服務應如何加載這些合作伙伴服務並與之交 互。盡管此清單是基於 XML 的文件,可以使用基於文本的編輯器進行編輯,但最 好使用 MSRS 隨附的 DSS 清單編輯器。DSS 清單編輯器是一個可視工具,允許您 將合作伙伴服務拖放到設計圖面上。在使用 DSS 清單編輯器之前,需要成功編譯 基本服務。這將創建一個程序集文件,供 DSS 清單編輯器使用。
加載 DSS 清單編輯器後,將在左窗格中提供所有可用服務的列表。開始之前 ,您需要從可用服務列表中找到基本服務,並將該服務的一個實例拖動到設計圖 面上。如果對 Boe-Bot 模擬服務執行此操作,設計圖面中將包含代表 SimulatedBoeBot 服務的節點和代表模擬引擎服務的子節點。
MSRS 安裝的 \samples 文件夾中包含了多個服務,其中的一項服務 SimpleDashboard 可用作模擬機器人的控制面板。SimpleDashboard 允許您啟動 用於控制機器人特定功能的其他服務。例如,SimulatedBoeBot 服務中的代碼只 使用包括 Boe-Bot 在內的一些實體來填充模擬場景,服務中的所有代碼都不會實 際移動機器人。您需要從驅動服務中借用此代碼。
為加載和使用簡單的控制板,必須從服務列表中找到 SimpleDashboard 的一 個實例,將其拖動到設計圖面的底部,從而將其添加到清單中。最終效果應如圖 12 所示。最後,還需要將此清單保存到 SimulatedBoeBot 服務的項目目錄,覆 蓋名為 SimulatedBoeBot.mainfest.xml 的清單。
圖 12 DSS 清單編輯器中的最終清單版本
運行模擬
現在,您已為運行 SimulatedBoeBot 服務做好了一切准備,只需單擊 Visual Studio 2005 菜單中的“調試”和“運行”即可開始運行 。首先,應顯示命令提示符窗口。
加載服務後,應立即顯示另外兩個窗口。簡單控制板的界面是一個 Windows 表單,其中包括多個組框。表單右側(請參見圖 13)有“遠程結點” 組框。要開始運行,您需要在計算機文本框中輸入本地計算機 (localhost) 的名 稱,然後單擊“連接”。這將開始與 SimulatedBoeBot 服務建立連接 ,並加載實體合作伙伴服務,例如目錄列表框中顯示的驅動服務。
圖 13 在虛擬世界中驅動 Boe-Bot
驅動服務用於為控制 Boe-Bot 的輪子提供動力。這樣,您就可以使用虛擬控 制桿控件或與計算機相連的實際控制桿在模擬中來回移動 Boe-Bot。雙擊列表框 中顯示的 SimulatedBoeBot 項目即可開始移動。隨後,您就可以使用鼠標拖動圓 形虛擬控制桿,此控制桿位於簡單控制板表單的左上角。
您可能要經過一段時間後才會習慣使用虛擬控制桿控件(有關模擬效果的外觀 ,請參見圖 14)。練習來回移動 Boe-Bot,並查看它與箱形障礙物碰撞時的情形 。您可以進入編輯模式,選擇其中一個實體,調整其部分屬性以查看這對該實體 有何影響。在模擬環境中體驗一段時間,感覺一下輪子的工作方式。
圖 14 在虛擬環境中操縱模擬的 Boe-Bot
構建不帶差動式驅動的實體
在本文中,我介紹了如何創建名為 Boe-Bot 的新機器人實體。由於 Boe-Bot 使用差動式驅動系統控制機器人輪子,所以我能夠創建從 DifferentialDriveEntity 類派生的實體類型。這樣,我就可以重用 MSRS 提供 的代碼來控制使用此類型的驅動系統的機器人。
如果您要模擬使用其他驅動系統的機器人,則首先要添加代表該驅動系統的類 。例如,部分機器人使用三輪式驅動系統。在這種情況下,只有一個前輪用於移 動機器人,兩個側輪分別連接兩個單獨的馬達,用於在各自的方向上操縱機器人 。
為使此類系統可用於模擬世界或真實世界,需要創建一個類,用於說明此類型 的驅動系統。此操作的步驟不在本文的討論范圍之內,但 MSRS 允許您針對此類 型的方案提供相應步驟。此類可擴展性是使 MSRS 對機器人學研究人員的價值非 比尋常的原因之一。MSRS 可以擴展為支持任何類型的硬件平台。
Sara Morgan 是 2007 年度 Office Communications Server 領域的 Microsoft MVP。她的第一本著作《Building Intelligent .NET Applications》 於 2005 年出版。除了與人合著多個 Microsoft 培訓工具包之外,她最近還發布 了《Programming Microsoft Robotics Studio》。目前,她在 CoroWare.com 擔 任機器人軟件工程師。
本文配套源碼