全自动管道:从无人机 LiDAR 点云到可建造桥梁施工图 | UAV Survey → Constructable Bridge Drawings
Bridge Skill 实现了从无人机激光扫描点云到可施工桥梁工程图纸的全自动管道。只需输入一个 .las 点云文件,系统自动完成:
无人机影像
│
▼ [ODM / 合成数据]
LAS 点云
│
▼ bridge_pipeline.py ← 体素降采样 · 多平面RANSAC · 植被过滤 · 拱桥检测 · 地形剖面
bridge_params.json ← 桥梁结构参数
│
▼ bridge_designer/ ← AASHTO LRFD / JTG D60 结构设计引擎 (模块化)
detailed_design.json ← 配筋设计 · 材料清单 · 荷载分析 · 挠度验算
│
├──► freecad_bridge.py ← I型梁 · 拱肋 · 盖梁 · 支座 · 栏杆
│ bridge.FCStd + .step + .stl
│
└──► bridge_drawing.py ← 专业施工图 (标准箭头 · ISO 129 标注 · 图层)
drawings/
├── GA_drawing.svg 总体布置图 (平面+立面+横断)
├── Superstructure_drawing.svg 主梁+桥面板构造图
├── Substructure_drawing.svg 桥墩+桥台构造图
└── BOM_table.svg 材料清单+规格表
- 🔍 点云处理:体素降采样、多平面 RANSAC、DBSCAN 聚类、植被分类过滤、拱桥抛物线检测
- 🏗️ 7种桥型设计:RC梁桥、预应力桥梁、钢梁桥、钢桁架桥、拱桥、斜拉桥
- 📐 双规范支持:AASHTO LRFD(美标)/ JTG D60-2015(中国公路桥涵规范)
- 🧱 完整结构设计:截面选型、荷载组合、配筋计算、挠度验算、材料清单
- 📄 专业施工图:4 张工程级 SVG 图纸,含 ISO 129 标准尺寸标注
- ✅ 输入验证 + 测试覆盖:32 项单元测试 + schema 验证 + CI/CD
# 1. 一键演示(合成数据 → 结构设计 → 3D模型 → 施工图) ./run_bridge_skill.sh --generate-synthetic # 2. 真实感 UAV 仿真数据 ./run_bridge_skill.sh --generate-synthetic --realistic # 3. 拱桥(40m 跨) ./run_bridge_skill.sh --generate-synthetic --bridge-type arch --span 40 --width 10 # 4. 含结构分析 ./run_bridge_skill.sh --generate-synthetic --analyze # 5. 查看输出 ls bridge_output/ ls bridge_output/drawings/
# 完整管道 ./run_bridge_skill.sh /path/to/uav_survey.las ./my_bridge_output # 指定中国规范 ./run_bridge_skill.sh survey.las ./output --design-code CHN --live-load CL1 # 含 FEA 验证 ./run_bridge_skill.sh survey.las ./output --analyze
用近距结构光深度相机(量程 0.35–6m)替代无人机 LiDAR 作为点云输入,验证同一套 "点云 → 桥梁参数 → 结构设计 → 3D 模型 → 施工图"流程。
# Python OpenNI2 绑定 (`openni` 包提供 from openni import openni2) pip install openni # WSL2: 相机插在 Windows 侧,需 usbipd 桥接进 WSL2 (Windows 管理员 PowerShell) usbipd list # 找到 ORBBEC Depth Sensor 的 BUSID usbipd bind --busid <BUSID> usbipd attach --wsl --busid <BUSID> --auto-attach
# 1. 原生采集: 读 N 帧深度 → 二进制 (WSL2 下稳定) ./openni_capture capture.bin 30 0.35 6.0 # 2. 转 LAS: 相机坐标→世界坐标, ×ばつ100 缩放到真实桥梁尺度 python openni_bin_to_las.py capture.bin capture.las --scale 100 --voxel-size 0.1 # 3. 送入管道 (或一步到位 --from-camera) ./run_bridge_skill.sh capture.las ./camera_output ./run_bridge_skill.sh --from-camera --camera-frames 30 --camera-scale 100
⚠️ 为什么用原生 C++ 采集器? Pythonopenni包装层在 WSL2 + usbipd 虚拟 USB 下会随机踩堆崩溃(glibc malloc assertion)。openni_capture.cpp用 OpenNI2 C++ API 直接采集,数据先落盘再做清理,稳定可靠。 原生 Linux(非 WSL2)可用camera_capture.py。
没有桥形实物时,用真实相机参数(FOV ×ばつ480、立体噪声模型、单视角透视) 模拟相机拍摄,并带已知真值:
# 模拟 50c×ばつ15c×ばつ15cm 两墩桥模, 多视角 + 缩放 python simulate_camera_capture.py /tmp/sim.las --scale 100 \ --bridge 0.5,0.15,0.15,2 --cam "1.2,0.70|0.6,0.35" --truth /tmp/truth.json # 提取参数并与真值对比 python bridge_pipeline.py /tmp/sim.las -o /tmp/params.json python compare_ground_truth.py /tmp/params.json /tmp/truth.json --scale 100
| 方案 | 跨径/桥宽 | 净空 | 桥墩数 | 结论 |
|---|---|---|---|---|
| 已知相机姿态(无人机 IMU)+ 多视角 | ✅ 52–55m / 15m (±7–21%) | ✅ ~17m | ✅ 2 | 可行 |
| 无 IMU 纯数据矫正 + 多视角 | ✅ 56m / 15m | ❌ | ❌ | 勉强 |
| 单视角(任何方法) | 部分 ✅ | ❌ | ❌ | 遮挡, 不可行 |
关键结论:
- 结构光相机点云可以驱动完整的桥梁设计流程(参数 → 配筋 → 材料 → FreeCAD → 施工图)。
- 需要已知相机姿态角(无人机 IMU 标配)做正确反变换
p_world = RTp_cam + t, 并多视角采集补全桥下净空(单视角有几何遮挡)。 - 相机拍摄的是小尺度物体,输入前 ×ばつ100 缩放 到真实桥梁尺度,复用同一套 pipeline。
| 桥型 | 适用跨径 | 设计方法 | 上部结构 |
|---|---|---|---|
| RC 梁桥 | <15m | T-beam / 矩形梁 | 钢筋混凝土 T/I 梁 |
| RC I型梁 | 15–35m | AASHTO 梁截面选型 | 钢筋混凝土 I 形梁 |
| 预应力梁 | 35–80m | AASHTO Type I–VI / BT | 先张法预应力 I 梁 |
| 钢梁桥 | 45–150m | 焊接板梁 (A709 Gr.50) | 钢 I 梁 + 组合桥面板 |
| 钢桁架 | 40–150m | Pratt 桁架 | 双角钢 / H 型截面 |
| 拱桥 | 20–200m | 抛物线拱肋 | RC 拱肋 + 立柱 |
| 斜拉桥 | 150–400m | 扇形索面 | 预应力桥面板 + 塔柱 |
所有桥型均自动计算:荷载组合、结构分析、配筋设计、材料清单。
| 文件 | 说明 |
|---|---|
bridge_params.json |
点云提取的结构参数(跨径、宽度、桥墩位置、地形剖面) |
detailed_design.json |
完整工程设计:配筋表、材料清单、荷载分析、挠度验算 |
bridge.FCStd |
FreeCAD 3D 参数化模型 |
bridge.step |
STEP 交换格式(兼容 AutoCAD / Revit) |
bridge.stl |
STL 网格(3D 打印 / 可视化) |
drawings/GA_drawing.svg |
总体布置图 — 平面 + 立面 + 横断面 |
drawings/Superstructure_drawing.svg |
主梁构造图 — 截面配筋 + 钢筋表 |
drawings/Substructure_drawing.svg |
下部结构图 — 桥墩立面 + 桥台详图 |
drawings/BOM_table.svg |
材料清单 — 混凝土 + 钢筋 + 其他材料 + 规格 |
| 参数 | 默认值 | 说明 |
|---|---|---|
--generate-synthetic |
— | 生成合成点云 |
--realistic |
— | 真实感 UAV LiDAR 仿真 |
--span N |
30 | 桥跨 (m) |
--width N |
8 | 桥面宽度 (m) |
--pier-height N |
5 | 桥墩高度 (m) |
--bridge-type TYPE |
auto | beam / arch / truss / auto |
--design-code CODE |
AASHTO | AASHTO / CHN |
--live-load MODEL |
HL93 | HL93 / CL1 |
--voxel-size N |
0.1 | 体素降采样分辨率 (m) |
--ransac-threshold N |
0.15 | RANSAC 距离阈值 (m) |
--dbscan-eps N |
0.5 | DBSCAN 聚类半径 (m) |
--no-class-filter |
— | 禁用植被分类过滤 |
--analyze |
false | 启用 OpenSeesPy FEA 验证 |
| 变量 | 默认值 | 说明 |
|---|---|---|
BRIDGE_CONDA_ENV |
bridge_skill |
Conda 环境名 |
FREECAD_CMD |
自动检测 | FreeCAD 可执行文件路径 |
BRIDGE_OUTPUT_DIR |
./bridge_output |
默认输出目录 |
- AASHTO LRFD 第 9 版(2020):美国公路桥梁设计规范
- JTG D60-2015:中国公路桥涵设计通用规范
| 规范 | 车道荷载 | 设计卡车 | 冲击系数 |
|---|---|---|---|
| AASHTO HL-93 | 9.3 kN/m | HS20-44 (325 kN) | IM = min(0.33, 1.2-0.005L) |
| JTG CL-1 | 10.5 kN/m | 5 轴 550 kN | 0.25–0.33 |
U = 1.25·DC + 1.50·DW + 1.75·LL
其中:DC=结构恒载, DW=铺装恒载, LL=活载+冲击
- 受弯:
As = Mu / (φ·fy·jd),迭代求解应力块深度 - 受剪:
Vc = 0.17√f'c·bw·d,Vs = Av·fy·d/s - 挠度:
δ < L/800(活载挠度限值)
考虑弹性缩短、混凝土徐变、收缩、钢绞线松弛四项损失,总损失约 15-30%。
# 创建 conda 环境 conda create -n bridge_skill python=3.10 -y conda install -n bridge_skill -c conda-forge \ open3d opencv shapely laspy numpy scipy matplotlib -y # FreeCAD(可选,用于 3D 建模) conda install -n bridge_skill -c conda-forge freecad=0.21.2 -y # OpenSeesPy(可选,用于 FEA 验证) pip install openseespy # 相机采集(可选) pip install openni # 原生 C++ 采集器编译依赖 sudo apt install g++
⚠️ numpy 2.x 兼容:open3d-cpu >= 0.19才支持 numpy 2。若环境中 numpy 是 2.x(检查pip list | grep numpy),务必保证open3d-cpu>=0.19, 否则 KDTree(search_radius_vector_3d等)会段错误/卡死:pip install --upgrade "open3d-cpu>=0.19"
如果 FreeCAD 不可用,管道将跳过 3D 建模步骤,仍会生成完整的结构设计和施工图纸。
~/bridge_skill/
├── run_bridge_skill.sh # 主入口脚本 (v0.4)
├── generate_synthetic_data.py # 简单合成点云
├── generate_realistic_data.py # 真实感仿真点云
├── bridge_pipeline.py # 点云处理 & 结构提取
├── bridge_designer.py # 设计引擎入口 (薄包装)
├── bridge_designer/ # 模块化设计引擎 (v0.4 新增)
│ ├── __init__.py # 调度器 + CLI
│ ├── materials.py # 材料属性 (混凝土/钢筋/钢绞线)
│ ├── loads.py # 荷载计算 (HL-93 / CL-1)
│ ├── analysis.py # 结构分析 (简支/连续梁)
│ ├── rebar.py # 配筋设计 (受弯/受剪/拱肋)
│ ├── substructure.py # 下部结构 (桥墩/桥台/支座/基础)
│ ├── quantities.py # 材料清单/工程量
│ ├── beam_bridge.py # RC 梁桥设计
│ ├── prestressed.py # 预应力桥梁设计
│ ├── steel.py # 钢梁 + 钢桁架设计
│ └── arch_cable.py # 拱桥 + 斜拉桥设计
├── freecad_bridge.py # FreeCAD 参数化 3D 建模
├── bridge_drawing.py # SVG 施工图生成器
├── bridge_fea.py # OpenSeesPy FEA 验证
├── bridge_logging.py # 结构化日志 (v0.4 新增)
├── bridge_config.py # 集中化配置 (v0.4 新增)
├── bridge_validate.py # 输入验证 (v0.4 新增)
├── camera_capture.py # 深度相机采集 (Python, 原生 Linux)
├── openni_capture.cpp # 原生 OpenNI2 C++ 采集器 (WSL2 稳定)
├── openni_bin_to_las.py # 相机帧 → pipeline LAS (含缩放)
├── simulate_camera_capture.py # 结构光相机点云仿真器 (带真值)
├── validate_camera_pipeline.sh # 相机验证框架 (采集→缩放→pipeline)
├── compare_ground_truth.py # 提取参数 vs 实物真值对比
├── test_bridge_designer.py # 32项单元测试 (v0.4 新增)
├── .github/workflows/test.yml # CI/CD (v0.4 新增)
└── README.md # 本文档
- 跨径硬编码 Bug:
bridge_drawing.py总布置图跨径现在从设计数据正确读取 - FreeCAD 管道:重写为正确的 Python runner 脚本,支持优雅降级(FreeCAD 不可用时跳过)
- 数据流修复:植被过滤的 point cloud 引用正确传递到下游步骤
- bridge_designer 包:原始 2097 行单体文件拆分为 9 个专注模块
- bridge_fea.py:消除与 bridge_designer 的重复代码,使用共享材料属性
- 集中化配置:新增
bridge_config.py,支持环境变量覆盖
bridge_logging.py— 结构化日志(INFO/WARN/ERROR/SECTION/STEP)bridge_validate.py— 输入数据 schema 验证test_bridge_designer.py— 32 项单元测试,覆盖材料/荷载/配筋/分析/验证.github/workflows/test.yml— CI 自动化测试
- 尺寸标注使用 SVG 标准箭头(ISO 129 兼容)
- 图纸元素分组到命名图层(兼容 Inkscape)
- 钢筋质量查询使用查表法替代嵌套三元运算符
Bridge Skill is a fully automated pipeline that converts UAV LiDAR point clouds into constructable bridge engineering drawings. v0.4 supports 7 bridge types, dual design codes (AASHTO LRFD / JTG D60), and outputs professional SVG construction drawings with ISO 129-compliant dimensioning.
| Feature | Details |
|---|---|
| Point Cloud Processing | Voxel downsampling, multi-plane RANSAC, DBSCAN clustering, vegetation classification filtering, arch curvature detection |
| Bridge Types | RC beam, prestressed, steel girder, steel truss, arch, cable-stayed |
| Design Codes | AASHTO LRFD 9th Ed (HL-93) / JTG D60-2015 (CL-1) |
| Analysis | Flexure, shear, deflection, prestress losses (4 components), ultimate moment capacity |
| Outputs | JSON design data, FreeCAD 3D model (.FCStd/.step/.stl), 4 professional SVG drawing sheets |
| Testing | 32 unit tests, input validation, CI/CD pipeline |
# One-command demo ./run_bridge_skill.sh --generate-synthetic # Process real UAV data ./run_bridge_skill.sh survey_data.las ./output # With FEA verification ./run_bridge_skill.sh --generate-synthetic --analyze
The monolithic bridge_designer.py has been refactored into a modular package with 9 focused modules under bridge_designer/. The pipeline gracefully degrades when FreeCAD is unavailable — structural design and drawings are always generated.
- Python 3.10+ with conda environment
bridge_skill - Core:
open3d,laspy,numpy,scipy - Optional:
freecad(3D modeling),openseespy(FEA verification)
MIT
Generated by Bridge Skill Pipeline v0.4