IAP GITLAB

Skip to content
Snippets Groups Projects
CoordinateSystem.cc 1.07 KiB
Newer Older
ralfulrich's avatar
ralfulrich committed
#include <Geometry/CoordinateSystem.h>
ralfulrich's avatar
ralfulrich committed
EigenTransform CoordinateSystem::GetTransformation(CoordinateSystem const& c1, CoordinateSystem const& c2)
{
    CoordinateSystem const* a{&c1};
    CoordinateSystem const* b{&c2};
    CoordinateSystem const* commonBase{nullptr};
    
    while (a != b && b != nullptr)
    {
        a = &c1;
        
        while (a != b && a != nullptr)
        {
ralfulrich's avatar
ralfulrich committed
            a = a->GetReference();
ralfulrich's avatar
ralfulrich committed
        b = b->GetReference();
    }
    
    if (a == b && a != nullptr)
    {
        commonBase = a;
        
    }
    else
    {
        throw std::string("no connection between coordinate systems found!");
    }
    
    
    EigenTransform t = EigenTransform::Identity();
    
    auto* p = &c1;
    
    while (p != commonBase)
    {
ralfulrich's avatar
ralfulrich committed
        t = p->GetTransform() * t;
        p = p->GetReference();
    }
    
    p = &c2;
    
    while (p != commonBase)
    {
ralfulrich's avatar
ralfulrich committed
        t = p->GetTransform().inverse(Eigen::TransformTraits::Isometry) * t;
        p = p->GetReference();