本文面向刚进入机器人、SLAM、自动驾驶、无人机、移动机器人方向的新人,介绍 PCL、Eigen、OpenCV、ROS/ROS2、Ceres、g2o、Sophus 等常见开源库的作用、学习重点和练习路线。目标不是背 API,而是建立“这些库为什么重要、在系统里怎么配合”的整体认知。


一、为什么机器人开发离不开开源库?

机器人软件不是单一算法,而是一个由传感器、数学计算、感知、定位、建图、规划、控制和可视化组成的复杂系统。

一个典型机器人系统可能同时处理:

  • 相机图像
  • 激光雷达点云
  • IMU 加速度和角速度
  • 轮速计数据
  • GPS/RTK 数据
  • 地图数据
  • 位姿和轨迹
  • 控制指令

如果所有底层能力都从零写,成本非常高,也很容易出错。因此机器人开发大量依赖成熟开源库。

常见库可以粗略分成几类:

类别 常用库 主要作用
数学计算 Eigen 矩阵、向量、坐标变换、线性代数
图像处理 OpenCV 相机图像处理、视觉算法、标定
点云处理 PCL 激光雷达/RGB-D 点云滤波、分割、配准
机器人框架 ROS/ROS2 节点通信、消息管理、系统集成
非线性优化 Ceres、g2o SLAM 后端、标定、位姿图优化
位姿表示 Sophus SO(3)、SE(3)、李群李代数
空间搜索 nanoflann、ikd-Tree 最近邻搜索、点云地图索引
地图表达 OctoMap、grid_map 栅格地图、三维占据地图

新人学习这些库时,不建议一开始就“库大全式”学习,而应该围绕机器人数据流理解它们之间的关系。

机器人系统中的典型数据流:

传感器数据
   ↓
ROS/ROS2 消息
   ↓
OpenCV / PCL / Eigen 数据结构
   ↓
算法处理
   ↓
位姿、地图、检测结果
   ↓
rviz 可视化 / 控制模块 / 规划模块

二、Eigen:机器人算法的数学地基

2.1 Eigen 是什么?

Eigen 是 C++ 中非常常用的线性代数库。机器人代码里只要出现矩阵、向量、旋转、位姿、雅可比,大概率都能看到 Eigen。

它常用于:

  • 三维点和向量表示
  • 矩阵运算
  • 坐标系变换
  • 旋转矩阵、四元数、欧拉角
  • 线性方程求解
  • 最小二乘和优化问题中的雅可比计算
  • EKF、ESKF、SLAM、VIO、LIO 中的状态表达

2.2 机器人里常见的 Eigen 类型

类型 含义 常见用途
Eigen::Vector3d 三维向量 点、速度、加速度、平移
Eigen::Matrix3d 3×3 矩阵 旋转矩阵、协方差
Eigen::Matrix4d 4×4 矩阵 齐次变换矩阵
Eigen::Quaterniond 四元数 三维旋转
Eigen::Isometry3d 刚体变换 位姿变换
Eigen::AngleAxisd 轴角 旋转构造与转换

示例:定义一个三维点。

Eigen::Vector3d point(1.0, 2.0, 3.0);

示例:定义一个单位旋转矩阵。

Eigen::Matrix3d R = Eigen::Matrix3d::Identity();

示例:定义一个位姿变换。

Eigen::Isometry3d T = Eigen::Isometry3d::Identity();
T.rotate(R);
T.pretranslate(Eigen::Vector3d(1.0, 0.0, 0.0));

2.3 新人重点不是背 API,而是理解坐标变换

机器人里最容易让新人迷糊的是坐标系。

常见坐标系包括:

  • map:地图坐标系
  • odom:里程计坐标系
  • base_link:机器人本体坐标系
  • imu_link:IMU 坐标系
  • camera_link:相机坐标系
  • lidar_link:激光雷达坐标系

一个点从激光雷达坐标系变换到地图坐标系,本质就是:

p_map = T_map_lidar * p_lidar

这里的 T_map_lidar 就可以用 Eigen 的矩阵、四元数或 Isometry3d 表示。

如果你以后看 FAST-LIO、LIO-SAM、VINS-Fusion、ORB-SLAM,会反复看到类似的位姿变换。

2.4 Eigen 建议学习顺序

