diff options
Diffstat (limited to 'thirdparty/bullet/BulletInverseDynamics/details')
7 files changed, 0 insertions, 2548 deletions
diff --git a/thirdparty/bullet/BulletInverseDynamics/details/IDEigenInterface.hpp b/thirdparty/bullet/BulletInverseDynamics/details/IDEigenInterface.hpp deleted file mode 100644 index fe4f102513..0000000000 --- a/thirdparty/bullet/BulletInverseDynamics/details/IDEigenInterface.hpp +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef INVDYNEIGENINTERFACE_HPP_ -#define INVDYNEIGENINTERFACE_HPP_ -#include "../IDConfig.hpp" -namespace btInverseDynamics -{ -#define BT_ID_HAVE_MAT3X - -#ifdef BT_USE_DOUBLE_PRECISION -typedef Eigen::Matrix<double, Eigen::Dynamic, 1, Eigen::DontAlign> vecx; -typedef Eigen::Matrix<double, 3, 1, Eigen::DontAlign> vec3; -typedef Eigen::Matrix<double, 3, 3, Eigen::DontAlign> mat33; -typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::DontAlign> matxx; -typedef Eigen::Matrix<double, 3, Eigen::Dynamic, Eigen::DontAlign> mat3x; -#else -typedef Eigen::Matrix<float, Eigen::Dynamic, 1, Eigen::DontAlign> vecx; -typedef Eigen::Matrix<float, 3, 1, Eigen::DontAlign> vec3; -typedef Eigen::Matrix<float, 3, 3, Eigen::DontAlign> mat33; -typedef Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::DontAlign> matxx; -typedef Eigen::Matrix<float, 3, Eigen::Dynamic, Eigen::DontAlign> mat3x; -#endif - -inline void resize(mat3x &m, Eigen::Index size) -{ - m.resize(3, size); - m.setZero(); -} - -inline void setMatxxElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, matxx *m) -{ - (*m)(row, col) = val; -} - -inline void setMat3xElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, mat3x *m) -{ - (*m)(row, col) = val; -} - -} // namespace btInverseDynamics -#endif // INVDYNEIGENINTERFACE_HPP_ diff --git a/thirdparty/bullet/BulletInverseDynamics/details/IDLinearMathInterface.hpp b/thirdparty/bullet/BulletInverseDynamics/details/IDLinearMathInterface.hpp deleted file mode 100644 index 0c398a3727..0000000000 --- a/thirdparty/bullet/BulletInverseDynamics/details/IDLinearMathInterface.hpp +++ /dev/null @@ -1,202 +0,0 @@ -#ifndef IDLINEARMATHINTERFACE_HPP_ -#define IDLINEARMATHINTERFACE_HPP_ - -#include <cstdlib> - -#include "../IDConfig.hpp" - -#include "../../LinearMath/btMatrix3x3.h" -#include "../../LinearMath/btVector3.h" -#include "../../LinearMath/btMatrixX.h" -#define BT_ID_HAVE_MAT3X - -namespace btInverseDynamics -{ -class vec3; -class vecx; -class mat33; -typedef btMatrixX<idScalar> matxx; - -class vec3 : public btVector3 -{ -public: - vec3() : btVector3() {} - vec3(const btVector3& btv) { *this = btv; } - idScalar& operator()(int i) { return (*this)[i]; } - const idScalar& operator()(int i) const { return (*this)[i]; } - int size() const { return 3; } - const vec3& operator=(const btVector3& rhs) - { - *static_cast<btVector3*>(this) = rhs; - return *this; - } -}; - -class mat33 : public btMatrix3x3 -{ -public: - mat33() : btMatrix3x3() {} - mat33(const btMatrix3x3& btm) { *this = btm; } - idScalar& operator()(int i, int j) { return (*this)[i][j]; } - const idScalar& operator()(int i, int j) const { return (*this)[i][j]; } - const mat33& operator=(const btMatrix3x3& rhs) - { - *static_cast<btMatrix3x3*>(this) = rhs; - return *this; - } - friend mat33 operator*(const idScalar& s, const mat33& a); - friend mat33 operator/(const mat33& a, const idScalar& s); -}; - -inline mat33 operator/(const mat33& a, const idScalar& s) { return a * (1.0 / s); } - -inline mat33 operator*(const idScalar& s, const mat33& a) { return a * s; } - -class vecx : public btVectorX<idScalar> -{ -public: - vecx(int size) : btVectorX<idScalar>(size) {} - const vecx& operator=(const btVectorX<idScalar>& rhs) - { - *static_cast<btVectorX<idScalar>*>(this) = rhs; - return *this; - } - - idScalar& operator()(int i) { return (*this)[i]; } - const idScalar& operator()(int i) const { return (*this)[i]; } - - friend vecx operator*(const vecx& a, const idScalar& s); - friend vecx operator*(const idScalar& s, const vecx& a); - - friend vecx operator+(const vecx& a, const vecx& b); - friend vecx operator-(const vecx& a, const vecx& b); - friend vecx operator/(const vecx& a, const idScalar& s); -}; - -inline vecx operator*(const vecx& a, const idScalar& s) -{ - vecx result(a.size()); - for (int i = 0; i < result.size(); i++) - { - result(i) = a(i) * s; - } - return result; -} -inline vecx operator*(const idScalar& s, const vecx& a) { return a * s; } -inline vecx operator+(const vecx& a, const vecx& b) -{ - vecx result(a.size()); - // TODO: error handling for a.size() != b.size()?? - if (a.size() != b.size()) - { - bt_id_error_message("size missmatch. a.size()= %d, b.size()= %d\n", a.size(), b.size()); - abort(); - } - for (int i = 0; i < a.size(); i++) - { - result(i) = a(i) + b(i); - } - - return result; -} - -inline vecx operator-(const vecx& a, const vecx& b) -{ - vecx result(a.size()); - // TODO: error handling for a.size() != b.size()?? - if (a.size() != b.size()) - { - bt_id_error_message("size missmatch. a.size()= %d, b.size()= %d\n", a.size(), b.size()); - abort(); - } - for (int i = 0; i < a.size(); i++) - { - result(i) = a(i) - b(i); - } - return result; -} -inline vecx operator/(const vecx& a, const idScalar& s) -{ - vecx result(a.size()); - for (int i = 0; i < result.size(); i++) - { - result(i) = a(i) / s; - } - - return result; -} - -// use btMatrixX to implement 3xX matrix -class mat3x : public matxx -{ -public: - mat3x() {} - mat3x(const mat3x& rhs) - { - matxx::resize(rhs.rows(), rhs.cols()); - *this = rhs; - } - mat3x(int rows, int cols) : matxx(3, cols) - { - } - void operator=(const mat3x& rhs) - { - if (m_cols != rhs.m_cols) - { - bt_id_error_message("size missmatch, cols= %d but rhs.cols= %d\n", cols(), rhs.cols()); - abort(); - } - for (int i = 0; i < rows(); i++) - { - for (int k = 0; k < cols(); k++) - { - setElem(i, k, rhs(i, k)); - } - } - } - void setZero() - { - matxx::setZero(); - } -}; - -inline vec3 operator*(const mat3x& a, const vecx& b) -{ - vec3 result; - if (a.cols() != b.size()) - { - bt_id_error_message("size missmatch. a.cols()= %d, b.size()= %d\n", a.cols(), b.size()); - abort(); - } - result(0) = 0.0; - result(1) = 0.0; - result(2) = 0.0; - for (int i = 0; i < b.size(); i++) - { - for (int k = 0; k < 3; k++) - { - result(k) += a(k, i) * b(i); - } - } - return result; -} - -inline void resize(mat3x& m, idArrayIdx size) -{ - m.resize(3, size); - m.setZero(); -} - -inline void setMatxxElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, matxx* m) -{ - m->setElem(row, col, val); -} - -inline void setMat3xElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, mat3x* m) -{ - m->setElem(row, col, val); -} - -} // namespace btInverseDynamics - -#endif // IDLINEARMATHINTERFACE_HPP_ diff --git a/thirdparty/bullet/BulletInverseDynamics/details/IDMatVec.hpp b/thirdparty/bullet/BulletInverseDynamics/details/IDMatVec.hpp deleted file mode 100644 index 1c786095e7..0000000000 --- a/thirdparty/bullet/BulletInverseDynamics/details/IDMatVec.hpp +++ /dev/null @@ -1,489 +0,0 @@ -/// @file Built-In Matrix-Vector functions -#ifndef IDMATVEC_HPP_ -#define IDMATVEC_HPP_ - -#include <cstdlib> - -#include "../IDConfig.hpp" -#define BT_ID_HAVE_MAT3X - -namespace btInverseDynamics -{ -class vec3; -class vecx; -class mat33; -class matxx; -class mat3x; - -/// This is a very basic implementation to enable stand-alone use of the library. -/// The implementation is not really optimized and misses many features that you would -/// want from a "fully featured" linear math library. -class vec3 -{ -public: - idScalar& operator()(int i) { return m_data[i]; } - const idScalar& operator()(int i) const { return m_data[i]; } - const int size() const { return 3; } - const vec3& operator=(const vec3& rhs); - const vec3& operator+=(const vec3& b); - const vec3& operator-=(const vec3& b); - vec3 cross(const vec3& b) const; - idScalar dot(const vec3& b) const; - - friend vec3 operator*(const mat33& a, const vec3& b); - friend vec3 operator*(const vec3& a, const idScalar& s); - friend vec3 operator*(const idScalar& s, const vec3& a); - - friend vec3 operator+(const vec3& a, const vec3& b); - friend vec3 operator-(const vec3& a, const vec3& b); - friend vec3 operator/(const vec3& a, const idScalar& s); - -private: - idScalar m_data[3]; -}; - -class mat33 -{ -public: - idScalar& operator()(int i, int j) { return m_data[3 * i + j]; } - const idScalar& operator()(int i, int j) const { return m_data[3 * i + j]; } - const mat33& operator=(const mat33& rhs); - mat33 transpose() const; - const mat33& operator+=(const mat33& b); - const mat33& operator-=(const mat33& b); - - friend mat33 operator*(const mat33& a, const mat33& b); - friend vec3 operator*(const mat33& a, const vec3& b); - friend mat33 operator*(const mat33& a, const idScalar& s); - friend mat33 operator*(const idScalar& s, const mat33& a); - friend mat33 operator+(const mat33& a, const mat33& b); - friend mat33 operator-(const mat33& a, const mat33& b); - friend mat33 operator/(const mat33& a, const idScalar& s); - -private: - // layout is [0,1,2;3,4,5;6,7,8] - idScalar m_data[9]; -}; - -class vecx -{ -public: - vecx(int size) : m_size(size) - { - m_data = static_cast<idScalar*>(idMalloc(sizeof(idScalar) * size)); - } - ~vecx() { idFree(m_data); } - const vecx& operator=(const vecx& rhs); - idScalar& operator()(int i) { return m_data[i]; } - const idScalar& operator()(int i) const { return m_data[i]; } - const int& size() const { return m_size; } - - friend vecx operator*(const vecx& a, const idScalar& s); - friend vecx operator*(const idScalar& s, const vecx& a); - - friend vecx operator+(const vecx& a, const vecx& b); - friend vecx operator-(const vecx& a, const vecx& b); - friend vecx operator/(const vecx& a, const idScalar& s); - -private: - int m_size; - idScalar* m_data; -}; - -class matxx -{ -public: - matxx() - { - m_data = 0x0; - m_cols = 0; - m_rows = 0; - } - matxx(int rows, int cols) : m_rows(rows), m_cols(cols) - { - m_data = static_cast<idScalar*>(idMalloc(sizeof(idScalar) * rows * cols)); - } - ~matxx() { idFree(m_data); } - idScalar& operator()(int row, int col) { return m_data[row * m_cols + col]; } - const idScalar& operator()(int row, int col) const { return m_data[row * m_cols + col]; } - const int& rows() const { return m_rows; } - const int& cols() const { return m_cols; } - -private: - int m_rows; - int m_cols; - idScalar* m_data; -}; - -class mat3x -{ -public: - mat3x() - { - m_data = 0x0; - m_cols = 0; - } - mat3x(const mat3x& rhs) - { - m_cols = rhs.m_cols; - allocate(); - *this = rhs; - } - mat3x(int rows, int cols) : m_cols(cols) - { - allocate(); - }; - void operator=(const mat3x& rhs) - { - if (m_cols != rhs.m_cols) - { - bt_id_error_message("size missmatch, cols= %d but rhs.cols= %d\n", cols(), rhs.cols()); - abort(); - } - for (int i = 0; i < 3 * m_cols; i++) - { - m_data[i] = rhs.m_data[i]; - } - } - - ~mat3x() - { - free(); - } - idScalar& operator()(int row, int col) { return m_data[row * m_cols + col]; } - const idScalar& operator()(int row, int col) const { return m_data[row * m_cols + col]; } - int rows() const { return m_rows; } - const int& cols() const { return m_cols; } - void resize(int rows, int cols) - { - m_cols = cols; - free(); - allocate(); - } - void setZero() - { - memset(m_data, 0x0, sizeof(idScalar) * m_rows * m_cols); - } - // avoid operators that would allocate -- use functions sub/add/mul in IDMath.hpp instead -private: - void allocate() { m_data = static_cast<idScalar*>(idMalloc(sizeof(idScalar) * m_rows * m_cols)); } - void free() { idFree(m_data); } - enum - { - m_rows = 3 - }; - int m_cols; - idScalar* m_data; -}; - -inline void resize(mat3x& m, idArrayIdx size) -{ - m.resize(3, size); - m.setZero(); -} - -////////////////////////////////////////////////// -// Implementations -inline const vec3& vec3::operator=(const vec3& rhs) -{ - if (&rhs != this) - { - memcpy(m_data, rhs.m_data, 3 * sizeof(idScalar)); - } - return *this; -} - -inline vec3 vec3::cross(const vec3& b) const -{ - vec3 result; - result.m_data[0] = m_data[1] * b.m_data[2] - m_data[2] * b.m_data[1]; - result.m_data[1] = m_data[2] * b.m_data[0] - m_data[0] * b.m_data[2]; - result.m_data[2] = m_data[0] * b.m_data[1] - m_data[1] * b.m_data[0]; - - return result; -} - -inline idScalar vec3::dot(const vec3& b) const -{ - return m_data[0] * b.m_data[0] + m_data[1] * b.m_data[1] + m_data[2] * b.m_data[2]; -} - -inline const mat33& mat33::operator=(const mat33& rhs) -{ - if (&rhs != this) - { - memcpy(m_data, rhs.m_data, 9 * sizeof(idScalar)); - } - return *this; -} -inline mat33 mat33::transpose() const -{ - mat33 result; - result.m_data[0] = m_data[0]; - result.m_data[1] = m_data[3]; - result.m_data[2] = m_data[6]; - result.m_data[3] = m_data[1]; - result.m_data[4] = m_data[4]; - result.m_data[5] = m_data[7]; - result.m_data[6] = m_data[2]; - result.m_data[7] = m_data[5]; - result.m_data[8] = m_data[8]; - - return result; -} - -inline mat33 operator*(const mat33& a, const mat33& b) -{ - mat33 result; - result.m_data[0] = - a.m_data[0] * b.m_data[0] + a.m_data[1] * b.m_data[3] + a.m_data[2] * b.m_data[6]; - result.m_data[1] = - a.m_data[0] * b.m_data[1] + a.m_data[1] * b.m_data[4] + a.m_data[2] * b.m_data[7]; - result.m_data[2] = - a.m_data[0] * b.m_data[2] + a.m_data[1] * b.m_data[5] + a.m_data[2] * b.m_data[8]; - result.m_data[3] = - a.m_data[3] * b.m_data[0] + a.m_data[4] * b.m_data[3] + a.m_data[5] * b.m_data[6]; - result.m_data[4] = - a.m_data[3] * b.m_data[1] + a.m_data[4] * b.m_data[4] + a.m_data[5] * b.m_data[7]; - result.m_data[5] = - a.m_data[3] * b.m_data[2] + a.m_data[4] * b.m_data[5] + a.m_data[5] * b.m_data[8]; - result.m_data[6] = - a.m_data[6] * b.m_data[0] + a.m_data[7] * b.m_data[3] + a.m_data[8] * b.m_data[6]; - result.m_data[7] = - a.m_data[6] * b.m_data[1] + a.m_data[7] * b.m_data[4] + a.m_data[8] * b.m_data[7]; - result.m_data[8] = - a.m_data[6] * b.m_data[2] + a.m_data[7] * b.m_data[5] + a.m_data[8] * b.m_data[8]; - - return result; -} - -inline const mat33& mat33::operator+=(const mat33& b) -{ - for (int i = 0; i < 9; i++) - { - m_data[i] += b.m_data[i]; - } - - return *this; -} - -inline const mat33& mat33::operator-=(const mat33& b) -{ - for (int i = 0; i < 9; i++) - { - m_data[i] -= b.m_data[i]; - } - return *this; -} - -inline vec3 operator*(const mat33& a, const vec3& b) -{ - vec3 result; - - result.m_data[0] = - a.m_data[0] * b.m_data[0] + a.m_data[1] * b.m_data[1] + a.m_data[2] * b.m_data[2]; - result.m_data[1] = - a.m_data[3] * b.m_data[0] + a.m_data[4] * b.m_data[1] + a.m_data[5] * b.m_data[2]; - result.m_data[2] = - a.m_data[6] * b.m_data[0] + a.m_data[7] * b.m_data[1] + a.m_data[8] * b.m_data[2]; - - return result; -} - -inline const vec3& vec3::operator+=(const vec3& b) -{ - for (int i = 0; i < 3; i++) - { - m_data[i] += b.m_data[i]; - } - return *this; -} - -inline const vec3& vec3::operator-=(const vec3& b) -{ - for (int i = 0; i < 3; i++) - { - m_data[i] -= b.m_data[i]; - } - return *this; -} - -inline mat33 operator*(const mat33& a, const idScalar& s) -{ - mat33 result; - for (int i = 0; i < 9; i++) - { - result.m_data[i] = a.m_data[i] * s; - } - return result; -} - -inline mat33 operator*(const idScalar& s, const mat33& a) { return a * s; } - -inline vec3 operator*(const vec3& a, const idScalar& s) -{ - vec3 result; - for (int i = 0; i < 3; i++) - { - result.m_data[i] = a.m_data[i] * s; - } - return result; -} -inline vec3 operator*(const idScalar& s, const vec3& a) { return a * s; } - -inline mat33 operator+(const mat33& a, const mat33& b) -{ - mat33 result; - for (int i = 0; i < 9; i++) - { - result.m_data[i] = a.m_data[i] + b.m_data[i]; - } - return result; -} -inline vec3 operator+(const vec3& a, const vec3& b) -{ - vec3 result; - for (int i = 0; i < 3; i++) - { - result.m_data[i] = a.m_data[i] + b.m_data[i]; - } - return result; -} - -inline mat33 operator-(const mat33& a, const mat33& b) -{ - mat33 result; - for (int i = 0; i < 9; i++) - { - result.m_data[i] = a.m_data[i] - b.m_data[i]; - } - return result; -} -inline vec3 operator-(const vec3& a, const vec3& b) -{ - vec3 result; - for (int i = 0; i < 3; i++) - { - result.m_data[i] = a.m_data[i] - b.m_data[i]; - } - return result; -} - -inline mat33 operator/(const mat33& a, const idScalar& s) -{ - mat33 result; - for (int i = 0; i < 9; i++) - { - result.m_data[i] = a.m_data[i] / s; - } - return result; -} - -inline vec3 operator/(const vec3& a, const idScalar& s) -{ - vec3 result; - for (int i = 0; i < 3; i++) - { - result.m_data[i] = a.m_data[i] / s; - } - return result; -} - -inline const vecx& vecx::operator=(const vecx& rhs) -{ - if (size() != rhs.size()) - { - bt_id_error_message("size missmatch, size()= %d but rhs.size()= %d\n", size(), rhs.size()); - abort(); - } - if (&rhs != this) - { - memcpy(m_data, rhs.m_data, rhs.size() * sizeof(idScalar)); - } - return *this; -} -inline vecx operator*(const vecx& a, const idScalar& s) -{ - vecx result(a.size()); - for (int i = 0; i < result.size(); i++) - { - result.m_data[i] = a.m_data[i] * s; - } - return result; -} -inline vecx operator*(const idScalar& s, const vecx& a) { return a * s; } -inline vecx operator+(const vecx& a, const vecx& b) -{ - vecx result(a.size()); - // TODO: error handling for a.size() != b.size()?? - if (a.size() != b.size()) - { - bt_id_error_message("size missmatch. a.size()= %d, b.size()= %d\n", a.size(), b.size()); - abort(); - } - for (int i = 0; i < a.size(); i++) - { - result.m_data[i] = a.m_data[i] + b.m_data[i]; - } - - return result; -} -inline vecx operator-(const vecx& a, const vecx& b) -{ - vecx result(a.size()); - // TODO: error handling for a.size() != b.size()?? - if (a.size() != b.size()) - { - bt_id_error_message("size missmatch. a.size()= %d, b.size()= %d\n", a.size(), b.size()); - abort(); - } - for (int i = 0; i < a.size(); i++) - { - result.m_data[i] = a.m_data[i] - b.m_data[i]; - } - return result; -} -inline vecx operator/(const vecx& a, const idScalar& s) -{ - vecx result(a.size()); - for (int i = 0; i < result.size(); i++) - { - result.m_data[i] = a.m_data[i] / s; - } - - return result; -} - -inline vec3 operator*(const mat3x& a, const vecx& b) -{ - vec3 result; - if (a.cols() != b.size()) - { - bt_id_error_message("size missmatch. a.cols()= %d, b.size()= %d\n", a.cols(), b.size()); - abort(); - } - result(0) = 0.0; - result(1) = 0.0; - result(2) = 0.0; - for (int i = 0; i < b.size(); i++) - { - for (int k = 0; k < 3; k++) - { - result(k) += a(k, i) * b(i); - } - } - return result; -} - -inline void setMatxxElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, matxx* m) -{ - (*m)(row, col) = val; -} - -inline void setMat3xElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, mat3x* m) -{ - (*m)(row, col) = val; -} - -} // namespace btInverseDynamics -#endif diff --git a/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeImpl.cpp b/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeImpl.cpp deleted file mode 100644 index ec9a562295..0000000000 --- a/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeImpl.cpp +++ /dev/null @@ -1,1286 +0,0 @@ -#include "MultiBodyTreeImpl.hpp" - -namespace btInverseDynamics -{ -MultiBodyTree::MultiBodyImpl::MultiBodyImpl(int num_bodies_, int num_dofs_) - : m_num_bodies(num_bodies_), m_num_dofs(num_dofs_) -#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS) - , - m_m3x(3, m_num_dofs) -#endif -{ -#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS) - resize(m_m3x, m_num_dofs); -#endif - m_body_list.resize(num_bodies_); - m_parent_index.resize(num_bodies_); - m_child_indices.resize(num_bodies_); - m_user_int.resize(num_bodies_); - m_user_ptr.resize(num_bodies_); - - m_world_gravity(0) = 0.0; - m_world_gravity(1) = 0.0; - m_world_gravity(2) = -9.8; -} - -const char *MultiBodyTree::MultiBodyImpl::jointTypeToString(const JointType &type) const -{ - switch (type) - { - case FIXED: - return "fixed"; - case REVOLUTE: - return "revolute"; - case PRISMATIC: - return "prismatic"; - case FLOATING: - return "floating"; - case SPHERICAL: - return "spherical"; - } - return "error: invalid"; -} - -inline void indent(const int &level) -{ - for (int j = 0; j < level; j++) - id_printf(" "); // indent -} - -void MultiBodyTree::MultiBodyImpl::printTree() -{ - id_printf("body %.2d[%s]: root\n", 0, jointTypeToString(m_body_list[0].m_joint_type)); - printTree(0, 0); -} - -void MultiBodyTree::MultiBodyImpl::printTreeData() -{ - for (idArrayIdx i = 0; i < m_body_list.size(); i++) - { - RigidBody &body = m_body_list[i]; - id_printf("body: %d\n", static_cast<int>(i)); - id_printf("type: %s\n", jointTypeToString(body.m_joint_type)); - id_printf("q_index= %d\n", body.m_q_index); - id_printf("Jac_JR= [%f;%f;%f]\n", body.m_Jac_JR(0), body.m_Jac_JR(1), body.m_Jac_JR(2)); - id_printf("Jac_JT= [%f;%f;%f]\n", body.m_Jac_JT(0), body.m_Jac_JT(1), body.m_Jac_JT(2)); - - id_printf("mass = %f\n", body.m_mass); - id_printf("mass * com = [%f %f %f]\n", body.m_body_mass_com(0), body.m_body_mass_com(1), - body.m_body_mass_com(2)); - id_printf( - "I_o= [%f %f %f;\n" - " %f %f %f;\n" - " %f %f %f]\n", - body.m_body_I_body(0, 0), body.m_body_I_body(0, 1), body.m_body_I_body(0, 2), - body.m_body_I_body(1, 0), body.m_body_I_body(1, 1), body.m_body_I_body(1, 2), - body.m_body_I_body(2, 0), body.m_body_I_body(2, 1), body.m_body_I_body(2, 2)); - - id_printf("parent_pos_parent_body_ref= [%f %f %f]\n", body.m_parent_pos_parent_body_ref(0), - body.m_parent_pos_parent_body_ref(1), body.m_parent_pos_parent_body_ref(2)); - } -} -int MultiBodyTree::MultiBodyImpl::bodyNumDoFs(const JointType &type) const -{ - switch (type) - { - case FIXED: - return 0; - case REVOLUTE: - case PRISMATIC: - return 1; - case FLOATING: - return 6; - case SPHERICAL: - return 3; - } - bt_id_error_message("unknown joint type %d\n", type); - return 0; -} - -void MultiBodyTree::MultiBodyImpl::printTree(int index, int indentation) -{ - // this is adapted from URDF2Bullet. - // TODO: fix this and print proper graph (similar to git --log --graph) - int num_children = m_child_indices[index].size(); - - indentation += 2; - int count = 0; - - for (int i = 0; i < num_children; i++) - { - int child_index = m_child_indices[index][i]; - indent(indentation); - id_printf("body %.2d[%s]: %.2d is child no. %d (qi= %d .. %d) \n", index, - jointTypeToString(m_body_list[index].m_joint_type), child_index, (count++) + 1, - m_body_list[index].m_q_index, - m_body_list[index].m_q_index + bodyNumDoFs(m_body_list[index].m_joint_type)); - // first grandchild - printTree(child_index, indentation); - } -} - -int MultiBodyTree::MultiBodyImpl::setGravityInWorldFrame(const vec3 &gravity) -{ - m_world_gravity = gravity; - return 0; -} - -int MultiBodyTree::MultiBodyImpl::generateIndexSets() -{ - m_body_revolute_list.resize(0); - m_body_prismatic_list.resize(0); - int q_index = 0; - for (idArrayIdx i = 0; i < m_body_list.size(); i++) - { - RigidBody &body = m_body_list[i]; - body.m_q_index = -1; - switch (body.m_joint_type) - { - case REVOLUTE: - m_body_revolute_list.push_back(i); - body.m_q_index = q_index; - q_index++; - break; - case PRISMATIC: - m_body_prismatic_list.push_back(i); - body.m_q_index = q_index; - q_index++; - break; - case FIXED: - // do nothing - break; - case FLOATING: - m_body_floating_list.push_back(i); - body.m_q_index = q_index; - q_index += 6; - break; - case SPHERICAL: - m_body_spherical_list.push_back(i); - body.m_q_index = q_index; - q_index += 3; - break; - default: - bt_id_error_message("unsupported joint type %d\n", body.m_joint_type); - return -1; - } - } - // sanity check - if (q_index != m_num_dofs) - { - bt_id_error_message("internal error, q_index= %d but num_dofs %d\n", q_index, m_num_dofs); - return -1; - } - - m_child_indices.resize(m_body_list.size()); - - for (idArrayIdx child = 1; child < m_parent_index.size(); child++) - { - const int &parent = m_parent_index[child]; - if (parent >= 0 && parent < (static_cast<int>(m_parent_index.size()) - 1)) - { - m_child_indices[parent].push_back(child); - } - else - { - if (-1 == parent) - { - // multiple bodies are directly linked to the environment, ie, not a single root - bt_id_error_message("building index sets parent(%zu)= -1 (multiple roots)\n", child); - } - else - { - // should never happen - bt_id_error_message( - "building index sets. parent_index[%zu]= %d, but m_parent_index.size()= %d\n", - child, parent, static_cast<int>(m_parent_index.size())); - } - return -1; - } - } - - return 0; -} - -void MultiBodyTree::MultiBodyImpl::calculateStaticData() -{ - // relative kinematics that are not a function of q, u, dot_u - for (idArrayIdx i = 0; i < m_body_list.size(); i++) - { - RigidBody &body = m_body_list[i]; - switch (body.m_joint_type) - { - case REVOLUTE: - body.m_parent_vel_rel(0) = 0; - body.m_parent_vel_rel(1) = 0; - body.m_parent_vel_rel(2) = 0; - body.m_parent_acc_rel(0) = 0; - body.m_parent_acc_rel(1) = 0; - body.m_parent_acc_rel(2) = 0; - body.m_parent_pos_parent_body = body.m_parent_pos_parent_body_ref; - break; - case PRISMATIC: - body.m_body_T_parent = body.m_body_T_parent_ref; - body.m_parent_Jac_JT = body.m_body_T_parent_ref.transpose() * body.m_Jac_JT; - body.m_body_ang_vel_rel(0) = 0; - body.m_body_ang_vel_rel(1) = 0; - body.m_body_ang_vel_rel(2) = 0; - body.m_body_ang_acc_rel(0) = 0; - body.m_body_ang_acc_rel(1) = 0; - body.m_body_ang_acc_rel(2) = 0; - break; - case FIXED: - body.m_parent_pos_parent_body = body.m_parent_pos_parent_body_ref; - body.m_body_T_parent = body.m_body_T_parent_ref; - body.m_body_ang_vel_rel(0) = 0; - body.m_body_ang_vel_rel(1) = 0; - body.m_body_ang_vel_rel(2) = 0; - body.m_parent_vel_rel(0) = 0; - body.m_parent_vel_rel(1) = 0; - body.m_parent_vel_rel(2) = 0; - body.m_body_ang_acc_rel(0) = 0; - body.m_body_ang_acc_rel(1) = 0; - body.m_body_ang_acc_rel(2) = 0; - body.m_parent_acc_rel(0) = 0; - body.m_parent_acc_rel(1) = 0; - body.m_parent_acc_rel(2) = 0; - break; - case FLOATING: - // no static data - break; - case SPHERICAL: - //todo: review - body.m_parent_pos_parent_body = body.m_parent_pos_parent_body_ref; - body.m_parent_vel_rel(0) = 0; - body.m_parent_vel_rel(1) = 0; - body.m_parent_vel_rel(2) = 0; - body.m_parent_acc_rel(0) = 0; - body.m_parent_acc_rel(1) = 0; - body.m_parent_acc_rel(2) = 0; - break; - } - - // resize & initialize jacobians to zero. -#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS) - body.m_body_dot_Jac_T_u(0) = 0.0; - body.m_body_dot_Jac_T_u(1) = 0.0; - body.m_body_dot_Jac_T_u(2) = 0.0; - body.m_body_dot_Jac_R_u(0) = 0.0; - body.m_body_dot_Jac_R_u(1) = 0.0; - body.m_body_dot_Jac_R_u(2) = 0.0; - resize(body.m_body_Jac_T, m_num_dofs); - resize(body.m_body_Jac_R, m_num_dofs); - body.m_body_Jac_T.setZero(); - body.m_body_Jac_R.setZero(); -#endif // - } -} - -int MultiBodyTree::MultiBodyImpl::calculateInverseDynamics(const vecx &q, const vecx &u, - const vecx &dot_u, vecx *joint_forces) -{ - if (q.size() != m_num_dofs || u.size() != m_num_dofs || dot_u.size() != m_num_dofs || - joint_forces->size() != m_num_dofs) - { - bt_id_error_message( - "wrong vector dimension. system has %d DOFs,\n" - "but dim(q)= %d, dim(u)= %d, dim(dot_u)= %d, dim(joint_forces)= %d\n", - m_num_dofs, static_cast<int>(q.size()), static_cast<int>(u.size()), - static_cast<int>(dot_u.size()), static_cast<int>(joint_forces->size())); - return -1; - } - // 1. relative kinematics - if (-1 == calculateKinematics(q, u, dot_u, POSITION_VELOCITY_ACCELERATION)) - { - bt_id_error_message("error in calculateKinematics\n"); - return -1; - } - // 2. update contributions to equations of motion for every body. - for (idArrayIdx i = 0; i < m_body_list.size(); i++) - { - RigidBody &body = m_body_list[i]; - // 3.4 update dynamic terms (rate of change of angular & linear momentum) - body.m_eom_lhs_rotational = - body.m_body_I_body * body.m_body_ang_acc + body.m_body_mass_com.cross(body.m_body_acc) + - body.m_body_ang_vel.cross(body.m_body_I_body * body.m_body_ang_vel) - - body.m_body_moment_user; - body.m_eom_lhs_translational = - body.m_body_ang_acc.cross(body.m_body_mass_com) + body.m_mass * body.m_body_acc + - body.m_body_ang_vel.cross(body.m_body_ang_vel.cross(body.m_body_mass_com)) - - body.m_body_force_user; - } - - // 3. calculate full set of forces at parent joint - // (not directly calculating the joint force along the free direction - // simplifies inclusion of fixed joints. - // An alternative would be to fuse bodies in a pre-processing step, - // but that would make changing masses online harder (eg, payload masses - // added with fixed joints to a gripper) - // Also, this enables adding zero weight bodies as a way to calculate frame poses - // for force elements, etc. - - for (int body_idx = m_body_list.size() - 1; body_idx >= 0; body_idx--) - { - // sum of forces and moments acting on this body from its children - vec3 sum_f_children; - vec3 sum_m_children; - setZero(sum_f_children); - setZero(sum_m_children); - for (idArrayIdx child_list_idx = 0; child_list_idx < m_child_indices[body_idx].size(); - child_list_idx++) - { - const RigidBody &child = m_body_list[m_child_indices[body_idx][child_list_idx]]; - vec3 child_joint_force_in_this_frame = - child.m_body_T_parent.transpose() * child.m_force_at_joint; - sum_f_children -= child_joint_force_in_this_frame; - sum_m_children -= child.m_body_T_parent.transpose() * child.m_moment_at_joint + - child.m_parent_pos_parent_body.cross(child_joint_force_in_this_frame); - } - RigidBody &body = m_body_list[body_idx]; - - body.m_force_at_joint = body.m_eom_lhs_translational - sum_f_children; - body.m_moment_at_joint = body.m_eom_lhs_rotational - sum_m_children; - } - - // 4. Calculate Joint forces. - // These are the components of force_at_joint/moment_at_joint - // in the free directions given by Jac_JT/Jac_JR - // 4.1 revolute joints - for (idArrayIdx i = 0; i < m_body_revolute_list.size(); i++) - { - RigidBody &body = m_body_list[m_body_revolute_list[i]]; - // (*joint_forces)(body.m_q_index) = body.m_Jac_JR.transpose() * body.m_moment_at_joint; - (*joint_forces)(body.m_q_index) = body.m_Jac_JR.dot(body.m_moment_at_joint); - } - // 4.2 for prismatic joints - for (idArrayIdx i = 0; i < m_body_prismatic_list.size(); i++) - { - RigidBody &body = m_body_list[m_body_prismatic_list[i]]; - // (*joint_forces)(body.m_q_index) = body.m_Jac_JT.transpose() * body.m_force_at_joint; - (*joint_forces)(body.m_q_index) = body.m_Jac_JT.dot(body.m_force_at_joint); - } - // 4.3 floating bodies (6-DoF joints) - for (idArrayIdx i = 0; i < m_body_floating_list.size(); i++) - { - RigidBody &body = m_body_list[m_body_floating_list[i]]; - (*joint_forces)(body.m_q_index + 0) = body.m_moment_at_joint(0); - (*joint_forces)(body.m_q_index + 1) = body.m_moment_at_joint(1); - (*joint_forces)(body.m_q_index + 2) = body.m_moment_at_joint(2); - - (*joint_forces)(body.m_q_index + 3) = body.m_force_at_joint(0); - (*joint_forces)(body.m_q_index + 4) = body.m_force_at_joint(1); - (*joint_forces)(body.m_q_index + 5) = body.m_force_at_joint(2); - } - - // 4.4 spherical bodies (3-DoF joints) - for (idArrayIdx i = 0; i < m_body_spherical_list.size(); i++) - { - //todo: review - RigidBody &body = m_body_list[m_body_spherical_list[i]]; - (*joint_forces)(body.m_q_index + 0) = body.m_moment_at_joint(0); - (*joint_forces)(body.m_q_index + 1) = body.m_moment_at_joint(1); - (*joint_forces)(body.m_q_index + 2) = body.m_moment_at_joint(2); - } - return 0; -} - -int MultiBodyTree::MultiBodyImpl::calculateKinematics(const vecx &q, const vecx &u, const vecx &dot_u, - const KinUpdateType type) -{ - if (q.size() != m_num_dofs || u.size() != m_num_dofs || dot_u.size() != m_num_dofs) - { - bt_id_error_message( - "wrong vector dimension. system has %d DOFs,\n" - "but dim(q)= %d, dim(u)= %d, dim(dot_u)= %d\n", - m_num_dofs, static_cast<int>(q.size()), static_cast<int>(u.size()), - static_cast<int>(dot_u.size())); - return -1; - } - if (type != POSITION_ONLY && type != POSITION_VELOCITY && type != POSITION_VELOCITY_ACCELERATION) - { - bt_id_error_message("invalid type %d\n", type); - return -1; - } - - // 1. update relative kinematics - // 1.1 for revolute - for (idArrayIdx i = 0; i < m_body_revolute_list.size(); i++) - { - RigidBody &body = m_body_list[m_body_revolute_list[i]]; - mat33 T; - bodyTParentFromAxisAngle(body.m_Jac_JR, q(body.m_q_index), &T); - body.m_body_T_parent = T * body.m_body_T_parent_ref; - if (type >= POSITION_VELOCITY) - { - body.m_body_ang_vel_rel = body.m_Jac_JR * u(body.m_q_index); - } - if (type >= POSITION_VELOCITY_ACCELERATION) - { - body.m_body_ang_acc_rel = body.m_Jac_JR * dot_u(body.m_q_index); - } - } - // 1.2 for prismatic - for (idArrayIdx i = 0; i < m_body_prismatic_list.size(); i++) - { - RigidBody &body = m_body_list[m_body_prismatic_list[i]]; - body.m_parent_pos_parent_body = - body.m_parent_pos_parent_body_ref + body.m_parent_Jac_JT * q(body.m_q_index); - if (type >= POSITION_VELOCITY) - { - body.m_parent_vel_rel = - body.m_body_T_parent_ref.transpose() * body.m_Jac_JT * u(body.m_q_index); - } - if (type >= POSITION_VELOCITY_ACCELERATION) - { - body.m_parent_acc_rel = body.m_parent_Jac_JT * dot_u(body.m_q_index); - } - } - // 1.3 fixed joints: nothing to do - // 1.4 6dof joints: - for (idArrayIdx i = 0; i < m_body_floating_list.size(); i++) - { - RigidBody &body = m_body_list[m_body_floating_list[i]]; - - body.m_body_T_parent = transformZ(q(body.m_q_index + 2)) * - transformY(q(body.m_q_index + 1)) * - transformX(q(body.m_q_index)); - body.m_parent_pos_parent_body(0) = q(body.m_q_index + 3); - body.m_parent_pos_parent_body(1) = q(body.m_q_index + 4); - body.m_parent_pos_parent_body(2) = q(body.m_q_index + 5); - body.m_parent_pos_parent_body = body.m_body_T_parent * body.m_parent_pos_parent_body; - - if (type >= POSITION_VELOCITY) - { - body.m_body_ang_vel_rel(0) = u(body.m_q_index + 0); - body.m_body_ang_vel_rel(1) = u(body.m_q_index + 1); - body.m_body_ang_vel_rel(2) = u(body.m_q_index + 2); - - body.m_parent_vel_rel(0) = u(body.m_q_index + 3); - body.m_parent_vel_rel(1) = u(body.m_q_index + 4); - body.m_parent_vel_rel(2) = u(body.m_q_index + 5); - - body.m_parent_vel_rel = body.m_body_T_parent.transpose() * body.m_parent_vel_rel; - } - if (type >= POSITION_VELOCITY_ACCELERATION) - { - body.m_body_ang_acc_rel(0) = dot_u(body.m_q_index + 0); - body.m_body_ang_acc_rel(1) = dot_u(body.m_q_index + 1); - body.m_body_ang_acc_rel(2) = dot_u(body.m_q_index + 2); - - body.m_parent_acc_rel(0) = dot_u(body.m_q_index + 3); - body.m_parent_acc_rel(1) = dot_u(body.m_q_index + 4); - body.m_parent_acc_rel(2) = dot_u(body.m_q_index + 5); - - body.m_parent_acc_rel = body.m_body_T_parent.transpose() * body.m_parent_acc_rel; - } - } - - for (idArrayIdx i = 0; i < m_body_spherical_list.size(); i++) - { - //todo: review - RigidBody &body = m_body_list[m_body_spherical_list[i]]; - - mat33 T; - - T = transformX(q(body.m_q_index)) * - transformY(q(body.m_q_index + 1)) * - transformZ(q(body.m_q_index + 2)); - body.m_body_T_parent = T * body.m_body_T_parent_ref; - - body.m_parent_pos_parent_body(0)=0; - body.m_parent_pos_parent_body(1)=0; - body.m_parent_pos_parent_body(2)=0; - - body.m_parent_pos_parent_body = body.m_body_T_parent * body.m_parent_pos_parent_body; - - if (type >= POSITION_VELOCITY) - { - body.m_body_ang_vel_rel(0) = u(body.m_q_index + 0); - body.m_body_ang_vel_rel(1) = u(body.m_q_index + 1); - body.m_body_ang_vel_rel(2) = u(body.m_q_index + 2); - body.m_parent_vel_rel = body.m_body_T_parent.transpose() * body.m_parent_vel_rel; - } - if (type >= POSITION_VELOCITY_ACCELERATION) - { - body.m_body_ang_acc_rel(0) = dot_u(body.m_q_index + 0); - body.m_body_ang_acc_rel(1) = dot_u(body.m_q_index + 1); - body.m_body_ang_acc_rel(2) = dot_u(body.m_q_index + 2); - body.m_parent_acc_rel = body.m_body_T_parent.transpose() * body.m_parent_acc_rel; - } - } - - // 2. absolute kinematic quantities (vector valued) - // NOTE: this should be optimized by specializing for different body types - // (e.g., relative rotation is always zero for prismatic joints, etc.) - - // calculations for root body - { - RigidBody &body = m_body_list[0]; - // 3.1 update absolute positions and orientations: - // will be required if we add force elements (eg springs between bodies, - // or contacts) - // not required right now, added here for debugging purposes - body.m_body_pos = body.m_body_T_parent * body.m_parent_pos_parent_body; - body.m_body_T_world = body.m_body_T_parent; - - if (type >= POSITION_VELOCITY) - { - // 3.2 update absolute velocities - body.m_body_ang_vel = body.m_body_ang_vel_rel; - body.m_body_vel = body.m_parent_vel_rel; - } - if (type >= POSITION_VELOCITY_ACCELERATION) - { - // 3.3 update absolute accelerations - // NOTE: assumption: dot(J_JR) = 0; true here, but not for general joints - body.m_body_ang_acc = body.m_body_ang_acc_rel; - body.m_body_acc = body.m_body_T_parent * body.m_parent_acc_rel; - // add gravitational acceleration to root body - // this is an efficient way to add gravitational terms, - // but it does mean that the kinematics are no longer - // correct at the acceleration level - // NOTE: To get correct acceleration kinematics, just set world_gravity to zero - body.m_body_acc = body.m_body_acc - body.m_body_T_parent * m_world_gravity; - } - } - - for (idArrayIdx i = 1; i < m_body_list.size(); i++) - { - RigidBody &body = m_body_list[i]; - RigidBody &parent = m_body_list[m_parent_index[i]]; - // 2.1 update absolute positions and orientations: - // will be required if we add force elements (eg springs between bodies, - // or contacts) not required right now added here for debugging purposes - body.m_body_pos = - body.m_body_T_parent * (parent.m_body_pos + body.m_parent_pos_parent_body); - body.m_body_T_world = body.m_body_T_parent * parent.m_body_T_world; - - if (type >= POSITION_VELOCITY) - { - // 2.2 update absolute velocities - body.m_body_ang_vel = - body.m_body_T_parent * parent.m_body_ang_vel + body.m_body_ang_vel_rel; - - body.m_body_vel = - body.m_body_T_parent * - (parent.m_body_vel + parent.m_body_ang_vel.cross(body.m_parent_pos_parent_body) + - body.m_parent_vel_rel); - } - if (type >= POSITION_VELOCITY_ACCELERATION) - { - // 2.3 update absolute accelerations - // NOTE: assumption: dot(J_JR) = 0; true here, but not for general joints - body.m_body_ang_acc = - body.m_body_T_parent * parent.m_body_ang_acc - - body.m_body_ang_vel_rel.cross(body.m_body_T_parent * parent.m_body_ang_vel) + - body.m_body_ang_acc_rel; - body.m_body_acc = - body.m_body_T_parent * - (parent.m_body_acc + parent.m_body_ang_acc.cross(body.m_parent_pos_parent_body) + - parent.m_body_ang_vel.cross(parent.m_body_ang_vel.cross(body.m_parent_pos_parent_body)) + - 2.0 * parent.m_body_ang_vel.cross(body.m_parent_vel_rel) + body.m_parent_acc_rel); - } - } - - return 0; -} - -#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS) - -void MultiBodyTree::MultiBodyImpl::addRelativeJacobianComponent(RigidBody &body) -{ - const int &idx = body.m_q_index; - switch (body.m_joint_type) - { - case FIXED: - break; - case REVOLUTE: - setMat3xElem(0, idx, body.m_Jac_JR(0), &body.m_body_Jac_R); - setMat3xElem(1, idx, body.m_Jac_JR(1), &body.m_body_Jac_R); - setMat3xElem(2, idx, body.m_Jac_JR(2), &body.m_body_Jac_R); - break; - case PRISMATIC: - setMat3xElem(0, idx, body.m_body_T_parent_ref(0, 0) * body.m_Jac_JT(0) + body.m_body_T_parent_ref(1, 0) * body.m_Jac_JT(1) + body.m_body_T_parent_ref(2, 0) * body.m_Jac_JT(2), - &body.m_body_Jac_T); - setMat3xElem(1, idx, body.m_body_T_parent_ref(0, 1) * body.m_Jac_JT(0) + body.m_body_T_parent_ref(1, 1) * body.m_Jac_JT(1) + body.m_body_T_parent_ref(2, 1) * body.m_Jac_JT(2), - &body.m_body_Jac_T); - setMat3xElem(2, idx, body.m_body_T_parent_ref(0, 2) * body.m_Jac_JT(0) + body.m_body_T_parent_ref(1, 2) * body.m_Jac_JT(1) + body.m_body_T_parent_ref(2, 2) * body.m_Jac_JT(2), - &body.m_body_Jac_T); - break; - case FLOATING: - setMat3xElem(0, idx + 0, 1.0, &body.m_body_Jac_R); - setMat3xElem(1, idx + 1, 1.0, &body.m_body_Jac_R); - setMat3xElem(2, idx + 2, 1.0, &body.m_body_Jac_R); - // body_Jac_T = body_T_parent.transpose(); - setMat3xElem(0, idx + 3, body.m_body_T_parent(0, 0), &body.m_body_Jac_T); - setMat3xElem(0, idx + 4, body.m_body_T_parent(1, 0), &body.m_body_Jac_T); - setMat3xElem(0, idx + 5, body.m_body_T_parent(2, 0), &body.m_body_Jac_T); - - setMat3xElem(1, idx + 3, body.m_body_T_parent(0, 1), &body.m_body_Jac_T); - setMat3xElem(1, idx + 4, body.m_body_T_parent(1, 1), &body.m_body_Jac_T); - setMat3xElem(1, idx + 5, body.m_body_T_parent(2, 1), &body.m_body_Jac_T); - - setMat3xElem(2, idx + 3, body.m_body_T_parent(0, 2), &body.m_body_Jac_T); - setMat3xElem(2, idx + 4, body.m_body_T_parent(1, 2), &body.m_body_Jac_T); - setMat3xElem(2, idx + 5, body.m_body_T_parent(2, 2), &body.m_body_Jac_T); - - break; - case SPHERICAL: - //todo: review - setMat3xElem(0, idx + 0, 1.0, &body.m_body_Jac_R); - setMat3xElem(1, idx + 1, 1.0, &body.m_body_Jac_R); - setMat3xElem(2, idx + 2, 1.0, &body.m_body_Jac_R); - break; - } -} - -int MultiBodyTree::MultiBodyImpl::calculateJacobians(const vecx &q, const vecx &u, const KinUpdateType type) -{ - if (q.size() != m_num_dofs || u.size() != m_num_dofs) - { - bt_id_error_message( - "wrong vector dimension. system has %d DOFs,\n" - "but dim(q)= %d, dim(u)= %d\n", - m_num_dofs, static_cast<int>(q.size()), static_cast<int>(u.size())); - return -1; - } - if (type != POSITION_ONLY && type != POSITION_VELOCITY) - { - bt_id_error_message("invalid type %d\n", type); - return -1; - } - - addRelativeJacobianComponent(m_body_list[0]); - for (idArrayIdx i = 1; i < m_body_list.size(); i++) - { - RigidBody &body = m_body_list[i]; - RigidBody &parent = m_body_list[m_parent_index[i]]; - - mul(body.m_body_T_parent, parent.m_body_Jac_R, &body.m_body_Jac_R); - body.m_body_Jac_T = parent.m_body_Jac_T; - mul(tildeOperator(body.m_parent_pos_parent_body), parent.m_body_Jac_R, &m_m3x); - sub(body.m_body_Jac_T, m_m3x, &body.m_body_Jac_T); - - addRelativeJacobianComponent(body); - mul(body.m_body_T_parent, body.m_body_Jac_T, &body.m_body_Jac_T); - - if (type >= POSITION_VELOCITY) - { - body.m_body_dot_Jac_R_u = body.m_body_T_parent * parent.m_body_dot_Jac_R_u - - body.m_body_ang_vel_rel.cross(body.m_body_T_parent * parent.m_body_ang_vel); - body.m_body_dot_Jac_T_u = body.m_body_T_parent * - (parent.m_body_dot_Jac_T_u + parent.m_body_dot_Jac_R_u.cross(body.m_parent_pos_parent_body) + - parent.m_body_ang_vel.cross(parent.m_body_ang_vel.cross(body.m_parent_pos_parent_body)) + - 2.0 * parent.m_body_ang_vel.cross(body.m_parent_vel_rel)); - } - } - return 0; -} -#endif - -static inline void setThreeDoFJacobians(const int dof, vec3 &Jac_JR, vec3 &Jac_JT) -{ - switch (dof) - { - // rotational part - case 0: - Jac_JR(0) = 1; - Jac_JR(1) = 0; - Jac_JR(2) = 0; - setZero(Jac_JT); - break; - case 1: - Jac_JR(0) = 0; - Jac_JR(1) = 1; - Jac_JR(2) = 0; - setZero(Jac_JT); - break; - case 2: - Jac_JR(0) = 0; - Jac_JR(1) = 0; - Jac_JR(2) = 1; - setZero(Jac_JT); - break; - } -} - -static inline void setSixDoFJacobians(const int dof, vec3 &Jac_JR, vec3 &Jac_JT) -{ - switch (dof) - { - // rotational part - case 0: - Jac_JR(0) = 1; - Jac_JR(1) = 0; - Jac_JR(2) = 0; - setZero(Jac_JT); - break; - case 1: - Jac_JR(0) = 0; - Jac_JR(1) = 1; - Jac_JR(2) = 0; - setZero(Jac_JT); - break; - case 2: - Jac_JR(0) = 0; - Jac_JR(1) = 0; - Jac_JR(2) = 1; - setZero(Jac_JT); - break; - // translational part - case 3: - setZero(Jac_JR); - Jac_JT(0) = 1; - Jac_JT(1) = 0; - Jac_JT(2) = 0; - break; - case 4: - setZero(Jac_JR); - Jac_JT(0) = 0; - Jac_JT(1) = 1; - Jac_JT(2) = 0; - break; - case 5: - setZero(Jac_JR); - Jac_JT(0) = 0; - Jac_JT(1) = 0; - Jac_JT(2) = 1; - break; - } -} - -static inline int jointNumDoFs(const JointType &type) -{ - switch (type) - { - case FIXED: - return 0; - case REVOLUTE: - case PRISMATIC: - return 1; - case FLOATING: - return 6; - case SPHERICAL: - return 3; - } - // this should never happen - bt_id_error_message("invalid joint type\n"); - // TODO add configurable abort/crash function - abort(); - return 0; -} - -int MultiBodyTree::MultiBodyImpl::calculateMassMatrix(const vecx &q, const bool update_kinematics, - const bool initialize_matrix, - const bool set_lower_triangular_matrix, - matxx *mass_matrix) -{ - // This calculates the joint space mass matrix for the multibody system. - // The algorithm is essentially an implementation of "method 3" - // in "Efficient Dynamic Simulation of Robotic Mechanisms" (Walker and Orin, 1982) - // (Later named "Composite Rigid Body Algorithm" by Featherstone). - // - // This implementation, however, handles branched systems and uses a formulation centered - // on the origin of the body-fixed frame to avoid re-computing various quantities at the com. - - if (q.size() != m_num_dofs || mass_matrix->rows() != m_num_dofs || - mass_matrix->cols() != m_num_dofs) - { - bt_id_error_message( - "Dimension error. System has %d DOFs,\n" - "but dim(q)= %d, dim(mass_matrix)= %d x %d\n", - m_num_dofs, static_cast<int>(q.size()), static_cast<int>(mass_matrix->rows()), - static_cast<int>(mass_matrix->cols())); - return -1; - } - - // TODO add optimized zeroing function? - if (initialize_matrix) - { - for (int i = 0; i < m_num_dofs; i++) - { - for (int j = 0; j < m_num_dofs; j++) - { - setMatxxElem(i, j, 0.0, mass_matrix); - } - } - } - - if (update_kinematics) - { - // 1. update relative kinematics - // 1.1 for revolute joints - for (idArrayIdx i = 0; i < m_body_revolute_list.size(); i++) - { - RigidBody &body = m_body_list[m_body_revolute_list[i]]; - // from reference orientation (q=0) of body-fixed frame to current orientation - mat33 body_T_body_ref; - bodyTParentFromAxisAngle(body.m_Jac_JR, q(body.m_q_index), &body_T_body_ref); - body.m_body_T_parent = body_T_body_ref * body.m_body_T_parent_ref; - } - // 1.2 for prismatic joints - for (idArrayIdx i = 0; i < m_body_prismatic_list.size(); i++) - { - RigidBody &body = m_body_list[m_body_prismatic_list[i]]; - // body.m_body_T_parent= fixed - body.m_parent_pos_parent_body = - body.m_parent_pos_parent_body_ref + body.m_parent_Jac_JT * q(body.m_q_index); - } - // 1.3 fixed joints: nothing to do - // 1.4 6dof joints: - for (idArrayIdx i = 0; i < m_body_floating_list.size(); i++) - { - RigidBody &body = m_body_list[m_body_floating_list[i]]; - - body.m_body_T_parent = transformZ(q(body.m_q_index + 2)) * - transformY(q(body.m_q_index + 1)) * - transformX(q(body.m_q_index)); - body.m_parent_pos_parent_body(0) = q(body.m_q_index + 3); - body.m_parent_pos_parent_body(1) = q(body.m_q_index + 4); - body.m_parent_pos_parent_body(2) = q(body.m_q_index + 5); - - body.m_parent_pos_parent_body = body.m_body_T_parent * body.m_parent_pos_parent_body; - } - - for (idArrayIdx i = 0; i < m_body_spherical_list.size(); i++) - { - //todo: review - RigidBody &body = m_body_list[m_body_spherical_list[i]]; - - mat33 T; - - T = transformX(q(body.m_q_index)) * - transformY(q(body.m_q_index + 1)) * - transformZ(q(body.m_q_index + 2)); - body.m_body_T_parent = T * body.m_body_T_parent_ref; - - body.m_parent_pos_parent_body(0)=0; - body.m_parent_pos_parent_body(1)=0; - body.m_parent_pos_parent_body(2)=0; - - body.m_parent_pos_parent_body = body.m_body_T_parent * body.m_parent_pos_parent_body; - } - } - for (int i = m_body_list.size() - 1; i >= 0; i--) - { - RigidBody &body = m_body_list[i]; - // calculate mass, center of mass and inertia of "composite rigid body", - // ie, sub-tree starting at current body - body.m_subtree_mass = body.m_mass; - body.m_body_subtree_mass_com = body.m_body_mass_com; - body.m_body_subtree_I_body = body.m_body_I_body; - - for (idArrayIdx c = 0; c < m_child_indices[i].size(); c++) - { - RigidBody &child = m_body_list[m_child_indices[i][c]]; - mat33 body_T_child = child.m_body_T_parent.transpose(); - - body.m_subtree_mass += child.m_subtree_mass; - body.m_body_subtree_mass_com += body_T_child * child.m_body_subtree_mass_com + - child.m_parent_pos_parent_body * child.m_subtree_mass; - body.m_body_subtree_I_body += - body_T_child * child.m_body_subtree_I_body * child.m_body_T_parent; - - if (child.m_subtree_mass > 0) - { - // Shift the reference point for the child subtree inertia using the - // Huygens-Steiner ("parallel axis") theorem. - // (First shift from child origin to child com, then from there to this body's - // origin) - vec3 r_com = body_T_child * child.m_body_subtree_mass_com / child.m_subtree_mass; - mat33 tilde_r_child_com = tildeOperator(r_com); - mat33 tilde_r_body_com = tildeOperator(child.m_parent_pos_parent_body + r_com); - body.m_body_subtree_I_body += - child.m_subtree_mass * - (tilde_r_child_com * tilde_r_child_com - tilde_r_body_com * tilde_r_body_com); - } - } - } - - for (int i = m_body_list.size() - 1; i >= 0; i--) - { - const RigidBody &body = m_body_list[i]; - - // determine DoF-range for body - const int q_index_min = body.m_q_index; - const int q_index_max = q_index_min + jointNumDoFs(body.m_joint_type) - 1; - // loop over the DoFs used by this body - // local joint jacobians (ok as is for 1-DoF joints) - vec3 Jac_JR = body.m_Jac_JR; - vec3 Jac_JT = body.m_Jac_JT; - for (int col = q_index_max; col >= q_index_min; col--) - { - // set jacobians for 6-DoF joints - if (FLOATING == body.m_joint_type) - { - setSixDoFJacobians(col - q_index_min, Jac_JR, Jac_JT); - } - if (SPHERICAL == body.m_joint_type) - { - //todo: review - setThreeDoFJacobians(col - q_index_min, Jac_JR, Jac_JT); - } - - vec3 body_eom_rot = - body.m_body_subtree_I_body * Jac_JR + body.m_body_subtree_mass_com.cross(Jac_JT); - vec3 body_eom_trans = - body.m_subtree_mass * Jac_JT - body.m_body_subtree_mass_com.cross(Jac_JR); - setMatxxElem(col, col, Jac_JR.dot(body_eom_rot) + Jac_JT.dot(body_eom_trans), mass_matrix); - - // rest of the mass matrix column upwards - { - // 1. for multi-dof joints, rest of the dofs of this body - for (int row = col - 1; row >= q_index_min; row--) - { - if (SPHERICAL == body.m_joint_type) - { - //todo: review - setThreeDoFJacobians(row - q_index_min, Jac_JR, Jac_JT); - const double Mrc = Jac_JR.dot(body_eom_rot) + Jac_JT.dot(body_eom_trans); - setMatxxElem(col, row, Mrc, mass_matrix); - } - if (FLOATING == body.m_joint_type) - { - setSixDoFJacobians(row - q_index_min, Jac_JR, Jac_JT); - const double Mrc = Jac_JR.dot(body_eom_rot) + Jac_JT.dot(body_eom_trans); - setMatxxElem(col, row, Mrc, mass_matrix); - } - } - // 2. ancestor dofs - int child_idx = i; - int parent_idx = m_parent_index[i]; - while (parent_idx >= 0) - { - const RigidBody &child_body = m_body_list[child_idx]; - const RigidBody &parent_body = m_body_list[parent_idx]; - - const mat33 parent_T_child = child_body.m_body_T_parent.transpose(); - body_eom_rot = parent_T_child * body_eom_rot; - body_eom_trans = parent_T_child * body_eom_trans; - body_eom_rot += child_body.m_parent_pos_parent_body.cross(body_eom_trans); - - const int parent_body_q_index_min = parent_body.m_q_index; - const int parent_body_q_index_max = - parent_body_q_index_min + jointNumDoFs(parent_body.m_joint_type) - 1; - vec3 Jac_JR = parent_body.m_Jac_JR; - vec3 Jac_JT = parent_body.m_Jac_JT; - for (int row = parent_body_q_index_max; row >= parent_body_q_index_min; row--) - { - if (SPHERICAL == parent_body.m_joint_type) - { - //todo: review - setThreeDoFJacobians(row - parent_body_q_index_min, Jac_JR, Jac_JT); - } - // set jacobians for 6-DoF joints - if (FLOATING == parent_body.m_joint_type) - { - setSixDoFJacobians(row - parent_body_q_index_min, Jac_JR, Jac_JT); - } - const double Mrc = Jac_JR.dot(body_eom_rot) + Jac_JT.dot(body_eom_trans); - setMatxxElem(col, row, Mrc, mass_matrix); - } - - child_idx = parent_idx; - parent_idx = m_parent_index[child_idx]; - } - } - } - } - - if (set_lower_triangular_matrix) - { - for (int col = 0; col < m_num_dofs; col++) - { - for (int row = 0; row < col; row++) - { - setMatxxElem(row, col, (*mass_matrix)(col, row), mass_matrix); - } - } - } - return 0; -} - -// utility macro -#define CHECK_IF_BODY_INDEX_IS_VALID(index) \ - do \ - { \ - if (index < 0 || index >= m_num_bodies) \ - { \ - bt_id_error_message("invalid index %d (num_bodies= %d)\n", index, m_num_bodies); \ - return -1; \ - } \ - } while (0) - -int MultiBodyTree::MultiBodyImpl::getParentIndex(const int body_index, int *p) -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - *p = m_parent_index[body_index]; - return 0; -} - -int MultiBodyTree::MultiBodyImpl::getUserInt(const int body_index, int *user_int) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - *user_int = m_user_int[body_index]; - return 0; -} -int MultiBodyTree::MultiBodyImpl::getUserPtr(const int body_index, void **user_ptr) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - *user_ptr = m_user_ptr[body_index]; - return 0; -} - -int MultiBodyTree::MultiBodyImpl::setUserInt(const int body_index, const int user_int) -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - m_user_int[body_index] = user_int; - return 0; -} - -int MultiBodyTree::MultiBodyImpl::setUserPtr(const int body_index, void *const user_ptr) -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - m_user_ptr[body_index] = user_ptr; - return 0; -} - -int MultiBodyTree::MultiBodyImpl::getBodyOrigin(int body_index, vec3 *world_origin) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - const RigidBody &body = m_body_list[body_index]; - *world_origin = body.m_body_T_world.transpose() * body.m_body_pos; - return 0; -} - -int MultiBodyTree::MultiBodyImpl::getBodyCoM(int body_index, vec3 *world_com) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - const RigidBody &body = m_body_list[body_index]; - if (body.m_mass > 0) - { - *world_com = body.m_body_T_world.transpose() * - (body.m_body_pos + body.m_body_mass_com / body.m_mass); - } - else - { - *world_com = body.m_body_T_world.transpose() * (body.m_body_pos); - } - return 0; -} - -int MultiBodyTree::MultiBodyImpl::getBodyTransform(int body_index, mat33 *world_T_body) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - const RigidBody &body = m_body_list[body_index]; - *world_T_body = body.m_body_T_world.transpose(); - return 0; -} -int MultiBodyTree::MultiBodyImpl::getBodyAngularVelocity(int body_index, vec3 *world_omega) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - const RigidBody &body = m_body_list[body_index]; - *world_omega = body.m_body_T_world.transpose() * body.m_body_ang_vel; - return 0; -} -int MultiBodyTree::MultiBodyImpl::getBodyLinearVelocity(int body_index, - vec3 *world_velocity) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - const RigidBody &body = m_body_list[body_index]; - *world_velocity = body.m_body_T_world.transpose() * body.m_body_vel; - return 0; -} - -int MultiBodyTree::MultiBodyImpl::getBodyLinearVelocityCoM(int body_index, - vec3 *world_velocity) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - const RigidBody &body = m_body_list[body_index]; - vec3 com; - if (body.m_mass > 0) - { - com = body.m_body_mass_com / body.m_mass; - } - else - { - com(0) = 0; - com(1) = 0; - com(2) = 0; - } - - *world_velocity = - body.m_body_T_world.transpose() * (body.m_body_vel + body.m_body_ang_vel.cross(com)); - return 0; -} - -int MultiBodyTree::MultiBodyImpl::getBodyAngularAcceleration(int body_index, - vec3 *world_dot_omega) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - const RigidBody &body = m_body_list[body_index]; - *world_dot_omega = body.m_body_T_world.transpose() * body.m_body_ang_acc; - return 0; -} -int MultiBodyTree::MultiBodyImpl::getBodyLinearAcceleration(int body_index, - vec3 *world_acceleration) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - const RigidBody &body = m_body_list[body_index]; - *world_acceleration = body.m_body_T_world.transpose() * body.m_body_acc; - return 0; -} - -int MultiBodyTree::MultiBodyImpl::getJointType(const int body_index, JointType *joint_type) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - *joint_type = m_body_list[body_index].m_joint_type; - return 0; -} - -int MultiBodyTree::MultiBodyImpl::getJointTypeStr(const int body_index, - const char **joint_type) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - *joint_type = jointTypeToString(m_body_list[body_index].m_joint_type); - return 0; -} - -int MultiBodyTree::MultiBodyImpl::getParentRParentBodyRef(const int body_index, vec3 *r) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - *r = m_body_list[body_index].m_parent_pos_parent_body_ref; - return 0; -} - -int MultiBodyTree::MultiBodyImpl::getBodyTParentRef(const int body_index, mat33 *T) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - *T = m_body_list[body_index].m_body_T_parent_ref; - return 0; -} - -int MultiBodyTree::MultiBodyImpl::getBodyAxisOfMotion(const int body_index, vec3 *axis) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - if (m_body_list[body_index].m_joint_type == REVOLUTE) - { - *axis = m_body_list[body_index].m_Jac_JR; - return 0; - } - if (m_body_list[body_index].m_joint_type == PRISMATIC) - { - *axis = m_body_list[body_index].m_Jac_JT; - return 0; - } - setZero(*axis); - return 0; -} - -int MultiBodyTree::MultiBodyImpl::getDoFOffset(const int body_index, int *q_index) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - *q_index = m_body_list[body_index].m_q_index; - return 0; -} - -int MultiBodyTree::MultiBodyImpl::setBodyMass(const int body_index, const idScalar mass) -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - m_body_list[body_index].m_mass = mass; - return 0; -} - -int MultiBodyTree::MultiBodyImpl::setBodyFirstMassMoment(const int body_index, - const vec3 &first_mass_moment) -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - m_body_list[body_index].m_body_mass_com = first_mass_moment; - return 0; -} -int MultiBodyTree::MultiBodyImpl::setBodySecondMassMoment(const int body_index, - const mat33 &second_mass_moment) -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - m_body_list[body_index].m_body_I_body = second_mass_moment; - return 0; -} -int MultiBodyTree::MultiBodyImpl::getBodyMass(const int body_index, idScalar *mass) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - *mass = m_body_list[body_index].m_mass; - return 0; -} -int MultiBodyTree::MultiBodyImpl::getBodyFirstMassMoment(const int body_index, - vec3 *first_mass_moment) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - *first_mass_moment = m_body_list[body_index].m_body_mass_com; - return 0; -} -int MultiBodyTree::MultiBodyImpl::getBodySecondMassMoment(const int body_index, - mat33 *second_mass_moment) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - *second_mass_moment = m_body_list[body_index].m_body_I_body; - return 0; -} - -void MultiBodyTree::MultiBodyImpl::clearAllUserForcesAndMoments() -{ - for (int index = 0; index < m_num_bodies; index++) - { - RigidBody &body = m_body_list[index]; - setZero(body.m_body_force_user); - setZero(body.m_body_moment_user); - } -} - -int MultiBodyTree::MultiBodyImpl::addUserForce(const int body_index, const vec3 &body_force) -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - m_body_list[body_index].m_body_force_user += body_force; - return 0; -} - -int MultiBodyTree::MultiBodyImpl::addUserMoment(const int body_index, const vec3 &body_moment) -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - m_body_list[body_index].m_body_moment_user += body_moment; - return 0; -} - -#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS) -int MultiBodyTree::MultiBodyImpl::getBodyDotJacobianTransU(const int body_index, vec3 *world_dot_jac_trans_u) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - const RigidBody &body = m_body_list[body_index]; - *world_dot_jac_trans_u = body.m_body_T_world.transpose() * body.m_body_dot_Jac_T_u; - return 0; -} - -int MultiBodyTree::MultiBodyImpl::getBodyDotJacobianRotU(const int body_index, vec3 *world_dot_jac_rot_u) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - const RigidBody &body = m_body_list[body_index]; - *world_dot_jac_rot_u = body.m_body_T_world.transpose() * body.m_body_dot_Jac_R_u; - return 0; -} - -int MultiBodyTree::MultiBodyImpl::getBodyJacobianTrans(const int body_index, mat3x *world_jac_trans) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - const RigidBody &body = m_body_list[body_index]; - mul(body.m_body_T_world.transpose(), body.m_body_Jac_T, world_jac_trans); - return 0; -} - -int MultiBodyTree::MultiBodyImpl::getBodyJacobianRot(const int body_index, mat3x *world_jac_rot) const -{ - CHECK_IF_BODY_INDEX_IS_VALID(body_index); - const RigidBody &body = m_body_list[body_index]; - mul(body.m_body_T_world.transpose(), body.m_body_Jac_R, world_jac_rot); - return 0; -} - -#endif -} // namespace btInverseDynamics diff --git a/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeImpl.hpp b/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeImpl.hpp deleted file mode 100644 index eabdbe161b..0000000000 --- a/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeImpl.hpp +++ /dev/null @@ -1,288 +0,0 @@ -// The structs and classes defined here provide a basic inverse fynamics implementation used -// by MultiBodyTree -// User interaction should be through MultiBodyTree - -#ifndef MULTI_BODY_REFERENCE_IMPL_HPP_ -#define MULTI_BODY_REFERENCE_IMPL_HPP_ - -#include "../IDConfig.hpp" -#include "../MultiBodyTree.hpp" - -namespace btInverseDynamics -{ -/// Structure for for rigid body mass properties, connectivity and kinematic state -/// all vectors and matrices are in body-fixed frame, if not indicated otherwise. -/// The body-fixed frame is located in the joint connecting the body to its parent. -struct RigidBody -{ - ID_DECLARE_ALIGNED_ALLOCATOR(); - // 1 Inertial properties - /// Mass - idScalar m_mass; - /// Mass times center of gravity in body-fixed frame - vec3 m_body_mass_com; - /// Moment of inertia w.r.t. body-fixed frame - mat33 m_body_I_body; - - // 2 dynamic properties - /// Left-hand side of the body equation of motion, translational part - vec3 m_eom_lhs_translational; - /// Left-hand side of the body equation of motion, rotational part - vec3 m_eom_lhs_rotational; - /// Force acting at the joint when the body is cut from its parent; - /// includes impressed joint force in J_JT direction, - /// as well as constraint force, - /// in body-fixed frame - vec3 m_force_at_joint; - /// Moment acting at the joint when the body is cut from its parent; - /// includes impressed joint moment in J_JR direction, and constraint moment - /// in body-fixed frame - vec3 m_moment_at_joint; - /// external (user provided) force acting at the body-fixed frame's origin, written in that - /// frame - vec3 m_body_force_user; - /// external (user provided) moment acting at the body-fixed frame's origin, written in that - /// frame - vec3 m_body_moment_user; - // 3 absolute kinematic properties - /// Position of body-fixed frame relative to world frame - /// this is currently only for debugging purposes - vec3 m_body_pos; - /// Absolute velocity of body-fixed frame - vec3 m_body_vel; - /// Absolute acceleration of body-fixed frame - /// NOTE: if gravitational acceleration is not zero, this is the accelation PLUS gravitational - /// acceleration! - vec3 m_body_acc; - /// Absolute angular velocity - vec3 m_body_ang_vel; - /// Absolute angular acceleration - /// NOTE: if gravitational acceleration is not zero, this is the accelation PLUS gravitational - /// acceleration! - vec3 m_body_ang_acc; - - // 4 relative kinematic properties. - // these are in the parent body frame - /// Transform from world to body-fixed frame; - /// this is currently only for debugging purposes - mat33 m_body_T_world; - /// Transform from parent to body-fixed frame - mat33 m_body_T_parent; - /// Vector from parent to child frame in parent frame - vec3 m_parent_pos_parent_body; - /// Relative angular velocity - vec3 m_body_ang_vel_rel; - /// Relative linear velocity - vec3 m_parent_vel_rel; - /// Relative angular acceleration - vec3 m_body_ang_acc_rel; - /// Relative linear acceleration - vec3 m_parent_acc_rel; - - // 5 Data describing the joint type and geometry - /// Type of joint - JointType m_joint_type; - /// Position of joint frame (body-fixed frame at q=0) relative to the parent frame - /// Components are in body-fixed frame of the parent - vec3 m_parent_pos_parent_body_ref; - /// Orientation of joint frame (body-fixed frame at q=0) relative to the parent frame - mat33 m_body_T_parent_ref; - /// Joint rotational Jacobian, ie, the partial derivative of the body-fixed frames absolute - /// angular velocity w.r.t. the generalized velocity of this body's relative degree of freedom. - /// For revolute joints this is the joint axis, for prismatic joints it is a null matrix. - /// (NOTE: dimensions will have to be dynamic for additional joint types!) - vec3 m_Jac_JR; - /// Joint translational Jacobian, ie, the partial derivative of the body-fixed frames absolute - /// linear velocity w.r.t. the generalized velocity of this body's relative degree of freedom. - /// For prismatic joints this is the joint axis, for revolute joints it is a null matrix. - /// (NOTE: dimensions might have to be dynamic for additional joint types!) - vec3 m_Jac_JT; - /// m_Jac_JT in the parent frame, it, m_body_T_parent_ref.transpose()*m_Jac_JT - vec3 m_parent_Jac_JT; - /// Start of index range for the position degree(s) of freedom describing this body's motion - /// relative to - /// its parent. The indices are wrt the multibody system's q-vector of generalized coordinates. - int m_q_index; - - // 6 Scratch data for mass matrix computation using "composite rigid body algorithm" - /// mass of the subtree rooted in this body - idScalar m_subtree_mass; - /// center of mass * mass for subtree rooted in this body, in body-fixed frame - vec3 m_body_subtree_mass_com; - /// moment of inertia of subtree rooted in this body, w.r.t. body origin, in body-fixed frame - mat33 m_body_subtree_I_body; - -#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS) - /// translational jacobian in body-fixed frame d(m_body_vel)/du - mat3x m_body_Jac_T; - /// rotationsl jacobian in body-fixed frame d(m_body_ang_vel)/du - mat3x m_body_Jac_R; - /// components of linear acceleration depending on u - /// (same as is d(m_Jac_T)/dt*u) - vec3 m_body_dot_Jac_T_u; - /// components of angular acceleration depending on u - /// (same as is d(m_Jac_T)/dt*u) - vec3 m_body_dot_Jac_R_u; -#endif -}; - -/// The MBS implements a tree structured multibody system -class MultiBodyTree::MultiBodyImpl -{ - friend class MultiBodyTree; - -public: - ID_DECLARE_ALIGNED_ALLOCATOR(); - - enum KinUpdateType - { - POSITION_ONLY, - POSITION_VELOCITY, - POSITION_VELOCITY_ACCELERATION - }; - - /// constructor - /// @param num_bodies the number of bodies in the system - /// @param num_dofs number of degrees of freedom in the system - MultiBodyImpl(int num_bodies_, int num_dofs_); - - /// \copydoc MultiBodyTree::calculateInverseDynamics - int calculateInverseDynamics(const vecx& q, const vecx& u, const vecx& dot_u, - vecx* joint_forces); - ///\copydoc MultiBodyTree::calculateMassMatrix - int calculateMassMatrix(const vecx& q, const bool update_kinematics, - const bool initialize_matrix, const bool set_lower_triangular_matrix, - matxx* mass_matrix); - /// calculate kinematics (vector quantities) - /// Depending on type, update positions only, positions & velocities, or positions, velocities - /// and accelerations. - int calculateKinematics(const vecx& q, const vecx& u, const vecx& dot_u, const KinUpdateType type); -#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS) - /// calculate jacobians and (if type == POSITION_VELOCITY), also velocity-dependent accelration terms. - int calculateJacobians(const vecx& q, const vecx& u, const KinUpdateType type); - /// \copydoc MultiBodyTree::getBodyDotJacobianTransU - int getBodyDotJacobianTransU(const int body_index, vec3* world_dot_jac_trans_u) const; - /// \copydoc MultiBodyTree::getBodyDotJacobianRotU - int getBodyDotJacobianRotU(const int body_index, vec3* world_dot_jac_rot_u) const; - /// \copydoc MultiBodyTree::getBodyJacobianTrans - int getBodyJacobianTrans(const int body_index, mat3x* world_jac_trans) const; - /// \copydoc MultiBodyTree::getBodyJacobianRot - int getBodyJacobianRot(const int body_index, mat3x* world_jac_rot) const; - /// Add relative Jacobian component from motion relative to parent body - /// @param body the body to add the Jacobian component for - void addRelativeJacobianComponent(RigidBody& body); -#endif - /// generate additional index sets from the parent_index array - /// @return -1 on error, 0 on success - int generateIndexSets(); - /// set gravity acceleration in world frame - /// @param gravity gravity vector in the world frame - /// @return 0 on success, -1 on error - int setGravityInWorldFrame(const vec3& gravity); - /// pretty print tree - void printTree(); - /// print tree data - void printTreeData(); - /// initialize fixed data - void calculateStaticData(); - /// \copydoc MultiBodyTree::getBodyFrame - int getBodyFrame(const int index, vec3* world_origin, mat33* body_T_world) const; - /// \copydoc MultiBodyTree::getParentIndex - int getParentIndex(const int body_index, int* m_parent_index); - /// \copydoc MultiBodyTree::getJointType - int getJointType(const int body_index, JointType* joint_type) const; - /// \copydoc MultiBodyTree::getJointTypeStr - int getJointTypeStr(const int body_index, const char** joint_type) const; - /// \copydoc MultiBodyTree::getParentRParentBodyRef - int getParentRParentBodyRef(const int body_index, vec3* r) const; - /// \copydoc MultiBodyTree::getBodyTParentRef - int getBodyTParentRef(const int body_index, mat33* T) const; - /// \copydoc MultiBodyTree::getBodyAxisOfMotion - int getBodyAxisOfMotion(const int body_index, vec3* axis) const; - /// \copydoc MultiBodyTree:getDoFOffset - int getDoFOffset(const int body_index, int* q_index) const; - /// \copydoc MultiBodyTree::getBodyOrigin - int getBodyOrigin(const int body_index, vec3* world_origin) const; - /// \copydoc MultiBodyTree::getBodyCoM - int getBodyCoM(const int body_index, vec3* world_com) const; - /// \copydoc MultiBodyTree::getBodyTransform - int getBodyTransform(const int body_index, mat33* world_T_body) const; - /// \copydoc MultiBodyTree::getBodyAngularVelocity - int getBodyAngularVelocity(const int body_index, vec3* world_omega) const; - /// \copydoc MultiBodyTree::getBodyLinearVelocity - int getBodyLinearVelocity(const int body_index, vec3* world_velocity) const; - /// \copydoc MultiBodyTree::getBodyLinearVelocityCoM - int getBodyLinearVelocityCoM(const int body_index, vec3* world_velocity) const; - /// \copydoc MultiBodyTree::getBodyAngularAcceleration - int getBodyAngularAcceleration(const int body_index, vec3* world_dot_omega) const; - /// \copydoc MultiBodyTree::getBodyLinearAcceleration - int getBodyLinearAcceleration(const int body_index, vec3* world_acceleration) const; - /// \copydoc MultiBodyTree::getUserInt - int getUserInt(const int body_index, int* user_int) const; - /// \copydoc MultiBodyTree::getUserPtr - int getUserPtr(const int body_index, void** user_ptr) const; - /// \copydoc MultiBodyTree::setUserInt - int setUserInt(const int body_index, const int user_int); - /// \copydoc MultiBodyTree::setUserPtr - int setUserPtr(const int body_index, void* const user_ptr); - ///\copydoc MultiBodytTree::setBodyMass - int setBodyMass(const int body_index, const idScalar mass); - ///\copydoc MultiBodytTree::setBodyFirstMassMoment - int setBodyFirstMassMoment(const int body_index, const vec3& first_mass_moment); - ///\copydoc MultiBodytTree::setBodySecondMassMoment - int setBodySecondMassMoment(const int body_index, const mat33& second_mass_moment); - ///\copydoc MultiBodytTree::getBodyMass - int getBodyMass(const int body_index, idScalar* mass) const; - ///\copydoc MultiBodytTree::getBodyFirstMassMoment - int getBodyFirstMassMoment(const int body_index, vec3* first_mass_moment) const; - ///\copydoc MultiBodytTree::getBodySecondMassMoment - int getBodySecondMassMoment(const int body_index, mat33* second_mass_moment) const; - /// \copydoc MultiBodyTree::clearAllUserForcesAndMoments - void clearAllUserForcesAndMoments(); - /// \copydoc MultiBodyTree::addUserForce - int addUserForce(const int body_index, const vec3& body_force); - /// \copydoc MultiBodyTree::addUserMoment - int addUserMoment(const int body_index, const vec3& body_moment); - -private: - // debug function. print tree structure to stdout - void printTree(int index, int indentation); - // get string representation of JointType (for debugging) - const char* jointTypeToString(const JointType& type) const; - // get number of degrees of freedom from joint type - int bodyNumDoFs(const JointType& type) const; - // number of bodies in the system - int m_num_bodies; - // number of degrees of freedom - int m_num_dofs; - // Gravitational acceleration (in world frame) - vec3 m_world_gravity; - // vector of bodies in the system - // body 0 is used as an environment body and is allways fixed. - // The bodies are ordered such that a parent body always has an index - // smaller than its child. - idArray<RigidBody>::type m_body_list; - // Parent_index[i] is the index for i's parent body in body_list. - // This fully describes the tree. - idArray<int>::type m_parent_index; - // child_indices[i] contains a vector of indices of - // all children of the i-th body - idArray<idArray<int>::type>::type m_child_indices; - // Indices of rotary joints - idArray<int>::type m_body_revolute_list; - // Indices of prismatic joints - idArray<int>::type m_body_prismatic_list; - // Indices of floating joints - idArray<int>::type m_body_floating_list; - // Indices of spherical joints - idArray<int>::type m_body_spherical_list; - // a user-provided integer - idArray<int>::type m_user_int; - // a user-provided pointer - idArray<void*>::type m_user_ptr; -#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS) - mat3x m_m3x; -#endif -}; -} // namespace btInverseDynamics -#endif diff --git a/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeInitCache.cpp b/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeInitCache.cpp deleted file mode 100644 index a718db051e..0000000000 --- a/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeInitCache.cpp +++ /dev/null @@ -1,131 +0,0 @@ -#include "MultiBodyTreeInitCache.hpp" - -namespace btInverseDynamics -{ -MultiBodyTree::InitCache::InitCache() -{ - m_inertias.resize(0); - m_joints.resize(0); - m_num_dofs = 0; - m_root_index = -1; -} - -int MultiBodyTree::InitCache::addBody(const int body_index, const int parent_index, - const JointType joint_type, - const vec3& parent_r_parent_body_ref, - const mat33& body_T_parent_ref, - const vec3& body_axis_of_motion, const idScalar mass, - const vec3& body_r_body_com, const mat33& body_I_body, - const int user_int, void* user_ptr) -{ - switch (joint_type) - { - case REVOLUTE: - case PRISMATIC: - m_num_dofs += 1; - break; - case FIXED: - // does not add a degree of freedom - // m_num_dofs+=0; - break; - case SPHERICAL: - m_num_dofs += 3; - break; - case FLOATING: - m_num_dofs += 6; - break; - default: - bt_id_error_message("unknown joint type %d\n", joint_type); - return -1; - } - - if (-1 == parent_index) - { - if (m_root_index >= 0) - { - bt_id_error_message("trying to add body %d as root, but already added %d as root body\n", - body_index, m_root_index); - return -1; - } - m_root_index = body_index; - } - - JointData joint; - joint.m_child = body_index; - joint.m_parent = parent_index; - joint.m_type = joint_type; - joint.m_parent_pos_parent_child_ref = parent_r_parent_body_ref; - joint.m_child_T_parent_ref = body_T_parent_ref; - joint.m_child_axis_of_motion = body_axis_of_motion; - - InertiaData body; - body.m_mass = mass; - body.m_body_pos_body_com = body_r_body_com; - body.m_body_I_body = body_I_body; - - m_inertias.push_back(body); - m_joints.push_back(joint); - m_user_int.push_back(user_int); - m_user_ptr.push_back(user_ptr); - return 0; -} -int MultiBodyTree::InitCache::getInertiaData(const int index, InertiaData* inertia) const -{ - if (index < 0 || index > static_cast<int>(m_inertias.size())) - { - bt_id_error_message("index out of range\n"); - return -1; - } - - *inertia = m_inertias[index]; - return 0; -} - -int MultiBodyTree::InitCache::getUserInt(const int index, int* user_int) const -{ - if (index < 0 || index > static_cast<int>(m_user_int.size())) - { - bt_id_error_message("index out of range\n"); - return -1; - } - *user_int = m_user_int[index]; - return 0; -} - -int MultiBodyTree::InitCache::getUserPtr(const int index, void** user_ptr) const -{ - if (index < 0 || index > static_cast<int>(m_user_ptr.size())) - { - bt_id_error_message("index out of range\n"); - return -1; - } - *user_ptr = m_user_ptr[index]; - return 0; -} - -int MultiBodyTree::InitCache::getJointData(const int index, JointData* joint) const -{ - if (index < 0 || index > static_cast<int>(m_joints.size())) - { - bt_id_error_message("index out of range\n"); - return -1; - } - *joint = m_joints[index]; - return 0; -} - -int MultiBodyTree::InitCache::buildIndexSets() -{ - // NOTE: This function assumes that proper indices were provided - // User2InternalIndex from utils can be used to facilitate this. - - m_parent_index.resize(numBodies()); - for (idArrayIdx j = 0; j < m_joints.size(); j++) - { - const JointData& joint = m_joints[j]; - m_parent_index[joint.m_child] = joint.m_parent; - } - - return 0; -} -} // namespace btInverseDynamics diff --git a/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeInitCache.hpp b/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeInitCache.hpp deleted file mode 100644 index dbdb3ff604..0000000000 --- a/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeInitCache.hpp +++ /dev/null @@ -1,113 +0,0 @@ -#ifndef MULTIBODYTREEINITCACHE_HPP_ -#define MULTIBODYTREEINITCACHE_HPP_ - -#include "../IDConfig.hpp" -#include "../IDMath.hpp" -#include "../MultiBodyTree.hpp" - -namespace btInverseDynamics -{ -/// Mass properties of a rigid body -struct InertiaData -{ - ID_DECLARE_ALIGNED_ALLOCATOR(); - - /// mass - idScalar m_mass; - /// vector from body-fixed frame to center of mass, - /// in body-fixed frame, multiplied by the mass - vec3 m_body_pos_body_com; - /// moment of inertia w.r.t. the origin of the body-fixed - /// frame, represented in that frame - mat33 m_body_I_body; -}; - -/// Joint properties -struct JointData -{ - ID_DECLARE_ALIGNED_ALLOCATOR(); - - /// type of joint - JointType m_type; - /// index of parent body - int m_parent; - /// index of child body - int m_child; - /// vector from parent's body-fixed frame to child's body-fixed - /// frame for q=0, written in the parent's body fixed frame - vec3 m_parent_pos_parent_child_ref; - /// Transform matrix converting vectors written in the parent's frame - /// into vectors written in the child's frame for q=0 - /// ie, child_vector = child_T_parent_ref * parent_vector; - mat33 m_child_T_parent_ref; - /// Axis of motion for 1 degree-of-freedom joints, - /// written in the child's frame - /// For revolute joints, the q-value is positive for a positive - /// rotation about this axis. - /// For prismatic joints, the q-value is positive for a positive - /// translation is this direction. - vec3 m_child_axis_of_motion; -}; - -/// Data structure to store data passed by the user. -/// This is used in MultiBodyTree::finalize to build internal data structures. -class MultiBodyTree::InitCache -{ -public: - ID_DECLARE_ALIGNED_ALLOCATOR(); - /// constructor - InitCache(); - ///\copydoc MultiBodyTree::addBody - int addBody(const int body_index, const int parent_index, const JointType joint_type, - const vec3 &parent_r_parent_body_ref, const mat33 &body_T_parent_ref, - const vec3 &body_axis_of_motion, idScalar mass, const vec3 &body_r_body_com, - const mat33 &body_I_body, const int user_int, void *user_ptr); - /// build index arrays - /// @return 0 on success, -1 on failure - int buildIndexSets(); - /// @return number of degrees of freedom - int numDoFs() const { return m_num_dofs; } - /// @return number of bodies - int numBodies() const { return m_inertias.size(); } - /// get inertia data for index - /// @param index of the body - /// @param inertia pointer for return data - /// @return 0 on success, -1 on failure - int getInertiaData(const int index, InertiaData *inertia) const; - /// get joint data for index - /// @param index of the body - /// @param joint pointer for return data - /// @return 0 on success, -1 on failure - int getJointData(const int index, JointData *joint) const; - /// get parent index array (paren_index[i] is the index of the parent of i) - /// @param parent_index pointer for return data - void getParentIndexArray(idArray<int>::type *parent_index) { *parent_index = m_parent_index; } - /// get user integer - /// @param index body index - /// @param user_int user integer - /// @return 0 on success, -1 on failure - int getUserInt(const int index, int *user_int) const; - /// get user pointer - /// @param index body index - /// @param user_int user pointer - /// @return 0 on success, -1 on failure - int getUserPtr(const int index, void **user_ptr) const; - -private: - // vector of bodies - idArray<InertiaData>::type m_inertias; - // vector of joints - idArray<JointData>::type m_joints; - // number of mechanical degrees of freedom - int m_num_dofs; - // parent index array - idArray<int>::type m_parent_index; - // user integers - idArray<int>::type m_user_int; - // user pointers - idArray<void *>::type m_user_ptr; - // index of root body (or -1 if not set) - int m_root_index; -}; -} // namespace btInverseDynamics -#endif // MULTIBODYTREEINITCACHE_HPP_ |