PVN3D ONNX 转换与测试记录

PVN3D混合推理部署:ONNX转换与CUDA扩展实战 在深度学习模型部署领域,ONNX作为跨框架的中间表示格式,已成为工业级部署的重要工具。其核心原理是通过标准化算子定义,实现不同训练框架与推理引擎的互操作。针对PVN3D这类包含自定义CUDA算子的3D视觉模型,混合推理架构结合了ONNX Runtime的高效执行与原生CUDA扩展的灵活性。这种技术方案在机器人抓取、工业质检等需要实时6D位姿估计的场景中具有重要价值,既能利用ONNX的跨平台优势,又能通过CUDA扩展处理点云等非结构化数据。通过内存共享和模块化拆分,该方案在YCB/LINEMOD等标准数据集上 阅读详情

1. 目的

本文单独记录当前 pvn3d-dev 容器内的 ONNX 转换流程、测试方法,以及已经确认的导出问题。

这篇文档只关注两件事:

  1. 如何把当前 deploy/ 里的可导出子图转成 ONNX
  2. 导出过程中实际遇到了什么问题,如何判断,下一步怎么处理

不在本文展开的内容:

  • TensorRT 安装
  • 容器创建
  • PointNet2 插件化

这里先说明一个边界:

  • 当前可以用 ONNX Runtime 测试整条 PVN3D 推理链
  • 但不是“整网纯 ONNX Runtime”
  • 当前可行的是“ONNX Runtime + PointNet2 Native CUDA”的混合推理流程

原因很简单:

  • rgb_backbone 可以走 ONNX Runtime
  • fusion_head 可以走 ONNX Runtime
  • PointNet2 仍然保留 PyTorch CUDA 扩展

相关文档:

2. 当前容器环境

本文基于当前实测容器环境编写:

  • 容器:pvn3d-dev
  • 仓库路径:/workspace/workflow/self/PVN3D
  • Conda 环境:pvn3d
  • Python:3.8.20
  • PyTorch:1.10.0+cu113
  • CUDA Toolkit:11.3
  • ONNX:1.14.1
  • ONNX Runtime:1.16.3
  • TensorRT Python:8.6.1
  • trtexec:/opt/tensorrt/TensorRT-8.6.1.6/bin/trtexec

当前环境已经满足 ONNX 导出和 ONNX 基础校验的前提。

3. 当前导出目标

当前 deploy/scripts/export_onnx.py 只导出两个子图:

  1. rgb_backbone
  2. fusion_head

PointNet2 不在 ONNX 导出范围内,原因是它依赖自定义 CUDA 扩展。

3.1 为什么不是把原始 graph 一次性导成一个 ONNX

当前 PVN3D 的推理路径不是一个“纯标准算子”的网络,而是混合结构:

  1. RGB 主干网络
  2. PointNet2 点云分支
  3. RGB 与点云融合头

这里真正的问题不在 CNN,也不在最终的融合头,而在 PointNet2。

PointNet2 当前依赖本仓库里的自定义 CUDA 扩展,包括这类算子:

  • furthest_point_sample
  • gather_points
  • ball_query
  • group_points
  • three_nn
  • three_interpolate

这些算子当前是通过本地编译的扩展模块执行的,不是标准 ONNX 算子。

因此如果直接把整个 PVN3D 原始 graph 一次性导出,会立刻遇到两个工程问题:

  1. PyTorch 到 ONNX 这一层无法稳定表达 PointNet2 的自定义 CUDA 算子
  2. 即使勉强导出,后面的 TensorRT 也不能直接解析这些自定义算子,除非单独开发 TensorRT plugin

这就是当前部署路线不把整网直接导成单个 ONNX 的原因。

3.2 为什么最终变成“2 个 ONNX + 1 段 CUDA”

当前拆分后的部署结构是:

  1. rgb_backbone.onnx
  2. PointNet2 Native CUDA
  3. fusion_head.onnx

也就是:

  • 图像分支导成 ONNX
  • 点云分支继续保留原生 CUDA
  • 融合与预测头再导成 ONNX

这样拆的目的很明确:

  • 把能稳定导出的部分先导出来
  • 把最难处理的 PointNet2 自定义算子留在现有 CUDA 路径
  • 先跑通第一阶段部署,再决定是否值得做 TensorRT plugin

换句话说,当前不是“原始 graph 被随意拆开”,而是按算子可导出性做的工程拆分。

3.3 为什么 PointNet2 继续保留 CUDA,而不是也转成 ONNX

原因不是 PointNet2 不重要,恰恰相反,是因为它最特殊。

当前 PointNet2 这一路已经在容器里验证通过:

  • 扩展模块能导入
  • CUDA 可用
  • 原生推理链可工作

这里有一个验证细节需要单独说明:

  • 当前容器里验证 _ext 时,应先 import torch
  • 如果直接裸导入 _ext,可能报 ImportError: libc10.so: cannot open shared object file
  • 这属于 PyTorch 共享库的动态加载顺序问题,不表示扩展没有编译成功

