robotoc - efficient robot optimal control solvers
robotoc
(efficient ROBOT Optimal Control solvers) is a collection of C++ (with Python bindings) efficient optimal control problem solvers for multibody robot systems with rigid contacts.
The main apllication purposes are trajectory optimization and model predictive control (MPC). The followings are examples:
- A trajectory optimization example of quadrupedal running
- A trajectory optimization example of humanoid jump
More examples are found in Examples.
Brief overview of optimal control solvers
The following three solvers are available:
robotoc::OCPSolver
: Optimal control solver for robot systems with rigid contacts and/or a floating base. This solver can optimize the trajectory and switching times simultaneously.
robotoc::UnconstrOCPSolver
: Optimal control solver for robot systems without rigid contacts or a floating base. More efficient than robotoc::OCPSolver
.
robotoc::UnconstrParNMPCSolver
: Optimal control solver for robot systems without rigid contacts or a floating base. Possibly very efficient when the number of available CPU cores is very large.
The common features among these three solvers are as follows:
- Direct multiple shooting method:
- has a nice convergence property.
- fully leverages parallel computation.
- Primal-dual interior point method:
- can treat many inequality constraints including nonlinear ones very efficiently.
- allows infeasible initial guess of the solution.
- enables us to perform very fast suboptimal MPC by fixing the barrier parameter.
- Structure-exploting algorithms to compute Newton steps:
- can compute the Newton steps with linear time complexity with respect to the length of the horizon.
- Very fast rigid body kinematics and dynamics computation thanks to Pinocchio.
- Pinocchio enables us to compute the rigid body kinematics, dynamics, and their sensitivities (Jacobians) very efficiently.
- Pinocchio also gives us an interface to construct robot model (
robotoc::Robot
) via URDF files.
The detailed features are found in Features of optimal control solvers.
Installation
Please see Installation.
Citing robotoc
- Citing the switching time optimization (STO) algorithm of
OCPSolver
: @misc{katayama2021newtonocss,
title={Structure-exploiting {N}ewton-type method for optimal control of switched systems},
author={Sotaro Katayama and Toshiyuki Ohtsuka},
url={arXiv:2112.07232},
eprint={2112.07232},
archivePrefix={arXiv}
year={2021}}
- Citing
robotoc::OCPSolver
(the repository name was idocp
in this paper (https://github.com/mayataka/idocp)): @misc{katayama2021liftedcd,
title={Lifted contact dynamics for efficient optimal control of rigid body systems with contacts},
author={Sotaro Katayama and Toshiyuki Ohtsuka},
url={arXiv:2108.01781},
eprint={2108.01781},
archivePrefix={arXiv}
year={2021}}
- Citing
robotoc::UnconstrOCPSolver
and UnconstrParNMPCSolver
(the repository name was idocp
in this paper (https://github.com/mayataka/idocp)): @inproceedings{katayama2021idocp,
title={Efficient solution method based on inverse dynamics for optimal control problems of rigid body systems},
author={Sotaro Katayama and Toshiyuki Ohtsuka},
booktitle={{IEEE International Conference on Robotics and Automation (ICRA)}},
pages={2070--2076},
year={2021}}
Moreover, there are many pieces of literature the solvers basing on. For example,
robotoc::OCPSolver
uses the Riccati recursion algorithm with the pure-state equality constraints @inproceedings{katayama2022purestate,
title={Efficient {R}iccati recursion for optimal control problems with pure-state equality constraints},
author={Sotaro Katayama and Toshiyuki Ohtsuka},
booktitle={{American Control Conference (ACC)}},
pages={3579--3586},
year={2022}}
robotoc::UnconstrParNMPCSolver
uses the highly parallelizable Newton-type method @article{deng2019parnmpc,
title={A parallel {N}ewton-type method for nonlinear model predictive control},
author={Haoyang Deng and Toshiyuki Ohtsuka},
journal={Automatica},
volume={109},
pages={108560},
year={2019}}
- Moreover,
robotoc
heavily relies on Pinocchio, so we'd like you to cite it as @inproceedings{carpentier-sii19,
title={The {P}inocchio {C}++ library -- {A} fast and flexible implementation of rigid body dynamics algorithms and their analytical derivatives},
author={J. Carpentier and G. Saurel and G. Buondonno and J. Mirabel and F. Lamiraux and O. Stasse and N. Mansard},
booktitle={International Symposium on System Integration (SII)}
year={2019}}
Source code
Source code is available at github https://github.com/mayataka/robotoc.