[人体运动分析]节段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.5320−0.8461−0.02430.7490−0.4572−0.47910.3942−0.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.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