Header-only C++ library containing controllers designed for Lie Groups
The library aims to contain some controllers designed in lie groups. The library depends only on Eigen
and manif
.
All the controllers defined in lie-group-controllers
have in common that they inherit from a templated base class (CRTP). It allows one to write generic code abstracting the controller details. This follows the structure of manif
and Eigen
.
The library implements two controllers:
- Proportional Controller (
P controller
) - Proportional Derivative Controller (
PD controller
)
The controllers have the following form
Trivialization | Proportional Controller | Proportional Derivative Controller |
---|---|---|
Left (default) | ||
Right |
where X
and Xᵈ
are elements of a Lie group. ∘
is the group operator. ψ
represents an element in the Lie algebra of the Lie group whose coordinates are expressed in ℝⁿ
.
The controllers support all the groups defined in manif
. Namely:
- ℝ(n): Euclidean space with addition.
- SO(2): rotations in the plane.
- SE(2): rigid motion (rotation and translation) in the plane.
- SO(3): rotations in 3D space.
- SE(3): rigid motion (rotation and translation) in 3D space.
Please you can find further information in
Modern Robotics: Mechanics, Planning, and Control,
Kevin M. Lynch and Frank C. Park,
Cambridge University Press, 2017,
ISBN 9781107156302
The library implements proportional and proportional derivative controllers on Lie groups. What follows are two simple snippets that you can follow to build and use such controllers. For sake of simplicity, only controllers in SO(3) are shown. The very same applies to the other Lie groups
// set random initial state and zero feedforward
manif::SO3d desiredState, state;
desiredState.setRandom();
state.setRandom();
Eigen::Vector3d feedForward = Eigen::Vector3d::Zero();
// create the controller.
ProportionalControllerSO3d controller;
// In case you want to use the right trivialized controller
// ProportionalControllerTplSO3d<Trivialization::Right> controller;
// set the proportional gain
const double kp = 10;
controller.setGains(kp);
// set the desired state, the feed-forward, and the state
controller.setDesiredState(desiredState);
controller.setFeedForward(feedForward);
controller.setState(state);
// compute the control law
controller.computeControlLaw();
const auto& controlOutput = controller.getControl();
// set random initial state and zero feedforward
manif::SO3d desiredState, state;
desiredState.setRandom();
state.setRandom();
manif::SO3d::Tangent stateDerivative = Eigen::Vector3d::Zero();
manif::SO3d::Tangent desiredStateDerivative = Eigen::Vector3d::Zero();
Eigen::Vector3d feedForward = Eigen::Vector3d::Zero();
// create the controller.
ProportionalDerivativeControllerSO3d controller;
// In case you want to use the right trivialized controller
// ProportionalDerivativeControllerTplSO3d<Trivialization::Right> controller;
// set the proportional and the derivative gains
const double kp = 10;
const double kd = 2 * std::sqrt(kp);
controller.setGains(kp, kd);
// set the desired state, its derivative, the feed-forward, and the state
controller.setDesiredState(desiredState, desiredStateDerivative);
controller.setFeedForward(feedForward);
controller.setState(state, stateDerivative);
// compute the control law
controller.computeControlLaw();
const auto& controlOutput = controller.getControl();
git clone https://github.com/GiulioRomualdi/lie-group-controllers.git
cd lie-group-controllers
mkdir build && cd build
cmake ../
cmake --build .
[sudo] cmake --build . --target install
If you want to enable tests set the BUILD_TESTING
option to ON
.
lie-group-controllers provides native CMake support which allows the library to be easily used in CMake projects. Please add in your CMakeLists.txt
project(foo)
find_package(LieGroupControllers REQUIRED)
add_executable(${PROJECT_NAME} src/foo.cpp)
target_link_libraries(${PROJECT_NAME} LieGroupControllers::LieGroupControllers)
All types of issues are welcome.
The original version of the library can be found here.