Omni-directional walk
NAO's walk is now stabilized using feedback from his joint sensors. This makes the walk robust against small disturbances and absorbs torso oscillations in the frontal and lateral planes.
NAO is able to walk on multiple floor surfaces such as carpet, tiles and wooden floors. He can transition between these surfaces while walking, however, large obstacles can still make him fall, as he assumes that the ground is more or less flat. We hope to tackle this in future versions.
Walk Engine
NAO's walk uses a simple dynamic model(linear inverse Pendulum) inspired by work of Kajita et al1, and is solved using Quadratic programming2
Each step is composed of a double leg and a single leg support phase. The double support time uses one third of the step time. The foot swing trajectory uses SE3 Interpolation. The preview controller length is 0.8s. The walk is initialized with and ended with a 0.4s phase of double support.
Foot Step planner
The basic foot planner used for by the walk process irrespective of the command (setWalkTargetVelocity, walkTo and stepTo), uses a simple projection as shown in the picture below. It is composed of a translation by x and y, then a rotation around the vertical z axis.
Note: |
To avoid foot collisions during planning, the inner foot rotation is limited in relation to foot separation. If the foot separation is equal to minimum foot separation, the maximum rotation allowed is the minimum inner Turn value. If the foot separation is maximum (minimum foot separation + maximum Step Y), the maximum rotation allowed is the maximum Step Theta. Between these values, the rotation per step is linearly interpolated. |
---|
Default Walk Parameters
In the current walk, the default parameters are fixed and not customizable.
Posture Constants
Name | Value | Description |
---|---|---|
Torso Height | 0.315 meters | the torso average height |
Foot Separation | 0.095 meters | the reference foot separation along lateral Y axis |
Gait protection constants
Name | Value | Description |
---|---|---|
Minimum Inner Turn | 0.050 radians | this avoids foot collisions during turns |
Minimum Foot Separation | 0.085 meters | this avoids foot collisions during lateral motion |
Step Constants
Name | Value | Description |
---|---|---|
Maximum Step X | 0.040 meters | the maximum step length along the X axis |
Maximum Step Y | 0.040 meters | the maximum step length along the Y axis |
Maximum Step Theta | 0.349 radians | the maximum step rotation around the Z axis |
Maximum Step Frequency | 2.38 Hz | the maximum step frequency |
Minimum Step Frequency | 1.67 Hz | the minimum step frequency |
This results in a maximum walk velocity of 9.52cm/s (straight and sideway) and up 42deg/s for turns.
Arm motions
The arm motion amplitude during walk is dependent on the step frequency and the step length. The motion can be activated or deactivated at any moment during a walk.
# 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]
Custom arm movements
Any user commands for the arms will have priority over the default arm motions during a walk. This enables you to control the arms as you wish during a walk. If, the default arm movements are enabled, they will continue after you have finished controlling them.
# Example showing smooth arm motions during the walk process # Enable arm motions proxy.setWalkArmsEnable(True, True) # Start walking 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)
References
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.