Microsoft Robotics Studio可以使你在pc上創(chuàng)建程序來(lái)遠(yuǎn)程控制機(jī)器人,當(dāng)然我們知道,微軟的機(jī)器人軟件開(kāi)發(fā)平臺(tái)是架構(gòu)在.NET和.NET CF平臺(tái)下的,如果你的機(jī)器人自身安裝了.NET 或.NET CF的話,那么就機(jī)器人就可以脫機(jī)跑了,本文所說(shuō)的方法是針自身沒(méi)能夠安裝.NET和.NET CF平臺(tái)的機(jī)器人的哦。
這個(gè)實(shí)例主要講解怎樣為你的遠(yuǎn)程連接(有線或無(wú)線)機(jī)器人實(shí)現(xiàn)一個(gè)PC端的控制接口,實(shí)際上我們要實(shí)現(xiàn)一個(gè)負(fù)責(zé)和機(jī)器人通信的服務(wù),為了使這個(gè)服務(wù)更加通用,這個(gè)服務(wù)需要實(shí)現(xiàn)Microsoft Robotics Studio中所定義的通用協(xié)議,例如為Motor,Bumper,Contract,sonar等傳感器,Microsoft Robotics Studio為這些傳感器定義了統(tǒng)一通信協(xié)議,包括消息類型,消息體等,這些協(xié)議在 Robotics Common找到,這些協(xié)議使得我們隱藏機(jī)器人的細(xì)節(jié),實(shí)現(xiàn)了這些協(xié)議,就可以在VPL中使用一致的操作方式使用這些模塊了。
這個(gè)實(shí)例主要有以下幾個(gè)方面:
* 在機(jī)器人一端創(chuàng)建一個(gè)遠(yuǎn)程通信的接口
* 在PC端創(chuàng)建一個(gè)和機(jī)器人硬件交互的接口
* 使用Brick Service
* 實(shí)現(xiàn)一個(gè)通用的服務(wù)
準(zhǔn)備:
硬件:這個(gè)實(shí)例目的是幫助msrs不支持的硬件開(kāi)發(fā)服務(wù),你可能會(huì)發(fā)現(xiàn),使用下面的平臺(tái)會(huì)來(lái)學(xué)這個(gè)實(shí)例比較有幫助的。
* LEGO MINDSTORMS NXT
* fischertechnik
* iRobot Create
硬件制造商通常會(huì)為自己的平臺(tái)提服務(wù)供支持,在為這些硬件寫服務(wù)的時(shí)候可以看下官方網(wǎng)站或論壇,可有這樣的服務(wù)已經(jīng)有人寫好了哦。
軟件:這個(gè)實(shí)例是為使用Visual C#的開(kāi)發(fā)人員提供的,你可以使用下面的開(kāi)發(fā)工具:
* Microsoft Visual C# Expss Edition
* Microsoft Visual Studio Standard, Professional, or Team Edition.
開(kāi)始
這個(gè)實(shí)例由C#語(yǔ)言編寫,你可以在下面的MSRS目錄中找到這個(gè)實(shí)例的項(xiàng)目文件。
Samples\RoboticsTutorials\Tutorial6\CSharp
概述
這個(gè)實(shí)例通過(guò)分析LEGO NET機(jī)器人的服務(wù)來(lái)讓大家了解一個(gè)通用的、一個(gè)很有用的架構(gòu),架構(gòu)圖如下所示:
圖1-PC和機(jī)器人遠(yuǎn)程連接
圖2-LegoNxt機(jī)器人的服務(wù)架構(gòu)
第一步:在機(jī)器人上為遠(yuǎn)程通信開(kāi)發(fā)通信接口
你的機(jī)器人需要為外界提供接口,通過(guò)這個(gè)接口我們可以獲取機(jī)器人的傳感器和電機(jī)的信息,接口相應(yīng)的程序必須運(yùn)行在機(jī)器人自身系統(tǒng)上,比如單片機(jī)、arm等,如果機(jī)器人已經(jīng)提供了遠(yuǎn)程通信的接口(比如iRobot Create•,LegoNXT等機(jī)器人已經(jīng)實(shí)現(xiàn)了這樣的接口),那么你可以跳過(guò)此步了哦。
假如你的機(jī)器人不包括一個(gè)通信接口,你需要用自己去開(kāi)發(fā)這樣的接口,通過(guò)機(jī)器人所支持的開(kāi)發(fā)工具開(kāi)發(fā)程序,這些程序可以監(jiān)視傳感器的改變,并且向一個(gè)連接的PC端發(fā)送回消息,它應(yīng)該也可以很好的處理所接收的馬達(dá)消息請(qǐng)求,這些程序應(yīng)該是一個(gè)循環(huán)類的程序。
第二步:
現(xiàn)在把精力集中在運(yùn)行在PC端的代碼上,這些代碼和遠(yuǎn)程的機(jī)器人接口通信,代碼所實(shí)現(xiàn)的服務(wù)通過(guò)其他的協(xié)助服務(wù)或C++/CLI庫(kù)來(lái)實(shí)現(xiàn),這個(gè)實(shí)例中的 Brick Service完全負(fù)責(zé)和機(jī)器通信,這個(gè)Brick Service可以認(rèn)為是機(jī)器人在mrds平臺(tái)的一個(gè)抽象實(shí)體,所有和機(jī)器人的交互將由Brick Service實(shí)現(xiàn),mrds通過(guò)Brick Service來(lái)控制機(jī)器人,Brick Service的狀態(tài)應(yīng)該包含最新的馬達(dá)和傳感器信息。
LEGO NXT機(jī)器人使用一個(gè)藍(lán)牙接口,當(dāng)連接藍(lán)牙后,它會(huì)呈現(xiàn)為PC的一個(gè)串口提供給用戶使用,下面的代碼段實(shí)現(xiàn)了如何讀寫串口,這一步最重要的兩個(gè)部分是:1、確保有權(quán)限使用這個(gè)串口;2、在合適的位置處理從串口輸入的數(shù)據(jù)。
如何設(shè)置串口:
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);