python機器人編程1——手搓一個類ROS機器人消息訂閱發(fā)布模塊
一、前言
我們知道ROS是一個開源的機器人系統(tǒng),有人叫他是操作系統(tǒng),里面有豐富的生態(tài),如導航等,很多大學搞研究都利用它。但是,使用ROS很多是基于linux系統(tǒng),并且需要按照,學習,同時,很多用ROS可能只是為了使用它的消息發(fā)布訂閱機制,由于其基于的是進程間的通信,可能對通信的實時性也有一些影響。本章,我們來手搓一個純python構(gòu)建的類似ROS系統(tǒng)的消息訂閱發(fā)布系統(tǒng),非常輕量級,可以在開發(fā)機器人時候,想輕量化不想裝ROS系統(tǒng)的朋友們。并且我們把這個消息模塊用在了無人機仿真控制環(huán)境如下:

接下來開搞.....
二、總體設想
開發(fā)這個分布訂閱系統(tǒng)的目的,我們想是作為一個機器人系統(tǒng)的“中樞神經(jīng)”系統(tǒng),用于跟硬件打交道,并為上層運動控制軟件提供消息輸入輸出的服務,并且需要保持一定的實時性,滿足實時控制,整個框架設想如下:

三、系統(tǒng)的組成
如上圖所示,我們的一個消息訂閱發(fā)布系統(tǒng)可以負責跟硬件打交道,通過如串口、以太網(wǎng)口通信的方式去和采集硬件如網(wǎng)關進行通信,這個我們在這里命名為“第一級原始信號通訊”,然后我們會進入一個預處理模塊,對原始信號進行一些預處理,這個預處理模塊根據(jù)需要我們可以自定義修改,預處理的型號變成了上層模塊想要的格式和頻率的TOPIC(主題)后,可以將這個TOCPIC發(fā)布出來,供多個用戶訂閱后使用,這個過程我們命名為“第二級信號預處理”。經(jīng)過這個兩級處理,從底層傳感或者部件采集的不同頻率、不同格式數(shù)據(jù)就變成了可以供上層應用的有固定周期和格式的TOPIC。接下來就可以做各種應用模塊了。
四、python代碼構(gòu)建
構(gòu)建一個MessageBroker消息代理類
python實現(xiàn)的消息代理類其實也非常常見了,網(wǎng)上到處都是,這里我們結(jié)合了一下協(xié)程的概念,對普通的消息代理類進行了一些優(yōu)化,利用協(xié)程的高性能特性,勢必可以在大量的消息來源服務下保持一個好的性能,這部分有待壓力測試,發(fā)布本博文前并未經(jīng)過性能測試。源代碼如下:
以下這個是常規(guī)的MessageBroker類:
以下這個是引入?yún)f(xié)程的MessageBroker類:
如上所述,我們可以實例化這個類之后,通過start()啟動這個消息服務,并且是在新線程中運行,不會影響主線程,也保持了一定的實時性,然后在main()這個消息分發(fā)處理方法中,采用了協(xié)程處理,這樣理論上會提高處理時間。
此外,可以通過`subscribe` 和`unsubscribe` 來訂閱相關的主題,用`publish` 發(fā)布主題:
下面是使用MessageBroker消息代理類
運行如下:

構(gòu)建一個DataProcessor消息預處理類
根據(jù)我們的設想,是要建設一個消息預處理系統(tǒng),也就是對原始數(shù)據(jù)進行加工處理,將原始數(shù)據(jù)按照一定的頻率發(fā)布出去供上層訂閱使用。這個DataProcessor是這么構(gòu)建的:
如上所述,我們在`DataProcessor`初始化時定義了`interval` 消息更新的周期,`broker` 指定的分發(fā)模塊,`topic` 預處理完后的消息名稱如“機械臂末端坐標”,`processer` 預處理的自定義函數(shù),預處理默認我們內(nèi)置了一個在周期內(nèi)取平均的過濾器。這樣就可以把各路原始數(shù)據(jù)來自`一級系統(tǒng)`進行預處理后在`二級系統(tǒng)`的`broker`中進行發(fā)布了。
此外,我們知道原始數(shù)據(jù)路數(shù)非常多,如果使用串行進行預處理肯定是不合理的,特別是用到某些耗時的預處理函數(shù)時,那么我們還是引入了協(xié)程處理的方式,通過再開啟一個線程,并集中創(chuàng)建預處理任務的方式,讓各路預處理函數(shù)平行運行,這樣就提高了效率。于是我們再要構(gòu)建一個類`DataProcessors`
構(gòu)建一個DataProcessors平行協(xié)程處理類
這個類的代碼如下:
綜合應用示例
結(jié)合以上三個模塊,我們就完成了本標題的一個類ROS機器人消息訂閱發(fā)布模塊,以下是簡易使用:
如上所述,我們對一級原始數(shù)據(jù)通過broker進行發(fā)布"topic1"給預處理器processor,processor在processors的線程里周期處理原始數(shù)據(jù),處理完后按照周期為1s定時進行發(fā)布"topic2","topic2"即為成品數(shù)據(jù),給subscriber4使用。

如上圖,紅框為原始數(shù)據(jù),紅線為預處理后的成品數(shù)據(jù)(這里是平均值)。
# 五、總結(jié)
好了到此,我們構(gòu)建了一個非常輕量的類ROS機器人消息訂閱發(fā)布模塊,當然跟ROS其實沒有半毛錢關系,也沒法比較,只是一個說頭。源碼已經(jīng)上傳至云盤,評論區(qū)留言獲取。
下一篇我們將這個系統(tǒng)用于無人機的控制,盡情期待.....
