
与"ArUco / ChArUco + 四圆孔刚性板"最匹配的开源项目是:
- hku-mars/FAST-Calib :当前最推荐,目标板为四个 ArUco + 四圆孔,支持 Livox Mid-360 / Avia / Ouster 等机械式和固态 LiDAR。
- MaroSalah02/FAST-Calib-ROS2:FAST-Calib 的 ROS2 移植版本,适合你的 ROS2 / Jetson 机器人项目直接验证。
- beltransen/velo2cam_calibration:该类目标板方案的经典开源实现,也是 FAST-Calib 所参考的目标板基础方案。
- OpenCalib/JointCalib :采用棋盘格 + 四圆孔,不是 ArUco/ChArUco,但支持相机内参与 LiDAR--Camera 外参联合优化。
- Clothooo/lvt2calib:采用四圆孔板,面向多类 LiDAR、RGB 相机和热成像相机,不依赖 ArUco/ChArUco。
目前可直接落地的开源实现仍以 ArUco + 四圆孔 的 FAST-Calib / velo2cam 为主。(arXiv1)
1. 项目对比表
| 项目 | 标定板设计 | 传感器支持 | ROS 支持 | 是否严格对应方案 C | 推荐用途 |
|---|---|---|---|---|---|
| FAST-Calib | 四 ArUco + 四圆孔刚性板 | 机械式 / 固态 3D LiDAR + Camera | ROS1 | 是 | 首选工程方案 |
| FAST-Calib-ROS2 | 四 ArUco + 四圆孔刚性板 | Mid-360 / Avia / Ouster 等 | ROS2 | 是 | ROS2 快速接入 |
| velo2cam_calibration | 四 ArUco + 四圆孔板 | LiDAR / Mono / Stereo Camera | ROS1 | 是 | 经典算法参考 |
| JointCalib | 棋盘格 + 四圆孔板 | LiDAR + Camera | 非 ROS 主流程 | 部分对应 | 联合内外参优化 |
| SensorsCalibration | 提供 round-hole board 及多传感器工具箱 | Camera / LiDAR / Radar / IMU | 工具箱 / Docker | 部分对应 | 自动驾驶标定工具集 |
| LVT2Calib | 四圆孔板 | 多类 LiDAR / RGB / Thermal | ROS Noetic | 不含 ArUco | 多模态传感器扩展 |
| SquareCalib | 四圆孔平面板 | Camera + LiDAR | ROS Noetic / Python | 不含 ArUco | 稀疏点云圆孔提取研究 |
2. 首选项目:FAST-Calib
2.1 项目定位
FAST-Calib 是香港大学 MARS Lab 开源的 LiDAR--Camera 外参标定工具。其标定板与方案 C 基本一致:
text
┌────────────────────────────────────┐
│ ArUco ○ ○ ArUco │
│ │
│ │
│ ArUco ○ ○ ArUco │
└────────────────────────────────────┘
其中:
- 相机侧检测四个 ArUco Marker;
- LiDAR 侧检测四个圆孔中心;
- 标定板几何布局已知;
- 最终通过圆孔中心的 3D--3D 对应关系求解 LiDAR 到 Camera 的刚体变换。
FAST-Calib 论文明确说明:相机处理阶段使用位于标定板已知位置的四个 ArUco marker 推算圆孔中心在相机坐标系中的位置;LiDAR 处理阶段执行平面分割、圆孔边缘提取和椭圆拟合;最后通过 SVD / Kabsch 方法完成外参求解,并支持多场景联合标定。(arXiv2)
2.2 支持能力
| 能力 | 支持情况 |
|---|---|
| 单目相机 + 3D LiDAR | 支持 |
| 固态 LiDAR | 支持 |
| 机械旋转式 LiDAR | 支持 |
| 无外参初始值 | 支持 |
| 多姿态联合标定 | 支持 |
| 示例数据 | Mid-360、Avia、Ouster |
| 相机内参自动标定 | 不负责,需要预先提供 |
| 许可证 | GPL-2.0 |
官方仓库要求 PCL >= 1.8、OpenCV >= 4.0,提供单场景和多场景标定流程,并提供目标板 CAD 模型入口及 Mid-360、Avia、Ouster 示例数据。(GitHub3)
2.3 算法流程
#mermaid-svg-3ydI3qtgqx3AR4z4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3ydI3qtgqx3AR4z4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3ydI3qtgqx3AR4z4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3ydI3qtgqx3AR4z4 .error-icon{fill:#552222;}#mermaid-svg-3ydI3qtgqx3AR4z4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3ydI3qtgqx3AR4z4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3ydI3qtgqx3AR4z4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3ydI3qtgqx3AR4z4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3ydI3qtgqx3AR4z4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3ydI3qtgqx3AR4z4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3ydI3qtgqx3AR4z4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3ydI3qtgqx3AR4z4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3ydI3qtgqx3AR4z4 .marker.cross{stroke:#333333;}#mermaid-svg-3ydI3qtgqx3AR4z4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3ydI3qtgqx3AR4z4 p{margin:0;}#mermaid-svg-3ydI3qtgqx3AR4z4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3ydI3qtgqx3AR4z4 .cluster-label text{fill:#333;}#mermaid-svg-3ydI3qtgqx3AR4z4 .cluster-label span{color:#333;}#mermaid-svg-3ydI3qtgqx3AR4z4 .cluster-label span p{background-color:transparent;}#mermaid-svg-3ydI3qtgqx3AR4z4 .label text,#mermaid-svg-3ydI3qtgqx3AR4z4 span{fill:#333;color:#333;}#mermaid-svg-3ydI3qtgqx3AR4z4 .node rect,#mermaid-svg-3ydI3qtgqx3AR4z4 .node circle,#mermaid-svg-3ydI3qtgqx3AR4z4 .node ellipse,#mermaid-svg-3ydI3qtgqx3AR4z4 .node polygon,#mermaid-svg-3ydI3qtgqx3AR4z4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3ydI3qtgqx3AR4z4 .rough-node .label text,#mermaid-svg-3ydI3qtgqx3AR4z4 .node .label text,#mermaid-svg-3ydI3qtgqx3AR4z4 .image-shape .label,#mermaid-svg-3ydI3qtgqx3AR4z4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-3ydI3qtgqx3AR4z4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3ydI3qtgqx3AR4z4 .rough-node .label,#mermaid-svg-3ydI3qtgqx3AR4z4 .node .label,#mermaid-svg-3ydI3qtgqx3AR4z4 .image-shape .label,#mermaid-svg-3ydI3qtgqx3AR4z4 .icon-shape .label{text-align:center;}#mermaid-svg-3ydI3qtgqx3AR4z4 .node.clickable{cursor:pointer;}#mermaid-svg-3ydI3qtgqx3AR4z4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3ydI3qtgqx3AR4z4 .arrowheadPath{fill:#333333;}#mermaid-svg-3ydI3qtgqx3AR4z4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3ydI3qtgqx3AR4z4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3ydI3qtgqx3AR4z4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3ydI3qtgqx3AR4z4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3ydI3qtgqx3AR4z4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3ydI3qtgqx3AR4z4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3ydI3qtgqx3AR4z4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3ydI3qtgqx3AR4z4 .cluster text{fill:#333;}#mermaid-svg-3ydI3qtgqx3AR4z4 .cluster span{color:#333;}#mermaid-svg-3ydI3qtgqx3AR4z4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3ydI3qtgqx3AR4z4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3ydI3qtgqx3AR4z4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-3ydI3qtgqx3AR4z4 .icon-shape,#mermaid-svg-3ydI3qtgqx3AR4z4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3ydI3qtgqx3AR4z4 .icon-shape p,#mermaid-svg-3ydI3qtgqx3AR4z4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3ydI3qtgqx3AR4z4 .icon-shape .label rect,#mermaid-svg-3ydI3qtgqx3AR4z4 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3ydI3qtgqx3AR4z4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3ydI3qtgqx3AR4z4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3ydI3qtgqx3AR4z4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 同步采集图像与点云
相机侧检测四个 ArUco
LiDAR 点云 ROI 过滤
估计标定板 Pose
计算 Camera 坐标系下四圆孔中心
RANSAC 提取平面板
圆孔边缘提取
椭圆拟合获取 LiDAR 圆孔中心
四组 3D-3D 对应点
Kabsch / SVD 求解外参
点云投影验证
2.4 适合机器人项目的原因
FAST-Calib 的优势是:
| 项目需求 | FAST-Calib 对应能力 |
|---|---|
| Livox Mid-360 等固态 LiDAR | 已有验证 |
| RGB + LiDAR 融合 | 原生目标 |
| 点云投影到图像验证 | 支持 |
| 地铁站坡道 / 障碍物语义融合 | 可作为外参基础 |
| ROS2 接入 | 有社区 ROS2 移植版本 |
| 不希望依赖人工点选 | 自动提取目标板特征 |
3. ROS2 直接落地:FAST-Calib-ROS2
3.1 项目定位
FAST-Calib-ROS2 是 FAST-Calib 的 ROS2 移植仓库,保留了原方案的四圆孔目标板和点云---图像标定流程。
其 README 给出的运行入口为:
bash
ros2 launch fast_calib calib_launch.py
并说明支持:
- Livox Mid-360;
- Livox Avia;
- Ouster;
PointCloud2格式点云;ros2 bag数据采集。
对于 Livox ROS Driver 2,仓库特别指出需要确保输出为 PointCloud2 格式。(GitHub4)
3.2 与官方版区别
| 项目 | FAST-Calib 官方版 | FAST-Calib-ROS2 |
|---|---|---|
| ROS 版本 | ROS1 | ROS2 |
| 官方维护 | 是 | 社区移植 |
| 目标板 | 四 ArUco + 四圆孔 | 四 ArUco + 四圆孔 |
| OpenCV / PCL | OpenCV ≥ 4.0,PCL ≥ 1.8 | OpenCV ≥ 4.0,PCL ≥ 1.8 |
| 多场景联合流程 | README 明确提供 | README 主要描述基础流程 |
| 适合 ROS2 bringup | 需要移植 | 可直接开始验证 |
3.3 推荐用法
建议:
text
阶段 1:使用 FAST-Calib-ROS2 在 ROS2 下完成数据录制与基础标定
阶段 2:使用官方 FAST-Calib 的多场景联合标定逻辑核验精度
阶段 3:将最终外参发布为 ROS2 static_transform_publisher / YAML
4. 经典基础项目:velo2cam_calibration
4.1 项目定位
velo2cam_calibration 是较早且具有代表性的自动 LiDAR--Camera 标定项目。其论文与代码采用:
text
四个圆孔:用于 LiDAR / Stereo 点云侧提取几何特征
四个 ArUco:用于单目相机侧估计目标板与圆孔中心位置
论文说明,四个圆孔用于利用 LiDAR 和双目点云中的几何不连续性;四个 ArUco 位于目标板角部,用于单目图像中恢复三维信息。(ResearchGate5)
FAST-Calib 官方 README 明确表示,其目标板设计基于 velo2cam_calibration。(GitHub3)
4.2 项目特点
| 项目 | 说明 |
|---|---|
| 实现语言 | C++ 为主 |
| 框架 | ROS1 catkin package |
| 目标板 | 四圆孔 + 四 ArUco |
| 支持类型 | LiDAR 与 Camera 的组合标定 |
| 许可证 | GPL-2.0 |
| 工程价值 | 适合理解目标板检测、特征提取与早期算法设计 |
官方仓库提供 ROS 包、目标板尺寸示意图和 Gazebo 验证方案。(GitHub6)
4.3 与 FAST-Calib 的差异
| 对比项 | velo2cam_calibration | FAST-Calib |
|---|---|---|
| 定位 | 经典基础实现 | 更新的实用工程实现 |
| 固态 LiDAR 适配 | 较弱 | 重点支持 |
| 圆孔中心提取 | 基础深度突变方法 | 边缘提取 + 椭圆拟合补偿 |
| Mid-360 / Avia | 不作为主要验证目标 | 已验证 |
| 多场景联合优化 | 能扩展 | 官方流程支持 |
| 推荐优先级 | 算法参考 | 实际落地首选 |
对于你可能采用的 Livox Mid-360 / Jetson / ROS2 路线,不建议从 velo2cam 开始工程部署,更适合作为 FAST-Calib 的算法对照与源码参考。
5. 联合优化方案:OpenCalib / JointCalib
5.1 标定板类型
JointCalib 对应的是:
text
棋盘格 + 四圆孔刚性板
而不是:
text
ArUco / ChArUco + 四圆孔板
其论文提出在棋盘格周围增加四个圆孔,通过棋盘格角点与圆孔特征的重投影约束,联合求解:
- 相机内参;
- 镜头畸变参数;
- LiDAR--Camera 外参。
论文和仓库均公开了该方案;仓库输入包括相机标定板图像目录,以及与图像对应的圆孔中心 CSV 文件。(arXiv7) (GitHub8)
5.2 适合场景
| 需求 | 是否适合 |
|---|---|
| 已知相机内参,只求外参 | 可以,但不是最简路线 |
| 相机内参质量不可靠 | 适合 |
| 希望联合优化内参与外参 | 适合 |
| 直接使用 ArUco / ChArUco | 需要自行修改 |
| ROS2 在线集成 | 需要二次开发 |
5.3 改造成 ChArUco + 四圆孔的思路
JointCalib 的核心不是必须依赖普通棋盘格,而是需要:
text
图像侧:稳定且已知板坐标的二维角点
LiDAR 侧:四圆孔中心三维坐标
优化侧:角点与圆孔的联合重投影误差
因此可将图像特征模块替换为:
cpp
cv::aruco::CharucoDetector
并保持:
text
圆孔点云检测模块
+
内参 / 外参联合非线性优化模块
这样可以构建:
text
ChArUco + 四圆孔 + 联合内外参优化
此方案比直接采用 FAST-Calib 更适合"相机内参尚未稳定"或"多相机系统需要统一标定基准"的场景。
6. 多传感器工具箱:PJLab SensorsCalibration
6.1 项目定位
PJLab-ADG/SensorsCalibration 是 OpenCalib 多传感器标定工具箱,覆盖:
- Camera intrinsic;
- LiDAR--Camera;
- LiDAR--LiDAR;
- LiDAR--IMU;
- Radar--Camera;
- Radar--LiDAR;
- Sensor--Vehicle。
其工厂标定部分明确提供了:
text
round hole board:Camera and LiDAR
aruco marker board:Camera
apriltag board:Camera
并在仓库中提供 round_hole_board.pdf。工具箱采用 Apache-2.0 许可证,同时提供 Docker 快速运行方式。(GitHub9)
6.2 与方案 C 的关系
它不是一个开箱即用的"ChArUco + 四圆孔"标定器,但可以组合使用:
text
SensorsCalibration 圆孔板及工具链
+
OpenCV ChArUco 图像检测
+
JointCalib / 自定义优化器
6.3 使用方式
不仅要做 LiDAR--Camera,还包括:
text
IMU + LiDAR + Camera + Robot Base / Navigation Frame
则 SensorsCalibration 更适合作为多传感器标定工具总库,FAST-Calib 则作为其中的 LiDAR--Camera 精标模块。
7. 多类型 LiDAR / RGB / 热成像扩展:LVT2Calib
7.1 项目特点
LVT2Calib 使用统一的四圆孔标定板,对不同传感器提取共同的四个圆心特征,支持:
- Livox Horizon / Mid-40 / Mid-70 / Avia;
- Robosense M1;
- Velodyne VLP-16 / 32 / 64 / 128;
- Ouster OS1-32 / 64 / 128;
- RGB Camera;
- Thermal Camera。
其开源仓库基于 ROS Noetic、PCL 1.10、Ceres Solver 1.14 和 OpenCV 4.2,并提供 Docker 运行方式。(GitHub10)
7.2 与方案 C 的差异
| 项目 | LVT2Calib |
|---|---|
| 四圆孔 | 支持 |
| ArUco | 不作为核心特征 |
| ChArUco | 不使用 |
| RGB Camera | 支持 |
| Thermal Camera | 支持 |
| 多 LiDAR | 支持 |
| 面向固态 LiDAR | 支持 |
若未来机器人平台需要同时接入:
text
RGB + 热成像 + Livox / Ouster
LVT2Calib 更有扩展价值;但仅做 RGB + LiDAR 外参时,FAST-Calib 更直接。
8. ChArUco + 四圆孔:当前开源情况
检索到的最直接 ChArUco + 圆孔 方案来自 2025 年论文:
A Target-based Multi-LiDAR Multi-Camera Extrinsic Calibration System
该方法采用:
- 带 ArUco 编码的 ChArUco 棋盘;
- 位于标定板角部的圆孔;
- 相机侧使用 OpenCV ChArUco 检测与 PnP;
- LiDAR 侧利用圆孔深度不连续特征;
- 面向多 LiDAR、多相机传感器套件执行全局优化。
论文明确描述了 ChArUco 与圆孔结合的标定板及相机 / LiDAR 特征提取流程。(arXiv11)
但是,目前未检索到该论文配套的公开 GitHub 代码仓库。因此,若需要立即工程实现,建议基于 FAST-Calib 修改其相机侧模块,而不是等待现成 ChArUco 实现。
9.2 选型结论
| 目标 | 推荐项目 |
|---|---|
| 立即跑通 ROS2 LiDAR--Camera 标定 | FAST-Calib-ROS2 |
| 追求官方实现与论文复现 | FAST-Calib |
| 理解四 ArUco + 四圆孔经典算法 | velo2cam_calibration |
| 希望同时优化相机内参与外参 | JointCalib |
| 建设完整多传感器标定工具链 | SensorsCalibration |
| RGB + Thermal + 多 LiDAR 统一标定 | LVT2Calib |
| 严格使用 ChArUco + 四圆孔 | 基于 FAST-Calib 二次开发 |
参考链接:
1: https://arxiv.org/abs/2507.16621?utm_source=chatgpt.com "A Target-based Multi-LiDAR Multi-Camera Extrinsic Calibration System"
2: https://arxiv.org/html/2507.17210v1 "FAST-Calib: LiDAR-Camera Extrinsic Calibration in One Second"
3: https://github.com/hku-mars/FAST-Calib "GitHub - hku-mars/FAST-Calib: A Handy Extrinsic Calibration Tool for LiDAR-camera Systems. · GitHub"
4: https://github.com/MaroSalah02/FAST-Calib-ROS2 "GitHub - MaroSalah02/FAST-Calib-ROS2: A Handy Extrinsic Calibration Tool for LiDAR-camera Systems. · GitHub"
5: https://www.researchgate.net/publication/359181926_Automatic_Extrinsic_Calibration_Method_for_LiDAR_and_Camera_Sensor_Setups?utm_source=chatgpt.com "Automatic Extrinsic Calibration Method for LiDAR and ..."
6: https://github.com/beltransen/velo2cam_calibration "GitHub - beltransen/velo2cam_calibration: Automatic Extrinsic Calibration Method for LiDAR and Camera Sensor Setups. ROS Package. · GitHub"
7: https://arxiv.org/abs/2202.13708?utm_source=chatgpt.com "Joint Camera Intrinsic and LiDAR-Camera Extrinsic Calibration"
8: https://github.com/OpenCalib/JointCalib "GitHub - OpenCalib/JointCalib · GitHub"
9: https://github.com/PJLab-ADG/SensorsCalibration "GitHub - PJLab-ADG/SensorsCalibration: OpenCalib: A Multi-sensor Calibration Toolbox for Autonomous Driving · GitHub"
10: https://github.com/Clothooo/lvt2calib "GitHub - Clothooo/lvt2calib: A unified calibration for 3D LiDARs, visual cameras and thermal cameras · GitHub"
11: https://arxiv.org/html/2507.16621v1 "A Target-based Multi-LiDAR Multi-Camera Extrinsic Calibration System"