8_Collision Detection and Freespace Sampling Methods_宾夕法尼亚大学机器人运动规划专项课程【学习笔记】

本文探讨了碰撞检测函数在机器人运动规划中的应用,如何通过几何分析判断机器人与障碍物的相交,以及在二维空间中使用多边形碰撞检测算法确保路径安全。介绍了位形空间中的采样和图搜索在避免碰撞路径规划中的作用。
部署运行你感兴趣的模型镜像

障碍规划非常简单,因为它能够对位形空间障碍进行明确的描述,但通常我们没有那么奢侈,用碰撞函数【collision function】来表达障碍就行了,尽管它有点模糊。

碰撞检测函数
在这里插入图片描述

更具体地说,如果我们让x表示位形空间中点的坐标,我们通常可以定义一个叫Collision Check的函数,如果空间内无障碍则其值为0,否则为1
在这里插入图片描述

该幻灯片展示的是代表机器人的红色多边形完全位于自由空间中的情况,我们希望 CollisionCheck 函数返回0;

在这里插入图片描述

在上述幻灯片所示情况中,机器人将与一个障碍物碰撞,我们希望 CollisionCheck 函数返回1。

碰撞检测是大多数路径规划算法的关键步骤之一,它通常回归到计算一些简单几何问题的答案,看这个例子:
在这里插入图片描述
如图所示,在这里我们可以使用一系列角形来表示机器人和障碍物,机器人和障碍物是否相撞转换为机器人的任何三角形是否与任何障碍物的三角形重叠的问题。

在这里插入图片描述

这里,我们可以利用三角形是凸多边形,在这种情况下,这意味着我们可以通过检查两个三角形的所有边,并测试这些边中是否有分隔线使一三角形所有点位航该边一侧。如果在两个三角形六个边缘之间找到这样的分隔线,这样就可以证明两个三角形不相交,如果找不到分割线,三角形就相交。

寻找分隔线或平面的方法,实际上可以推广到更高的维度。例如,在三个维度上如果你有一个由凸多边形组成的机器人,比如盒子或金字塔,那就可以通过测试一个多边形上的所有面是否有分离超平面来检查碰撞。

在目前我们考虑的情况下,机器人和障碍物都是由简单的多边形组成,所以要测试碰撞的话,我们首先得根据位形空间参数对机器人进行变形,然后测试组成机器人的多边形是否会与障碍物碰撞。
在这里插入图片描述

在图示情况下,这相当于测试红色三角形是否与黑色三角形有重叠,在这种情况下。我们希望Collisionheck函数返回0,即不相交。

在这里插入图片描述

但实际上有红色三角形与黑色三角形重叠,因此Collisionheck函数应返回1。

我们可能有兴趣回答的另一个问题是:两个位形空间点x1和x2之间的线段上所有点是否都在自由空间中,有时我们很幸运,因为实际上我们可以通过分析作出肯定回答。
在实践中,如果两个点都在自由空间中,并且在给定一些合理的距离度量情况下它们彼此足够接近,那么我们倾向于假设它们之间的直线路径不会产生碰撞,但如果我们大意的话,显然,这个假设会错得很离谱。

在考虑二维规划时,我们可以对位形空间中的位置网格进行采样。对于每个网格点,我们使用CollisionCheck函数确定它是否在自由空间中,自由空间中的所有网格点都将被视为图中的节点。

