本節書摘來華章計算機《仿人機器人原理與實戰》一書中的第2章 ,第2.3節,作者布萊恩·伯傑倫(bryan bergeron) 托馬斯b. 塔爾博特(thomas b. talbot) 王偉 魏洪興 劉斐 譯, 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
有了第1章描述的反射弧,再加上機械臂、溫度和壓力傳感器以及一點想象力,我們将探讨一個關于圖2-1中所示的理論上的行為鍊架構的實際例子。作為一個四肢健全的仿人機器人的組成部分之一,機械臂是一個很好的實驗平台,因為它足夠複雜以至于能夠示範許多種肢體上的行為鍊。我們的另一個選擇是應用仿真。然而,電腦仿真或許能夠展現出應當發生的事情,然而在現實中移動具體的事物更具有魔力。
如圖2-3所示,我們通過按鈕s1來啟動夾持器夾緊的動作。如果夾持器上的傳感器測量出被夾物體的溫度過高,則夾持器會松開并把物體扔掉。經過了短暫的不應期,溫度傳感器會冷卻下來到達抓取允許範圍内,系統會再次對夾緊做出反應。我們分别用兩個電位器p1和p2模拟腎上腺素對反射的刺激作用和大腦對反射的抑制效應。

相反,如果夾持器與物體接觸後,溫度沒有超過限定值,那麼夾持器将會夾緊物體,夾緊力可以由夾持器上的壓力傳感器測量得到。在這段時間内,物體可以被機械臂夾持着在空間内移動或者隻是保持不動。按下按鈕s2,夾持器将會打開,使得系統能夠對按下按鈕s1進行反應。
我們用來探究行為鍊的實驗平台是一個五自由度(dof)的機械臂,它由廉價的模拟量舵機搭建而成。用傳統的舵機搭建的機械臂的主要優點是使用友善、設定便捷以及有許多可相容的軟硬體。例如,有了适用于sony ps/2控制器和諸如botboarduino的相容arduino控制卡的arduino函數庫,當我們要控制多個舵機時就會很容易。隻要用到模拟量舵機,你就會用到這裡包含的程式範例以及标準的arduino函數庫。
另一種方案是利用由ax-12a dynamixel舵機搭建的機械臂。盡管數字量舵機由于特别的硬體裝配以及不相容arduino序列槽而很難使用,然而它們有内置的溫度、位置、負載電壓、輸入電壓以及輸出軸柔順的傳感器。如果你願意在串行控制線中增加一個晶片,那麼savage electronics公司針對arduino 的dynamixel舵機庫是很值得嘗試的。在這章中可以很容易地改造出dynamixel 舵機或其他數字舵機環境,但是對于舵機的控制不可避免地将會與本章描述的有所不同。
如果你沒有很多錢花費在機械臂上,那麼你也可以考慮買一個或者自己做一個單一舵機的夾持器(沒有機械臂)。或者你也可以參照第1章中用來做簡單的反射弧仿真的兩舵機實驗平台。你可以在舵機擺臂上安裝訓示器用來觀察關節的彎曲和夾持器的關閉。
除了現有的機械臂實驗平台、arduino微處理器、sony ps/2控制器,或者其他互動地控制機械臂位置的方式,還需要以下器材:
功率電阻或其他熱源
熱源的供電電源(可選,由熱源而定)
tmp36 模拟量溫度傳感器
10kΩ熱敏電阻
cds光傳感器
力傳感電阻器
瞬時接觸開關按鈕(2個)
10kΩ電位計(2個)
給arduino和舵機供電的 5v直流電源
跳線帽和導線
自選擴充闆(可選)
本組實驗的所有元器件如圖2-4所示,包括一套标準的arduino uno、grove擴充闆、grove按鈕和電位計、力和溫度傳感器以及lynxmotion機械臂。注意:功率電阻當作熱源使用。
用一隻已經标定過的溫度探頭和數字萬用表(dmm)來确定熱源的溫度,如果有的話就更好了,實在沒有也沒關系。盡管你的手指不是一杯咖啡或者一個大型功率電阻,但是也可以作為熱源的選項之一。在圖2-4中沒有顯示的器件是為功率電阻、arduino和機械臂供電的電源,還有連接配接機械臂舵機、傳感器、按鈕和電位器到grove擴充闆上的無數根導線。
熱源由你標明。你的選擇将會取決于機器夾持器的尺寸和負載能力。幸運的是,即使價值35美元的玩具機械臂也能夠拿得動5w的功率電阻的和一些短的電源線。
圖2-5展示了第一個實驗的完整電路。為了簡化起見,肘關節、肩關節、基座舵機的詳細的機械和電子結構沒有表示在圖的右側。在電子方面,每個舵機配有5v直流電源和gnd,以及連接配接自arduino的脈寬調節(pwm)信号。内置溫度和力傳感器的夾持器的機械部分在圖中左下角表示出來。
力傳感電阻器fsr1不是強制性的。如果你很擅長操作夾持器,則可以不考慮這一部分。但是如果你不能熟練地在恰當的時候停止夾持器,便會面臨破壞舵機中的齒輪的風險。就這一點而言,fsr1是相對便宜的保險,而且在機械臂的其他實驗中也會更為友善。
10kΩ 熱敏電阻t1與10kΩ的電阻器r2一起使用,形成一個分壓器對5v直流供電電壓進行分壓。熱敏電阻與溫度負相關,随着溫度的升高熱敏電阻阻抗降低。在使用sparkfun公司的熱敏電阻的電路中,從arduino中讀到的環境溫度是450(2.19vdc)。抓緊手指時溫度讀數增加到475(2.32vdc),響應速度也很快,小于一秒鐘。
由于分壓器的配置形式,溫度讀數随溫度增加而升高(increase)。t1的阻值越低,電壓在r2兩端下降得越多,在arduino模拟量輸入端輸入的電壓就越高。
由于t1的阻抗變化與溫度的關系不是線性的,是以需要用一個校準的溫度計或溫度傳感器作為查詢表或轉化公式以收集資料,這樣我們可以将熱敏電阻處的壓降值轉化成準确的溫度讀數。當電阻自加熱時,你也可以調整查詢表或轉化公式以保證測量準确。由于10kΩ的熱敏電阻的阻值和1mΩ或更大的固态傳感器的阻值相比是很小的,是以電流和散熱效果都很明顯。幸運的是,不必在這方面花費心思,因為相對于散熱導緻的溫度變化,實驗時的溫度變化是十分顯著的。而且熱敏電阻價格不高且響應很快,對溫度變化的響應時間隻需要幾百毫秒。
除了在夾持器的兩片相對的颚上安裝溫度和壓力傳感器以外,在建構過程中并沒有更多的任務。用雙面膠将grove接線端子粘在兩颚外側,如圖2-6所示,一個接線端子上裝有熱敏電阻和10kΩ電阻器。不論你是否在電路闆上使用接線端子,都要在颚内側粘上絕緣泡沫材料将熱敏電阻和接線端子間裸露的電線隔離絕緣。
第二個接線端子上安裝力傳感電阻器fsr1,如圖2-7所示,它安裝在與熱敏電阻相對的夾持器的颚上。注意,在力傳感電阻器上粘接了墊套,墊套可以保護電阻器不被尖銳、硬質物體所破壞,也可以把力均勻地施加在電阻器表面。裝在grove接線端子上的10kΩ電阻器被力傳感電阻器上的扁平引線蓋住。
把開關按鈕連接配接到合适的數字信号輸入端,把兩個電位計直接或經過擴充闆接入模拟量輸入端。grove系統的一個不足之處是預設按下按鈕的動作會使電位變為高電位。如果你想用arduino内置的電阻器把電位提高,而用外部的按鈕降低電位,這将是一個問題。一個簡單的解決方案時将grove電纜中的地線和vcc交換。
如果你一定要與圖2-5中不同,使用arduino 的其他引腳,那麼記住編碼時要改變引腳配置設定。例如,你正好使用botboarduino以及ps/2接口,則應當更改管腳配置設定,為ps/2控制器的四個連接配接引腳騰出空間。
由于你可能沒有和我們例子中lynxmotion機械臂有類似電路結構的機械臂,是以我們把重點放在夾持器舵機和溫度傳感器上。另外,為了友善起見,我們将用标準的arduino舵機庫函數和arduino uno。應當不需要任何麻煩就能将下述代碼整合到你的機械臂上。
清單2-1 行為鍊實驗中的arduino代碼
現在我們仔細地将清單2-1從上到下解釋一遍,最初我們加載舵機庫,之後定義arduino uno的輸出引腳,初始化程式中的變量。啟動時我們會測量周圍環境的室溫,并把表示溫度的值存儲在tmpvaluestartup變量中。
在主循環中,我們讀取扔物體反射的p1(抑制器)以及p2(激勵器)的值并把其反映到變量p1value和p2value上。p1映射為0~100,同時p2映射為0~tmpdifference,将熱敏電阻的目前讀數與最初周圍環境的溫度差設定為觸發值。在這個例子中,因為我們要處理的溫度差較小,是以這個值僅為10。
當按鈕s1被按下,軟體會率先檢測目前熱敏電阻讀數與設定的tmpdifference變量的差。如果溫度差足夠低(換言之,熱敏電阻已冷卻充分)且力傳感電阻沒有收到超出門檻值的壓力,當且僅當這種情況下夾持器閉合。s2按鈕是手動控制按鈕,按下後夾持器會迅速打開。
下面一段看起來簡單的代碼表達的就是由“皮質”抑制(p1value)和“腎上腺素”激勵(p2value)控制的半自動行為:
随着p1順時針旋轉,p1value增加,控制扔掉物體的溫度和周圍環境的有效溫度差增加。相反,如果p2順時針旋轉,p2value增加,控制扔掉物體的溫度和周圍環境的有效溫度差減小。在這個例子中,p1value的取值範圍是0~100,p2value的取值範圍是0~tmpdifference。這樣,夾持器受相對溫度差的限制,不會不斷地扔掉夾持物體。
在實際操作中,使用sony ps/2控制器、操縱杆或是一系列瞬時開關按鈕,抑或其他控制方式把機器人的基座、肩、肘關節移動到腕關節可以撿起物體的地方。按下瞬時開關按鈕s1直到夾持器與物體接觸,之後通過電路控制系統夾起并移動物體。當然,如果你要移動連有供電線的電阻器,小心不要弄斷電源連接配接。在電阻器和電源電纜的末端可以用彈簧夾或者用一個3.5mm的插塞接頭把電傳遞給電阻器。
另外一個方案是用拇指當“熱物體”,如圖2-8所示。要保證手指肚與熱敏電阻相接觸。與手指上的軟組織相比,指甲相對而言是好的絕緣體,能夠與力傳感器充分接觸。
如圖2-3所示,如果物體的溫度低于軟體中設定的允許溫度值,那麼夾持器和機械臂會依照你的指令而運動,即你可以把電阻器和其他物體移動到想要的位置。按下按鈕s2則會釋放物體,夾持器會完全張開,腕關節會回到等待位置。用其他控制器把基座和其他關節移動到初始位置,為下一次測試運作做準備。
但是,如果物體溫度等于或高于定義的允許溫度,且p1和p2都逆時針轉到頭,那麼夾持器将張開并扔掉物體。幾秒之後當熱敏電阻冷卻完全時,夾持器将繼續對按鈕s1做出反應。
如前所述,如果順時針旋轉p1,增加p1提供的阻抗,則自動扔掉物體的行為将會被抑制,在p1的順時針極限位置将不會有根據被夾物體溫度自動扔掉物體的行為。設想機器人拿着一杯熱咖啡懸在你頭上,你一定不希望服務機器人扔掉咖啡,甚至不惜為此而傷害機器人。理想情況下,仿人機器人應當具備一些高優先級的模式識别裝置來識别即将發生的危險,并且有效地将p1表示的值最大化。
順時針旋轉p2将會削弱p1的作用,但是由于兩電位計設定值範圍的原因,最多隻能到達一定程度。然而當p1在逆時針的極限位置時,p2的激勵作用足以使熱敏電阻中的噪聲信号觸發扔物體的反射。所有這些互動作用都是由tmpdifference的設定值以及p1和p2的權重決定的。
這中間簡單的三條連接配接反射弧是很有實際應用價值的。設想服務仿人機器人的手上覆寫了昂貴的仿生乳膠,當仿人機器人從爐子上拿起一口極熱的鍋時,如果你已經提供了行為鍊功能,那麼将不必為修複燒焦的乳膠而發愁。
對溫度進行感覺的夾持器會對皮膚和肌肉做出反應,這一點可應用于安全方面。設想機器人助理廚師在準備沙拉時抓取了一個蕃茄,而此時你不小心也抓着這個蕃茄。如果機器人具備溫度感覺和瞬間釋放功能,你便可以逃脫手指被切的危險。
這種簡單行為鍊的另一種替代方案是針對仿人機器人在廚房中的每一個動作,在中央處理器中寫出特定工作條件下的大量規則。但是,你很有可能忘記了一些發生幾率很小的情況,諸如當檢查餡餅時不要把頭伸進烤箱。一些情況下,提供簡單、低級的行為鍊處理潛在事故,而在需要時提供皮質抑制或是腎上腺素激勵。我們可以回憶老鼠參加迷宮比賽的情況。