建议按下面顺序学:

  1. 向量:Vector2dVector3dVectorXd
  2. 矩阵:Matrix3dMatrix4d、动态矩阵
  3. 基础运算:加减乘、转置、逆、行列式
  4. 旋转表达:旋转矩阵、欧拉角、轴角、四元数
  5. 刚体变换:Isometry3dAffine3d
  6. 坐标变换链:T_world_body * T_body_sensor
  7. 与 ROS 消息互转:geometry_msgstf2

一句话总结:Eigen 是机器人算法的数学地基,越早熟悉越好。


三、OpenCV:机器人视觉入门首选

3.1 OpenCV 是什么?

OpenCV 是计算机视觉领域最常见的开源库。只要机器人上有相机,基本就会用到 OpenCV。

它可以处理:

  • 图像读取、保存、显示
  • 图像滤波、增强、二值化
  • 边缘检测、轮廓提取
  • 特征点检测和匹配
  • 光流跟踪
  • 相机标定
  • 双目视觉
  • ArUco / AprilTag 识别
  • 深度学习模型前后处理

最基础的图像读取:

cv::Mat img = cv::imread("image.png");
cv::imshow("image", img);
cv::waitKey(0);

图像灰度化和边缘检测:

cv::Mat gray, edges;
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
cv::Canny(gray, edges, 50, 150);

3.2 OpenCV 在机器人中的典型用途

场景 OpenCV 作用
相机驱动调试 显示图像、检查曝光、检查畸变
相机标定 求内参、畸变参数、重投影误差
视觉里程计 特征点提取、匹配、光流跟踪
目标识别 图像预处理、结果可视化
双目视觉 立体匹配、视差图、深度估计
标志物定位 ArUco、AprilTag 检测
视觉 SLAM 图像金字塔、特征、PnP、RANSAC

3.3 新人一定要理解 cv::Mat

cv::Mat 是 OpenCV 最核心的数据结构,可以理解成一张图像或一个矩阵。

一张 RGB 图像通常是:

高度 × 宽度 × 通道数

例如 640×480 的彩色图像:

480 行,640 列,3 通道

新人容易踩坑的地方:

  • OpenCV 默认颜色顺序是 BGR,不是 RGB
  • 图像坐标原点在左上角
  • 像素坐标通常是 (u, v),不是三维坐标 (x, y, z)
  • cv::Mat 赋值默认可能共享数据,需要注意深拷贝 clone()
  • ROS 图像消息和 cv::Mat 之间通常需要 cv_bridge

3.4 OpenCV 建议学习顺序

推荐路线:

  1. cv::Mat 数据结构
  2. 图像读取、保存、显示
  3. 颜色空间转换:BGR、RGB、GRAY、HSV
  4. 滤波:均值、高斯、中值
  5. 二值化、形态学操作
  6. 边缘检测和轮廓提取
  7. 相机模型和相机标定
  8. 特征点:ORB、SIFT、FAST
  9. 特征匹配、RANSAC、PnP
  10. ROS 中使用 cv_bridge

一句话总结:OpenCV 是机器人视觉感知的基础工具,先学图像数据结构,再学视觉算法。


四、PCL:点云处理核心库

4.1 PCL 是什么?

PCL,全称 Point Cloud Library,是点云处理领域最常用的 C++ 开源库之一。

如果机器人使用:

  • 机械式激光雷达
  • 固态激光雷达
  • RGB-D 相机
  • 双目深度点云
  • 三维重建地图

那么大概率会用到 PCL。

PCL 能做:

  • 点云读写
  • 点云滤波
  • 点云下采样
  • 法向量估计
  • KD-Tree 搜索
  • 平面/圆柱/模型分割
  • 欧式聚类
  • ICP / NDT 点云配准
  • 点云特征提取
  • 点云可视化

4.2 常见点云类型

类型 含义 常见场景
pcl::PointXYZ 只有 xyz 坐标 普通三维点云
pcl::PointXYZI xyz + intensity 激光雷达点云
pcl::PointXYZRGB xyz + rgb RGB-D 彩色点云
pcl::PointNormal xyz + normal 法向量估计
pcl::PointCloud<T> 点云容器 存储一帧点云

定义一帧点云:

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(
    new pcl::PointCloud<pcl::PointXYZ>
);

体素滤波示例:

pcl::VoxelGrid<pcl::PointXYZ> voxel;
voxel.setInputCloud(cloud);
voxel.setLeafSize(0.1f, 0.1f, 0.1f);
voxel.filter(*filtered_cloud);

4.3 PCL 在机器人中的典型用途

