我有一个机器人腿(3个关节),并使用convhull
绘制了3D绘图中腿部末端的最大范围。现在,我希望能够在整个工作空间中指定一个特定的高度,并在该高度的工作空间内创建一个具有所有可能点的坐标的X
和Y
的二维图(三维图同样适用,但可能更难) 。从现有的3D绘图/数据集绘制特定高度的绘图点
编辑:忘了提及数据存储在一个3乘1088矩阵,每行的坐标。此外,由于Z
的坐标可能与我正在查找的值完全不匹配,所以下一个最接近的点也适用。
谢谢。
我有一个机器人腿(3个关节),并使用convhull
绘制了3D绘图中腿部末端的最大范围。现在,我希望能够在整个工作空间中指定一个特定的高度,并在该高度的工作空间内创建一个具有所有可能点的坐标的X
和Y
的二维图(三维图同样适用,但可能更难) 。从现有的3D绘图/数据集绘制特定高度的绘图点
编辑:忘了提及数据存储在一个3乘1088矩阵,每行的坐标。此外,由于Z
的坐标可能与我正在查找的值完全不匹配,所以下一个最接近的点也适用。
谢谢。
如果我正确解释您的问题,您希望隔离矩阵中与特定z
坐标匹配的点。如果没有完全匹配,您希望找到最接近 z坐标的到您想要的查询。此外,由于您的数据存储在3 x 1088
矩阵中,因此您可能会说每个列都是坐标,而不是每行。
我打算假设第一行,第二行和第三行分别表示机器人运动的坐标为x
,y
和z
。第一步将简单地找到所需的z
坐标与所有在矩阵中找到的坐标之间的最小距离。一旦找到匹配的坐标,我们只需找到匹配的矩阵中的z坐标,将它们隔离出来,并只绘制x
和y
坐标。因此,假设您的点矩阵存储在data
,和您的查询z
坐标存储在queryZ
,做这样的事情:
queryZ = 2.0; %// 1
zPoints = data(3,:); %// 2
[~,loc] = min(abs(queryZ - zPoints)); %// 3
minZ = zPoints(loc); %// 4
ind = data(3,:) == minZ; %// 5
xPoints = data(1,ind); %// 6
yPoints = data(2,ind); %// 7
plot(xPoints, yPoints, 'b.'); %// 8
title(['Points found for ' num2str(minZ)]); %// 9
的第一行代码声明所需的z
坐标您搜索。接下来的两行提取出您的数据的坐标为z
,然后使用min
并通过z
坐标进行搜索,找到最接近您想要的坐标的位置。我们使用这个位置来提取出最接近的坐标是(第4行),然后找到数据矩阵中共享相同坐标(第5行)的那些位置。
最后,这些位置用于过滤数据矩阵(第6行和第7行)的x
和y
坐标,然后我们用蓝色和点标记(第8行)标出这些点。作为奖励,我们在图上放置一个标题,告诉您实际的z
坐标与您的查询匹配(第9行)。
鉴于您的评论你的查询,你想为每个值的特定容差范围内发现的z
多个值。最简单的方法是在for
循环中执行此操作。当然还有其他方法可以做到这一点,但我不会花时间去做这件事。这样,你就必须稍微修改上述配方并执行以下步骤:
queryZ
:
z
点这一点tol
添加这些点到列表这样,代码看起来是这样的:
%// Step #1
queryZ = [2.0 1.0 -1.0 -2.0]; %// Define desired z points
tol = 0.001; %// Define tolerance here
zPoints = data(3,:); %// Extract out z points
%// Step #2
loc = false(numel(zPoints));
for idx = 1 : numel(queryZ)
z = queryZ(idx); %// Get query point
[~,minInd] = min(abs(z - zPoints)); %// Find closest point to query
minZ = zPoints(minInd);
loc(abs(minZ - zPoints) < tol) = true; %// Find indices within tolerance wrt closest point
%// Set to true
end
%// Step #3
xPoints = data(1,ind); %// 6
yPoints = data(2,ind); %// 7
plot(xPoints, yPoints, 'b.'); %// 8
的第一步是不言自明的。我们首先定义了一堆z
坐标,你正在寻找,定义相似的公差,并提取出数据的z
坐标。接下来,在我们的查询集合中的每个点上,我们找到最接近z
坐标数据,然后针对这个最接近的协调,我们搜索的是这个匹配点的指定公差范围内的点。我们使用这些位置(而不是坐标)标记为逻辑数组,其中true
表示此点符合匹配条件,否则为false
。最后,被设置为true
逻辑阵列中的任何位置是指位于该索引处的对应点即已满足查询中的点中的至少一个要被匹配的标准。最后,我们使用这个逻辑数组来索引我们的数据,抓住所有的有效点并绘制它们。
希望这有助于! “
@rayryeng你好。这很好,谢谢。我确实有一个问题:为了获得数据集,我需要为手臂使用多组运动(由于约束),然后我将它们组合起来以提供总工作空间。这意味着对于每个运动组不同的高度。所以,你的解决方案的伟大工程,但只从一个子集,发现Z值。我怎样才能从其他集合中获取值?是否有可能引入容差或三角洲来找到所有点?如果图表上有多条线,那没问题。谢谢。 –
@ConstantinNeacsu - 检查我的编辑。有一些信息缺失,但我用我最好的猜测和判断。希望这是你正在寻找的。如果我帮助,考虑接受我的答案! – rayryeng
它完美的作品。非常感谢你。你是一个传奇。 –
”next next“ - 如同每个X和Y的最接近的Z值,或Z高度的某个阈值内的Z值? – nkjt
最接近的值到Z,存在于我的数据集(所以第二个选项) –