RobotLibrary is a C++ package for modeling, trajectory generation, and control of robots. The initial release supports real-time velocity control of serial link robot arms (work on torque control is underway). The interfaces are designed to provide simple inputs and outputs, without needing to know anything about the algorithms underneath.
The modular design means you can utilize different components to develop your own controllers. For example, you can inherit the SerialLinkBase
class in the Control sub-library and implement your own algorithms for the joint and Cartesian control methods. Or, you can use the KinematicTree
in the Model sub-library for the inverse dynamics and write your own controller from scratch.
- Control: Classes for real-time, feedback control.
- Math: Supporting functions & classes for other parts of the library.
- Model: Classes for computing the kinematics & dynamics of rigid-body structures.
- Trajectory: Classes for generating paths through space & time.
- CMake 3.14 or higher
- C++17 or higher
- Eigen3 v3.4 or higher
Note
You need to manually install Eigen 3.4 if you're using Ubuntu 20.04.
-
First ensure prerequisites are installed:
sudo apt update
sudo apt install -y build-essential cmake git
-
Download version 3.4 directly (or from the webpage):
wget https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz
-
Extract the downloaded file:
tar -xvf eigen-3.4.0.tar.gz
cd eigen-3.4.0
-
Build and install:
mkdir build && cd build
cmake ../
sudo make install
Eigen 3.4 is automatically installed on later versions of Ubuntu. In the command line you can run:
sudo apt install libeigen3-dev
-
Clone this repository in to your working directory:
git clone https://github.com/Woolfrey/software_robot_library.git
-
Navigate in to the folder:
cd ~/<your_working_directory>/software_robot_library
-
Create a build directory and navigate in to it:
mkdir build && cd build
-
Run the following commands in the
build
directory:cmake ..
sudo make install
You should now be able to include different parts of the library in your C++ files.
When using RobotLibrary
classes in another project, it is necessary to link both Eigen
and RobotLibrary
when compiling executables. For example, we may want to use the KinematicTree
class in the example.cpp
of the following example project:
example_project/
├── build/
├── src/
| └── example.cpp
└── CMakeLists.txt
In the example.cpp
file we can include the KinematicTree
header file under RobotLibrary
:
#include <RobotLibrary/Model/KinematicTree.h>
...
int main(int argc, char **argv)
{
RobotLibrary::Model::KinematicTree model("path/to/robot.urdf");
}
Then, in the CMakeLists.txt
file, we must:
- Tell the compiler to find both
Eigen3
andRobotLibrary
, and - Link
RobotLibrary
andEigen3
to the executable that uses anyRobotLibrary
classes:
cmake_minimum_required(VERSION 3.8)
project(example)
...
find_package(Eigen3 REQUIRED)
find_package(RobotLibrary REQUIRED)
include_directories(${EIGEN3_INCLUDE_DIR})
...
add_executable(example src/example.cpp)
target_link_libraries(example RobotLibrary::RobotLibrary Eigen3::Eigen)
Inside the example_project/build
folder it should be possible to compile the project:
cmake ..
make
If you would like to see examples where RobotLibrary
has been applied, you can check out:
- Serial Link Action Server : My own ROS2 action servers for control,
- Kuka iiwa14 velocity control : a ROS2 package which implements the former action server, and
- TestingRobotLibrary : C++ executables I use for numerical validation of RobotLibrary.
- Control:
- SerialLinkBase : Base class providing common structure for all child classes.
- SerialKinematicControl : Joint velocity & Cartesian velocity control algorithms.
- Math:
- MathFunctions : Helper functions for other classes.
- Polynomial : Generates a scalar, polynomial function.
- SkewSymmetric: Converted an
Eigen::Vector3d
object to an anti-symmetricEigen::Matrix3d
object. - Spline : Connects multiple points using polynomials, whilst ensuring continuity.
- Model:
- Joint : Models an actuated joint on a robot.
- KinematicTree : Kinematic & dynamic modeling of branching, serial-link structures.
- Link : Represents a combined
Joint
andRigidBody
object. - Pose : Position and orientation;
$\mathbb{SE}(3)$ . - RigidBody : Dynamics for a single, solid object.
- Trajectory:
- CartesianSpline : Generates smooth trajectories over a series of poses.
- SplineTrajectory : Generates smooth trajectories over a series of points.
- TrajectoryBase : Provides common structure to all trajectory classes.
- TrapezoidalVelocity : Trajectory with constant sections, and ramps up and down.
Contributions are welcome! Feel free to fork the library, make your own improvements, and issue a pull request.