场景 PCL 作用
激光雷达预处理 去除无效点、裁剪范围、降采样
地面分割 RANSAC 平面拟合、区域分割
障碍物检测 欧式聚类、包围框估计
点云地图 拼接多帧点云、保存 PCD
激光 SLAM 特征提取、最近邻搜索、点面残差
点云配准 ICP、GICP、NDT
可视化调试 PCL Viewer、rviz 显示

4.4 PCL 学习难点

PCL 比 OpenCV 更难一些,原因有三个:

  • 点云是三维数据,空间几何理解更难
  • 点云规模大,一帧可能几万到几十万个点
  • 算法经常依赖最近邻搜索、法向量、局部几何特征

新人常见困惑:

  • PointCloud2pcl::PointCloud 有什么区别?
  • 为什么点云要下采样?
  • ICP 为什么需要初值?
  • NDT 和 ICP 有什么区别?
  • 为什么激光 SLAM 里要找边缘点和平面点?
  • KD-Tree 是干什么的?

4.5 PCL 建议学习顺序

推荐路线:

  1. PCD 文件读取和保存
  2. PointXYZPointXYZIPointXYZRGB
  3. 直通滤波、体素滤波、统计滤波
  4. 点云坐标变换
  5. KD-Tree 最近邻搜索
  6. RANSAC 平面分割
  7. 欧式聚类
  8. ICP 点云配准
  9. NDT 点云配准
  10. ROS 中 sensor_msgs/PointCloud2 和 PCL 互转

一句话总结:PCL 是激光雷达和三维感知的基础工具,重点掌握滤波、分割、搜索、配准。


五、ROS/ROS2:把各种库连接成机器人系统

5.1 ROS 不是算法库,而是机器人中间件

ROS/ROS2 的作用不是替代 OpenCV、PCL、Eigen,而是把它们组织进一个完整系统。

一个机器人系统通常有多个节点:

相机驱动节点
激光雷达驱动节点
IMU 驱动节点
定位节点
建图节点
路径规划节点
控制节点
可视化节点

ROS/ROS2 提供:

  • Topic 发布订阅
  • Service 请求响应
  • Action 长任务通信
  • 参数服务器/参数系统
  • launch 启动管理
  • rosbag 数据录制和回放
  • tf/tf2 坐标变换
  • rviz 可视化

5.2 ROS 和其他库如何配合?

以相机节点为例:

ROS Image 消息
   ↓ cv_bridge
cv::Mat
   ↓ OpenCV 处理
检测结果 / 图像结果
   ↓
ROS Topic 发布

以激光雷达节点为例:

ROS PointCloud2 消息
   ↓ pcl_conversions
pcl::PointCloud<PointXYZI>
   ↓ PCL 滤波/分割/配准
处理后的点云 / 位姿
   ↓
ROS Topic 发布

以定位算法为例:

IMU + LiDAR + Odom
   ↓
Eigen 表示状态和位姿
   ↓
PCL 处理点云
   ↓
Ceres/g2o/EKF 做估计
   ↓
发布 odometry 和 tf

5.3 新人学习 ROS 的重点

不要一开始就纠结“ROS1 还是 ROS2”,先理解机器人系统的基本通信思想。

建议学习顺序:

  1. 工作空间和功能包结构
  2. Topic 发布和订阅
  3. Service 和 Action
  4. 常见消息类型:ImagePointCloud2ImuOdometry
  5. launch 文件
  6. rviz 可视化
  7. rosbag 录制和回放
  8. tf/tf2 坐标变换
  9. OpenCV 与 ROS 集成
  10. PCL 与 ROS 集成

一句话总结:ROS/ROS2 是机器人系统的胶水,负责把传感器、算法和执行模块连接起来。


六、Ceres 和 g2o:SLAM 里的优化工具

6.1 为什么机器人需要优化?

机器人中的很多问题本质上是优化问题。

例如:

  • 相机标定:找到最合适的内参和畸变参数
  • 位姿估计:找到最符合观测的机器人位姿
  • 视觉 SLAM:最小化重投影误差
  • 激光 SLAM:最小化点到线、点到面的残差
  • 后端优化:让整条轨迹和地图整体一致
  • 外参标定:估计相机、雷达、IMU 之间的相对位姿

典型形式:

找到一组状态 x,使残差 r(x) 尽可能小

也就是:

minimize Σ ||r_i(x)||²

6.2 Ceres Solver

Ceres 是 Google 开源的非线性优化库,特点是接口友好,自动求导方便。

常见用途:

  • Bundle Adjustment
  • 相机标定
  • 曲线拟合
  • 位姿优化
  • 传感器外参标定

