[人體運動分析]節段LCS座標的建立
技術標籤:人體運動分析[筆記]人體運動分析節段LCS座標系經驗分享
[人體運動分析]節段LCS座標的建立
文章目錄
利用所給的座標點資料及對應的旋轉矩陣,在三維空間中繪製出身體節段的剛性模型,並標誌出HJC (Hip Joint Center)和KJC (Knee Joint Center) 的區域性座標系(Local Coordinate System,LCS) 座標軸。此外還要標誌出世界座標系(Global Coordinate System,GCS) 座標軸。
一、資料介紹
所需要的資料及其變數名稱、資料內容和變數含義如表格所示,座標都是相對於世界座標系GCS所得的測量結果:
變數名 | 資料內容 | 變數含義 |
---|---|---|
HJC | [ − 55.7257 204.9089 768.1623 ] \begin{bmatrix}-55.7257\\204.9089\\768.1623\end{bmatrix} ⎣⎡−55.7257204.9089768.1623⎦⎤ | 大腿關節質心(Hip Joint Center) |
KJC |
[
−
47.8143
360.7420
482.7412
]
\begin{bmatrix}-47.8143\\360.7420\\482.7412\end{bmatrix}
| 膝關節質心(Knee Joint Center) |
AJC | [ − 66.9817 236.2824 114.4218 ] \begin{bmatrix}-66.9817\\236.2824\\114.4218\end{bmatrix} ⎣⎡−66.9817236.2824114.4218⎦⎤ | 踝關節質心(Ankle Joint Center) |
R t h i g h R_{thigh} Rthigh |
[
−
0.5320
0.7490
0.3942
−
0.8461
−
0.4572
−
0.2731
−
0.0243
−
0.4791
0.8774
]
\left[\begin{array}{ccc}-0.5320 & 0.7490 & 0.3942 \\-0.8461 & -0.4572 & -0.2731 \\-0.0243 & -0.4791 & 0.8774\end{array}\right]
| 由GCS座標系到HJC的LCS座標系的旋轉矩陣 |
R s h a n k R_{shank} Rshank | [ − 0.3623 0.7887 − 0.2476 − 0.8254 − 0.3306 0.1547 0.0492 0.3197 0.9462 ] \left[\begin{array}{ccc}-0.3623 & 0.7887 & -0.2476 \\-0.8254 & -0.3306 & 0.1547 \\0.0492 & 0.3197 & 0.9462\end{array}\right] ⎣⎡−0.3623−0.82540.04920.7887−0.33060.3197−0.24760.15470.9462⎦⎤ | 由GCS座標系到KJC的LCS座標系的旋轉矩陣 |
表格1.變數名及其資料內容和代表意義
二、座標的幾何變換
點在空間內的位置,需要通過其所在座標系進行描述,其座標值也只有對應其座標系才有意義。所以說,我們對座標進行的平移和旋轉變換,其本質是對座標系 ( 座標軸 ) 進行的平動或旋轉; 而對於在空間內的點,它們的空間位置是確定不變的,有變化的只是它們的座標值。
現分別按照獨立的平動變換、獨立的旋轉變換和平動旋轉變換結合來幾何變換方法。
2.1 座標系平動變換
如果 LCS 相對於 GCS 沒有旋轉變換,則點在 LCS 座標系內的座標值對映到 GCS 座標系內的座標值,其變換表示式可以表示為
P
⃗
=
P
′
⃗
+
O
⃗
\vec{P}=\vec{P'}+\vec{O}
P
=P′
+O
其中,
P
⃗
\vec{P}
P
表示點在 GCS 座標系內的座標值,
P
′
⃗
\vec{P'}
P′
表示點在 LCS 座標系內的座標值。用列向量來表示,則可以為
[
P
x
P
y
P
z
]
=
[
P
x
′
P
y
′
P
z
′
]
+
[
O
x
O
y
O
z
]
\left[\begin{array}{l}P_{x} \\P_{y} \\P_{z}\end{array}\right]=\left[\begin{array}{l}P_{x}^{\prime} \\P_{y}^{\prime} \\P_{z}^{\prime}\end{array}\right]+\left[\begin{array}{l}O_{x} \\O_{y} \\O_{z}\end{array}\right]
⎣⎡PxPyPz⎦⎤=⎣⎡Px′Py′Pz′⎦⎤+⎣⎡OxOyOz⎦⎤其中,
O
⃗
\vec{O}
O
表示 GCS 到 LCS 的平動向量。
2.2 座標系旋轉變換
如果單獨的定義 LCS 相對於 GCS 的旋轉,而不考慮平動變換,則有
P
⃗
′
=
R
P
⃗
\vec{P}^{\prime}=R \vec{P}
P
′=RP
其中旋轉矩陣的 R 描述為
R
=
[
i
^
x
i
^
y
i
^
z
j
^
x
j
^
y
j
^
z
k
^
x
k
^
y
k
^
z
]
R=\left[\begin{array}{lll}\hat{i}_{x} & \hat{i}_{y} & \hat{i}_{z} \\\hat{j}_{x} & \hat{j}_{y} & \hat{j}_{z} \\\hat{k}_{x} & \hat{k}_{y} & \hat{k}_{z}\end{array}\right]
R=⎣⎡i^xj^xk^xi^yj^yk^yi^zj^zk^z⎦⎤
有關 “旋轉矩陣R” 的相關知識:點選此處跳轉(待補充)
2.3 考慮旋轉的平動
2.3.1 已知點在GCS座標系內的座標
此時求解點在 LCS 座標系內的座標,則需要“先平動,再旋轉”,如
P
′
⃗
=
R
(
P
⃗
−
O
⃗
)
\vec{P'}=R(\vec{P}-\vec{O})
P′
=R(P
−O
)
2.3.2 已知點在LCS座標系內的座標
此時求解點在 GCS 座標系內的座標,則需要“先旋轉,再平動”,如
P
⃗
=
R
′
P
′
⃗
+
O
⃗
\vec{P}=R^{\prime} \vec{P'}+\vec{O}
P
=R′P′
+O
其中,
R
′
R'
R′ 是旋轉矩陣 R 的逆矩陣 。
有關 “為何是這種求解次序” 的相關解釋:點選此處跳轉(待補充)
三、座標軸的繪製
本次繪圖的難點在於 LCS 座標系的三座標軸的方向向量的繪製。我們可以認為,LCS 的三座標軸的方向向量是通過相同的平動向量和旋轉矩陣,由 GCS 的三軸方向向量依據一定的數學處理次序變換得到。由已知 LCS 座標求解 GCS 座標,故需要選擇 “先旋轉,再平動” 的處理次序,使用
P
⃗
=
R
′
P
′
⃗
+
O
⃗
\vec{P}=R^{\prime} \vec{P'}+\vec{O}
P
=R′P′
+O
。
四、程式碼分享
% % 2021.01.01 Jlin.Zheng (Sun Yat-sen University)
clc;clear;
%% 資料輸入
% 輸入關節節點的GCS座標(列向量)
GCS_HJC = [-55.7257;204.9089;768.1623];
GCS_KJC = [-47.8143;360.7420;482.7412];
GCS_AJC = [-66.9817;236.2824;114.4218];
% 輸入GCS到LCS的旋轉矩陣
R_thigh = [-0.5320,0.7490,0.3942;-0.8461,-0.4572,-0.2731;-0.0243,-0.4791,0.8774];
R_shank = [-0.3623,0.7887,-0.2476;-0.8254,-0.3306,0.1547;0.0492,0.3197,0.9462];
%% 建立人體節段模型-剛體
figh = figure;
hold on;
plot_Segment(GCS_HJC,GCS_KJC,GCS_AJC);% 引用自編函式連線身體節段
title(sprintf('Segment模型及關節點LCS繪製'));
xlabel('x');ylabel('y');zlabel('z');
set(gca,'PlotBoxAspectRatio',[0.946,0.946,1]);
xlim([-200,1400]);% 設定座標軸範圍
ylim([0,1400]);zlim([-50,1500]);
% 旋轉觀察視角
view(83,0);% 90°方位角,0°仰角
grid on;
%% 繪製身體節段的LCS座標軸。
% 即已知LCS內的三座標軸在當前LCS中的座標,求該三軸座標在GCS中的座標值
% 計算次序:先旋轉,再平動
AXIS1 = calculate_segLCS(GCS_HJC,R_thigh);
plot_Axis(GCS_HJC,AXIS1)% 繪製大腿LCS三軸方向
AXIS2 = calculate_segLCS(GCS_KJC,R_shank);
plot_Axis(GCS_KJC,AXIS2)% 繪製小腿LCS三軸方向
plot_Axis([0;0;0],100*eye(3));% 繪製GCS三軸方向
hold off;
%% 座標軸相互垂直的檢驗
% 通過下式可知道座標軸之間是正交的
sum((AXIS1(:,1)-GCS_HJC)./norm(AXIS1(:,1)-GCS_HJC).*(AXIS1(:,2)-GCS_HJC)./norm(AXIS1(:,2)-GCS_HJC))
%% 所用函式
%% 函式plot_Segment:用來將GCS當中的點有次序的連線成線
function plot_Segment(GCS_HJC,GCS_KJC,GCS_AJC)
A = [GCS_HJC,GCS_KJC,GCS_AJC];% 輸入各點
X = A(1,:);Y = A(2,:);Z = A(3,:);% 分別得到各點的X,Y,Z座標
% 繪製關節節點
scatter3(X(1),Y(1),Z(1),'Marker','o','LineWidth',1,...
'MarkerEdgeColor','black','MarkerFaceColor',[0.93,0.69,0.13]);% 顏色填充
scatter3(X(2),Y(2),Z(2),'Marker','o','LineWidth',1,...
'MarkerEdgeColor','black','MarkerFaceColor',[0.93,0.69,0.13]);
scatter3(X(3),Y(3),Z(3),'Marker','o','LineWidth',1,...
'MarkerEdgeColor','black','MarkerFaceColor',[0.93,0.69,0.13]);
% 將節點依照次序連線成線,形成身體節段
plot3(X,Y,Z,'black','LineWidth',1);
end
%% 函式calculate_segLCS:用來計算LCS三軸在GCS中的座標
% 我們要在GCS裡統一繪製節段的LCS座標三軸,自然是“LCS座標已知-先平動再旋轉”
function AXIS = calculate_segLCS(point_GCS,Rotation)
% 輸入需要需要建立LCS的節點座標 Point_GCS
O = point_GCS;% 方向:From GCS to LCS
% Axis_LCS是LCS座標系下的三軸座標值
Axis_LCS = 100*eye(3);% 為了方便觀察,在此增大座標軸方向向量的模。
axisX_LCS = Axis_LCS(:,1);% 提取LCS座標軸方向向量
axisY_LCS = Axis_LCS(:,2);
axisZ_LCS = Axis_LCS(:,3);
% 先通過Rotation旋轉矩陣將點由LCS到GCS進行旋轉
% 再求LCS座標到GCS座標的平動
P_axisX = trans_fromLCS_toGCS(Rotation,O,axisX_LCS);% 座標軸旋轉
P_axisY = trans_fromLCS_toGCS(Rotation,O,axisY_LCS);
P_axisZ = trans_fromLCS_toGCS(Rotation,O,axisZ_LCS);
% 輸出LCS座標軸方向向量
AXIS = [P_axisX,P_axisY,P_axisZ];
end
%% 函式trans_fromLCS_toGCS:用來計算LCS到GCS座標點的幾何變換
function P_GCS = trans_fromLCS_toGCS(Rotation,O,P_LCS)
% 幾何變換公式:P_GCS = Rotation'*P_LCS + O;
P_GCS = Rotation'*P_LCS + O;
end
%% 繪製三軸座標
function plot_Axis(O,AXIS)
% O 是座標系原點的位置
% AXIS 其列向量為座標軸的方向向量
Xaxis = AXIS(1,:);Yaxis = AXIS(2,:);Zaxis = AXIS(3,:);
% 注意,plot最少是兩個點資料才能夠連線成線
plot3([O(1);Xaxis(1)],[O(2);Yaxis(1)],[O(3);Zaxis(1)],...
'LineWidth',1.5,'Color',[0.85,0.33,0.10]);% 繪製X軸,橙紅色
plot3([O(1);Xaxis(2)],[O(2);Yaxis(2)],[O(3);Zaxis(2)],...
'LineWidth',1.5,'Color',[0.47,0.67,0.19]);% 繪製Y軸,淡綠色
plot3([O(1);Xaxis(3)],[O(2);Yaxis(3)],[O(3);Zaxis(3)],...
'LineWidth',1.5,'Color',[0.00,0.45,0.74]);% 繪製Z軸,淡藍色
end