# Stair Climbing Stabilization of the HRP-4 Humanoid Robot using Whole-body Admittance Control

## Abstract

We consider dynamic stair climbing with the HRP-4 humanoid robot as part of an Airbus manufacturing use-case demonstrator. We share experimental knowledge gathered so as to achieve this task, which HRP-4 had never been challenged to before. In particular, we extend walking stabilization based on linear inverted pendulum tracking by quadratic programming-based wrench distribution and a whole-body admittance controller that applies both end-effector and CoM strategies. While existing stabilizers tend to use either one or the other, our experience suggests that the combination of these two approaches improves tracking performance. We demonstrate this solution in an on-site experiment where HRP-4 climbs an industrial staircase with 18.5 cm high steps, and release our walking controller as open source software.

## Videos

### Climbing stairs

### Standing on mobile ground

## Content

The paper on HAL is a *post-print* I have kept updating after the conference to
keep up with the later additions and fixes implemented in the walking
controller. See
the release notes on GitHub for an overview of the major changes since the
conference version (v1.1).

Post-print paper | |

Poster presented at ICRA 2019 | |

Presentation given at NASA-Caltech JPL on 5 June 2019 | |

Stair climbing at the Airbus Saint-Nazaire factory | |

Walking controller (C++) | |

10.1109/ICRA.2019.8794348 |

## Supplementary material

Controller documentation | |

Floating base observer used in this controller |

## BibTeX

```
@inproceedings{caron2019icra,
title = {Stair Climbing Stabilization of the {HRP}-4 Humanoid Robot using Whole-body Admittance Control},
author = {Caron, St{\'e}phane and Kheddar, Abderrahmane and Tempier, Olivier},
booktitle = {IEEE International Conference on Robotics and Automation},
url = {https://hal.archives-ouvertes.fr/hal-01875387},
year = {2019},
month = may,
}
```

## Discussion

**What is the formula for the matrix** \(\bfU\) **in Equation (10)?**

This matrix is given by:

\begin{equation*} \bfU = \begin{bmatrix} -1 & 0 & -\mu & 0 & 0 & 0 \\ +1 & 0 & -\mu & 0 & 0 & 0 \\ 0 & -1 & -\mu & 0 & 0 & 0 \\ 0 & +1 & -\mu & 0 & 0 & 0 \\ 0 & 0 & -Y & -1 & 0 & 0 \\ 0 & 0 & -Y & +1 & 0 & 0 \\ 0 & 0 & -X & 0 & -1 & 0 \\ 0 & 0 & -X & 0 & +1 & 0 \\ -Y & -X & -(X + Y) \mu & +\mu & +\mu & -1 \\ -Y & +X & -(X + Y) \mu & +\mu & -\mu & -1 \\ +Y & -X & -(X + Y) \mu & -\mu & +\mu & -1 \\ +Y & +X & -(X + Y) \mu & -\mu & -\mu & -1 \\ +Y & +X & -(X + Y) \mu & +\mu & +\mu & +1 \\ +Y & -X & -(X + Y) \mu & +\mu & -\mu & +1 \\ -Y & +X & -(X + Y) \mu & -\mu & +\mu & +1 \\ -Y & -X & -(X + Y) \mu & -\mu & -\mu & +1 \end{bmatrix} \end{equation*}with \(\mu\) the friction coefficient, \(X\) the half-length and \(Y\) the half-width of the rectangular contact area. Check out this paper for the derivation of this formula, which corresponds to its equations (15) to (20). In code, it is implemented in the functions:

- Contact.wrench_inequalities() of pymanoid (Python)
- Stabilizer::wrenchFaceMatrix() of the lipm_walking_controller (C++)

**Why use damping control at the foot contact frame rather than, say, an acceleration-based force control law?**

The answer can be found in Equation (2) of Kajita et al. (2001). Robots from the HRP series have inherited from their Honda elders the choice of a mechanical flexibility (rubber bushes and linear dampers) added between the ankle and foot links. Stiffness \(K\) dominates damping \(B\) in this flexibility, that is, in practice \(K \Delta \theta \gg B \Delta \dot{\theta}\) where \(\theta\) is a contact frame angle. We then use as a ground reaction torque model:

\begin{equation*} \tau = K (\theta - \theta_{\mathit{ground}}) \end{equation*}Usually the environment is static, so that the time-derivative of this expression is:

\begin{equation*} \dot{\tau} = K \dot{\theta} \end{equation*}Foot damping control corresponds to the following angular velocity:

\begin{equation*} \dot{\theta} = A (\tau_{\mathit{desired}} - \tau) \end{equation*}In closed loop, this yields:

\begin{equation*} \dot{\tau} = K A (\tau_{\mathit{desired}} - \tau) \end{equation*}This ensures that \(\tau \to \tau_{\mathit{desired}}\) as \(t \to \infty\).