在这种前提下,继续保留 PointNet2 的原生 CUDA 路径,收益很直接:

  • 不需要先做 ONNX 自定义算子适配
  • 不需要先做 TensorRT plugin
  • 可以先让部署链往前走

这条路线的代价也很明确:

  • 最终不是单一 engine
  • 推理链会变成混合执行

但对当前阶段来说,这是合理代价,因为它显著降低了第一版部署风险。

相关脚本:

4. 进入环境

docker exec -it pvn3d-dev bash
source /opt/conda/etc/profile.d/conda.sh
conda activate pvn3d
cd /workspace/workflow/self/PVN3D

建议先做一轮快速检查:

python --version
python - <<'PY'
import torch
import onnx
import onnxruntime as ort
print("torch:", torch.__version__)
print("torch_cuda:", torch.version.cuda)
print("cuda_available:", torch.cuda.is_available())
print("onnx:", onnx.__version__)
print("onnxruntime:", ort.__version__)
PY

5. ONNX 导出脚本说明

导出脚本在:

当前关键参数:

  • --checkpoint
  • --output-dir
  • --target
  • --num-classes
  • --num-points
  • --height
  • --width
  • --device
  • --opset

当前脚本已经调整过默认 opset:

  • 默认值:13

原因不是偏好问题,而是当前容器里的 torch 1.10.0 不支持 opset 17 导出。

6. 推荐导出命令

当前已经验证通过的一组导出尺寸是:

  • height=480
  • width=624

下面的命令统一按这组尺寸记录。
之前的 480x640 是问题定位阶段的测试尺寸,不再作为当前推荐命令。

6.0 用于 LINEMOD ape 混合测试的推荐导出命令

如果后续要用 ONNX Runtime 测试 LINEMOD ape 的整条混合推理链,建议先导出与 ape 权重匹配的 ONNX:

python deploy/scripts/export_onnx.py \
  --checkpoint weights/ape_pvn3d_best.pth.tar \
  --output-dir deploy/models/onnx_ape \
  --target all \
  --num-classes 2 \
  --num-points 4096 \
  --height 480 \
  --width 624 \
  --device cuda \
  --opset 13

这里不要继续使用 ycb_pvn3d_best.pth.tar 导出的 ONNX 去测 LINEMOD ape。

原因:

  • YCB 是 22 类
  • LINEMOD 单类配置是 2 类
  • checkpoint 和输出头维度必须一致

6.1 先只测 rgb_backbone

python deploy/scripts/export_onnx.py \
  --checkpoint weights/ycb_pvn3d_best.pth.tar \
  --output-dir deploy/models/onnx \
  --target rgb_backbone \
  --num-classes 22 \
  --num-points 4096 \
  --height 480 \
  --width 624 \
  --device cuda \
  --opset 13

6.2 只测 fusion_head

python deploy/scripts/export_onnx.py \
  --checkpoint weights/ycb_pvn3d_best.pth.tar \
  --output-dir deploy/models/onnx \
  --target fusion_head \
  --num-classes 22 \
  --num-points 4096 \
  --height 480 \
  --width 624 \
  --device cuda \
  --opset 13

6.3 全量导出

python deploy/scripts/export_onnx.py \
  --checkpoint weights/ycb_pvn3d_best.pth.tar \
  --output-dir deploy/models/onnx \
  --target all \
  --num-classes 22 \
  --num-points 4096 \
  --height 480 \
  --width 624 \
  --device cuda \
  --opset 13

建议不要一开始就跑 all。
先拆开测试,定位更快。

7. 导出后检查

如果导出成功,先检查输出目录:

ls -lh deploy/models/onnx
cat deploy/models/onnx/export_manifest.json

预期文件:

  • rgb_backbone.onnx
  • fusion_head.onnx
  • export_manifest.json

8. ONNX 基础测试

8.1 检查模型能否被 ONNX 解析

python - <<'PY'
import onnx
model = onnx.load("deploy/models/onnx/rgb_backbone.onnx")
onnx.checker.check_model(model)
print("rgb_backbone.onnx ok")
PY

如果是 fusion_head.onnx,把文件名替换掉即可。

8.2 用 ONNX Runtime 测试能否创建会话

python - <<'PY'
import onnxruntime as ort
sess = ort.InferenceSession(
    "deploy/models/onnx/rgb_backbone.onnx",
    providers=["CPUExecutionProvider"],
)
print("inputs:", [i.name for i in sess.get_inputs()])
print("outputs:", [o.name for o in sess.get_outputs()])
PY

这里先用 CPUExecutionProvider。

原因:

  • 当前目的只是检查 ONNX 图是否可加载
  • 不把 ORT GPU 执行问题混进导出验证阶段

9. 混合推理全流程测试

9.1 当前是否可以用 ONNX Runtime 测整条 PVN3D 流程

可以,但要明确是“混合推理”。

当前能跑通的路径是:

  1. rgb_backbone.onnx 由 ONNX Runtime 执行
  2. PointNet2 由原生 PyTorch CUDA 扩展执行
  3. fusion_head.onnx 由 ONNX Runtime 执行
  4. 最后的 LINEMOD pose 求解仍走现有 PyTorch / numpy 逻辑

