[人体运动分析]节段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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值