Ceres 比较适合新人入门非线性优化,因为它的例子较多,文档相对清晰。

6.3 g2o

g2o 是图优化库,在经典 SLAM 项目中非常常见。

它适合表达:

  • 顶点:待优化变量,例如位姿、地图点
  • 边:约束,例如里程计约束、观测约束、回环约束

典型应用:

  • 位姿图优化
  • SLAM 后端
  • ORB-SLAM 等项目中的优化模块

6.4 新人什么时候学优化库?

不建议刚入门就深挖 Ceres/g2o。更合理的顺序是:

  1. 先掌握 Eigen 和坐标变换
  2. 理解最小二乘问题
  3. 理解残差、雅可比、鲁棒核
  4. 看懂简单曲线拟合例子
  5. 再看 SLAM 中的位姿优化和图优化

一句话总结:Ceres 和 g2o 是 SLAM、标定、状态估计中的优化工具,建议有数学和位姿基础后再深入。


七、Sophus:更专业的三维位姿表达

7.1 Sophus 解决什么问题?

机器人中经常需要表示三维位姿,也就是旋转和平移。

常见表达方式包括:

  • 欧拉角
  • 旋转矩阵
  • 四元数
  • 齐次变换矩阵
  • SO(3)
  • SE(3)

Sophus 是一个用于李群李代数计算的 C++ 库,常用于 SLAM、VIO、LIO 和非线性优化。

你可能会在代码里看到:

Sophus::SO3d R;
Sophus::SE3d T;

其中:

  • SO3 表示三维旋转
  • SE3 表示三维刚体变换,也就是旋转 + 平移

7.2 为什么不用普通欧拉角?

欧拉角直观,但在优化和连续更新中有问题:

  • 存在万向节锁
  • 插值不自然
  • 旋转更新不适合直接加减
  • 在优化中不如李代数扰动方便

SLAM 中常见的位姿更新形式是:

T_new = exp(δξ) * T_old

这里的 δξ 是李代数扰动,Sophus 就是处理这类问题的工具。

7.3 Sophus 建议学习顺序

推荐路线:

  1. 先理解旋转矩阵和四元数
  2. 理解 SO(3)、SE(3) 是什么
  3. 理解指数映射和对数映射
  4. 理解李代数扰动更新
  5. 结合 Ceres/g2o 看位姿优化
  6. 再看 VIO/LIO 项目中的 Sophus 使用

一句话总结:Sophus 不是新人第一天必须掌握的库,但想深入 SLAM,一定绕不开它。


八、其他常见机器人开源库

8.1 OctoMap

OctoMap 用于构建三维占据地图。

它把空间划分成八叉树结构,用概率表示某个空间是否被占据。

常见用途:

  • 三维避障
  • 无人机建图
  • 移动机器人导航
  • 环境占据建模

8.2 grid_map

grid_map 常用于二维或 2.5D 栅格地图表达。

适合表示:

  • 高程地图
  • 代价地图
  • 地形可通行性
  • 局部规划地图

8.3 nanoflann

nanoflann 是轻量级 KD-Tree 库,常用于最近邻搜索。

在 SLAM 和点云配准中,经常需要快速找到某个点附近的点:

给定当前点 p,在地图中找最近的 5 个点

这类操作如果暴力遍历会非常慢,需要 KD-Tree 加速。

8.4 ikd-Tree

ikd-Tree 是增量式 KD-Tree,在 FAST-LIO2 中非常关键。

传统 KD-Tree 适合静态数据,但 SLAM 地图会不断插入和删除点。ikd-Tree 支持增量更新,更适合实时激光 SLAM。

8.5 GTSAM

GTSAM 是因子图优化库,常用于多传感器融合和 SLAM 后端。

典型项目:

  • LIO-SAM
  • GPS/IMU/LiDAR 融合
  • 因子图 SLAM

它的思想是把传感器约束建模成因子,再统一优化状态变量。


九、新人应该按什么顺序学?

9.1 第一阶段:C++、Linux、CMake、Eigen

先打基础:

  • C++ 基础语法
  • 指针、引用、类、模板
  • Linux 命令行
  • CMake 编译
  • Git 基础
  • 线性代数
  • Eigen 矩阵和坐标变换

这一阶段的目标:

能看懂机器人 C++ 项目,能编译,能理解矩阵和位姿变换。

9.2 第二阶段:ROS/ROS2 基础

重点掌握:

  • 工作空间
  • package
  • node
  • topic
  • service
  • launch
  • rviz
  • rosbag
  • tf/tf2

