全方位行走

现在,NAO使用来自其关节传感器的反馈信息来保持行走平稳,免受各种小干扰的影响,并可以抵消躯干在向前和横向平面里的摆动。

NAO可以在多种地面上行走,诸如地毯、瓷砖地和木制地板等。NAO还可以在不同质地的地面间转换。然而,由于机器人假设地面大致是平坦的,因此大的障碍物仍可让NAO摔倒。我们希望能够在以后的版本中对此加以改进。

omni-walk

行走引擎

NAO行走时使用一个简单的动态模块(线性倒摆),这个模式受Kajita et al1的研究成果的启发,并使用二次编程法(Quadratic programming)2

NAO迈出的每一步都包括一个双腿支撑和一个单腿支撑的阶段。双腿支撑阶段的用时占每一步用时的三分之一。脚摆动轨迹使用SE3插值。预览控制器(preview controller)用时0.8秒。行走由一个用时0.6秒的双腿支撑阶段进行初始化,并以同样的阶段结束。

脚步规划器

行走进程使用的基本脚步规划器不受命令(如setWalkTargetVelocity、walkTo和stepTo)的影响。它使用一个简单的投影,如下图所示,包括一个由x和y轴的转换以及一个围绕垂直z轴的转动。

Foot Planner

注释:

为了避免计划时双脚碰撞,脚向内转动相应地受到脚分离的限制。

当脚分离为最小值(Minimum Foot Separation)时,转动的最大允许值为最小向内转动值(Minimum Inner Turn)。

当处于最大脚分离时,即最小脚分离+沿Y轴最大步长(Maximum Step Y),最大允许转动值为最大脚步Theta(Maximum Step Theta)。

在这些值之间,每步的转动都为线性插值。

默认行走参数

目前,默认行走参数是固定的,无法自定义。

姿势常量

名称 说明
Torso Height 0.315米 躯干平均高度
Foot Separation 0.095米 沿横向Y轴的参考脚分离

步法保护常量

名称 说明
Minimum Inner Turn (最小向内转动) 0.050弧度 避免转动时双脚碰撞
Minimum Foot Separation (最小脚分离) 0.085米 避免横向移动时双脚碰撞

脚步常量

名称 说明
Maximum Step X 0.040米 沿X轴的最大步长
Maximum Step Y 0.040米 沿Y轴的最大步长
Maximum Step Theta 0.349弧度 沿Z轴的最大脚步转动
Maximum Step Frequency 2.38 Hz 最大步频
Minimum Step Frequency 1.67 Hz 最小步频

得到这些结果的条件:最高行走速度为9.52cm/s(直走和横走),最高转动速度为42°/s。

手臂动作

行走时手臂动作的幅度取决于步频和步长。行走时可随时启动或停止手臂的动作。

# Example showing how to disable left arm motions during a walk leftArmEnable = False rightArmEnable = True proxy.setWalkArmsEnable(leftArmEnable, rightArmEnable) # disable right arm motion after 10 seconds time.sleep(10) rightArmEnable = False proxy.setWalkArmsEnable(leftArmEnable, rightArmEnable)

# Example showing how to get the enabled flags for the arms result = proxy.getWalkArmsEnable() print 'LeftArmEnabled: ', result[0] print 'RightArmEnabled: ', result[1]

自定义手臂动作

行走时,任何用户的手臂命令都优先于默认的手臂动作。这样,您就可以在行走时自由地控制机器人的手臂。如果默认手臂动作启用,这些动作会在您结束控制后继续进行。

# Example showing smooth arm motions during the walk process # Enable arm motions proxy.setWalkArmsEnable(True, True) # Start walkking X = 0.8 Y = 0.0 Theta = 0.0 Frequency =1.0 proxy.setWalkTargetVelocity(X, Y, Theta, Frequency) # Wait time.sleep(4.0) # User arm motions ( a punch in the air ) import math TO_RAD = math.pi/180 Arm1 = [-40, 25, 0, -40, 0, 0] Arm1 = [ x * TO_RAD for x in Arm1] Arm2 = [-40, 50, 0, -80, 0, 0] Arm2 = [ x * TO_RAD for x in Arm2] proxy.angleInterpolationWithSpeed("LArm",Arm1, 0.8) proxy.angleInterpolationWithSpeed("LArm",Arm2, 0.8) proxy.angleInterpolationWithSpeed("LArm",Arm1, 0.8) # Wait time.sleep(3.0) # End the walk X = 0.0 Y = 0.0 Theta = 0.0 motionProxy.setWalkTargetVelocity( X, Y, Theta, Frequency)

参考书目

1 S. Kajita and K. Tani. Experimental study of biped dynamic walking in the linear inverted pendulum mode. IEEE Int. Conf. on Robotics and Automation, 1995.

2 P-B. Wieber. Trajectory free linear model predictive control for stable walking in the presence of strong perturbation. IEEE Int. Conf. on Humanoids, 2006.





Copyright © 2010 Aldebaran-Robotics - 版权所有