这不是整网纯 ORT,但已经覆盖了当前部署拆分后的主流程。

9.2 测试脚本位置

脚本放在:

脚本做的事情:

  1. 读取一帧 LINEMOD 样本
  2. 把 RGB 从 640 裁成 624
  3. 把点数从数据集原始的 12288 重采样到 4096
  4. 用 ONNX Runtime 跑 rgb_backbone
  5. 用原生 PointNet2 CUDA 跑点云特征
  6. 用 ONNX Runtime 跑 fusion_head
  7. 可选对比整模型 PyTorch 输出
  8. 调用 LINEMOD pose solver,输出 pose、ADD、ADD-S

9.3 运行命令

先保证你已经导出了 ape 对应的 ONNX:

python deploy/scripts/export_onnx.py \
  --checkpoint weights/ape_pvn3d_best.pth.tar \
  --output-dir deploy/models/onnx_ape \
  --target all \
  --num-classes 2 \
  --num-points 4096 \
  --height 480 \
  --width 624 \
  --device cuda \
  --opset 13

然后执行测试脚本:

python onnx_test/run_linemod_hybrid_ort.py \
  --cls ape \
  --checkpoint weights/ape_pvn3d_best.pth.tar \
  --rgb-onnx deploy/models/onnx_ape/rgb_backbone.onnx \
  --fusion-onnx deploy/models/onnx_ape/fusion_head.onnx \
  --sample-index 0 \
  --num-points 4096 \
  --height 480 \
  --width 624 \
  --crop-left 8 \
  --output onnx_test/outputs/linemod_ape_hybrid_summary.json

9.4 输出内容

脚本会输出并保存一份 JSON,总结以下信息:

  • 使用的 checkpoint
  • 使用的 ONNX 文件
  • ONNX Runtime providers
  • 输入 shape
  • 点云 shape
  • 预测 pose
  • ADD
  • ADD-S
  • 如果未加 --skip-torch-compare
    还会给出混合推理和整模型 PyTorch 结果的误差统计

9.5 为什么脚本里还要裁剪和重采样

这是当前导出配置决定的,不是额外的设计复杂度。

原因有两个:

  1. 当前已验证通过的 ONNX 导出尺寸是 480x624
  2. LINEMOD 数据集当前默认采样点数是 12288,而导出使用的是 4096

所以脚本里必须做两步对齐:

  • RGB: 640 -> 624
  • points: 12288 -> 4096

9.6 为什么需要 crop_left

crop_left 不是多余参数,它是用来定义 RGB 裁剪窗口起点的。

当前背景是:

  • LINEMOD 原始 RGB 宽度是 640
  • 当前导出的 ONNX 输入宽度是 624

所以测试脚本必须先把原图裁成 624 宽,才能送进 rgb_backbone.onnx。

但这里不能只裁 RGB,不处理 choose。

原因:

  • choose 记录的是采样点在原始图像上的像素索引
  • 一旦 RGB 被裁剪,像素坐标系就变了
  • 脚本必须知道裁剪窗口是从哪一列开始的,才能把 choose 从原始 640 宽图正确映射到裁剪后的 624 宽图

这就是 crop_left 的作用:

  1. 定义 RGB 裁剪起点
  2. 让 choose 的索引同步完成重映射

当前默认值是:

--crop-left 8

原因:

  • 原始宽度 640
  • 导出宽度 624
  • 两者差值是 16
  • 左边裁 8、右边等价裁 8

也就是居中裁剪。

如果以后导出宽度改了,crop_left 也要跟着一起调整。
它不是固定常量,而是和导出分辨率绑定的参数。

10. 当前已经确认的问题

10.1 问题一:默认 opset 17 导致导出直接失败

实际报错:

ValueError: Unsupported ONNX opset version: 17

原因:

  • 原脚本默认把 --opset 设成了 17
  • 当前容器里的 torch 1.10.0+cu113 不支持这个导出版本

实际检查结果:

  • stable opset: 7 到 13
  • main opset: 14

解决:

  • 当前环境统一使用 --opset 13
  • 脚本默认值已经改成 13

相关代码位置:

10.2 问题二:torch.onnx.symbolic_helper 访问方式在 torch 1.10 下不稳

在把导出脚本默认 opset 改为 13 之后,又遇到过一轮脚本自身报错:

AttributeError: module 'torch.onnx' has no attribute 'symbolic_helper'

原因:

  • 在当前 torch 1.10.0+cu113 环境里
  • import torch.onnx.symbolic_helper as sh 是可以成功的
  • 但 torch.onnx.symbolic_helper 不一定会自动挂成 torch.onnx 的属性

也就是说,这两种写法在当前环境里不是等价的:

错误写法:

torch.onnx.symbolic_helper

正确写法:

import torch.onnx.symbolic_helper as onnx_symbolic_helper

解决:

  • 已经把 export_onnx.py 改成显式导入 torch.onnx.symbolic_helper
  • 后续 opset 检查统一使用局部模块变量,不再通过 torch.onnx.symbolic_helper 访问

这属于脚本兼容性问题,不是模型结构问题。

10.3 问题三:rgb_backbone 导出卡在 adaptive_avg_pool2d