这一阶段的目标:

能写一个节点,订阅传感器数据,处理后再发布出去。

9.3 第三阶段:OpenCV 或 PCL 二选一深入

如果你偏视觉方向,优先学:

  • OpenCV
  • 相机模型
  • 相机标定
  • 特征点
  • PnP
  • 视觉里程计

如果你偏激光雷达方向,优先学:

  • PCL
  • 点云滤波
  • 点云分割
  • KD-Tree
  • ICP/NDT
  • 激光里程计

这一阶段的目标:

能独立处理一种主传感器数据:图像或点云。

9.4 第四阶段:SLAM 和优化

再往后学习:

  • Ceres
  • g2o
  • Sophus
  • GTSAM
  • EKF/ESKF
  • 因子图
  • 视觉 SLAM
  • 激光 SLAM
  • LiDAR-IMU 融合

这一阶段的目标:

能看懂主流 SLAM 项目的整体框架和核心模块。

十、推荐练手项目

10.1 Eigen 坐标变换练习

任务:

  • 定义几个三维点
  • 定义一个旋转和平移
  • 把点从雷达坐标系变换到机器人坐标系
  • 再从机器人坐标系变换到世界坐标系
  • 分别用矩阵和四元数实现

能学到:

  • 坐标系变换
  • 旋转矩阵
  • 四元数
  • 齐次变换

10.2 OpenCV 相机标定

任务:

  • 采集棋盘格图片
  • 检测角点
  • 标定相机内参
  • 计算重投影误差
  • 保存标定参数

能学到:

  • 相机模型
  • 畸变参数
  • 内参矩阵
  • 标定流程

10.3 ROS 图像处理节点

任务:

  • 订阅相机图像
  • 使用 cv_bridge 转成 cv::Mat
  • 做灰度化和边缘检测
  • 发布处理后的图像
  • 在 rviz 或 rqt_image_view 中查看

能学到:

  • ROS 图像消息
  • OpenCV 和 ROS 集成
  • 图像处理节点结构

10.4 PCL 点云滤波与分割

任务:

  • 读取一帧 .pcd 点云
  • 使用体素滤波降采样
  • 使用直通滤波裁剪范围
  • 使用 RANSAC 分割地面
  • 保存处理后的点云

能学到:

  • 点云数据结构
  • 点云滤波
  • 平面分割
  • PCD 文件读写

10.5 ROS 点云处理节点

任务:

  • 订阅 sensor_msgs/PointCloud2
  • 转成 pcl::PointCloud<pcl::PointXYZI>
  • 做滤波处理
  • 再转回 PointCloud2
  • 发布到新话题
  • 在 rviz 中显示

能学到:

  • ROS 点云消息
  • PCL 和 ROS 集成
  • 激光雷达预处理流程

10.6 简单 ICP 配准实验

任务:

  • 读取两帧点云
  • 给第二帧点云一个初始位姿
  • 使用 ICP 配准
  • 输出变换矩阵
  • 可视化配准前后效果

能学到:

  • 点云配准思想
  • 初值的重要性
  • ICP 的收敛特点
  • 点云地图拼接基础

十一、学习这些库时最容易踩的坑

11.1 只背 API,不理解数据结构

新人最常见的问题是会调用函数,但不知道数据是什么。

例如:

  • cv::Mat 的通道顺序是什么?
  • PointCloud2 的字段里有什么?
  • Eigen::Quaterniond 的系数顺序是什么?
  • 点云坐标是在雷达坐标系还是世界坐标系?

机器人开发里,数据结构比函数名更重要。

11.2 不重视坐标系

很多 bug 不是算法错,而是坐标系错。

常见问题:

  • 左乘右乘搞反
  • 外参方向写反
  • T_body_lidarT_lidar_body 混淆
  • 世界坐标系和机体系混用
  • 相机坐标系和图像坐标系混用

建议养成习惯:变量名写清楚坐标系。

例如:

p_lidar
p_body
p_world
T_world_body
T_body_lidar

不要只写:

p
T
R

11.3 不会用可视化工具调试

机器人开发一定要会可视化。

常用工具:

  • rviz:看点云、轨迹、地图、tf
  • rqt_graph:看节点和 topic 关系
  • rqt_image_view:看图像话题
  • pcl_viewer:看 PCD 点云
  • OpenCV imshow:快速看图像处理结果