此图显示了所得的采样点:
在这里插入图片描述
在此例中,我们将继续假设如果两个相邻的网格点都在自由空间中,那么它们之间的所有点也都在自由空间中。如下图所示我们通过凿刻来表示它们间的关联,其中为了保证起点和终点都是图中的两个节点,我们要进行一些选择。然后,通常我们可以使用基于图的规划中何一个算法来搜索两个节点之间的路径。在这里我们用红色来表示最终的路径。
在这里插入图片描述
感谢 B 站 up 主 Here_Kin 的翻译和分享!
【自制中英】宾夕法尼亚大学机器人专项课程二 运动规划 - Robotics:Motion and Planning

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>在NX Open API中,碰撞检测的返回状态(通过`UF_COLLISION_check`或类似函数)通常用预定义的常量表示不同的碰撞类型。以下是常见的碰撞状态常量及其含义: 1. **UF_COLLISION_NO_COLLISION** (0): 表示没有检测到任何碰撞,刀具路径完全安全。 2. **UF_COLLISION_FULL_COLLISION** (1): 表示检测到完全碰撞,即刀具(包括刀柄和夹持器)在整个路径中与工件、夹具或机床发生了干涉。 3. **UF_COLLISION_PARTIAL_COLLISION** (2): 表示部分碰撞,即刀具路径中只有某些区段发生了碰撞(例如,刀具的某一部分在移动过程中与几何体相交,但并非全程碰撞)。 4. **UF_COLLISION_NEAR_MISS** (3): 表示“近碰撞”,即刀具与几何体的距离小于设定的安全距离但未实际接触。这通常用于警告潜在风险。 5. **UF_COLLISION_ERROR** (-1): 表示检测过程中发生错误(如几何数据无效或API调用失败)。 ### 代码示例:处理碰撞状态 以下C++代码片段展示如何根据碰撞状态进行逻辑判断: ```cpp #include <uf_collision.h> void CheckCollisionStatus(int status) { switch (status) { case UF_COLLISION_NO_COLLISION: // 无碰撞,可安全使用当前参数 UF_UI_write_listing_window("状态: 无碰撞\n"); break; case UF_COLLISION_FULL_COLLISION: // 完全碰撞,必须调整刀具或路径 UF_UI_write_listing_window("状态: 完全碰撞!需修改刀具长度或路径\n"); break; case UF_COLLISION_PARTIAL_COLLISION: // 部分碰撞,需检查具体区段 UF_UI_write_listing_window("状态: 部分碰撞!建议使用详细检测定位问题区域\n"); break; case UF_COLLISION_NEAR_MISS: // 近碰撞,需警惕 UF_UI_write_listing_window("状态: 近碰撞(安全距离内)!建议增加安全距离或调整路径\n"); break; case UF_COLLISION_ERROR: // 检测失败 UF_UI_write_listing_window("错误: 碰撞检测失败\n"); break; default: UF_UI_write_listing_window("未知状态\n"); } } ``` ### 注意事项: - **状态优先级**:实际应用中,若同时存在多种状态(如部分碰撞和近碰撞),API通常返回最严重的状态(如部分碰撞优先于近碰撞)。 - **详细报告**:可通过`UF_COLLISION_ask_collisions`获取具体碰撞位置和碰撞体信息。 - **安全距离影响**:近碰撞状态直接依赖于用户设置的安全距离值。 §§相关问题§§ 1. 在NX二次开发中如何获取碰撞发生的具体位置和碰撞深度? 2. 如何设置碰撞检测的安全距离参数? 3. 如何处理部分碰撞(UF_COLLISION_PARTIAL_COLLISION)并自动优化刀具路径? 4. 碰撞检测API是否支持多线程以提高检测效率?</think>在NX二次开发中,碰撞检测API返回的不同碰撞状态具有特定含义,这些状态常量定义在`uf_collision.h`头文件中。以下是主要碰撞状态及其含义的详细说明: ### 碰撞状态常量及含义 | 状态常量 | 值 | 含义说明 | |---------|----|---------| | **UF_COLLISION_NO_COLLISION** | 0 | 无碰撞:刀具路径完全安全,无任何干涉 | | **UF_COLLISION_FULL_COLLISION** | 1 | 完全碰撞:刀具在整个路径中与工件/夹具持续干涉 | | **UF_COLLISION_PARTIAL_COLLISION** | 2 | **部分碰撞**:刀具在部分路径段发生干涉(最常见的关键状态) | | **UF_COLLISION_NEAR_MISS** | 3 | 近距警告:刀具未接触但距离几何体小于安全距离 | | **UF_COLLISION_TOOL_HOLDER_COLLISION** | 4 | 刀柄碰撞:仅刀柄部分发生干涉(刀具头部安全) | | **UF_COLLISION_SHANK_COLLISION** | 5 | 夹持器碰撞:仅夹持器部分发生干涉 | | **UF_COLLISION_ERROR** | -1 | 检测错误:几何数据无效或API调用失败 | ### 重点状态详解 1. **UF_COLLISION_PARTIAL_COLLISION (部分碰撞)**: - 表示刀具在**部分运动轨迹**中发生干涉 - 通常发生在: - 刀具进入/退出材料时的瞬时碰撞 - 复杂几何区域的局部干涉 - 多轴加工中的姿态相关碰撞 - 需要结合`UF_COLLISION_ask_collisions`获取具体碰撞段 2. **UF_COLLISION_NEAR_MISS (近距警告)**: ```cpp // 设置安全距离检测 detector.SetSafetyDistance(2.0); // 2mm安全距离 ``` - 非实际碰撞,但距离危险区域过近 - 安全距离可通过API设置(默认0mm) 3. **碰撞层级关系**: ```mermaid graph TD A[碰撞检测] --> B{碰撞类型} B -->|最严重| C[完全碰撞] B -->|最常见| D[部分碰撞] B -->|局部| E[刀柄/夹持器碰撞] B -->|警告| F[近距警告] ``` ### 代码示例:处理碰撞状态 ```cpp #include <uf_collision.h> void HandleCollision(int status, CAM::CollisionDetector& detector) { switch(status) { case UF_COLLISION_NO_COLLISION: UF_UI_write_listing_window("状态: 无碰撞 - 路径安全\n"); break; case UF_COLLISION_PARTIAL_COLLISION: // 获取具体碰撞段 int numCollisions; UF_COLLISION_collision_p_t collisions; UF_COLLISION_ask_collisions(detector.GetTag(), &numCollisions, &collisions); UF_UI_write_listing_window("状态: 部分碰撞 - 需优化路径\n"); for(int i=0; i<numCollisions; i++) { char msg[256]; sprintf(msg, "碰撞段 %d: 起点(%.2f,%.2f,%.2f) 深度%.2fmm\n", i, collisions[i].point.x, collisions[i].point.y, collisions[i].point.z, collisions[i].depth); UF_UI_write_listing_window(msg); } break; case UF_COLLISION_NEAR_MISS: UF_UI_write_listing_window("警告: 近距风险 - 建议增加安全距离\n"); break; case UF_COLLISION_ERROR: UF_UI_write_listing_window("错误: 碰撞检测失败\n"); break; default: char statusMsg[50]; sprintf(statusMsg, "未知碰撞状态: %d\n", status); UF_UI_write_listing_window(statusMsg); } } ``` ### 实际应用建议 1. **状态处理优先级**: ```cpp if(status == UF_COLLISION_FULL_COLLISION) { // 最高优先级:完全碰撞必须处理 } else if(status >= UF_COLLISION_PARTIAL_COLLISION) { // 中等优先级:部分碰撞或组件碰撞 } else if(status == UF_COLLISION_NEAR_MISS) { // 低优先级:警告信息 } ``` 2. **碰撞深度解读**: - 正值:穿透深度(需增加刀具长度) - 负值:安全裕量(当前长度安全) 3. **多状态组合**: - 使用`UF_COLLISION_ask_collision_types`获取组合状态 - 例如同时报告`刀柄碰撞+近距警告`
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值