吳嘉榮 王佳星 梁嘉瀅 林藝琳 白雪松
廣東第二師范學院物理與信息工程學院 廣東廣州 510000
隨著科技的發(fā)展、社會的進步,人形機器人的迅猛發(fā)展為人們的生活帶來了極大的便利,服務于人類的生活和工作的各個方面并有效發(fā)揮了較大的作用。如今的學術界和業(yè)界、專家群體和公眾視線都著眼于人形機器人的研究與發(fā)展,對人形機器人的關注度和期望值隨著研究的逐漸深入而逐步增長。現(xiàn)在人形機器人被更廣泛、更深入地研究,不僅是對人形機器人的構造和功能等的研究,更是為了將其更好地應用到人們的工作和生活中,做一些人們難以完成、煩瑣、不愿意去做的事情。
經(jīng)過以往的探究與經(jīng)驗表明,人形機器人的發(fā)明創(chuàng)造有其便利的一面,也有其不利的一面。由于現(xiàn)實所處環(huán)境情況的復雜,人形機器人未必能準確并及時地應付復雜的地理環(huán)境以及難以預計的突發(fā)情況,判斷力和行動的精準度有待提高。因此,對于其研究應用前景較廣,也將是人形機器人與各領域磨合過程中面臨的一些挑戰(zhàn)。為此,本項目提出基于Webots平臺的人形機器人爬坡研究,在Webots平臺中研究NAO機器人摔倒后恢復站立等情況,以此來分析如何應對在實際情況中遇到的復雜路面,初步設想是分析判斷機器人如何識別自身倒地,并通過這個分析的過程研究機器人如何識別正在上坡和下坡。以此達到本項目促進人形機器人復雜路面移動的目標,這對人形機器人研究基礎提升有重大的意義。
本項目的研究工具采用的是由Cyberbotics公司出品的便攜式機器人仿真平臺——Webots。它是一款集建模、編程、仿真、程序移植為一體的機器人研發(fā)軟件。而本文的項目是關于人形機器人的設計與仿真,Webots軟件即可以實現(xiàn)機器人的多種功能如爬坡、抓取、輔助作業(yè)等的模擬仿真,對我們研究人形機器人的行走有著很大幫助,可以很好地將我們的初步設想模擬出來,而真實的機器人大多數(shù)比較昂貴,通過Webots這樣一個良好的仿真平臺可以事先檢測自己所寫算法的優(yōu)劣程度。我們不僅可以通過機器人的動畫來判斷我們的算法是否可行,與此同時,Webots提供了與真實機器人的接口,我們可以用已經(jīng)寫好的算法來檢測實際的機器人,并且可以根據(jù)實際情況進行調(diào)整與優(yōu)化,使我們的項目更加完善,同時也不會輕易地造成機器人的器件損失,有效地降低了成本。而且通過仿真軟件Webots,可以利用互聯(lián)網(wǎng)將機器人所模擬的形態(tài)隨時隨地展示給其他人,不僅能夠與他人進行更好的溝通與交流,而且在一定程度上解決了真實場地的需求與模擬場地不匹配的問題,機器人也能夠有更大的行動空間與范圍。本次研究建立的機器人模型,渲染的顏色整體采用白色和紅色,體現(xiàn)了機器人模型的科技感。
Webots結合C語言與Python語言等算法工具功能,展示了場景可控化定制破解人形機器人行動過程中的難點和狀況,為打造人形機器人具備更強的機器行動能力,具備自主完成更多任務的能力,提供了良好的技術參考和依據(jù)。
本項目對于人形機器人爬坡的設計,通過代碼識別判斷人形機器人的動作所處狀態(tài),對上下坡地判定設置參考坐標,能夠較為精準地識別上下坡,并在判斷成功后執(zhí)行上坡行走或下坡行走的動作。
通過不斷實際測試,得出屈膝站立是最為穩(wěn)妥的站立姿勢,于是通過在官網(wǎng)模擬機器人各個部位動作,再計算改動作幅度的具體數(shù)值,應用到機器人身上。在這過程中也加深了平衡的重要性,在不斷測試更新動作的同時也在不斷地優(yōu)化機器人的平衡性,使其做到真正穩(wěn)定的站立。在機器人完成上坡動作的過程中調(diào)整腳部舵機旋轉(zhuǎn)數(shù)值,以此保持機器人的身體平衡,核心代碼如下:
def balance(self,l,r):
acc=self.accelerometer.getValues()#調(diào)用加速度傳感器
self.RAnkleRoll=self.getDevice("RAnkleRoll")#調(diào)用機器人下肢
self.LAnkleRoll=self.getDevice("LAnkleRoll")
self.RAnklePitch=self.getDevice("RAnklePitch")
self.LAnklePitch=self.getDevice("LAnklePitch")
RAR=self.RAnkleRoll.getTargetPosition()#獲取各部分關節(jié)旋轉(zhuǎn)數(shù)值
LAR=self.LAnkleRoll.getTargetPosition()
RAP=self.RAnklePitch.getTargetPosition()
LAP=self.LAnklePitch.getTargetPosition()
if self.UpUphillForwards.isOver()==True:#檢測到上一個動作已完成
if-1 self.RAnkleRoll.setPosition(RAR-0.001)#設置機器人關節(jié)旋轉(zhuǎn)程度 print('調(diào)整右腳-左前方傾斜') if acc[1]<=-1: self.RAnkleRoll.setPosition(RAR+0.005) print('調(diào)整-腳底位置不當,矯正幅度增加') if 1>acc[1]>0.8: self.RAnkleRoll.setPosition(RAR+0.001) print('調(diào)整右腳-右前方傾斜') if acc[1]>=1: self.RAnkleRoll.setPosition(RAR+0.005) print('調(diào)整右腳-右前方大幅度傾斜') 有了穩(wěn)定的站立機制,便開始著手爬坡的設計。一開始機器人爬坡經(jīng)常會摔倒,向前踏步時因為地形的改變,身體重心向后傾斜,而原本設計用于站立的固定姿勢不能及時調(diào)整動作導致摔倒,如圖1所示。 圖1 爬坡過程 我們調(diào)整方向,既然用站立姿勢上坡不行,那就改變姿勢。在瀏覽官網(wǎng)發(fā)現(xiàn),機器人本身帶有一個gps用以實時記錄機器人的坐標,我們將其設備調(diào)用,通過對實時gpsY軸坐標的變化并設置參考值,通過當前坐標與參考值進行對比來判斷機器人是否進入斜坡,實際運用一段時間后,發(fā)現(xiàn)該方法不夠靈敏,對于上坡的判定不夠精確,并且僅能判斷單個斜坡。其核心代碼如下: def ChangeOfEnviroment(self): p=self.gps.getValues()#獲取三軸數(shù)值 if p[1]>0:#0為參考數(shù)值,若p[1]Y軸大于該值則執(zhí)行動作 self.currentlyPlaying.stop()#停止當前動作 self.UphillForwards.setLoop(True)#設置循環(huán)動作為UphillForwards self.UphillForwards.play()#播放動作 鑒于判斷Y軸坐標的問題,我們采用了pandas庫作為輔助,實時記錄Y軸坐標的數(shù)據(jù)儲存于excel文件中,在需要判斷的時候再通過pandas庫讀取excel中的數(shù)據(jù)進行判斷。實時記錄坐標的好處是可以記錄上一秒的Y軸坐標,再與現(xiàn)在的Y軸坐標進行對比,檢測這一秒甚至更短的時間內(nèi)Y軸變化的幅度來判斷機器人是否將要進行爬坡,這使機器人對于坡度以及復雜地形的判斷更為靈敏。核心代碼如下: info_website=pd.DataFrame({'title':['時間','坐標'],'數(shù)據(jù)':['time[0],[%f %f %f]' %(p[0],p[1],p[2])]}) writer=pd.ExcelWriter('website.xlsx')#創(chuàng)建ExcelWrite對象保存數(shù)據(jù) info_website.to_excel(writer) writer.save() print('保存成功') df=pd.read_excel('website.xlsx',index_col='name',skiprows=[2])#讀取excel數(shù)據(jù) df.columns=df.columns.str.replace('Unnamed.*','col_label')#處理未命名列 print(df) 通過獲取機器人各部分舵機實時數(shù)值,配合官方提供的機器人動作模擬器對機器人的動作進行模擬和矯正,不同幀數(shù)分別做設定動作,設置動作時要保證動作的流暢性,使機器人不會因為突然變動的大幅度動作使機器人重心出現(xiàn)大幅度傾斜,再配合機器人的動作讀取和機器人鍵位操作函數(shù),可對機器人進行人為的動作調(diào)整或自我的動作調(diào)整,如圖2所示。 圖2 總體動作設置 解決了坡度的檢測問題,開始對爬坡動作進行設計。鑒于之前站立姿勢的錯誤點,此次我們對于重心更為關注,并且在爬坡方面我們通過調(diào)整步伐來提高爬坡的速度。爬坡的動作依次是,檢測到將要進入斜坡,停止當前動作并且將腿收回;轉(zhuǎn)移身體的重心至左腳,具體動作是向左擺動左腿的胯,之后抬起右腳,使機器人進入一個右腿懸空的狀態(tài);向上抬腳時發(fā)現(xiàn)若不及時彎曲膝蓋,可能會導致在遇到一些傾斜幅度較大的斜坡時會影響抬腿的動作,于是我們在向上抬腳的同時向后彎曲膝蓋,并且收起腳踝;向前伸腿,抬腿到一定幅度時,向前彎曲膝蓋并調(diào)整腳踝,便于腳部的落地。本套連貫姿勢運用時發(fā)現(xiàn),爬坡的成功率未能得到保證,在一些特殊的情況如機器人動作運行較快向前摔倒,或者機器人未與斜面平行,自身角度存在一定傾斜時,爬坡將會摔倒。 觀察爬坡摔倒的姿勢發(fā)現(xiàn),機器人并不會一踏上斜坡就摔倒,而是在踏上斜坡后因為在慣性的作用下重心不穩(wěn)導致摔倒,于是我們從腳踝部分進行調(diào)整,通過調(diào)整腳踝來穩(wěn)定機器人的重心。我們一開始是使用了機器人本身帶有的腳步壓力傳感器來進行監(jiān)控,同樣是檢測對比,通過腳步受到的壓力來判斷機器人是否存在一個重心不穩(wěn)的問題。調(diào)用設備獲取當前腳部姿勢的數(shù)據(jù),對比重心穩(wěn)定情況下的數(shù)據(jù)來進行調(diào)整,每次都在當前設備的值上略微添加或減少數(shù)據(jù)的值,以此來改變機器人腳踝的姿勢。進行多次模擬發(fā)現(xiàn),在當前仿真環(huán)境下,腳部的壓力不能很好地進行反饋,得到的數(shù)據(jù)與實際情況相反,經(jīng)常因為得到相反的數(shù)值導致的判斷失誤而摔倒,于是我們更換策略,使用了機器人的加速度傳感器。 監(jiān)測大量數(shù)據(jù)發(fā)現(xiàn),機器人在每次摔倒時,自身的Y軸加速度會有輕微的變化,而重心正常的數(shù)值在一定幅度之間,超過該數(shù)值機器人則會因為重心不穩(wěn)摔倒,于是我們采用同樣的方法,實時監(jiān)測Y軸加速度的值,通過對比判斷機器人是否將要摔倒,加速度輕微偏離正常區(qū)間,動作幅度較小,緩慢調(diào)整腳踝。若加速度較大幅度偏離了正常區(qū)間,則動作幅度加大,迅速調(diào)整腳踝并且進入輕微偏離區(qū)間后,恢復正常調(diào)整速度,使其Y軸加速度值保持在特定區(qū)間內(nèi),以此來保證機器人的平衡。喚醒機器人加速度核心代碼如下: def findAndEnableDevices(self): self.timeStep=int(self.getBasicTimeStep())#設置當前世界步長 self.accelerometer=self.getDevice('accelerometer')#喚醒加速度計 self.accelerometer.enable(4*self.timeStep) 本文提出了在Webots平臺中研究人形機器人,并基于NAO機器人做了測試,并提出機器人可行的爬坡策略。人形機器人在面對斜坡時首先應進行環(huán)境感知和路徑規(guī)劃,判定接下來是上坡行走還是下坡行走,再根據(jù)路面情況做出判斷,平衡機體,實現(xiàn)穩(wěn)定爬坡,完成在斜坡上拾取物體的工作。人形機器人的機械結構與人類相近,它可以模擬人的雙足行走功能,而人的雙足可以靈活地適應不同的地形。 致謝:感謝廣東第二師范學院教務處鄭譽煌老師的耐心指導和提供相應的實驗環(huán)境。2.2 爬坡姿勢
2.3 數(shù)據(jù)記錄
2.4 爬坡動作的策略設計
結語