实际报错:

RuntimeError: Unsupported: ONNX export of operator adaptive_avg_pool2d,
since output size is not factor of input size

这是当前真正的 ONNX 导出阻塞点。

原因来自 PSPNet 的 PSP 模块。

相关代码:

这里使用了:

  • AdaptiveAvgPool2d(output_size=(1,1))
  • AdaptiveAvgPool2d(output_size=(2,2))
  • AdaptiveAvgPool2d(output_size=(3,3))
  • AdaptiveAvgPool2d(output_size=(6,6))

前一轮失败时使用的测试输入是:

  • height=480
  • width=640

在 torch 1.10 的 ONNX 导出器里,如果特征图尺寸相对于这些目标池化尺寸不是整倍数,导出就会失败。

这不是 ONNX 包没装好,也不是 TensorRT 的问题,而是 PyTorch 导出器本身的限制。

10.4 问题四:PointNet2 扩展编译成功,但直接导入 _ext 报 libc10.so

当前容器里还确认过一个容易误判的问题。

现象:

  1. python setup.py build_ext --inplace 已经成功
  2. _ext.cpython-38-*.so 已经生成
  3. 直接执行下面的验证代码时失败:
python - <<'PY'
from pvn3d.lib.pointnet2_utils import _ext
print(_ext)
PY

报错:

ImportError: libc10.so: cannot open shared object file: No such file or directory

原因:

  • _ext.so 依赖 PyTorch 的共享库
  • 例如 libc10.so
  • 这些库在当前 conda 环境的 torch/lib 目录下
  • 如果当前 Python 进程还没有先加载 torch,直接导入 _ext 时,动态链接器可能找不到这些依赖

这说明问题不在编译结果本身,而在动态库加载顺序。

解决:

python - <<'PY'
import torch
from pvn3d.lib.pointnet2_utils import _ext
print(_ext)
PY

这个顺序已经在 pvn3d-dev 容器里验证通过。

结论:

  • build_ext --inplace 成功,说明扩展已经编译出来
  • 如果裸导入 _ext 报 libc10.so,优先先 import torch
  • 这不是 ONNX 导出 bug,而是当前环境下 PointNet2 扩展验证时的依赖加载问题

10.5 问题五:Invalid magic number 实际上是 checkpoint 保存格式不同

在用 LINEMOD ape 权重导出 ONNX 时,出现过下面的报错:

RuntimeError: Invalid magic number; corrupt file?

对应命令:

python deploy/scripts/export_onnx.py \
  --checkpoint weights/ape_pvn3d_best.pth.tar \
  --output-dir deploy/models/onnx_ape \
  --target all \
  --num-classes 2 \
  --num-points 4096 \
  --height 480 \
  --width 624 \
  --device cuda \
  --opset 13

这个报错看起来像文件损坏,但当前容器里实际确认的原因不是损坏,而是保存格式不同:

  • ycb_pvn3d_best.pth.tar 可以直接用 torch.load
  • ape_pvn3d_best.pth.tar 是普通 pickle checkpoint
  • 其中仍然包含 model_state

所以问题不在权重内容,而在加载器一开始只支持 torch.load。

解决:

  • 已经更新 model_wrappers.py
  • 现在会先尝试 torch.load
  • 如果遇到 Invalid magic number
  • 自动回退到 pickle.load

结论:

  • Invalid magic number 在这里不等于 checkpoint 损坏
  • 它表示当前 checkpoint 不是 torch.save 格式
  • 当前导出脚本已经兼容这两种 checkpoint

10.6 问题六:混合测试脚本找不到 obj_01.ply

在运行下面的混合测试命令时:

python onnx_test/run_linemod_hybrid_ort.py \
  --cls ape \
  --checkpoint weights/ape_pvn3d_best.pth.tar \
  --rgb-onnx deploy/models/onnx_ape/rgb_backbone.onnx \
  --fusion-onnx deploy/models/onnx_ape/fusion_head.onnx \
  --sample-index 0 \
  --num-points 4096 \
  --height 480 \
  --width 624 \
  --crop-left 8 \
  --output onnx_test/outputs/linemod_ape_hybrid_summary.json

出现过下面的报错:

FileNotFoundError: [Errno 2] No such file or directory:
'datasets/linemod/Linemod_preprocessed/models/obj_01.ply'

原因不是模型文件不存在。
当前容器里实际目录是存在的:

  • /workspace/workflow/self/PVN3D/pvn3d/datasets/linemod/Linemod_preprocessed/models/obj_01.ply

真正原因是:

  • basic_utils.py 里某些 LINEMOD 模型路径仍然写成了相对路径
  • 相对路径是按 pvn3d/ 目录为当前工作目录来解析的
  • 但 onnx_test/run_linemod_hybrid_ort.py 一开始是在仓库根目录执行

也就是说,这是 legacy 工具代码里的路径假设问题,不是数据集缺失。

解决:

  • 已经更新 run_linemod_hybrid_ort.py
  • 脚本启动后会自动切换当前工作目录到 pvn3d/
  • 这样 datasets/linemod/... 这类相对路径就能正确解析

