Going Further with Point Pair Features: PPF, 如何走的更远?

本文介绍基于PointPairFeatures (PPF) 的6D姿态估计方法,包括其在工业场景的优势、原理及2017年对该方法的优化方案。PPF方法能有效处理缺乏纹理或局部曲率变化小的物体,通过Hough Voting实现鲁棒的姿态估计。

文章目录

简介

基于Point Pair Features(PPF)的6D姿态估计方法PPF,Drost et al., 2010,是在机器视觉领域应用广泛的一种物体位姿提取方法。大名鼎鼎的Halcon,其Surface Matching 模块就是在这种方法的基础上做的优化。(Halcon有一份technique notes 专门讲该模块的使用)。

在这里插入图片描述

这种方法具有什么优势呢?

  1. 在工业场景中,有大量缺少表面纹理或局部曲率变化很小的物体,无法利用局部特征提取匹配点对,因此基于局部特征点匹配的姿态估计方法无法使用
  2. 该方法的输入,model(物体模型)与scene(场景)均为点云;随着3D传感器技术的发展,市场上出现了很多极具性价比的工业级3D传感器,获取高质量点云的成本越来越低

原理

该法的原理,有篇文章珠玉在前PPF原理,对原论文讲解很详细,这里不再重复,我想强调几个点:

  1. 一个高度概括:原论文的标题,"Model Globally, Match Locally"高度概括了该法的优点;所谓Model Globally,是指对model中所有的点对(任取两个点组成一个点对,遍历所有可能的组合)都计算了PPF描述子,以描述子为key,以这两个点为value构建hash table, 该hash table可以看作是对model 的一个global的描述; 在使用scene进行匹配的时候,同样要对scene中所有点对计算PPF描述子,然后在hash table中进行查找;

  2. 一种思想:广义霍夫变换是一种2D 形状匹配方法,早已于上世纪80年代提出。PPF可以看作该法的3D推广。基于Hough Voting思想,PPF描述子可以看成是一种“去中心化”的特征描述子。什么是“去中心化”?就是说两个点到底匹不匹配,不像传统的局部特征描述子,依赖点的局部信息,而是要靠其他的点来投票。尽管会有噪声影响,但是正确的匹配一定会在投票过程中被“群众”突显出来,取得最高票数。由于PPF采取了Hough Voting的思想,因此继承了其优缺点:

    • 优点:
      1. 对于轻微形变、遮挡鲁棒性好
      2. 抗噪声能力强
      3. 可一次提取出多个目标(对比Ransac与Hough Voting, 两者都是做model fitting的经典方法,但是Hough voting在这一点上胜过Ransac)
    • 缺点:
      1. 参数空间维度高,空间复杂度和时间复杂度都很高;
  3. 一个Intuition: 直观理解一下原文中做姿态估计的过程。两个点云如何align到一起?找到一对匹配点,先将这两个匹配点align到一起,并且他们的法向量方向也要一致;剩下只差一个绕着法向量的旋转角度。这个Intuition决定了在什么样的参数空间进行Hough Voting: 参数空间有两个维度,原文中为 ( m r , α ) (m_r,\alpha) mr,α) m r m_r mr代表了在model中,scene中 s r s_r sr的匹配点; α \alpha α代表了绕法向量的旋转角度;

在这里插入图片描述

优化

2017年的文章:Going Further with Point Pair Features 对PPF进行了优化, 取得了很好的效果。这篇文章指出Drost提出的原算法(以下称为Drost-PPF)及其变种中的问题:

  1. sampling schemes of pairs of 3D points 被长期忽视,导致方法效率低下
  2. 传感器噪声的影响:影响了quantization过程,而整个算法的加速正是靠quantization
  3. 杂乱背景的影响:影响了算法中投票的过程

针对这几个问题,作者采取的优化措施有以下几条:

  1. Pre-processing: 点云的降采样的策略。降采样可以加速计算,并且避免一些很接近的点(空间距离近的点往往法向量也很接近)产生的不具有区分性的PPF features。Drost-PPF中的降采样策略比较简单,作者认为会丢失部分有用信息,所以,即使两个点的距离够近,但如果法向量角度偏差超过30度,也会予以保留。

  2. Smart Sampling: 对scene中的 s i s_i si s r s_r sr的距离 d d d进行限制,即对于每一个 s i s_i si, 与其配对的 s r s_r sr只在以