很多问题用肉眼一看就知道:

  • 点云方向不对
  • 坐标系飞了
  • 图像畸变没去掉
  • 地图重影
  • 轨迹跳变

11.4 一开始就啃大型项目源码

新人很容易直接冲 ORB-SLAM、FAST-LIO、LIO-SAM,然后被复杂工程劝退。

更好的方式是:

先学小库 → 做小实验 → 理解数据流 → 再看大项目

例如看 FAST-LIO2 前,至少应该了解:

  • PCL 点云数据结构
  • Eigen 位姿变换
  • IMU 基本模型
  • KD-Tree 最近邻搜索
  • ESKF 基本思想
  • ROS topic 和 tf

这样看源码会轻松很多。


十二、面向 SLAM 方向的重点库组合

12.1 视觉 SLAM 常见组合

OpenCV + Eigen + Sophus + Ceres/g2o + ROS

重点能力:

  • 图像特征提取
  • 特征匹配
  • PnP
  • 三角化
  • 重投影误差
  • Bundle Adjustment
  • 位姿图优化

典型项目:

  • ORB-SLAM
  • VINS-Mono
  • VINS-Fusion

12.2 激光 SLAM 常见组合

PCL + Eigen + ROS + KD-Tree + Ceres/g2o/GTSAM

重点能力:

  • 点云滤波
  • 特征提取
  • 最近邻搜索
  • ICP/NDT
  • 点线/点面残差
  • 位姿估计
  • 地图维护

典型项目:

  • LOAM
  • LeGO-LOAM
  • LIO-SAM
  • FAST-LIO
  • FAST-LIO2

12.3 多传感器融合常见组合

Eigen + Sophus + Ceres/GTSAM + ROS + OpenCV/PCL

重点能力:

  • 时间同步
  • 外参标定
  • IMU 预积分
  • EKF/ESKF
  • 因子图优化
  • 多传感器残差建模

典型任务:

  • LiDAR-IMU 融合
  • Camera-IMU 融合
  • LiDAR-Camera 融合
  • GPS-IMU-LiDAR 融合

十三、推荐学习路线总结

如果你是机器人方向新人,可以按这个路线走:

C++ / Linux / CMake / Git
        ↓
Eigen:矩阵、向量、坐标变换
        ↓
ROS/ROS2:节点、话题、tf、rviz
        ↓
OpenCV 或 PCL:图像或点云处理
        ↓
小项目:图像节点 / 点云节点 / 标定 / 配准
        ↓
SLAM 基础:里程计、地图、状态估计
        ↓
Sophus / Ceres / g2o / GTSAM
        ↓
阅读 ORB-SLAM、VINS、LIO-SAM、FAST-LIO 等项目

按照方向也可以这样选:

方向 优先学习
视觉 SLAM OpenCV、Eigen、Sophus、g2o/Ceres
激光 SLAM PCL、Eigen、KD-Tree、ROS
多传感器融合 Eigen、Sophus、GTSAM、Ceres、ROS
自动驾驶感知 OpenCV、PCL、ROS、深度学习部署
移动机器人导航 ROS/ROS2、tf、costmap、OctoMap、PCL

十四、总结

PCL、Eigen、OpenCV 这些库不是孤立知识点,而是机器人系统里的基础能力模块。

可以简单记成:

  • Eigen:负责数学计算和坐标变换
  • OpenCV:负责图像处理和视觉感知
  • PCL:负责点云处理和三维感知
  • ROS/ROS2:负责系统通信和模块集成
  • Ceres/g2o/GTSAM:负责优化和后端估计
  • Sophus:负责更专业的位姿表达和李群计算
  • OctoMap/grid_map:负责地图表达
  • KD-Tree/ikd-Tree:负责高效空间搜索

新人学习时最重要的是抓住四件事:

数据结构
坐标变换
传感器处理
系统通信

只要把这四件事理解清楚,再去学具体 API、看大型 SLAM 项目,就会顺畅很多。

不要试图一次学完所有库。最好的方式是围绕一个小项目,一边写代码,一边补知识:

  • 想学视觉:做 ROS + OpenCV 图像节点
  • 想学激光:做 ROS + PCL 点云节点
  • 想学 SLAM:先学 Eigen 坐标变换,再看配准和优化
  • 想看 FAST-LIO:先补 PCL、Eigen、IMU、ESKF、KD-Tree

机器人开发的学习曲线确实比较陡,但这些通用开源库就是最稳的台阶。一步一步把它们踩实,后面无论做 SLAM、导航、感知还是多传感器融合,都会轻松很多。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