结论:

  • 报 obj_01.ply 找不到时,不要先怀疑数据集没准备好
  • 先检查是不是工作目录不符合 basic_utils.py 的相对路径假设
  • 当前测试脚本已经做了自动修正

11. 当前问题的处理建议

11.1 先固定 opset 13

这是当前环境下的硬约束,不要再尝试 17。

11.2 确保使用更新后的导出脚本

当前 export_onnx.py 已经做了两处修正:

  1. 默认 opset 从 17 改为 13
  2. symbolic_helper 改成显式导入方式

如果你本地容器里运行的还是旧版本脚本,先同步这份脚本再测试。

11.3 PointNet2 扩展验证时先导入 torch

如果需要验证 PointNet2 扩展是否可用,使用下面的顺序:

python - <<'PY'
import torch
from pvn3d.lib.pointnet2_utils import _ext
print(_ext)
PY

不要把下面这种“裸导入 _ext”当成唯一验证方式:

python - <<'PY'
from pvn3d.lib.pointnet2_utils import _ext
print(_ext)
PY

在当前容器里,这种写法可能因为 libc10.so 的动态加载顺序而失败。

11.4 使用更新后的 checkpoint 加载逻辑

如果导出 LINEMOD ape 权重时遇到:

Invalid magic number; corrupt file?

先不要判断为权重损坏。
当前应先确认使用的是更新后的:

现在它已经兼容:

  • torch.save checkpoint
  • pickle checkpoint

11.5 混合测试脚本应使用更新后的版本

如果运行 onnx_test/run_linemod_hybrid_ort.py 时出现:

FileNotFoundError: ... obj_01.ply

先确认使用的是更新后的脚本版本。
当前脚本已经自动切到 pvn3d/ 工作目录,避免 basic_utils.py 的相对路径解析失败。

11.6 优先尝试更适合 PSP 导出的固定分辨率

当前已经验证通过的尺寸是:

--height 480 --width 624

原因:

  • PSP 模块的池化目标是 1, 2, 3, 6
  • 这类结构更适合特征图宽高都能被 1,2,3,6 整除的输入
  • 480 和 624 这一组尺寸已经在当前容器里完成过 ONNX 导出
  • 相比 480x640,这一组更容易满足 PSP pooling 的导出约束

对当前容器,这一步不再是“尝试”,而是目前已经跑通的推荐值。

11.7 如果尺寸不能改,就做导出专用改写

如果部署输入必须固定为 480x640,那就不要继续硬试默认 PSP 实现了。

更直接的做法是:

  • 为 ONNX 导出单独改写 PSPModule
  • 把 AdaptiveAvgPool2d 换成更容易被 torch 1.10 导出的显式 pooling 方案

这条路需要改模型代码,但从工程上比升级整套 PyTorch 环境更稳。

11.8 不建议优先升级 PyTorch

原因:

  • 会影响当前稳定的 torch 1.10 + cu113
  • 会影响 PointNet2 扩展
  • 会把问题从“局部导出兼容性”扩大成“整套训练/推理环境迁移”

12. 当前建议的测试顺序

建议按下面顺序执行:

  1. python deploy/scripts/export_onnx.py --help
  2. 用 ape checkpoint 导出 deploy/models/onnx_ape
  3. 只测试 fusion_head
  4. 再测试 rgb_backbone
  5. rgb_backbone 导出失败时,先改输入尺寸
  6. 导出成功后,用 onnx.checker 检查
  7. 再用 ONNX Runtime 建立会话
  8. 再跑 onnx_test/run_linemod_hybrid_ort.py
  9. 最后再进入 TensorRT engine 构建

这样做的原因:

  • fusion_head 不包含 PSPNet 的自适应池化问题
  • 先拆开验证,能更快判断问题到底在 RGB backbone 还是 fusion head

13. 当前状态结论

截至目前,ONNX 导出与测试状态可以概括成下面几句:

  1. 当前可以测试整条 PVN3D 主流程,但方式是“混合推理”,不是整网纯 ORT
  2. rgb_backbone 在 480x640 下主要卡在 PSP 模块的 AdaptiveAvgPool2d 导出限制
  3. 在 480x624 下,当前容器已经成功导出 rgb_backbone.onnx 和 fusion_head.onnx
  4. PointNet2 继续保留原生 CUDA,是当前这条测试链成立的前提
  5. 当前阻塞点已经不再是 ONNX 缺包,而是后续要继续验证混合推理结果与 TensorRT engine 构建

补一条结构层面的结论:

  1. 当前部署路径本来就不是“整网一个 ONNX”,而是“两个 ONNX + PointNet2 原生 CUDA”

下一步最合理的动作是:

  • 用 ape 权重重新导出匹配 LINEMOD 的 ONNX
  • 跑 onnx_test/run_linemod_hybrid_ort.py
  • 看混合推理和整模型 PyTorch 的误差
  • 再决定是否继续推进 TensorRT engine 构建
