Test conversion between ViSP and Eigen type.
#include <visp3/core/vpConfig.h>
#include <visp3/core/vpEigenConversion.h>
#if defined(VISP_HAVE_EIGEN3) && defined(VISP_HAVE_CATCH2)
#include <catch_amalgamated.hpp>
#ifdef ENABLE_VISP_NAMESPACE
#endif
namespace
{
template <typename Type> std::ostream &operator<<(std::ostream &os, const Eigen::Quaternion<Type> &q)
{
return os << "qw: " << q.w() << " ; qx: " << q.x() << " ; qy: " << q.y() << " ; qz: " << q.z();
}
template <typename Type> std::ostream &operator<<(std::ostream &os, const Eigen::AngleAxis<Type> &aa)
{
return os << "angle: " << aa.angle() << " ; axis: " << aa.axis()(0) << " ; " << aa.axis()(1) << " ; " << aa.axis()(2)
<< " ; thetau: " << aa.angle() * aa.axis()(0) << " ; " << aa.angle() * aa.axis()(1) << " ; "
<< aa.angle() * aa.axis()(2);
}
}
TEST_CASE("vpMatrix <--> Eigen::MatrixXd/Matrix3Xd conversion", "[eigen_conversion]")
{
for (unsigned int i = 0; i < visp_m.size(); i++) {
visp_m.data[i] = i;
}
{
Eigen::MatrixXd eigen_m;
std::cout << "Eigen MatrixXd:\n" << eigen_m << std::endl;
std::cout << "ViSP vpMatrix:\n" << visp_m2 << std::endl;
REQUIRE(visp_m == visp_m2);
std::cout << std::endl;
}
{
Eigen::Matrix3Xd eigen_m;
std::cout << "Eigen Matrix3Xd:\n" << eigen_m << std::endl;
std::cout << "ViSP vpMatrix:\n" << visp_m2 << std::endl;
REQUIRE(visp_m == visp_m2);
std::cout << std::endl;
}
}
TEST_CASE("Eigen::MatrixXd <--> vpMatrix conversion", "[eigen_conversion]")
{
Eigen::MatrixXd eigen_m(3, 5);
#if (VP_VERSION_INT(EIGEN_WORLD_VERSION, EIGEN_MAJOR_VERSION, EIGEN_MINOR_VERSION) < 0x030300)
for (Eigen::DenseIndex i = 0; i < eigen_m.rows(); i++) {
for (Eigen::DenseIndex j = 0; j < eigen_m.cols(); j++) {
#else
for (Eigen::Index i = 0; i < eigen_m.rows(); i++) {
for (Eigen::Index j = 0; j < eigen_m.cols(); j++) {
#endif
eigen_m(i, j) = static_cast<double>(i * eigen_m.cols() + j);
}
}
std::cout << "Eigen Matrix (row major: " << eigen_m.IsRowMajor << "):\n" << eigen_m << std::endl;
std::cout << "ViSP vpMatrix:\n" << visp_m << std::endl;
Eigen::MatrixXd eigen_m2;
std::cout << "Eigen MatrixXd (row major: " << eigen_m2.IsRowMajor << "):\n" << eigen_m2 << std::endl;
REQUIRE(visp_m == visp_m2);
std::cout << std::endl;
}
TEST_CASE("Eigen::MatrixX4d <--> vpMatrix conversion", "[eigen_conversion]")
{
Eigen::MatrixX4d eigen_m(2, 4);
#if (VP_VERSION_INT(EIGEN_WORLD_VERSION, EIGEN_MAJOR_VERSION, EIGEN_MINOR_VERSION) < 0x030300)
for (Eigen::DenseIndex i = 0; i < eigen_m.rows(); i++) {
for (Eigen::DenseIndex j = 0; j < eigen_m.cols(); j++) {
#else
for (Eigen::Index i = 0; i < eigen_m.rows(); i++) {
for (Eigen::Index j = 0; j < eigen_m.cols(); j++) {
#endif
eigen_m(i, j) = static_cast<double>(i * eigen_m.cols() + j);
}
}
std::cout << "Eigen MatrixX4d (row major: " << eigen_m.IsRowMajor << "):\n" << eigen_m << std::endl;
std::cout << "ViSP vpMatrix:\n" << visp_m << std::endl;
Eigen::MatrixX4d eigen_m2;
std::cout << "Eigen MatrixX4d (row major: " << eigen_m2.IsRowMajor << "):\n" << eigen_m2 << std::endl;
REQUIRE(visp_m == visp_m2);
std::cout << std::endl;
}
TEST_CASE("Eigen::Matrix<double, Dynamic, Dynamic, RowMajor> <--> vpMatrix conversion", "[eigen_conversion]")
{
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> eigen_m(3, 5);
#if (VP_VERSION_INT(EIGEN_WORLD_VERSION, EIGEN_MAJOR_VERSION, EIGEN_MINOR_VERSION) < 0x030300)
for (Eigen::DenseIndex i = 0; i < eigen_m.rows(); i++) {
for (Eigen::DenseIndex j = 0; j < eigen_m.cols(); j++) {
#else
for (Eigen::Index i = 0; i < eigen_m.rows(); i++) {
for (Eigen::Index j = 0; j < eigen_m.cols(); j++) {
#endif
eigen_m(i, j) = static_cast<double>(i * eigen_m.cols() + j);
}
}
std::cout << "Eigen Matrix (RowMajor):\n" << eigen_m << std::endl;
std::cout << "ViSP vpMatrix:\n" << visp_m << std::endl;
Eigen::MatrixXd eigen_m2;
std::cout << "Eigen MatrixXd (row major: " << eigen_m2.IsRowMajor << "):\n" << eigen_m2 << std::endl;
REQUIRE(visp_m == visp_m2);
std::cout << std::endl;
}
TEST_CASE("Eigen::Matrix<double, Dynamic, Dynamic, ColMajor> <--> vpMatrix conversion", "[eigen_conversion]")
{
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor> eigen_m(3, 5);
#if (VP_VERSION_INT(EIGEN_WORLD_VERSION, EIGEN_MAJOR_VERSION, EIGEN_MINOR_VERSION) < 0x030300)
for (Eigen::DenseIndex i = 0; i < eigen_m.rows(); i++) {
for (Eigen::DenseIndex j = 0; j < eigen_m.cols(); j++) {
#else
for (Eigen::Index i = 0; i < eigen_m.rows(); i++) {
for (Eigen::Index j = 0; j < eigen_m.cols(); j++) {
#endif
eigen_m(i, j) = static_cast<double>(i * eigen_m.cols() + j);
}
}
std::cout << "Eigen Matrix (ColMajor):\n" << eigen_m << std::endl;
std::cout << "ViSP vpMatrix:\n" << visp_m << std::endl;
Eigen::MatrixXd eigen_m2;
std::cout << "Eigen MatrixXd (row major: " << eigen_m2.IsRowMajor << "):\n" << eigen_m2 << std::endl;
REQUIRE(visp_m == visp_m2);
std::cout << std::endl;
}
TEST_CASE("vpHomogeneousMatrix <--> Eigen::Matrix4d conversion", "[eigen_conversion]")
{
Eigen::Matrix4d eigen_cMo;
std::cout << "Eigen Matrix4d cMo:\n" << eigen_cMo << std::endl;
std::cout << "ViSP vpHomogeneousMatrix cMo:\n" << visp_cMo2 << std::endl;
REQUIRE(visp_cMo == visp_cMo2);
std::cout << std::endl;
}
TEST_CASE("vpHomogeneousMatrix <--> Eigen::Matrix4f + double casting conversion", "[eigen_conversion]")
{
Eigen::Matrix4d eigen_cMo_tmp;
Eigen::Matrix4f eigen_cMo = eigen_cMo_tmp.cast<float>();
std::cout << "Eigen Matrix4f cMo:\n" << eigen_cMo << std::endl;
std::cout << "ViSP vpHomogeneousMatrix cMo:\n" << visp_cMo2 << std::endl;
REQUIRE(visp_cMo == visp_cMo2);
std::cout << std::endl;
}
TEST_CASE("vpQuaternionVector <--> Eigen::Quaternionf conversion", "[eigen_conversion]")
{
Eigen::Quaternionf eigen_quaternion;
std::cout << "Eigen quaternion: " << eigen_quaternion << std::endl;
std::cout <<
"ViSP quaternion: " << visp_quaternion2.
t() << std::endl;
REQUIRE(visp_quaternion == visp_quaternion2);
std::cout << std::endl;
}
TEST_CASE("vpThetaUVector <--> Eigen::AngleAxisf conversion", "[eigen_conversion]")
{
Eigen::AngleAxisf eigen_angle_axis;
std::cout << "Eigen AngleAxis: " << eigen_angle_axis << std::endl;
std::cout <<
"ViSP AngleAxis: " << visp_thetau2.
t() << std::endl;
REQUIRE(visp_thetau == visp_thetau2);
std::cout << std::endl;
}
TEST_CASE("vpColVector <--> Eigen::VectorXd conversion", "[eigen_conversion]")
{
visp_col = 10;
Eigen::VectorXd eigen_col;
std::cout << "Eigen VectorXd: " << eigen_col.transpose() << std::endl;
std::cout <<
"ViSP vpColVector: " << visp_col2.
t() << std::endl;
REQUIRE(visp_col == visp_col2);
std::cout << std::endl;
}
TEST_CASE("vpRowVector <--> Eigen::RowVectorXd conversion", "[eigen_conversion]")
{
visp_row = 10;
Eigen::RowVectorXd eigen_row;
std::cout << "Eigen RowVectorXd: " << eigen_row << std::endl;
std::cout << "ViSP vpRowVector: " << visp_row2 << std::endl;
REQUIRE(visp_row == visp_row2);
std::cout << std::endl;
}
TEST_CASE("Eigen::RowVector4d <--> vpRowVector conversion", "[eigen_conversion]")
{
Eigen::RowVector4d eigen_row;
eigen_row << 9, 8, 7, 6;
std::cout << "ViSP vpRowVector: " << visp_row << std::endl;
Eigen::RowVector4d eigen_row2;
std::cout << "Eigen RowVector4d: " << eigen_row2 << std::endl;
REQUIRE(visp_row == visp_row2);
std::cout << std::endl;
}
TEST_CASE("vpRowVector <--> Eigen::RowVector4d conversion", "[eigen_conversion]")
{
visp_row = 10;
Eigen::RowVector4d eigen_row;
std::cout << "Eigen RowVector4d: " << eigen_row << std::endl;
std::cout << "ViSP vpRowVector: " << visp_row2 << std::endl;
REQUIRE(visp_row == visp_row2);
std::cout << std::endl;
}
int main(int argc, char *argv[])
{
Catch::Session session;
session.applyCommandLine(argc, argv);
int numFailed = session.run();
return numFailed;
}
#else
int main() { return EXIT_SUCCESS; }
#endif
Implementation of column vector and the associated operations.
Implementation of an homogeneous matrix and operations on such kind of matrices.
Implementation of a matrix and operations on matrices.
Implementation of a rotation vector as quaternion angle minimal representation.
Implementation of row vector and the associated operations.
Implementation of a rotation vector as axis-angle minimal representation.
VISP_EXPORT void eigen2visp(const Eigen::MatrixXd &src, vpMatrix &dst)
void visp2eigen(const vpMatrix &src, Eigen::MatrixBase< Derived > &dst)