點擊上方【騰訊雲IoT】,關注我們並設星標
共建物聯網產業生態
導語 | 騰訊雲IoT應用創新大賽前段時間圓滿落下帷幕,它是騰訊雲面向物聯網領域舉辦的大型競賽,通過騰訊雲IoT全鏈路產品能力,開放平臺和服務,與廣大開發者共築創新,孵化優秀的IoT產品和解決方案,共同構建IoT應用生態。本次大賽產生了很多優秀的作品,舊家電能變身智能家居?一起來看看吧~物聯網是一種連接各種各樣的傳感器的網絡,與之對應的是20世紀60年代開始研究的計算機網絡,後者將分散於不同地理位置的計算機連接起來。物聯網傳感器可以採集的信息包括聲音、光線、溫度、溼度、位置、速度、加速度等。
物聯網系統則是在物聯網之上,利用各類傳感器所提供的信息,通過信息綜合、決策判斷後形成控制信息,從而做出反應的信息系統。目前的物聯網家居系統還處於初始階段,各類智能家電正在發展。
首先,該系統依舊無法體現出智能家居的優勢,即智能度不夠。所謂智能,即不受人幹預的自主信息搜集、自主判斷、自主執行的系統。當我們已經明確知道需要哪臺設備通斷時,直接打開設備的開關就可以,無需通過智能音箱中轉。
舉個例子,當你深夜回家時,本能的反應是在黑暗中尋找開關,這時如果再讓小愛同學開燈就過於牽強,為智能而智能。真正智能的家居系統應當在你回家開門的那個瞬間,就自己完成了開燈動作,無需命令。
其次,目前的系統可以執行的動作過少。根據中國電子信息產業發展研究院發布的《2019年中國家電市場報告》,我國家電市場零售額規模達到8910億元,電磁爐、電飯煲、微波爐、洗衣機等設備已經走進千家萬戶。在激烈的市場競爭下,各類家電的設計早已非常適合人類操作。一般上,我們只需要將家電所需的「原料」放入,給予適當的「加工工序」,家電就可以產出合適的「產品」。仔細觀察就會發現,甚至有些家電已經把「加工工序」免去了。
比如洗衣機從早先時候的雙缸變為現在的單缸,不需要手動將溼衣物挪動到脫水缸。並且有些洗衣機自帶烘乾功能,髒衣服進去乾淨可穿的衣物出來。智能家居可以著重在如何自動放入「原料」以及取出「成品」上做研發。
最後,目前的系統過於封閉,自成一派;家電存量大,無法快速推進智能化。在開放性上,目前小米智能家居提供各種接入支持,但需要將控制終端集中到米家APP上,這對其他品牌的智能家電不友好。在智能化的推進上,目前大部分的智能設備都需要新購,無法將舊家電設備納入到智能家居體系中來。
本系統將在上述分析的基礎上,使用無損傷智能化的模式,將舊家電改造為智能家電;使用舵機、電機等設備構建簡單的機械臂用於挪動物品,實現無需幹預的添加「原料」的功能。
LoRa是一種應用於廣域低功耗無線網的標準,在低功耗的前提上有效地提高了傳輸距離。由該標準的特性可知,LoRa設備在城鎮的傳輸距離可達2-5Km郊區可達15Km。所使用的頻率為433MHz、868MHz、915MHz等,無需申請頻譜執照。在接入容量上,一個LoRa網關可以容納數千個節點,遠遠大於現有的WiFi路由器。若考慮到傳輸速率,LoRa標準可以達到幾百到幾十Kbps, LoRa標準的種種特性決定了它是一種比較適合物聯網環境的通信標準。
2. 語音交互
語音識別並不是新鮮事,早在1952年,由貝爾實驗室研製的自動數字識別機「Audrey」就可以識別基本的音素。該設備體型巨大,佔據了一個6英尺高的繼電器機架,耗電量巨大,連接著成群的電線。一般上,實現語音交互需要語音識別與語音合成兩部分內容。語音識別需要經過語音轉文字與自然語言處理過程,語音合成需要注意音調、語調等內容。幸運的是,語音交互已經非常成熟,我們可以直接接入公有雲服務來實現。
3. 機械控制
(1)貨機內部結構
考慮到擴大智能家居的控制範圍,我們需要尋找合適的控制機構,自動售貨機或許是一個不錯的研究對象。
我們主要研究自動售貨機與出貨相關的機械結構。售貨機內的電腦系統便會傳達指令給機器」抓手「,對特定的商品軌道進行」推出「和」旋轉「的動作,讓商品可以掉落。為了確保商品在操作之下有成功被運出,售貨機的底部還設有10道紅外線光速。若是紅外線沒有探測到掉落的商品,那售貨機便會自行再次」推落「商品,以確保客人可以拿到他購買的東西。
可以看到,商品放到支撐架上,通過彈簧的旋轉來形成推力,將商品推下,並由重力帶到取貨倉。
(2)機械臂
這裡的機械手主要指由多個關節組成的多軸機械臂,該機械結構可以取代自動售貨機的旋轉彈簧來挪動物體。一般的機械臂有6自由度、4自由度、3自由度等。
使用機械臂較為複雜,涉及到機械、電氣、控制三大部分。機械部分可以採用開源的設計圖,電氣部分採用步進電機或者舵機(大型機械臂使用伺服電機,小型機械臂使用步進電機,而微型機械臂使用舵機),控制部分包含運動學逆解與路徑規劃。
4. OpenCV
OpenCV是一個開源的計算機視覺代碼庫,提供簡單易用的python、ruby、matlab等語言的接口,在1999年由Intel建立,現在由Willow Garage維護。可以完成很多複雜的任務,如圖片讀取、圖像處理、目標識別等。不需要自己辛苦研究,就可以使用先進的識別算法。值得注意的是OpenCV的坐標系,如下定義:
本項目需要實現一個智能家居系統,其功能是通過語音控制,實現物品的加熱等功能。首先,通過小程序採集用戶語音輸入,然後將數據上傳到騰訊雲實現語音轉文字;文字再通過自然語言處理得到詞法分析結果,根據名詞之間的關係以及動詞來判斷需要實現的動作,由雲伺服器下發到樹莓派與物聯網平臺。樹莓派獲得任務指令後,拍攝照片獲得物品之間的相互位置關係,然後指揮機械臂挪動物品到指定位置。物聯網平臺連接有若干LoRa設備,根據指令下發開啟與關斷的數據。
注意在語音轉文字、詞法分析上的實際處理流程為小程序將語音通過插件轉換為文字,再把文字發送到雲伺服器,之後由雲伺服器發送到自然語言處理接口得到詞法分析結果。為了簡潔按數據的流向繪製出整體框圖。
首先是開關量的接入。有兩種接入方式,一種是通過繼電器模塊控制總電源的方式,和市場上的智能插座類似;第二種是使用舵機模擬人工的方式按開關。
傳感器數據輸出,接入溫度傳感器與水位傳感器,並通過單片機讀出即可。
在語音交互方案上,本項目採用小程序採集用戶語音,然後由騰訊雲轉換為文字的方式。為簡化開發流程,直接使用騰訊開源的面對面翻譯小程序,它直接內置了語音轉文字接口。修改原始碼,使得翻譯後文字上傳到伺服器,實現語音轉文字功能。
translateText: function(item, index) { let lfrom = item.lfrom || 'zh_CN'; let lto = item.lto || 'en_US'; wx.request({ url: "https://***.stackoverflow.***:8008/miniprogram", data: { "wd": item.text }, fail: (res)=>{ wx.showModal({ title: '發送失敗', content: ' ', }) this.setData({ bottomButtonDisabled: false, recording: false, }); }, success: (res)=>{
let tmpDialogList = this.data.dialogList.slice(0);
this.setData({ dialogList: tmpDialogList, bottomButtonDisabled: false, recording: false, });
let tmpTranslate = Object.assign({}, item, { autoPlay: false, translateText: res.data.status, translateVoicePath: "", translateVoiceExpiredTime: 0 })
tmpDialogList[index] = tmpTranslate
this.scrollToNew(); } })在語音交互方案上,詞法分析的主要功能是:
(1)智能分詞
將連續的自然語言文本,切分成具有語義合理性和完整性的詞彙序列;
(2)詞性標註
為每一個詞附上對應的詞性,例如名詞、代詞、形容詞、動詞等;
(3)命名實體識別
快速識別文本中的實體,例如人名、地名、機構名等。
這些功能可以讓我們準確識別說話人意圖。注意與早些年固定語句的語音識別,使用詞法分析處理自然語言,而不是一經設定就不可更改的語音指令。可以在API Explorer上快速探索詞法分析。
針對自然語言把酸奶放到水壺上, 詞法分析的結果如下所示:
"PosTokens": [ { "BeginOffset": 0, "Word": "把", "Length": 1, "Pos": "p" }, { "BeginOffset": 1, "Word": "酸奶", "Length": 2, "Pos": "n" }, { "BeginOffset": 3, "Word": "放到", "Length": 2, "Pos": "v" }, { "BeginOffset": 5, "Word": "水壺", "Length": 2, "Pos": "n" }, { "BeginOffset": 7, "Word": "上", "Length": 1, "Pos": "f" } ],這樣我們就知曉說話人談到了幾個物品,對物品的動作是什麼。
4. 物品搬運機構(1)基於旋轉彈簧借鑑自動售貨機的內部結構,購買旋轉彈簧、步進電機、驅動模塊,從而實現一個將物品從儲存倉拿出放到加熱設備的機械結構。
使用該機械結構的主要目的就是執行更多的功能,從而解放雙手,盡力做到無需人工介入的真實物理場景的自動化。
(2)基於機械臂本項目中,採用MeARM開源微型機械臂。在機械結構上,廉價的MeARM零件一般由亞克力或者木板經雷射切割而成,具有一定的機械強度,末端可承載的最大負重約為100克左右。
電氣結構部分,使用四個SG90舵機,分別安裝在末端爪、遠臂、近臂、底座上。其中末端舵機控制機械爪的張開與閉合,遠臂控制上下,近臂控制前後,底座控制方向。
控制部分,使用樹莓派4配合一隻USB攝像頭完成機械臂的視覺識別、自主規劃等功能。由於沒有雙目攝像頭,所以需要提取準備好各物體的高度信息。攝像頭從俯視圖上提取各物體的位置,然後通過運動學逆解得到舵機的旋轉角度,根據預存的物品高度信息調整末端高度,最終完成抓取。將物體從原來的位置挪動到指定位置需要做路徑規劃,但是此處為了簡化,直接對目標位置進行運動學逆解並運動到目標位置。
(3)運動學逆解
運動學逆解的部分較為複雜,基本思想是通過一些列三角計算將舵機的角度與末端的位置聯繫起來。通過舵機角度計算末端位置成為運動學正解,通過預期的末端位置得到舵機應該旋轉的角度成為運動學逆解。運動學逆解會存在多個解的情況,需要根據機械臂的姿態選擇合適的解。在本項目中由於Upper Arm與Forearm之間的角度限制為0-180度,不存在多個解的情況。
下圖為meArm的各部分定義與臂長的測量方式。
下圖為在真實機械臂中的各臂長測量方式。
本項目採用了開源的meArm運動學逆解庫,只需要測量各臂長並調整舵機角度即可。meArm運動學逆解庫需要輸入的末端位置由三個數構成,分別為底座旋轉角度(度)、前後位置(毫米)、上下位置(毫米)。
(4)位置信息提取
提前拍攝好俯視圖形式的物品圖片,然後再從採集過來的圖像中做匹配,可以返回目標物體所在的位置信息(攝像頭的位置需要固定,並且需要量出整幅畫面所對應的物理尺寸),經過換算後可知實際位置信息。
在圖片獲取上使用OpenCV的cap.read()函數。將USB攝像頭連接到樹莓派,然後就可以獲取到圖片。
在目標識別中採用了OpenCV的模板匹配函數。首先拍攝整張圖片,然後從圖片中截取待識別的目標。在識別的時候,先從攝像頭中讀取十張圖片做平均,用於減少噪聲;再與模板進行匹配,返回模板在整張圖片的位置。
def match_template(target_img, template_key, show=False): template = cv2.imread(templates[template_key])
theight, twidth = template.shape[:2] result = cv2.matchTemplate(target_img,template,cv2.TM_SQDIFF_NORMED) cv2.normalize( result, result, 0, 1, cv2.NORM_MINMAX, -1 ) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
return min_loc, [twidth, theight]def distance(point1, point2, scale_base, baseplate_width, baseplate_height): dx = (point1[0] - point2[0]) / scale_base[0] * baseplate_width dy = (point1[1] - point2[1]) / scale_base[1] * baseplate_height return math.sqrt(math.pow(dx, 2) + math.pow(dy, 2))計算角度。由於底座中心的匹配較為困難,這裡採用直接手工標註的方式。在拍攝好的照片中找出底座中心的圖像坐標,作為參數放入代碼中。同時作為參數的還有底部託盤的長與寬,適合抓取物品的高度。# 根據三角形公式,計算角度 # 設底座中心(basepoint)為A點, 末端(gripper)為C點,待抓取的物品為B點, 那麼a,b,c邊隨之確定 # cosA = (b^2 + c^2 - a^2)/(2*b*c) # 下面的location1為gripper, location2為B點 a = distance(location1_center, location2_center, scale_base, baseplate_width, baseplate_height) b = distance(location1_center, basepoint, scale_base, baseplate_width, baseplate_height) c = distance(location2_center, basepoint, scale_base, baseplate_width, baseplate_height)
print("a,b,c=", a, b, c) # 弧度 A = math.acos((b*b + c*c - a*a) / (2*b*c) ) print("A=", A) # 角度 A = A / math.pi * 180 print("A in du=", A) # c一定是正數,而A有可能是負角度 A = (location2[0] - basepoint[0]) / abs(location2[0] - basepoint[0]) * A print("Final A=", A)
# c是gripper中心和待抓取物中心之間的距離,會偏大 # 實際使用發現使用gripper中心和待抓取物的 下端中點會比較好 # 下端中點指的是在opencv坐標系中y值較大的邊的中點 short_c = distance([location2_center[0], location2_center[1] + scale2[1]/2], basepoint, scale_base, baseplate_width, baseplate_height)(5)獲取命令
在python中每隔1秒向伺服器發送心跳包,並獲取下發的任務。如果有任務,就將物品移動到指定位置,然後返回原點。
5. 任務協調
在完成了語音識別、詞法分析、物品搬移等部件之後,我們還需要一臺雲伺服器將各個部件整合起來,並根據詞法分析結果下發任務指令給樹莓派與物聯網平臺。
本項目使用輕量的Flask作為應用伺服器,用Caddy做代理伺服器並提供https入口,以滿足小程序的https連接要求。設置/arm, /miniprogram兩個路由用於處理機械臂與小程序上傳數據。收到小程序上傳的自然語言指令後,送到詞法分析接口並獲取結果。鑑於目前較為簡單的應用需求,如果結果中有兩個名詞,那麼就會根據名詞出現的先後順序組合為機械臂指令,並下發給樹莓派;如果只有一個名詞,並且該名詞為水壺,那麼就判斷動詞是否為打開或者關閉,然後送到物聯網平臺接口。
注意小程序要求所有伺服器都為https訪問,並且域名備案&小程序添加信任域名。https訪問可以使用Caddy做一層反向代理,Caddy是一款由go語言編寫的輕量高效server。
完成了一臺自動加熱食材的家居系統,可以用語音交互控制設備,使其完成取物品、加熱一系列動作,全過程除語音輸入指令外無需人工介入。
使用3D列印降低機械手臂與機械手的成本,並增加機械臂的載重。機械手臂與機械手可以大大降低設備的接入門檻,並且只要是人類可操作的設備該機械結構就可以操作。藉助於計算器視覺的已有成果,可以方便地用語音來完成各種家務。
感謝騰訊雲提供的P-NUCLEO-LRWAN3開發套件, 本項目使用其製作了加熱水壺部分;感謝opencv的開發者,本項目用其實現了物品識別、定位;感謝開源硬體meArm的開發者,本項目用其完成了物品搬移機構;感謝RorschachUK開源的meArmPi, 本項目使用了部分運動學逆解代碼與舵機控制代碼。
[1] 騰訊雲物聯網開發平臺IoT Explorer:https://cloud.tencent.com/product/iotexplorerhttps://github.com/Tencent/TencentOS-tinyhttps://cloud.tencent.com/product/asr?from=10680https://console.cloud.tencent.com/api/explorer?Product=nlp&Version=2019-04-08&Action=LexicalAnalysis&SignVersion=https://cloud.tencent.com/product/cvm?from=10680
「騰訊雲IoT應用創新大賽」優秀作品持續更新中,歡迎大家持續關注並星標,解鎖更多精彩內容~