开源机械臂结合RTX 5090实现99%成功率AI无序抓取方案 机器人视觉引导与无序抓取是工业自动化的核心技术,其核心原理在于通过视觉传感器感知环境,结合深度学习模型理解物体姿态,最终驱动机械臂执行精准操作。这项技术的核心价值在于替代传统高成本、低柔性的定制化方案,实现高精度、高鲁棒的自动化生产。其典型应用场景包括物流分拣、零件装配和上下料等。本文以开源机器人操作系统ROS生态为基础,详细阐述了如何利用OpenClawPi框架集成机械臂控制,并借助RTX 5090级别的顶级算力部署如PVN3D等复杂神经网络模型,进行实时6D姿态估计与抓取点生成,从而构建一套高成功率、高 阅读详情

相关推荐

ORB-SLAM3 class VertexAccBias : public g2o::BaseVertex<3,Eigen::Vector3d>

◄──── EdgeAccRW ──────► VertexAccBias(VAk)(上一关键帧,固定)在纯 IMU 短窗口内,零偏与重力的分解本就病态;陀螺零偏只影响旋转预积分,与视觉观测的旋转部分(相机朝向)直接对应,相对容易估计;加计零偏影响速度、位置预积分,且与重力向量在测量方程中线性组合,存在。会让边刷新用零偏一阶修正后的预积分测量(速度、位置部分);,视觉残差对零偏的雅可比明明是零,怎么会有信息传过去?刷新依赖零偏的中间项。把视觉信息传递到零偏估计,这句话怎么理解?是安全的,框架会兜底。

qq_43002259的博客 35

PVN3D TensorRT Engine 转换与测试记录

本文记录了在pvn3d-dev容器中将ONNX模型转换为TensorRT引擎的流程与测试方法,重点说明了两部分标准算子图(rgb_backbone和fusion_head)的转换步骤。文档明确了当前环境的配置要求、转换目标、输入尺寸约束(480×624分辨率、4096点云数)及类别一致性原则,并提供了构建脚本的使用说明,包括dry-run验证和实际构建命令。特别强调了对静态ONNX模型不应附加动态shape参数,并给出了不同场景下的推荐构建命令。

豆破苍琼 442

RTC温度补偿:如何让时间分秒不差?

RTC(实时时钟)温度补偿技术通过"检测温度→计算误差→动态调整频率"的闭环机制,解决振荡器频率随温度变化导致的时间误差问题。核心步骤包括:1)高精度温度检测;2)基于温度-频率误差模型计算偏差;3)通过硬件(可编程电容/DAC)或软件方式调整振荡频率。该技术需突破温度检测精度、误差模型拟合、频率调整分辨率等关键点,根据不同应用场景(消费电子±5ppm至军工±0.1ppm)选择匹配方案。典型实现如STM32的分段线性补偿算法,可将工业级RTC精度提升至±2ppm以内。

上市公司前技术负责人,20 年软硬件深耕 + 百人研发团队管理经验,名校理工科背景加持。从技术攻坚到团队掌舵,沉淀海量项目实战与管理心得,专注分享软硬件干货、疑难问题解决方案,既是靠谱知识传播者,也盼链接优质项目共成长。 1228

3D ACIS Modeler 在测量软件里怎么用?几何查询、区域判断与测点布点

本文面向测量软件开发团队,梳理 CAD 模型导入三坐标测量软件后的几何判断工作:如何借助 3D ACIS Modeler 完成模型对象访问、测量区域判断与空间关系分析,并结合 LK Metrology CAMIO 官方案例说明内核与应用的分工,最后给出自研与引入内核的评估思路。

HuiduCADTech的博客 318

手把手教你用Docker快速部署开源MES系统(附避坑指南)

本文提供了一份详细的实战指南,手把手教你使用Docker容器化技术快速部署开源MES系统。内容涵盖从环境准备、项目选型、数据库配置到应用服务器优化、前端部署及生产环境监控的全流程,并附有避坑指南,旨在帮助中小制造企业IT人员和开发者低成本、高效率地构建智能制造解决方案。

f0g1h2的博客 1058

机器人开发路线

通过这个路线图,你可以在6个月内完成从原型到试产的全流程。建议初期采用敏捷开发模式,每两周迭代一个核心功能模块。在硬件集成遇到瓶颈时,推荐参考。

woody218的博客 744

3D CAD参数化建模原理详解:尺寸参数、几何约束与特征关系

3DCAD参数化建模通过尺寸参数、几何约束与特征依赖关系,将设计意图融入模型,实现自动更新。其核心在于明确变量关联、合理设置约束、理顺特征逻辑。修改时,系统依规则重算几何,但需防范约束冲突、依赖失效等问题。提升可维护性需规划关键参数、优化建模结构,并验证多场景适用性。大腾智能ZCAD以自主内核与智能交互支持高效参数化设计,兼顾传统建模与同步修改需求,助力系列化开发与持续迭代。

大腾智能的博客 273

ESP32-S3开发板实战:5分钟搞定智能门铃的音视频通话功能(附源码)

本文详细介绍了如何利用乐鑫ESP32-S3开发板快速实现智能门铃的实时音视频通话功能。通过ESP-ADF框架和RTC服务,开发者可在五分钟内完成环境搭建与核心功能调试,并附有源码和关键配置详解,为嵌入式音视频应用开发提供了高效实践路径。

