SpaceVecAlg aim to implement Spatial Vector Algebra with the Eigen3 linear algebra library.
All this implementation is based on appendix A of Roy Featherstone Rigid Body Dynamics Algorithms book.
Features:
- Featherstone Spatial Vector Algebra C++11 implementation
- Header only
- Use Eigen3 as linear algebra library
- Python binding
A short tutorial is available here.
To learn more about Spatial Vector Algebra you can find some presentations on the following page.
The SpaceVecAlg and RBDyn tutorial is also a big ressource to understand how to use SpaceVecAlg. Also you will find a lot of IPython Notebook that will present real use case.
Finally you can build a Doxygen documentation by typing make doc in the build directory. After a make install the documentation will be in CMAKE_INSTALL_PREFIX/share/doc/SpaceVecAlg (see the Installing section).
An up-to-date doxygen documentation is also available online.
In this section a stand for a double, v for a motion vector, f for a force vector,
I for a rigid body inertia, I^a for a articulated body inertia and
X for a plücker transfrom.
. stand for the dot product, xfor the cross product and x^{\*} for the cross product dual.
r stand for a 3d translation vector, E for a 3d rotation matrix,
m for a mass, c for the center of mass 3d vector from the body origin,
I_c for the 3d rotational inertia matrix at CoM frame.
| Operation | C++ |
|---|---|
| rx(theta) | sva::RotX(theta) |
| ry(theta) | sva::RotY(theta) |
| rz(theta) | sva::RotZ(theta) |
| X = rotx(theta) | sva::PTransformd(sva::RotX(theta)) |
| X = roty(theta) | sva::PTransformd(sva::RotY(theta)) |
| X = rotz(theta) | sva::PTransformd(sva::RotZ(theta)) |
| X = xlt(r) | sva::PTransformd(r) |
| x = crm(v) | sva::vector6ToCrossMatrix(v) |
| v x^{*} = crf(v) | sva::vector6ToCrossDualMatrix(v) |
| I = E*mcI(m, c, I_c)*E{^T} | inertiaToOrigin(I_c, m, c, E) |
| v = XtoV(X) | sva::transformVelocity(X) |
| Operation | C++ |
|---|---|
| a v | a*sva::MotionVecd() |
| a f | a*sva::ForceVecd() |
| a I | a*sva::RBInertiad() |
| a I^a | a*sva::ABInertiad() |
| v_1 + v_2 | sva::MotionVecd() + sva::MotionVecd() |
| f_1 + f_2 | sva::ForceVecd() + sva::ForceVecd() |
| I_1 + I_1 | sva::RBInertiad() + sva::RBInertiad() |
| I_1^a + I_2^a | sva::ABInertiad() + sva::ABInertiad() |
| I_1^a + I_2^a | sva::ABInertiad() + sva::RBInertiad() |
| v . f | sva::MotionVecd().dot(sva::ForceVecd()) |
| v_1 x v_2 | sva::MotionVecd().cross(sva::MotionVecd()) |
| v x^* f | sva::MotionVecd().crossDual(sva::ForceVecd()) |
| I v | sva::RBInertiad()\*sva::MotionVecd() |
| I^a v | sva::ABInertiad()\*sva::MotionVecd() |
| X_1 X_2 | sva::PTransformd()\*sva::PTransformd() |
| X^{-1} | sva::PTransformd().inv() |
| X v | sva::PTransformd()\*sva::MotionVecd() |
| X^{-1} v | sva::PTransformd().invMul(sva::MotionVecd()) |
| X^{*} f | sva::PTransformd().dualMul(sva::ForceVecd()) |
| X^{T} f | sva::PTransformd().transMul(sva::ForceVecd()) |
| X^{*} I X^{-1} | sva::PTransformd().dualMul(sva::RBInertiad()) |
| X^{T} I X | sva::PTransformd().transMul(sva::RBInertiad()) |
| X^{*} I^a X^{-1} | sva::PTransformd().dualMul(sva::ABInertiad()) |
| X^{T} I^a X | sva::PTransformd().transMul(sva::ABInertiad()) |
Here w stand for the 3d angular velocity, v for the 3d linear velocity,
n for the 3d torque, f for the 3d force, E for the 3d rotation matrix,
r for the 3d translation vector, q for a unit quaternion, m for a mass,
h for the first moment of mass (h = m c) at body frame,
I for the 3d rotational inertia at body frame, M for the 3d mass matrix,
and H for the 3d generalized inertia matrix.
| Operation | C++ |
|---|---|
| mv(w, v) | sva::MotionVecd(w, v) |
| fv(n, f) | sva::ForceVecd(n, f) |
| plx(E, r) | sva::PTransform(E, r) |
| plx(q, r) | sva::PTransform(q, r) |
| rbi(m, h, I) | sva::RBInertia(m, h, I) |
| abi(M, H, I) | sva::ABInertia(M, H, I) |
Use the multi-contact-unstable ppa:
sudo add-apt-repository ppa:pierre-gergondet+ppa/multi-contact-unstable
sudo apt-get update
sudo apt-get install libspacevecalg-dev libspacevecalg-docInstall from the command line using Homebrew:
# install homebrew package manager
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# install caskroom application manager
brew install caskroom/cask/brew-cask
# tap homebrew-science package repository
brew tap homebrew/science
# tap ahundt-robotics repository
brew tap ahundt/robotics
# install tasks and all its dependencies
brew install spacevecalgTo compile you need the following tools:
For Python bindings:
- Cython >= 0.25
- Eigen3ToPython (to use the Python binding)
git clone --recursive https://github.com/jrl-umi3218/SpaceVecAlg
cd SpaceVecAlg
mkdir _build
cd _build
cmake [options] ..
make && make intallWhere the main options are:
-DCMAKE_BUIlD_TYPE=ReleaseBuild in Release mode-DCMAKE_INSTALL_PREFIX=some/path/to/installdefault is/usr/local-DPYTHON_BINDING=ONBuild the python binding-DUNIT_TESTS=ONBuild unit tests.-DPYTHON_DEB_LAYOUT=OFFinstall python library insite-packages(ON will install indist-packages)
You can use the following AUR package.
To update sync cmake or .travis directory with their upstream git repository:
git fetch git://github.com/jrl-umi3218/jrl-cmakemodules.git master
git subtree pull --prefix cmake git://github.com/jrl-umi3218/jrl-cmakemodules.git master --squash
git fetch git://github.com/jrl-umi3218/jrl-travis.git master
git subtree pull --prefix .travis git://github.com/jrl-umi3218/jrl-travis.git master --squash