注释
我认为这可能比看起来更难做到。 这个要求的应用是什么?停止并重新开始会起作用吗? |
应用程序可能会有所不同,比方说我只能从某个点到达的工具更改,或者用于管理非 Trivkins 机器(如 scara)的轴限制,可以使用简单的 Hal 组件进行管理,但如果点动方向切换太快 |
对于工具更换器应用程序,我认为能够定义更复杂的碰撞几何体会更健壮。我们可以定义多个边界框,而不是只为每个轴设置一个整体最小值/最大值,这些边界框组合在一起将定义工具的允许区域。对于永久性固定装置(虎钳、旋转工作台、安装在工作台上的工具设定器)也可以这样做。 很容易检查工具位置是否在允许的区域之一内(因此在限制范围内)。然而,规划一条无碰撞路径会更难(但可行);想象一个“U”形的允许区域,并在“U”的尖端之间规划一条路径。端点将在限制范围内,但中间点不会。 @grandixximo这会涵盖您的用例吗?如果是这样,我想长期采用这种方法,即使我们现在需要使用 INI 引脚的权宜之计解决方案。 |
是的,scara 会有一个甜甜圈形状的限制,你不能从中间通过,如果能够定义这样的形状或“U”形限制区域,你应该在哪里知道停止在 U 的提示上并且不发生碰撞。 |
2019 年 5 月 30 日星期四 22:03,Robert W. Ellenberg ***@***.***> 写道:对于工具更换器应用程序,我认为能够定义更复杂的碰撞会更健壮几何学。我们可以定义多个边界框,而不是只为每个轴设置一个整体最小值/最大值,这些边界框组合在一起将定义工具的允许区域。对于永久性固定装置(虎钳、旋转工作台、安装在工作台上的工具设定器)也可以这样做。
我建议选择 STL 限制文件。检查 STL 内部/外部非常容易(并且已经解决了很多问题)。并且正常的边界框对于生成 STL 是微不足道的(即使是手工)
|
那会很好用 |
经过一番搜索,libccd 似乎是碰撞检测的事实标准(由 OpenDE、Bullet Physics、ROS 中的 FCL 使用),它可以处理三角形网格,只要它们是凸的(非凸对象可以分解为多个凸的)。STL 文件形式的三角形网格对用户来说肯定很方便,因为它们可以在 CAD 中建模并保存到 STL。 我对 STL 作为一种基本格式的担忧是它只允许您定义一个对象。有时将多个对象组合起来会很好,例如作为 STL 的虎钳模型、用于总体限制的边界框、用于工具更换器的边界框等。为此,URDF或VRML之类的东西更适合。 与 trimesh 碰撞对象有关的其他一些问题:
TLDR:trimeshes 对用户来说很容易并且功能强大(复杂的几何形状),但是为了速度和可靠性也有原语会很好。 |
2019 年 5 月 31 日星期五 14:54,Robert W. Ellenberg ***@***.***> 写道:我对 STL 作为一种基本格式的担忧是它只允许您定义一个对象。有时将多个对象组合起来会很好,例如作为 STL 的虎钳模型、用于总体限制的边界框、用于工具更换器的边界框等。为此,像 URDF < http://wiki.ros。 org/urdf > 或 VRML < https://en.wikipedia.org/wiki/VRML > 更合适。
我想你是在倒着看这个。在 STL 内部定义了一个有效位置。外面一个无效的。一台机器不能有一个具有非连续卷的有效区域,因为这意味着没有办法从一个地方到另一个地方。
|
抱歉,我不清楚,您是对的,多个非连续卷没有意义。但是,需要将非凸体(例如 U 形)分解为凸体以检查点是否在内部,至少要使用像GJK这样的快速算法(libccd 就是这样做的)。的确,我们的目标与典型的碰撞检查相反(因为只有当它与工作空间体积“碰撞”时位置才是好的),但该算法应该同样有效。 |
2019 年 5 月 31 日星期五 16:29,Robert W. Ellenberg ***@***.***> 写道:抱歉,我不清楚,你是对的,多个不连续的卷不会产生感觉。但是,需要将非凸体(例如 U 形)分解为凸体以检查点是否在内部,至少要使用像 GJK < https://en.wikipedia.org这样的快速算法/wiki/Gilbert%E2%80%93Johnson%E2%80%93Keerthi_distance_algorithm > (这是 libccd 所做的)。的确,我们的目标与典型的碰撞检查相反(因为只有当它与工作空间体积“碰撞”时位置才是好的),但该算法应该同样有效。
不过,我认为我们的检查与 3D 打印机切片机执行的“塑料或空气”测试_完全_相同。而且我认为这只是“当我从这里沿任意方向移动到无穷大(和更远)时,我是否与奇数或偶数个面相交”
|
没错,这是同样的问题。您知道我们可以查看的该算法的任何示例吗?我很好奇与碰撞检查算法相比它的效率如何。 |
2019 年 5 月 31 日星期五 18:20,Robert W. Ellenberg ***@***.***> 写道:没错,这是同样的问题。您知道我们可以查看的该算法的任何示例吗?我很好奇与碰撞检查算法相比它的效率如何。
我没有找到任何快速搜索。但这是一种方法(我曾经写过一个切片器……)让我们任意选择从我们的兴趣点直接向上 (+Z) 照射一条光线。1) 找出点的XY 位于每个面顶点的XY 所形成的三角形内的所有面。2) 其中,拒绝所有顶点 Z < 点 Z 的那些 3) 计算所有 Z > 点 Z 的顶点然后从列表中清除 4) 对于任何剩余的面,需要一些数学来计算投影是否三角形面的点位于点的上方或下方,但我无法想象会有超过几个面需要这种分析水平。有趣的是,我的切片器的类似代码是:制作所有面的列表拒绝所有顶点高于或低于当前平面的所有面。从平面与三角形两条边的交点制作线段列表 将线段组装成闭合曲线。我是在八度音程中完成的,它会自动遍历列表,但它看起来像这样(省略了将 C 列表中的线段组装成闭合曲线) for z = max(z, zmin):thickness:zmax disp( z) I1 = find(sum((Z>z),2) == 1); % 有 1 个顶点大于 z 的面的索引 I2 = find(sum((Z>z),2) == 2); % 具有 2 > z C = [] 的面的索引;for a = 1:length(I1) [zs i] = sort(Z(I1(a),:)) ;% 将最大的 Z 放在最后,并存储顺序 xs = X(I1(a),i); ys = Y(I1(a),i); x1 = xs(1)+(xs(3)-xs(1))*(z-zs(1))/(zs(3)-zs(1)); x2 = xs(2)+(xs(3)-xs(2))*(z-zs(2))/(zs(3)-zs(2)); y1 = ys(1)+(ys(3)-ys(1))*(z-zs(1))/(zs(3)-zs(1)); y2 = ys(2)+(ys(3)-ys(2))*(z-zs(2))/(zs(3)-zs(2)); C = [C; x1 y1 x2 y2]; end for a = 1:length(I2) [zs i] = sort(Z(I2(a),:)) ;% 把最大的 Z 放在最后,存储顺序 xs = X(I2(a),i); ys = Y(I2(a),i); x1 = xs(2)+(xs(1)-xs(2))*(z-zs(2))/(zs(1)-zs(2)); x2 = xs(3)+(xs(1)-xs(3))*(z-zs(3))/(zs(1)-zs(3)); y1 = ys(2)+(ys(1)-ys(2))*(z-zs(2))/(zs(1)-zs(2)); y2 = ys(3)+(ys(1)-ys(3))*(z-zs(3))/(zs(1)-zs(3)); C = [C; x1 y1 x2 y2]; 结尾 end for a = 1:length(I2) [zs i] = sort(Z(I2(a),:)) ;% 把最大的 Z 放在最后,存储顺序 xs = X(I2(a),i); ys = Y(I2(a),i); x1 = xs(2)+(xs(1)-xs(2))*(z-zs(2))/(zs(1)-zs(2)); x2 = xs(3)+(xs(1)-xs(3))*(z-zs(3))/(zs(1)-zs(3)); y1 = ys(2)+(ys(1)-ys(2))*(z-zs(2))/(zs(1)-zs(2)); y2 = ys(3)+(ys(1)-ys(3))*(z-zs(3))/(zs(1)-zs(3)); C = [C; x1 y1 x2 y2]; 结尾 end for a = 1:length(I2) [zs i] = sort(Z(I2(a),:)) ;% 把最大的 Z 放在最后,存储顺序 xs = X(I2(a),i); ys = Y(I2(a),i); x1 = xs(2)+(xs(1)-xs(2))*(z-zs(2))/(zs(1)-zs(2)); x2 = xs(3)+(xs(1)-xs(3))*(z-zs(3))/(zs(1)-zs(3)); y1 = ys(2)+(ys(1)-ys(2))*(z-zs(2))/(zs(1)-zs(2)); y2 = ys(3)+(ys(1)-ys(3))*(z-zs(3))/(zs(1)-zs(3)); C = [C; x1 y1 x2 y2]; 结尾 y1 = ys(2)+(ys(1)-ys(2))*(z-zs(2))/(zs(1)-zs(2)); y2 = ys(3)+(ys(1)-ys(3))*(z-zs(3))/(zs(1)-zs(3)); C = [C; x1 y1 x2 y2]; 结尾 y1 = ys(2)+(ys(1)-ys(2))*(z-zs(2))/(zs(1)-zs(2)); y2 = ys(3)+(ys(1)-ys(3))*(z-zs(3))/(zs(1)-zs(3)); C = [C; x1 y1 x2 y2]; 结尾
|
在 2019 年 5 月 31 日星期五 22:56,Andy Pugh ***@***.***> 写道:1) 找到点的 XY 位于每个面顶点的 XY 形成的三角形内的所有面.
http://blackpawn.com/texts/pointinpoly/default.html 请记住,典型的机器包络不会(或不应)是 20,000,000 面实体模型,它将是 12 面长方体。可以设置一个限制。也许不超过1000张面孔。我突然想到,初始过滤器可能是确定 XY 空间中的点是否位于三角形的外接圆内。
|
@andypugh这看起来确实很容易实现,而且对于小的多边形计数,重复列表搜索的开销不太重要。当然,我想注意边界条件(并进行预处理/网格检查以避免退化实体)。在加载时快速搜索工作范围以确保没有孤岛也很有用。 这是否推广到更多维度(即如果我们想包括 ABC 以避免与倾斜头和虎钳发生碰撞)? |
机器是否限制了用虎钳/夹具等避免碰撞的地方?这不是通常在 CAM 中完成的吗?我没有经验可以知道,但这就是它看起来可能的样子。 |
慢跑时如果能不撞到虎钳就好了,但我也希望为非 trivkins 机器(如 scara puma 或 5 轴机器)提供更高级的限制定义,以便能够更安全地在附近慢跑极限将是一项伟大的成就 |
这是一个功能请求,能够通过 hal 从 ini 引脚更改限制,可以在慢跑时更改轴限制,现在您需要停止慢跑并再次移动以使用新限制计划慢跑,它会如果慢跑考虑到新的限制,那就太酷了,因为它可以实时慢跑而不必停下来。