2015-01-05 50 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

它完美的作品。非常感謝你。你是一個傳奇。 –