2015-01-05 46 views
0

我有一个机器人腿(3个关节),并使用convhull绘制了3D绘图中腿部末端的最大范围。现在,我希望能够在整个工作空间中指定一个特定的高度,并在该高度的工作空间内创建一个具有所有可能点的坐标的XY的二维图(三维图同样适用,但可能更难) 。从现有的3D绘图/数据集绘制特定高度的绘图点

编辑:忘了提及数据存储在一个3乘1088矩阵,每行的坐标。此外,由于Z的坐标可能与我正在查找的值完全不匹配,所以下一个最接近的点也适用。

谢谢。

+0

”next next“ - 如同每个X和Y的最接近的Z值,或Z高度的某个阈值内的Z值? – nkjt

+0

最接近的值到Z,存在于我的数据集(所以第二个选项) –

回答

0

如果我正确解释您的问题,您希望隔离矩阵中与特定z坐标匹配的点。如果没有完全匹配,您希望找到最接近 z坐标的到您想要的查询。此外,由于您的数据存储在3 x 1088矩阵中,因此您可能会说每个都是坐标,而不是每行。

我打算假设第一行,第二行和第三行分别表示机器人运动的坐标为x,yz。第一步将简单地找到所需的z坐标与所有在矩阵中找到的坐标之间的最小距离。一旦找到匹配的坐标,我们只需找到匹配的矩阵中的z坐标,将它们隔离出来,并只绘制xy坐标。因此,假设您的点矩阵存储在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行)的xy坐标,然后我们用蓝色和点标记(第8行)标出这些点。作为奖励,我们在图上放置一个标题,告诉您实际的z坐标与您的查询匹配(第9行)。

编辑

鉴于您的评论你的查询,你想为每个值的特定容差范围内发现的z多个值。最简单的方法是在for循环中执行此操作。当然还有其他方法可以做到这一点,但我不会花时间去做这件事。这样,你就必须稍微修改上述配方并执行以下步骤:

  1. 对于每个查询点queryZ
    • 查找数据的最近点
    • 搜索中的所有z点这一点
    • 的公差tol添加这些点到列表
  2. 重复步骤#1人升查询点所需
  3. 剧情所有的这些点以用于显示

这样,代码看起来是这样的:

%// 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逻辑阵列中的任何位置是指位于该索引处的对应点即已满足查询中的点中的至少一个要被匹配的标准。最后,我们使用这个逻辑数组来索引我们的数据,抓住所有的有效点并绘制它们。


希望这有助于! “

+0

@rayryeng你好。这很好,谢谢。我确实有一个问题:为了获得数据集,我需要为手臂使用多组运动(由于约束),然后我将它们组合起来以提供总工作空间。这意味着对于每个运动组不同的高度。所以,你的解决方案的伟大工程,但只从一个子集,发现Z值。我怎样才能从其他集合中获取值?是否有可能引入容差或三角洲来找到所有点?如果图表上有多条线,那没问题。谢谢。 –

+0

@ConstantinNeacsu - 检查我的编辑。有一些信息缺失,但我用我最好的猜测和判断。希望这是你正在寻找的。如果我帮助,考虑接受我的答案! – rayryeng

+0

它完美的作品。非常感谢你。你是一个传奇。 –