Skip to content

Navigation Menu

Sign in
Sign up

Latest commit

History

12 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Bridge Skill v0.4 — 无人机勘测 → 可施工桥梁工程图纸

全自动管道:从无人机 LiDAR 点云到可建造桥梁施工图 | UAV Survey → Constructable Bridge Drawings

CI Version Tests License


📖 目录


概述

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

结构光相机采集 (Orbbec Astra Mini S)

用近距结构光深度相机(量程 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

采集流程

×ばつ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">
# 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++ 采集器? Python openni 包装层在 WSL2 + usbipd 虚拟 USB 下会随机踩堆崩溃(glibc malloc assertion)。openni_capture.cpp 用 OpenNI2 C++ API 直接采集,数据先落盘再做清理,稳定可靠。 原生 Linux(非 WSL2)可用 camera_capture.py

无实景验证: 相机仿真

没有桥形实物时,用真实相机参数(FOV ×ばつ480、立体噪声模型、单视角透视) 模拟相机拍摄,并带已知真值:

×ばつ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">
# 模拟 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

相机验证结论 (2026-08)

方案 跨径/桥宽 净空 桥墩数 结论
已知相机姿态(无人机 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(活载挠度限值)

预应力损失(AASHTO LRFD §5.9.5)

考虑弹性缩短、混凝土徐变、收缩、钢绞线松弛四项损失,总损失约 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 # 本文档

v0.4 更新日志

🔧 关键修复

  • 跨径硬编码 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)
  • 钢筋质量查询使用查表法替代嵌套三元运算符

English Summary

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.

Key Capabilities

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

Quick Start (English)

# 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

Architecture (v0.4)

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.

Requirements

  • Python 3.10+ with conda environment bridge_skill
  • Core: open3d, laspy, numpy, scipy
  • Optional: freecad (3D modeling), openseespy (FEA verification)

License

MIT


Generated by Bridge Skill Pipeline v0.4

About

UAV drone survey → bridge construction drawing automated pipeline. Point cloud processing, structure extraction, parametric 3D modeling, and drawing generation.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /