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