hpp-fcl序列化实战:用Boost.Serialization持久化碰撞几何体的完整教程
发布时间:2026/11/6 5:11:23 锦皓数字建站

【免费下载链接】hpp-fclAn extension of the Flexible Collision Library项目地址https://gitcode.com/gh_mirrors/hp/hpp-fcl点击查看免费下载hpp-fcl 是高性能碰撞检测与距离计算库 Flexible Collision LibraryFCL的扩展版本其内置的序列化serialization功能基于 Boost.Serialization 实现可以一键把 Box、Sphere、BVHModel 等碰撞几何体保存为 TXT、XML 或二进制文件再原样加载回来。这篇完整教程带你从零掌握 hpp-fcl 序列化支持哪些格式、C 与 Python 各怎么写、有哪些必须知道的坑。一、先搞清楚hpp-fcl 能持久化哪些对象hpp-fcl 的碰撞计算对象几何体、BVH 模型、碰撞请求/结果等都可以直接序列化。开箱即用的类型包括注册代码见 src/serialization/serialization.cpp类别可序列化类型基础几何体Box、Sphere、Ellipsoid、Capsule、Cone、Cylinder、Halfspace、Plane、TriangleP网格模型BVHModelAABB / OBB / RSS / OBBRSS / kIOS / KDOP凸包ConvexTplTriangle16/32、ConvexTplQuadrilateral16/32高度场HeightFieldAABB / OBB / OBBRSS请求/结果CollisionRequest、CollisionResult、DistanceRequest、DistanceResult、Contact、接触面ContactPatch上面这些类型正是 hpp-fcl 每天在机器人仿真里用来做碰撞检测和 GJK 距离计算的几何对象每种几何体的serialize函数都定义在 include/coal/serialization/ 目录下例如 geometric_shapes.h 负责基础形状BVH_model.h 负责 BVH 网格模型。 如果手头只有旧代码include/hpp/fcl/serialization/下的同名头文件是兼容别名用法完全一致。二、准备工作获取 hpp-fcl 源码git clone https://gitcode.com/gh_mirrors/hp/hpp-fcl依赖方面需要 C11 以上编译器、BoostSerialization、Archive 等组件和 Eigen3。序列化功能在 README.md 中被列为核心特性之一full support of object serialization via Boost.Serialization。三、五种保存方式TXT、XML、Binary、字符串、内存缓冲所有读写能力都集中在 include/coal/serialization/serializer.h 的coal::serialization::Serializer结构体中底层模板实现在 archive.h格式保存方法加载方法适用场景TXT 文本saveToTextloadFromText人工检查、调试字符串saveToString/saveToStringStreamloadFromString/loadFromStringStream日志、网络传输XMLsaveToXML(filename, tag)loadFromXML(filename, tag)需要结构化、可打标签的文件二进制saveToBinaryloadFromBinary体积最小、速度最快内存缓冲saveToBufferloadFromBuffer不落盘直接写boost::asio::streambuf一个细节很贴心TXT/XML 归档通过boost::math::nonfinite_num_get专门处理了NaN 值见 archive.h 第 63-75 行不会出现 inf/nan 写不进文件的问题。四、C 实战3 行代码保存一个几何体以最常用的 TXT 格式为例#include coal/serialization/serializer.h #include coal/serialization/geometric_shapes.h coal::Box box(1.0, 2.0, 1.0); coal::serialization::Serializer::saveToText(box, box.txt); coal::Box loaded; coal::serialization::Serializer::loadFromText(loaded, box.txt); // loaded box换格式只改函数名。例如保存为 XML 时多传一个标签名coal::serialization::Serializer::saveToXML(box, box.xml, box); coal::serialization::Serializer::loadFromXML(loaded, box.xml, box);⚠️ 文件不存在时loadFromText等方法会抛出std::invalid_argument异常错误信息形如box.txt does not seem to be a valid file.记得捕获。五、Python 实战方法直接挂在对象上Python 绑定定义在 python/serializable.hh把整套接口绑定为对象方法一行调用import coal box coal.Box(1.0, 2.0, 1.0) box.saveToText(box.txt) loaded coal.Box() loaded.loadFromText(box.txt)同样可用saveToString/loadFromString、saveToXML/loadFromXML、saveToBinary/loadFromBinary、saveToBuffer/loadFromBuffer。六、序列化 BVHModel 网格模型的两个前提条件网格模型BVHModelOBBRSS等是最常被持久化的对象但 BVH_model.h 第 32-39 行有一个硬性检查模型必须处于BVH_BUILD_STATE_PROCESSED或BVH_BUILD_STATE_UPDATED状态即完成endModel()构建之后才能序列化否则会直接抛异常序列化保存的是num_vertices、vertices、num_tris、tri_indices、build_state等核心数据第 46-53 行加载后无需重新喂入 OBJ 文件网格几何直接还原。七、进阶多态、shared_ptr 与引用修复这三个知识点决定了你能不能存得进、取得出多态保存Box、Sphere等都以CollisionGeometry为基类注册了 GUIDfwd.h 中的COAL_SERIALIZATION_DECLARE_EXPORT/CAST_REGISTER宏因此即使存的是CollisionGeometry*指针加载后也能还原成真实的具体类型。shared_ptr 支持std::shared_ptrT可直接序列化官方测试 test/serialization.cpp 第 236-249 行就有完整用例。引用修复Contact、CollisionResult、DistanceResult内部持有几何体指针序列化时不跟随保存。加载后必须调用resolveReferences()把指针重新绑定回来示例见 test/serialization.cpp 第 288-290 行否则内部指针是悬空的。另外每个serialize函数都带version参数后续升级字段时可以据此做前向兼容。八、验证你的序列化跑官方测试官方在 test/serialization.cpp 中用 TXT、XML、BIN、内存流四种模式反复存—取—比对覆盖 AABB、碰撞数据、BVHModel、接触面等几乎所有可序列化类型。构建工程后运行名为serialization的测试用例即可自查若BOOST_CHECK(check(value, other_value))全部通过说明你的环境序列化链路正常该测试也是最好的格式对照代码库每种 API 的标准用法都能在里面找到。九、避坑清单坑正确做法未构建完的 BVHModel 直接序列化先调用endModel()再保存加载Contact后直接用内部指针先调用resolveReferences()修复引用XML 读写时忘记传tag_namesaveToXML/loadFromXML都必须提供一致的标签名文件路径错误时不处理异常捕获std::invalid_argument二进制文件跨平台混用二进制格式与 Boost 版本/平台绑定跨平台交换优先用 TXT 或 XML掌握以上内容你就可以把 hpp-fcl 的碰撞场景整体落盘存档、跨进程传递或做仿真回放——这正是 hpp-fcl 序列化的核心用途。赞分享【免费下载链接】hpp-fclAn extension of the Flexible Collision Library项目地址https://gitcode.com/gh_mirrors/hp/hpp-fcl点击查看免费下载相关推荐hpp-fcl高性能碰撞检测库hpp fcl高性能碰撞检测库 项目介绍 hpp fclHumanoid Path Planner Flexible Collision Library是hpp-fcl碰撞检测库终极指南从入门到实战应用hpp fcl碰撞检测库终极指南从入门到实战应用 在机器人路径规划和运动控制领域高效的碰撞检测和距离计算是确保系统安全可靠运行的关键技术。hpp fclCContent-generator-sketch-plugin团队协作终极指南10个高效统一设计规范技巧Content generator sketch plugin团队协作终极指南10个高效统一设计规范技巧 Content generator sketch p上一篇凭什么叫 Git 变智能git-ai 爆火背后的技术拆解下一篇airfoil-cst-rans-mlp训练全流程解析6000轮Epoch、log-Cd目标与数据血统追踪创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。