web99的专栏 527

AI 生成 3D 模型的技术实践:从文本生成到 Three.js 三维展示

无需3D建模基础,只需输入一句话,AI工具Meshy即可生成可编辑、可下载的3D模型。它支持文本转3D、图像转3D、AI纹理与动画生成,一键导出至Blender、Unity等软件,大幅降低创作门槛,让普通人也能轻松实现3D创意。

战族狼魂的博客 264

第二次 PX4仿真环境搭建过程全记录

参考链接 https://blog.youkuaiyun.com/yanwumuxi/article/details/80097294 https://www.ncnynl.com/archives/201709/2013.html 一、安装依赖项 我们使用Debian / Ubuntu LTS 作为Linux的标准支持版本,但是也支持Cent OS 和 Arch Linux的发行版本。 权限设置 警告:永远...

移步换景的博客 2261

CANoe_Demo_下载以及安装教程

CANoe Demo下载安装流程

Jar_Lee的博客 1万+

AI时代,Delft3D如何打通标量输运、波浪、粒子与溢油模拟

学完不仅能独立完成模型构建、参数设置和结果分析,还能真正掌握从“建模型”到“用模型解决实际问题”的完整方法。做 Delft3D 模拟,最难的不是“会点软件”,而是理论如何落地、参数如何设置、案例如何跑通,以及模型结果如何真正用于科研和项目。既适合零基础入门,也适合已有水动力基础、想进一步提升应用能力的科研人员、研究生及水文、水环境、海洋、水利、环评等领域技术工作者。1.拉格朗日粒子模型理论2.拉格朗日粒子法的适用情况3.拉格朗日粒子法的参数4.波浪模型后处理。这门课从基础到进阶,一次打通。

weixin_56135535的博客 173

BPC坏点矫正

whatis the Bad Pixel? 坏点为死点,也就是基本不随照度变化呈现光电线性转换的关系。表现为暗态常亮,亮态常暗。 坏点分类:静态坏点:亮坏点,暗坏点。 动态坏点:在一定像素范围内,该点表现正常,而超过这一范围,该点表现的比周围像素要亮。与sensor ...

camerall 1万+

【测评】SenseNova6.8Flash模型正式发布,支持动态 PPT 及 3D 设计

SenseNova 6.8 Flash将设计生成拓展至多种创作形态,支持Web、SVG、Three.js、Blender、PPT等形式,满足多样化的AI Native Design需求,并支持动态PPT、动态Poster与Agentic 3D设计。同时,模型可接入Figma等专业工作流,帮助用户将AI设计能力融入现有的专业设计流程。此外,模型还支持三维场景与交互内容创作,可综合处理空间布局、材质与光照、镜头控制及动画编排等因素,构建可在网页中实时渲染的三维内容,拓展从立体视觉展示到动态交互的表达方式。

Enweitech Software Works 290

红米k60 修复“NV损坏” 去除主板校验电阻步骤解析与图示

红米k60 基带代码:mondrian。搭载‌高通骁龙8+ Gen1处理器.国外版本称:POCO F5 Pro适用于以下型号的小米机型:23013RK75C, 23013PC75G。 💝💝💝通过博文了解 1💝💝💝-----此机型修复NV损坏硬件类操作主板图示 2💝💝💝-----了解设备出现NV损坏的底层逻辑 3💝💝💝 ------具体修改步骤

小马哥的专栏 391

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

文物3D数字化的技术选型指南:从WW/T 0115标准到落地工程,一次讲透采集、建档、管理与展示

《博物馆藏品管理办法》2026年施行,推动3D数字化保护。本文提出五层工程架构:采集、数据、平台、应用、安全,明确结构光、激光、摄影测量技术选型与WW/T 0115-2023标准对接,强调原始数据留档、自动建模与智慧管理平台建设,实现模型可追溯、可复用。通过样板验证、边扫边入库、应用驱动,确保等保二级合规,规避数据丢失、设备脱节等风险,形成可复制的数字化流水线。

Jmyd0123的博客 372

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

船舶安全培训怎么用AI生成3D预演?从甲板通道、设备热点到网页回放

船舶甲板能够漫游,不等于培训内容可信。本文梳理从培训任务、资料台账、空间白模到设备热点、步骤关联和网页交付的制作流程,说明如何用稳定设备 ID 追溯来源,通过三轮审核核对技术、课程与网页表现,并提供弱网图文回退和上线清单。AI 适合辅助场景与交互原型,不能替代专业审核、上船实训或正式安全程序。

Solange__的博客 535

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

二十分之一的压缩比:Spatial Vivid 1.0 把 3DGS 全链路参考实现按 MIT 开源了

一个高斯点携带的属性是固定的:位置 3 个 float,不透明度 1 个,三个轴的尺度 3 个,旋转四元数 4 个,剩下全是球谐系数。MIT 覆盖的是这次公布的参考工具,标准文本本身和可能存在的必要专利,授权条件不在这次公告的范围内。主论坛上宣布的事,到 11 月 2 日才由 IT之家 的报道扩散开来:Spatial Vivid 1.0(空间菁彩影像)标准的参考工具开源,包括 EGSC 编解码工具、Web 渲染器工具、封装解封装工具在内的全链路参考实现,以 MIT 协议面向全球开发者开放。

