摘? 要:當(dāng)前家用機器人的主流回座方法大都是基于紅外信號,也就是說,大多數(shù)家用機器人(如掃地機器人、陪伴機器人等)采用的是能夠發(fā)射紅外信號的充電座。由于各廠家的移動機器人模具不同,充電座紅外信號不同,導(dǎo)致機器人的回座方法也千差萬別。文章介紹一種面向移動機器人、依賴紅外信號回座的通用回座方法,該回座方法提供一套完整的軟件架構(gòu),用以規(guī)范回座算法,降低回座算法的開發(fā)難度,使得任何一個軟件工程師都可以進(jìn)行回座功能的開發(fā)。
關(guān)鍵詞:家用機器人;紅外信號;充電座;軟件架構(gòu)
中圖分類號:TP242;TP18? 文獻(xiàn)標(biāo)識碼:A? 文章編號:2096-4706(2023)23-0171-06
A Universal Reseating Algorithm for Mobile Robots
LI Ming
(Amicro Semiconductor Co., Ltd., Zhuhai? 519000, China)
Abstract: The current mainstream reseating methods for household robots are mostly based on infrared signals, which mean that most household robots (such as sweeping robots, companion robots, etc.) use charging stations that can emit infrared signals. Due to the different molds of mobile robots from different manufacturers and the different infrared signals of charging stations, the methods of robot resetting also vary greatly. This paper introduces a universal reseating method for mobile robots that relies on infrared signals for reseating. This reseating method provides complete software architecture to standardize the reseating algorithm, reduce the difficulty of developing reseating algorithms, and enable any software engineer to develop reseating functions.
Keywords: household robot; infrared signal; charging station; software architecture
0? 引? 言
機器人作為一個完全獨立自主的系統(tǒng),自動回座是其不可或缺的功能。當(dāng)前市面上大多數(shù)家用機器人主流的回座都是依靠紅外引導(dǎo)的方式實現(xiàn)。市面上常見的小米、石頭、追覓等掃地機器人廠商均有使用該方案。本文介紹一種適用于依靠紅外信號回座的移動機器人通用回座方法,將回座算法進(jìn)行歸納分解,搭建一套完整的回座算法軟件架構(gòu),此架構(gòu)可規(guī)范回座算法,使軟件結(jié)構(gòu)清晰,大大降低了回座算法的開發(fā)難度。同時,此軟件架構(gòu)具有通用性,適用于基于紅外引導(dǎo)回座的所有機器人。
1? 模塊介紹
1.1? 硬件介紹
Dock由充電座和機器人兩部分組成。充電座發(fā)出紅外信號,機器人根據(jù)所接收的紅外信號回座充電。通常,充電座的紅外信號分為左信號、右信號、中間信號(有的是左右信號疊加)、護(hù)欄信號(圓泡信號)。
充電座的信號分布如圖1所示。機器人有數(shù)目不等的紅外接收頭,正中間的一個或兩個紅外接收頭用來對準(zhǔn)座子上座,左右通常都會有一個紅外接收頭以保證樣機側(cè)面也能收到座子信號。個別機器人的機身后面還有一個紅外接收頭,確保樣機360度都可以接收到紅外信號。有些機器人頭頂有個360度的紅外接收頭,用以代替機身左右及后方的紅外接收頭。
1.2? 軟件架構(gòu)
Dock架構(gòu)如圖2所示。軟件分為兩層:Core層和驅(qū)動層。Core層實現(xiàn)回座行為的切換。當(dāng)前最多支持32個回座行為(可配置),最高優(yōu)先級為0,最低優(yōu)先級為31。各個行為根據(jù)其進(jìn)入條件,會進(jìn)行實時搶占式調(diào)度。Core層不對外開放,驅(qū)動層實現(xiàn)回座的行為。各個行為完全獨立,根據(jù)自身設(shè)定的進(jìn)入條件及優(yōu)先級完成啟動。
2? 架構(gòu)實現(xiàn)
2.1? Debouncer介紹
由于紅外信號具有瞬時性,加入Debouncer功能,可實現(xiàn)信號去抖動。
定時輪詢對應(yīng)的紅外信號,只要收到一次即認(rèn)為此信號有效。連續(xù)多次輪詢沒有收到時才認(rèn)為信號失效。
2.1.1? 數(shù)據(jù)介紹
predicate指針指向?qū)?yīng)的觸發(fā)函數(shù),返回True時代表收到對應(yīng)的紅外信號碼值,否則返回False。
tigger_on記錄on門限值,連續(xù)N次觸發(fā)函數(shù)返回True,且N大于等于tigger_on時,current_state為True。
tigger_off記錄off門限值,連續(xù)N次觸發(fā)函數(shù)返回False,且N大于等于tigger_off時,current_state為False。
on_count、off_count表示Core層內(nèi)部使用,記錄on與off的次數(shù)。
current_state表示Debouncer當(dāng)前的狀態(tài)。
set_dock_context表示設(shè)置上下文環(huán)境。用于在特定環(huán)境下設(shè)置樣機對應(yīng)的參數(shù)。如靠近充電座,對應(yīng)的Debouncer為True時,提高cliff閾值,關(guān)閉light touch等。遠(yuǎn)離充電座時,再恢復(fù)其對應(yīng)的參數(shù)。
2.1.2? 更新邏輯
Debouncer更新邏輯:每10 ms調(diào)用輪詢一次。
每個Debouncer根據(jù)其predicate函數(shù)的返回值,更新其on_count和off_count的值。predicate函數(shù)返回True時,其on_count加1,off_count設(shè)為零。predicate函數(shù)返回False時,其off_count加1,on_count設(shè)為零。
當(dāng)on_count大于trigger_on時,Debouncer的current_
state為True,當(dāng)off_count大于trigger_off時,Debouncer的current_state為False。
2.2? 行為介紹
行為behavior分為兩種,分別為邊沿觸發(fā)行為和電平觸發(fā)行為。
對于邊沿觸發(fā)行為,只要是觸發(fā)信號由False變?yōu)門rue,行為即被觸發(fā),啟動運行,需要自己主動退出行為。
對于電平觸發(fā)行為,當(dāng)觸發(fā)信號為True時,行為運行,當(dāng)觸發(fā)信號為False時,行為退出。
2.2.1? 數(shù)據(jù)結(jié)構(gòu)
Dock_Data結(jié)構(gòu)體用來管理behavior,其有如下幾個變量:
current_function函數(shù)指針指向?qū)?yīng)的behavior實現(xiàn)函數(shù)。
start_when函數(shù)指針指向邊沿觸發(fā)函數(shù),當(dāng)此函數(shù)的返回值由False變?yōu)門rue時,行為觸發(fā)。
run_when函數(shù)指針指向電平觸發(fā)函數(shù),此函數(shù)返回True時,行為啟動,返回False時,行為結(jié)束。
abort_when函數(shù)指針指向的函數(shù)返回True時,行為退出,與start_when配合使用。
abort_code函數(shù)指針在行為退出時,執(zhí)行其指向的函數(shù)。
last_start_state記錄上一次start_when的狀態(tài)。
priorty代表此behavior的優(yōu)先級,0為最高優(yōu)先級,數(shù)值越大,優(yōu)先級越低。
一個行為具有start_when和run_when兩種函數(shù),只有一個函數(shù)有效,另一個函數(shù)應(yīng)為空函數(shù)。
2.2.2? 行為切換
行為的調(diào)度采用搶占式調(diào)度策略,從所有行為中選擇優(yōu)先級高的行為運行。
1)行為篩選。當(dāng)前行為為空或為電平觸發(fā)行為時,所有行為參與篩選。當(dāng)前行為為邊沿觸發(fā)行為,且其不滿足abort條件的情況下,只有優(yōu)先級高的行為才能強制它。因此選擇下一個行為時,比它優(yōu)先級低的行為不參與篩選。從當(dāng)前行為及其他參與篩選的行為中,選擇優(yōu)先級最高的行為作為下一個要執(zhí)行的行為。
2)行為切換。行為運行在一個嵌入式操作系統(tǒng)task中。每次進(jìn)行行為切換,都要先刪除這個task,然后將其運行的行為指針指向新的行為,最后重新創(chuàng)建并啟動task。每次行為切換都要刪除task,重新創(chuàng)建的原因是保證每次都是一個新的行為運行。
2.3? 歸納總結(jié)
此Dock架構(gòu)有兩個好處:
1)Dock行為之間獨立,沒有耦合,有利于多個項目重用。
2)實時性好,行為的切換由單獨的Core層完成。Core層的行為切換判斷代碼在定時器的中斷服務(wù)函數(shù)中執(zhí)行。
3? 一種回座算法思路
將充電座信號劃分為四種區(qū)域,如圖3所示。
1)區(qū)域1。機器人什么信號都收不到,因此機器人進(jìn)行隨機模式行走,搜索信號。
如圖4(a)所示,機器人在區(qū)域1時接收不到任何紅外信號,機器人進(jìn)行隨機模式行走,尋找座子發(fā)出的紅外信號。
2)區(qū)域2。機器人收到了左信號或右信號,說明充電座的正前方就在附近。
如圖4(c)所示,機器人在區(qū)域2時,實現(xiàn)如上圖中的一種行為,去尋找中間線,并將機器人姿態(tài)調(diào)整為正對著充電座。一種是向中間線走,邊走邊轉(zhuǎn)向充電座方向,以確保行走在中間線上。一種是朝充電座方向弧形搖擺前進(jìn),直至走到中間線內(nèi)或收到了圓泡信號。
3)區(qū)域3。機器人可以同時收到左信號和右信號或中間信號,表明充電座就在機器人的前方。
圖4(b)所示,機器人在區(qū)域3時根據(jù)正前方的紅外接收頭接收到左信號、右信號兩個信號或者是接收到中間信號,實時調(diào)整樣機姿態(tài),使得機器人能夠精準(zhǔn)地對接充電座,進(jìn)行充電。
4)區(qū)域4。機器人收到了圓泡信號,說明當(dāng)前機器人離充電座很近,有可能撞到充電座。
圖4(d)所示,機器人可以繞圓泡信號行走,收到中間信號,直接旋轉(zhuǎn)掉頭直至樣機正前方的紅外接收頭接收到中間信號,然后切換到區(qū)域3的行為對準(zhǔn)上座。
4? 回座算法實現(xiàn)方法
可根據(jù)不同的模具、紅外信號特點,設(shè)計自己的回座行為。本節(jié)介紹當(dāng)前我們實現(xiàn)的一套算法行為,可適配公司大部分掃地機器人,由于不同模具具有不同的紅外信號,只需微調(diào)Debouncer及觸發(fā)函數(shù)start_when、run_when。
4.1? 區(qū)域1找信號
當(dāng)機器人在區(qū)域1時,收不到任何充電座信號,此時進(jìn)行隨機模式行走尋找充電座信號。隨機跑由兩個行為組成:docking_line和docking_line_bounce。docking_line走直線,docking_line_bounce遇到障礙物時隨機轉(zhuǎn)一個角度。
4.1.1? docking_line
docking_line行為為電平觸發(fā)方式。
觸發(fā)條件及行為實現(xiàn)如下:
1)觸發(fā)條件。電平觸發(fā)函數(shù)run_when永遠(yuǎn)有效,但其在所有行為中的優(yōu)先級最低。因此當(dāng)其他行為都無效時,它會運行。
2)行為實現(xiàn)。行為實現(xiàn)函數(shù)current_function控制機器人走直線。start_when函數(shù)指針、abort_when函數(shù)指針、abort_code函數(shù)指針都為空指針。
4.1.2? docking_line_bounce
docking_line_bounce行為為邊沿觸發(fā)方式。
觸發(fā)條件、退出條件及行為實現(xiàn)如下:
1)觸發(fā)條件。run_when函數(shù)指針為空指針。start_when函數(shù)的實現(xiàn)邏輯為遇到障礙物時獲取一個隨機角度,并設(shè)置旋轉(zhuǎn)方向為障礙物的反方向。當(dāng)發(fā)現(xiàn)障礙物時返回True觸發(fā)docking_line_bounce行為,其優(yōu)先級高于docking_line。
2)退出條件。用一個全局變量docking_line_bounce_abort記錄是否有行為要退出。abort_when函數(shù)用于判斷此全局變量,當(dāng)此全局變量被設(shè)置時abort_when函數(shù)返回True,docking_line_bounce行為退出。abort_code函數(shù)復(fù)位docking_line_bounce_abort變量,為下次行為進(jìn)入做準(zhǔn)備。
3)行為實現(xiàn)。根據(jù)start_when函數(shù)給出的旋轉(zhuǎn)角度、旋轉(zhuǎn)方向,控制機器人旋轉(zhuǎn),當(dāng)旋轉(zhuǎn)到目標(biāo)角度時設(shè)置docking_line_bounce_abort變量主動退出docking_line_bounce行為。
4.2? 區(qū)域2找中線
當(dāng)機器人處于區(qū)域2時,可以收到左信號或右信號,此時觸發(fā)docking_left_right行為。此行為將找到區(qū)域3,并將機器人的正前方對準(zhǔn)充電座,然后此行為退出,將控制權(quán)交給區(qū)域3的行為。
觸發(fā)條件、退出條件及行為實現(xiàn)如下:
1)觸發(fā)條件。有接收頭收到左信號或右信號,前方正中間紅外接收頭沒有收到中間信號(包括同時收到左信號和右信號)。
為了解決紅外信號的瞬時性,相關(guān)Debouncer定義如下:
recently_left_left代表機器人左邊接收頭接收左邊信號。收到1次就有效,連續(xù)50次未收到失效。
recently_right_left代表機器人左邊接收頭接收右邊信號。收到1次就有效,連續(xù)50次未收到失效。
recently_right_right代表機器人右邊接收頭接收右邊信號。收到1次就有效,連續(xù)50次未收到失效。
recently_left_right代表機器人右邊接收頭接收左邊信號。收到1次就有效,連續(xù)50次未收到失效。
recently_center_focus代表中間接收頭接收左邊或右邊信號。收到1次就有效,連續(xù)10次未收到失效。
run_when函數(shù)指針為空指針。
start_when函數(shù)實現(xiàn)邏輯如下:
當(dāng)recently_left_left、recently_left_right為True,且recently_center_focus為False,start_when函數(shù)返回True,且記錄機器人當(dāng)前在充電座左邊的區(qū)域2。
當(dāng)recently_right_left、recently_right_right為True,且recently_center_focus為False,start_when函數(shù)返回True,且記錄機器人當(dāng)前在充電座右邊的區(qū)域2。否則,start_when函數(shù)返回False。
2)退出條件。abort_when函數(shù)實現(xiàn)原理為,正中間紅外接收頭同時接收到左信號和右信號時退出。
3)行為實現(xiàn)。樣機直接擺動著向中線靠近。如樣機前方紅外接收頭接收到左信號就向右擺動,接收到右信號就向左擺動,且擺動弧度要大一些。如若擺動過程中收不到信號,就原地反方向轉(zhuǎn)圈或小弧度反方向擺動,直至重新接收到信號,再接著做大弧度擺動。
4.3? 區(qū)域3正面上座
正面對著上座,由docking_go_forward、docking_left、docking_right三個行為完成。
docking_go_forward行為表示直行;docking_left行為表示向左走弧形;docking_right行為表示向右走弧形。
三個行為的優(yōu)先級順序為docking_go_forward最高,docking_left最低。這三個行為根據(jù)樣機正中間的紅外接收頭實時收到信號,進(jìn)行實時任務(wù)切換,使樣機能夠正對著上到充電座上。
4.3.1? docking_go_forward
docking_go_forward為電平觸發(fā)行為,樣機正中間的紅外接收頭同時接收到左信號和右信號或者是接收到中間信號時運行。
觸發(fā)條件、退出條件及行為實現(xiàn)如下:
1)觸發(fā)條件。Debouncer定義正中間的紅外接收頭,同時接收到左信號和右信號,或者是接收到中間信號。只要滿足條件1次就有效,連續(xù)2次不滿足條件則失效。
此Debouncer有效,則run_when函數(shù)返回True,docking_go_forward行為生效。
start_when函數(shù)指針、abort_when函數(shù)指針、abort_code函數(shù)指針都為空指針。
2)退出條件。無。
3)行為實現(xiàn)。向左右輪流發(fā)送同樣的速度命令,使機器人直行。
4.3.2? docking_right
docking_right為電平觸發(fā)行為,樣機正中間的紅外接收頭只接收到左信號時運行。
觸發(fā)條件、退出條件及行為實現(xiàn)如下:
1)觸發(fā)條件。Debouncer定義如下。如若正中間的紅外接收頭只接收到左信號,1次就有效,連續(xù)20次未收到則失效。此Debouncer有效,則run_when函數(shù)返回True,docking_right行為生效。start_when函數(shù)指針、abort_when函數(shù)指針、abort_code函數(shù)指針都為空指針。
2)退出條件。無。
3)行為實現(xiàn)。將機器人的右輪子設(shè)置為較慢的速度,將機器人的左輪子設(shè)置為較快的速度,使樣機向右走弧線。
4.3.3? docking_left
docking_left為電平觸發(fā)行為,樣機正中間的紅外接收頭只接收到右信號時運行。docking_left行為與docking_right行為類似,這里不再贅述。
4.4? 區(qū)域4避開座子
機器人不是正對著座子,且機器人接收到了圓泡信號,說明機器人有可能撞到座子。此時應(yīng)觸發(fā)避座行為docking_force_field。
docking_force_field行為為邊沿觸發(fā)方式,可實現(xiàn)繞座功能。
觸發(fā)條件、退出條件及行為實現(xiàn)如下:
1)觸發(fā)條件。中間紅外接收頭沒有收到左右信號,但樣機收到圓泡信號時觸發(fā)。
Debouncer定義如下:
recently_near_dock代表樣機是否接收到圓泡信號,收到1次就有效,連續(xù)20次沒有收到則無效。
recently_force_field代表樣機一段時間內(nèi)多次收到圓泡信號。recently_near_dock有效23次,其有效;recently_near_dock失效1次,其失效。
recently_no_force_field代表中間接收頭是否收到左右信號。收到1次就有效,連續(xù)100次沒有收到則無效。
start_when函數(shù),當(dāng)recently_force_field有效、recently_no_force_field無效時,返回True,docking_force_field行為運行。
退出條件及行為實現(xiàn)如下:
1)退出條件。docking_force_field行為自己設(shè)置docking_force_field_abort變量,主動退出docking_force_field行為。用一個全局變量docking_force_field_abort記錄是否有行為要退出。abort_when函數(shù)判斷此全局變量,當(dāng)其被設(shè)置時返回True,docking_force_field行為退出。abort_code函數(shù)復(fù)位docking_force_field_abort變量,為下次行為進(jìn)入做準(zhǔn)備。
2)行為實現(xiàn)。docking_force_field繞座行為。當(dāng)樣機接收頭接收到圓泡時,遠(yuǎn)離座子走弧線;當(dāng)樣機接收頭接收不到圓泡信號時,靠近座子走弧線;直至機器人有接收頭同時接收到座子發(fā)出的左信號和右信號或者是中間信號。調(diào)整樣機方向,使樣機正前方的中間接收頭可以收到左信號和右信號或者是中間信號。
4.5? 優(yōu)先級
各行為優(yōu)先級從高到低分別為:DOCKING_FORCE_FIELD、DOCKING_LEFT_RIGHT、DOCKING_LINE_BOUNCE、DOCKING_GO_FORWARD、DOCKING_RIGHT、DOCKING_LEFT、DOCKING_LINE。
5? 實驗數(shù)據(jù)
5.1? 測試方法
試驗臺長為5 000 mm,寬為3 000 mm,圍欄高度至少為300 mm。
清潔機器人放置在以充電座為中心,半徑分別為1 000 mm和2 000 mm的半圓弧上。每個位置點和充電座的連線成0°、45°、90°、135°和180°。將清潔機器人放置在離充電座1 000 mm的位置上啟動返回鍵運行,記錄其是否能在3 min內(nèi)成功對接充電。在每個位置試驗4次,清潔機器人的頭部放置方位分別和充電座連線逆時針成0°、90°、180°和270°。在離充電座2 000 mm的位置重復(fù)以上試驗,運行時間為5 min。在10個位置進(jìn)行試驗40次,按照公式計算對接成功率。
注意:如果在試驗過程中,清潔機器人將充電座推離原位置0.5 m遠(yuǎn),則記為未對接成功。測試方法演示圖如圖5所示。
5.2? 測試結(jié)果
如圖6所示,采用兩種不同模具的掃地機器人來驗證此回座算法的通用性、可行性。
(a)樣機一? ? ? ? ? ? ? ? (b)樣機二
5.2.1? 樣機一測試結(jié)果
如圖6(a)所示,左側(cè)黑色樣機為樣機一,其測試結(jié)果如表1所示。
滿足國標(biāo)3 min內(nèi)成功對接充電的要求。
5.2.2? 樣機二測試結(jié)果
如圖6(b)所示,右側(cè)白色樣機為樣機二,其測試結(jié)果如表2所示。
滿足國標(biāo)3 min內(nèi)成功對接充電的要求。
6? 結(jié)? 論
此Dock架構(gòu)旨在規(guī)范回座算法,使軟件結(jié)構(gòu)清晰,算法思路明了,降低回座算法的開發(fā)難度,使得任何一個軟件工程師都可以進(jìn)行回座功能的開發(fā)。
參考文獻(xiàn):
[1] 魏銀.掃地機器人自動回充系統(tǒng)的設(shè)計與實現(xiàn) [D].合肥:中國科學(xué)技術(shù)大學(xué),2019.
[2] 白茶-清歡.移動機器人自主回充技術(shù)理論與實踐 [EB/OL].[2023-04-10].https://blog.csdn.net/zhao_ke_xue/article/details/122156201.
[3] 中華人民共和國工業(yè)和信息化部.家用和類似用途清潔機器人行業(yè)標(biāo)準(zhǔn):QB_T 4833—2015 [S].北京:中國輕工業(yè)出版社,2016.
[4] 肖奇軍,鄭健聰,陳斯鵬,等.一種基于地圖構(gòu)建與角度傳感器的掃地機器人自動回充方法 [J].機械與電子,2019,37(2):78-80.
[5] 谷冀嘉.基于ROS系統(tǒng)的自主充電技術(shù)研究 [D].成都:電子科技大學(xué),2020.
[6] 劉甲賓.一種基于激光雷達(dá)的機器人自主充電方法 [J].鐵路通信信號工程技術(shù),2022,19(4):19-23.
[7] 李斌,賴志林,王淼.基于醫(yī)院智能配送機器人的自主充電控制系統(tǒng) [J].中國信息化,2021(11):14-16.
[8] 孟虎.移動機器人路徑規(guī)劃與自主充電技術(shù)研究 [D].南京:南京理工大學(xué),2023.
作者簡介:李明(1983.10—),男,漢族,山西大同人,工程師,碩士,研究方向:智能家用機器人SLAM算法及運動控制。