UATHelper: 打包 (Android (ASTC)): ld.lld: error: too many errors emitted, stopping now (use -error-limit=0 to see all errors) UATHelper: 打包 (Android (ASTC)): clang++: error: linker command failed with exit code 1 (use -v to see invocation) PackagingResults: Error: undefined symbol: ppf_Message_GetString PackagingResults: Error: undefined symbol: ppf_ApplicationLifecycle_GetLaunchDetails PackagingResults: Error: undefined symbol: ppf_LaunchDetails_GetDeeplinkMessage PackagingResults: Error: undefined symbol: ppf_LaunchDetails_GetDestinationApiName PackagingResults: Error: undefined symbol: ppf_LaunchDetails_GetLobbySessionID PackagingResults: Error: undefined symbol: ppf_LaunchDetails_GetMatchSessionID PackagingResults: Error: undefined symbol: ppf_LaunchDetails_GetExtra PackagingResults: Error: undefined symbol: ppf_LaunchDetails_GetRoomID PackagingResults: Error: undefined symbol: ppf_LaunchDetails_GetTrackingID PackagingResults: Error: undefined symbol: ppf_LaunchDetails_GetChallengeID PackagingResults: Error: undefined symbol: ppf_LaunchDetails_GetLaunchType PackagingResults: Error: undefined symbol: ppf_ApplicationLifecycle_LogDeeplinkResult PackagingResults: Error: undefined symbol: ppf_Application_GetSystemInfo PackagingResults: Error: undefined symbol: ppf_SystemInfo_GetROMVersion PackagingResults: Error: undefined symbol: ppf_SystemInfo_GetLocale PackagingResults: Error: undefined symbol: ppf_SystemInfo_GetProductName PackagingResults: Error: undefined symbol: ppf_SystemInfo_GetIsCnDevice PackagingResults: Error: undefined symbol: ppf_SystemInfo_GetMatrixVersionName PackagingResults: Error: undefined symbol: ppf_SystemInfo_GetMatrixVersionCode PackagingResults: Error: undefined symbol: ppf_Achievements_Unlock PackagingResults: Error: too many errors emitted, stopping now (use -error-limit=0 to see all errors) PackagingResults: Error: linker command failed with exit code 1 (use -v to see invocation) UATHelper: 打包 (Android (ASTC)): Took 4.8559767s to run UnrealBuildTool.exe, ExitCode=6 UATHelper: 打包 (Android (ASTC)): UnrealBuildTool failed. See log for more details. (C:\Users\XZ612-Student\AppData\Roaming\Unreal Engine\AutomationTool\Logs\D+Epic+Games+UE_4.27\UBT-derder0610-Android-Development.txt) UATHelper: 打包 (Android (ASTC)): AutomationTool exiting with ExitCode=6 (6) UATHelper: 打包 (Android (ASTC)): BUILD FAILED PackagingResults: Error: Unknown Error
最新发布
06-19
### 解决Unreal Engine在Android平台上打包时出现的链接器错误 当在使用 Unreal Engine 打包 Android 应用程序时,如果遇到与 `ppf` 相关的未定义符号问题,并且链接器(如 `ld.lld`)返回错误代码 6,这通常表明存在库文件缺失或配置不正确的问题。以下是针对此问题的专业解决方案。 #### 1. 确认 `ppf` 库的正确性 确保项目中使用的 `ppf` 库已正确导入并配置。检查是否已将所有必要的 `.so` 文件添加到 Android 平台的构建路径中[^1]。可以通过以下步骤验证: - 在 Unreal Engine 的 `Build.cs` 文件中,确认已包含 `ppf` 库的相关依赖。 - 检查 `ppf` 的动态库文件是否位于项目的 `Intermediate/Android` 或 `Plugins/Android` 文件夹中。 #### 2. 配置链接器选项 为了更详细地调试链接器错误,可以调整链接器的参数以获取更多信息。通过修改 `Android.mk` 或 `Build.cs` 文件,添加以下标志: ```csharp PublicAdditionalLibraries.Add("libppf.so"); ``` 同时,在命令行中运行 UnrealBuildTool 时,添加以下参数以启用详细日志输出: ```bash -error-limit=0 -v ``` 这些参数可以帮助定位具体的未定义符号及其来源[^2]。 #### 3. 检查 ABI 支持 确保项目支持正确的 Android ABI(Application Binary Interface)。`ppf` 库可能仅支持特定的 ABI(例如 `armeabi-v7a` 或 `arm64-v8a`),而您的项目可能配置了其他 ABI。可以在 `DefaultEngine.ini` 文件中调整以下设置: ```ini [Android] SupportedABIs=arm64-v8a,armeabi-v7a ``` #### 4. 更新 Unreal Engine 和工具链 链接器错误有时可能是由于工具链版本不兼容引起的。确保使用最新版本的 Unreal Engine 和 Android NDK。例如,NDK r21 或更高版本可能对某些库有更好的支持[^3]。可以通过以下方式更新工具链: - 在 Unreal Engine 的 `Edit > Project Settings > Platforms > Android` 中,指定正确的 NDK 路径。 - 确保 Gradle 版本与项目兼容。 #### 5. 示例代码:调试链接器错误 以下是一个简单的脚本,用于捕获和分析链接器的日志输出: ```python import subprocess # 调用 UnrealBuildTool 并捕获输出 command = [ "UnrealBuildTool", "-error-limit=0", "-v" ] result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) print("STDOUT:", result.stdout) print("STDERR:", result.stderr) ``` #### 6. 其他可能的原因 如果上述方法未能解决问题,还可以考虑以下几点: - 检查是否存在重复定义的符号,可能导致冲突[^4]。 - 确保 `ppf` 库的头文件路径已正确添加到项目中。 - 如果使用插件,请确认插件的版本与 Unreal Engine 兼容。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值