吴嘉荣 王佳星 梁嘉滢 林艺琳 白雪松
广东第二师范学院物理与信息工程学院 广东广州 510000
随着科技的发展、社会的进步,人形机器人的迅猛发展为人们的生活带来了极大的便利,服务于人类的生活和工作的各个方面并有效发挥了较大的作用。如今的学术界和业界、专家群体和公众视线都着眼于人形机器人的研究与发展,对人形机器人的关注度和期望值随着研究的逐渐深入而逐步增长。现在人形机器人被更广泛、更深入地研究,不仅是对人形机器人的构造和功能等的研究,更是为了将其更好地应用到人们的工作和生活中,做一些人们难以完成、烦琐、不愿意去做的事情。
经过以往的探究与经验表明,人形机器人的发明创造有其便利的一面,也有其不利的一面。由于现实所处环境情况的复杂,人形机器人未必能准确并及时地应付复杂的地理环境以及难以预计的突发情况,判断力和行动的精准度有待提高。因此,对于其研究应用前景较广,也将是人形机器人与各领域磨合过程中面临的一些挑战。为此,本项目提出基于Webots平台的人形机器人爬坡研究,在Webots平台中研究NAO机器人摔倒后恢复站立等情况,以此来分析如何应对在实际情况中遇到的复杂路面,初步设想是分析判断机器人如何识别自身倒地,并通过这个分析的过程研究机器人如何识别正在上坡和下坡。以此达到本项目促进人形机器人复杂路面移动的目标,这对人形机器人研究基础提升有重大的意义。
本项目的研究工具采用的是由Cyberbotics公司出品的便携式机器人仿真平台——Webots。它是一款集建模、编程、仿真、程序移植为一体的机器人研发软件。而本文的项目是关于人形机器人的设计与仿真,Webots软件即可以实现机器人的多种功能如爬坡、抓取、辅助作业等的模拟仿真,对我们研究人形机器人的行走有着很大帮助,可以很好地将我们的初步设想模拟出来,而真实的机器人大多数比较昂贵,通过Webots这样一个良好的仿真平台可以事先检测自己所写算法的优劣程度。我们不仅可以通过机器人的动画来判断我们的算法是否可行,与此同时,Webots提供了与真实机器人的接口,我们可以用已经写好的算法来检测实际的机器人,并且可以根据实际情况进行调整与优化,使我们的项目更加完善,同时也不会轻易地造成机器人的器件损失,有效地降低了成本。而且通过仿真软件Webots,可以利用互联网将机器人所模拟的形态随时随地展示给其他人,不仅能够与他人进行更好的沟通与交流,而且在一定程度上解决了真实场地的需求与模拟场地不匹配的问题,机器人也能够有更大的行动空间与范围。本次研究建立的机器人模型,渲染的颜色整体采用白色和红色,体现了机器人模型的科技感。
Webots结合C语言与Python语言等算法工具功能,展示了场景可控化定制破解人形机器人行动过程中的难点和状况,为打造人形机器人具备更强的机器行动能力,具备自主完成更多任务的能力,提供了良好的技术参考和依据。
本项目对于人形机器人爬坡的设计,通过代码识别判断人形机器人的动作所处状态,对上下坡地判定设置参考坐标,能够较为精准地识别上下坡,并在判断成功后执行上坡行走或下坡行走的动作。
通过不断实际测试,得出屈膝站立是最为稳妥的站立姿势,于是通过在官网模拟机器人各个部位动作,再计算改动作幅度的具体数值,应用到机器人身上。在这过程中也加深了平衡的重要性,在不断测试更新动作的同时也在不断地优化机器人的平衡性,使其做到真正稳定的站立。在机器人完成上坡动作的过程中调整脚部舵机旋转数值,以此保持机器人的身体平衡,核心代码如下:
def balance(self,l,r):
acc=self.accelerometer.getValues()#调用加速度传感器
self.RAnkleRoll=self.getDevice("RAnkleRoll")#调用机器人下肢
self.LAnkleRoll=self.getDevice("LAnkleRoll")
self.RAnklePitch=self.getDevice("RAnklePitch")
self.LAnklePitch=self.getDevice("LAnklePitch")
RAR=self.RAnkleRoll.getTargetPosition()#获取各部分关节旋转数值
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)#设置机器人关节旋转程度 print('调整右脚-左前方倾斜') if acc[1]<=-1: self.RAnkleRoll.setPosition(RAR+0.005) print('调整-脚底位置不当,矫正幅度增加') if 1>acc[1]>0.8: self.RAnkleRoll.setPosition(RAR+0.001) print('调整右脚-右前方倾斜') if acc[1]>=1: self.RAnkleRoll.setPosition(RAR+0.005) print('调整右脚-右前方大幅度倾斜') 有了稳定的站立机制,便开始着手爬坡的设计。一开始机器人爬坡经常会摔倒,向前踏步时因为地形的改变,身体重心向后倾斜,而原本设计用于站立的固定姿势不能及时调整动作导致摔倒,如图1所示。 图1 爬坡过程 我们调整方向,既然用站立姿势上坡不行,那就改变姿势。在浏览官网发现,机器人本身带有一个gps用以实时记录机器人的坐标,我们将其设备调用,通过对实时gpsY轴坐标的变化并设置参考值,通过当前坐标与参考值进行对比来判断机器人是否进入斜坡,实际运用一段时间后,发现该方法不够灵敏,对于上坡的判定不够精确,并且仅能判断单个斜坡。其核心代码如下: def ChangeOfEnviroment(self): p=self.gps.getValues()#获取三轴数值 if p[1]>0:#0为参考数值,若p[1]Y轴大于该值则执行动作 self.currentlyPlaying.stop()#停止当前动作 self.UphillForwards.setLoop(True)#设置循环动作为UphillForwards self.UphillForwards.play()#播放动作 鉴于判断Y轴坐标的问题,我们采用了pandas库作为辅助,实时记录Y轴坐标的数据储存于excel文件中,在需要判断的时候再通过pandas库读取excel中的数据进行判断。实时记录坐标的好处是可以记录上一秒的Y轴坐标,再与现在的Y轴坐标进行对比,检测这一秒甚至更短的时间内Y轴变化的幅度来判断机器人是否将要进行爬坡,这使机器人对于坡度以及复杂地形的判断更为灵敏。核心代码如下: info_website=pd.DataFrame({'title':['时间','坐标'],'数据':['time[0],[%f %f %f]' %(p[0],p[1],p[2])]}) writer=pd.ExcelWriter('website.xlsx')#创建ExcelWrite对象保存数据 info_website.to_excel(writer) writer.save() print('保存成功') df=pd.read_excel('website.xlsx',index_col='name',skiprows=[2])#读取excel数据 df.columns=df.columns.str.replace('Unnamed.*','col_label')#处理未命名列 print(df) 通过获取机器人各部分舵机实时数值,配合官方提供的机器人动作模拟器对机器人的动作进行模拟和矫正,不同帧数分别做设定动作,设置动作时要保证动作的流畅性,使机器人不会因为突然变动的大幅度动作使机器人重心出现大幅度倾斜,再配合机器人的动作读取和机器人键位操作函数,可对机器人进行人为的动作调整或自我的动作调整,如图2所示。 图2 总体动作设置 解决了坡度的检测问题,开始对爬坡动作进行设计。鉴于之前站立姿势的错误点,此次我们对于重心更为关注,并且在爬坡方面我们通过调整步伐来提高爬坡的速度。爬坡的动作依次是,检测到将要进入斜坡,停止当前动作并且将腿收回;转移身体的重心至左脚,具体动作是向左摆动左腿的胯,之后抬起右脚,使机器人进入一个右腿悬空的状态;向上抬脚时发现若不及时弯曲膝盖,可能会导致在遇到一些倾斜幅度较大的斜坡时会影响抬腿的动作,于是我们在向上抬脚的同时向后弯曲膝盖,并且收起脚踝;向前伸腿,抬腿到一定幅度时,向前弯曲膝盖并调整脚踝,便于脚部的落地。本套连贯姿势运用时发现,爬坡的成功率未能得到保证,在一些特殊的情况如机器人动作运行较快向前摔倒,或者机器人未与斜面平行,自身角度存在一定倾斜时,爬坡将会摔倒。 观察爬坡摔倒的姿势发现,机器人并不会一踏上斜坡就摔倒,而是在踏上斜坡后因为在惯性的作用下重心不稳导致摔倒,于是我们从脚踝部分进行调整,通过调整脚踝来稳定机器人的重心。我们一开始是使用了机器人本身带有的脚步压力传感器来进行监控,同样是检测对比,通过脚步受到的压力来判断机器人是否存在一个重心不稳的问题。调用设备获取当前脚部姿势的数据,对比重心稳定情况下的数据来进行调整,每次都在当前设备的值上略微添加或减少数据的值,以此来改变机器人脚踝的姿势。进行多次模拟发现,在当前仿真环境下,脚部的压力不能很好地进行反馈,得到的数据与实际情况相反,经常因为得到相反的数值导致的判断失误而摔倒,于是我们更换策略,使用了机器人的加速度传感器。 监测大量数据发现,机器人在每次摔倒时,自身的Y轴加速度会有轻微的变化,而重心正常的数值在一定幅度之间,超过该数值机器人则会因为重心不稳摔倒,于是我们采用同样的方法,实时监测Y轴加速度的值,通过对比判断机器人是否将要摔倒,加速度轻微偏离正常区间,动作幅度较小,缓慢调整脚踝。若加速度较大幅度偏离了正常区间,则动作幅度加大,迅速调整脚踝并且进入轻微偏离区间后,恢复正常调整速度,使其Y轴加速度值保持在特定区间内,以此来保证机器人的平衡。唤醒机器人加速度核心代码如下: def findAndEnableDevices(self): self.timeStep=int(self.getBasicTimeStep())#设置当前世界步长 self.accelerometer=self.getDevice('accelerometer')#唤醒加速度计 self.accelerometer.enable(4*self.timeStep) 本文提出了在Webots平台中研究人形机器人,并基于NAO机器人做了测试,并提出机器人可行的爬坡策略。人形机器人在面对斜坡时首先应进行环境感知和路径规划,判定接下来是上坡行走还是下坡行走,再根据路面情况做出判断,平衡机体,实现稳定爬坡,完成在斜坡上拾取物体的工作。人形机器人的机械结构与人类相近,它可以模拟人的双足行走功能,而人的双足可以灵活地适应不同的地形。 致谢:感谢广东第二师范学院教务处郑誉煌老师的耐心指导和提供相应的实验环境。2.2 爬坡姿势
2.3 数据记录
2.4 爬坡动作的策略设计
结语