weixin_43043455的博客 224

DEM 数据源选型完全指南:SRTM、ASTER GDEM、ALOS AW3D30 与商业高分辨率的工程级对比

本文回答一个工程选型问题:SRTM、ASTER GDEM、ALOS AW3D30 和商业高分辨率 DEM 怎么选。核心结论:先确认数据表达的是裸地还是含地物表面,再确认垂直基准,最后才看分辨率。格网再细,表面层错了或基准没对齐,断面和汇水结果仍然不可用。

TuxinyunGIS的博客 286

三角基底律——矩阵3x6 是所有三角形的基底·3D中高就是边

「:doc max=805·engine max=805 ⇒ 定(L1/01·三角基底律)·公理 §6.140 冻结·。:本篇按 2026-11-01 作者立规(正文 ≥10000 字)直接成篇,引擎锚点组自检。,立:三视角三形(内部=直角·侧边=等腰·正面=等边·面 180/3=60°)——3D 3×3×3 立方体的三个视角投影正是三形(G1 实算:格账正三角形三边各 6 格步·棱长 3=高);,解码。

2603_96389967的博客 110

从CAD装配模型到3D装配动画:模型复用与工艺步序设计

本文阐述了从三维CAD模型生成装配动画的关键流程,涵盖模型准备、结构确认、工艺步序定义、动画表达与资料输出五大环节。指出传统方法存在重复整理、工艺脱节等问题,提出通过“3D工艺大师”等工具实现模型复用与工艺步序驱动,由工艺人员直接定义装配逻辑,自动生成动画并协同输出工艺文件,提升效率与准确性,真正实现设计数据向生产指导的无缝转化。

大腾智能的博客 590

把带贴图的 OBJ / glTF 转成 3D Tiles:我写了个 mesh-to-tiles

做倾斜摄影或单体模型上 Cesium 时,经常卡在同一件事:手上是一份带贴图的 OBJ 或 glTF,场景里要的是 3D Tiles。现成工具能转,但 LOD、图集和纹理压缩往往要再串一圈。我把这条链路收成了一个 Node 命令行工具,输入网格,输出 3D Tiles 1.1 隐式八叉树。,协议 MIT。

m0_69250830的博客 184

论文精读|DiffusionMBIR:用 2D 扩散模型解 3D 稀疏视角 CT 重建

本文提出DiffusionMBIR,解决3D稀疏视角CT重建中2D扩散模型难以保持体数据空间连贯性的问题。方法将2D扩散模型用于xy平面去噪,结合仅沿z方向的TV先验与ADMM实现全局数据一致性,通过变量共享和单步迭代提升效率。实验表明,该方法在8视角下冠状面重建达35.18 dB,显著优于逐片独立扩散重建(28.05 dB)。代码基于预训练2D扩散模型,支持分批处理与快速推理,为高效3D逆问题求解提供新范式。

weixin_45694817的博客 124

3D Forward Simulation of TMI Data:三维总磁场强度正演入门

本文面向初学者,基于SimPEG教程介绍三维磁法正演模拟。通过构建含球体的地下磁化率模型,结合地形与地磁场,预测地表17×17个测点的总磁场强度异常(TMI)。重点讲解磁化率、诱导磁化、TMI测量原理及三维积分正演机制,演示如何使用TensorMesh、active_cells和Simulation3DIntegral实现正演计算。代码可复现地形图、磁化率剖面与TMI异常图,并支持导出合成数据。实验建议调整磁化率、飞行高度、倾角等参数,理解其对异常形态的影响。强调磁异常非唯一性,需结合地质约束。适用于磁测设

m0_57685225的博客 333

影视场景怎么用AI生成3D镜头预演?从概念图、场景白模到网页审片

概念图有氛围,不代表能直接用于镜头预演。本文围绕剧本拆镜、资料与尺度假设、场景白模、机位走位、动作节拍和网页审片,介绍 AI 生成 3D 场景的预演流程。通过稳定对象与相机编号、统一镜头表、意见关联版本和三轮审核,让讨论落到具体镜头,同时明确白模与网页预演不能替代真实场地勘景及现场安全判断。

Solange__的博客 499

院校3D数字化实训平台闲置率分析:技术归因与选型核验方法

本文剖析院校3D数字化实训平台闲置的技术成因,指出问题核心在于平台与教学流程集成度不足,而非单一性能缺陷。提出“课程清单驱动需求、现场实测验证性能、合同约束运营”的三步框架,涵盖选型核验、五步实施与三项验收指标,强调数据接口连通性、师资培训与持续迭代的重要性,为平台高效落地提供可操作的技术路径。

Jmyd0123的博客 320
上一篇: Dify 本地环境忘记登录密码问题排障文档
下一篇: PVN3D TensorRT Engine 转换与测试记录
Yao.Li
博客等级 码龄10年 405粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yao.Li

爱的魔力,一被卡布奇诺~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值