ROS2 C++开发系列02-掌握机器人高频矩阵运算/坐标变换必备的Eigen库

2 阅读3分钟

📺 配套视频:ROS2 C++开发系列02-掌握机器人高频矩阵运算/坐标变换必备的Eigen库

ROS2 C++ 开发:使用 Eigen 库进行矩阵运算

在机器人开发中,线性代数运算是核心基础,涉及坐标变换、运动学解算等高频任务。手动实现这些算法既耗时又易错,因此引入成熟的外部库是最佳实践。Eigen 是一个高性能的 C++ 模板库,专为线性代数设计,广泛应用于 ROS 及机器人领域。它能显著减少重复代码编写,提升开发效率与程序稳定性。

安装 Eigen 库

在 Ubuntu 环境下,Eigen 可以通过系统包管理器直接安装。打开终端,执行以下命令即可获取开发所需的头文件和配置:

sudo apt install libeigen3-dev

该命令会安装 libeigen3-dev 包。由于 Eigen 是纯头文件库(Header-only),安装后无需链接额外的二进制库文件,只需在编译时指定头文件路径即可。若系统提示输入密码,请输入当前用户密码并等待安装完成。

编写示例代码

创建名为 simple_eigen_example.cpp 的新文件,并在 VS Code 中编辑。以下代码演示了如何定义三维向量并执行转置操作:

#include <iostream>   // 标准输入输出流
#include <Eigen/Dense> // 引入 Eigen 密集矩阵模块

int main() {
    // 定义一个三维双精度向量,初始化为 (1, 2, 3)
    Eigen::Vector3d v(1, 2, 3);

    // 打印向量及其转置结果
    // .transpose() 返回向量的转置形式
    std::cout << "Here is the vector v:\n" << v << std::endl;
    std::cout << "Here is v.transpose():\n" << v.transpose() << std::endl;

    return 0;
}

代码首先包含 <Eigen/Dense>,这是 Eigen 中最常用的模块,涵盖了向量、矩阵及基本运算。Eigen::Vector3d 是固定大小的 3x1 双精度向量类型。通过 .transpose() 方法,可以轻松获取行向量或列向量的转置,这在坐标系转换中极为常见。

小结:Eigen 采用模板元编程技术,编译期确定矩阵大小,因此运行效率极高。注意 Vector3d 中的 d 代表 double 类型,若需单精度可使用 Vector3f

编译与运行

由于 Eigen 不是标准库,编译时需显式指定头文件路径。使用 g++ 编译器时,通过 -I 参数指向 Eigen 的安装目录:

g++ -I /usr/include/eigen3 simple_eigen_example.cpp -o example
  • -I /usr/include/eigen3:告诉编译器在该目录下查找 #include 的头文件。
  • simple_eigen_example.cpp:源文件名。
  • -o example:指定生成的可执行文件名为 example

编译成功后,在终端运行可执行文件:

./example

终端将输出向量内容及其转置形式。若看到类似 1 2 3 的输出,说明环境配置正确,Eigen 库已正常工作。

速查表

  • 安装命令sudo apt install libeigen3-dev
  • 核心头文件#include <Eigen/Dense>
  • 常用类型Eigen::Vector3d(3维双精度向量)、Eigen::MatrixXd(动态大小矩阵)
  • 编译参数:必须添加 -I /usr/include/eigen3 以包含头文件
  • 关键操作.transpose() 用于矩阵或向量转置,.inverse() 用于求逆