目录
一、运动控制关键问题
1.1 初始化
在NAO启动行走进程前,首先要检查各关节是不是处于行走起始位置、双脚是否都平放在地面上。如果不是这种情况,NAO首先要执行初始化过程,初始化持续时间取决于当前实际配置。 在NAO行走之前调用moveInit()方法执行初始化,可以确保在行走之前不会花费不确定的时间。
1.2 同步
行走到指定位置的moveTo()方法为阻塞调用方法,使用ALMotion代理对象的post对象调用moveTo()方法,将创建新线程以非阻塞方式调用。moveTo()方法执行完成后,与原线程的同步可以使用如下几种方法:
(1)waitUntilMoveIsFinished self.motion.post.moveTo(1.0, 0.0, 0.0) self.motion.waitUntilMoveIsFinished()
(2)moveIsActive self.motion.post.moveTo(1.0, 0.0, 0.0) while self.motion.moveIsActive(): time.sleep(1)
1.3 步态控制
通过步态规划可以独立地控制NAO行走的每一步,这样就可以实现舞蹈类的动作,每一步都有精确的位置。实现步态规划有两种方式:
(1)setFootSteps 非阻塞调用,setFootSteps方法设置每一步发生的时间。 (2)setFootStepsWithSpeed 阻塞调用,setFootStepsWithSpeed方法使用标准化的步态速度。
# setFootSteps方法(左脚向左前一步, 0.3弧度;左脚、右脚分别向左前一步, 0.3弧度)
class MyClass(GeneratedClass):
def __init__(self):
GeneratedClass.__init__(self)
self.motion=ALProxy("ALMotion")
self.posture=ALProxy("ALRobotPosture")
def onLoad(self):
pass
def onUnload(self):
pass
def onInput_onStop(self):
self.onUnload()
self.onStopped()
def onInput_onStart(self):
self.posture.goToPosture("StandInit", 0.5)
legName = ["LLeg"]
X= 0.2
Y = 0.1
Theta= 0.3
footSteps = [[X, Y, Theta]]
timeList = [0.6]
clearExisting = False
self.motion.setFootSteps(legName, footSteps, timeList, clearExisting)
time.sleep(1.0)
legName = ["LLeg", "RLeg"]
X = 0.2
Y= 0.1
Theta = 0.3
footSteps = [[X, Y, Theta], [X, -Y, Theta]]
timeList = [0.6, 1.2]
clearExisting = False
self.motion.setFootSteps(legName, footSteps, timeList, clearExisting)
pass
# setFootStepsWithSpeed方法
class MyClass(GeneratedClass):
def __init__(self):
GeneratedClass.__init__(self)
self.motion=ALProxy("ALMotion")
se