Отображение аффинного преобразования в Eigen - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь сделать что-то простое, как:

std::cout << e << std::endl;  

, где e имеет тип Eigen::Affine3d. Однако я получаю бесполезные сообщения об ошибках, такие как:

cannot bind 'std::ostream {aka std::basic_ostream<char>}'   
lvalue to 'std::basic_ostream<char>&&'

Причина, по которой полезно объяснить здесь , но там, где ответ не применим.

Официальная документация краткая, подразумевая только, что объекты Affine3d и Affine3f являются матрицами. Собственные матрицы и векторы могут быть напечатаны std::cout без проблем. Так в чем же проблема?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Если честно, я бы предпочел перегрузить оператор потока. Это делает повторное использование более удобным. Это вы можете сделать, как это

std::ostream& operator<<(std::ostream& stream, const Eigen::Affine3d& affine)
{
    stream << "Rotation: " << std::endl << affine.rotation() << std::endl;
    stream << "Translation: " << std::endl <<  affine.translation() << std::endl;

    return stream;
}

int main()
{

    Eigen::Affine3d l;

    std::cout << l << std::endl;

    return 0;
}

Помните, что l не инициализирован

0 голосов
/ 10 сентября 2018

Досадно, что оператор << не определен для Affine объектов. Вы должны вызвать функцию matrix(), чтобы получить печатное представление:

std::cout << e.matrix() << std::endl;

Если вы не являетесь поклонником однородных матриц:

Eigen::Matrix3d m = e.rotation();
Eigen::Vector3d v = e.translation();
std::cout << "Rotation: " << std::endl << m << std::endl;
std::cout << "Translation: " << std::endl << v << std::endl;

Надеюсь, кто-то может сэкономить несколько минут раздражения.

PS: Другой одинокий вопрос SO мимоходом упомянул это решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...