1. 程式人生 > 其它 >[人體運動分析]節段LCS座標的建立

[人體運動分析]節段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}
47.8143360.7420482.7412
膝關節質心(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]
0.53200.84610.02430.74900.45720.47910.39420.27310.8774
由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.36230.82540.04920.78870.33060.31970.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=PxPyPz+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 =RP +O 其中, R ′ R' R 是旋轉矩陣 R 的逆矩陣 。

有關 “為何是這種求解次序” 的相關解釋:點選此處跳轉(待補充)

三、座標軸的繪製

本次繪圖的難點在於 LCS 座標系的三座標軸的方向向量的繪製。我們可以認為,LCS 的三座標軸的方向向量是通過相同的平動向量和旋轉矩陣,由 GCS 的三軸方向向量依據一定的數學處理次序變換得到。由已知 LCS 座標求解 GCS 座標,故需要選擇 “先旋轉,再平動” 的處理次序,使用 P ⃗ = R ′ P ′ ⃗ + O ⃗ \vec{P}=R^{\prime} \vec{P'}+\vec{O} P =RP +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