[人体运动分析]Matlab实验代码分享

[人体运动分析]Matlab实验代码分享

实验题目

  利用所给数据在三维空间中绘制出身体节段的刚性模型,并标志出 HJC (Hip Joint Center) 和 KJC (Knee Joint Center) 的 LCS 坐标轴。此外还要标志出 GCS 坐标轴。(来自疫情期间学校网课课后实验作业)

数据描述

  实验题目给出了 HJCKJCAJC (Ankle Joint Center) 在 GCS 坐标系中的坐标,并给出了 GCSHJCKJCLCS 坐标系的旋转矩阵。

实验结果图片

不要截图自己使用噢~

代码分享
clc;clear;
% CG_vedio.mat为matlab的mat文件名称
% Copyright 2020-05-10 @Jlin.Zheng
%% 已知坐标点在GCS中的坐标值
GCS_HJC = [-55.7257;204.9089;768.1623];% LCS坐标
GCS_KJC = [-47.8143;360.7420;482.7412];
GCS_AJC = [-66.9817;236.2824;114.4218];
% 建立人体节段模型-刚体
% 点在GCS坐标系中坐标值
figh = figure;hold on;
plot_pointLCS(GCS_HJC,GCS_KJC,GCS_AJC);% 引用自编函数连接身体节段
xlabel('x');ylabel('y');zlabel('z');
set(gca,'PlotBoxAspectRatio',[0.946,0.946,1]);
% 设置坐标轴范围
xlim([-200,1400]);
ylim([0,1400]);zlim([-50,1500]);
tt = 0;
title(sprintf('Knee joint at t = %1.2f seconds',tt));
% 旋转观察视角
view(83,0);% 90°方位角,0°仰角
grid on;
%% 已知GCS到LCS的旋转矩阵
Rthigh_LCS = [-0.5320,0.7490,0.3942;-0.8461,-0.4572,-0.2731;-0.0243,-0.4791,0.8774];% 旋转矩阵
Rshank_LCS = [-0.3623,0.7887,-0.2476;-0.8254,-0.3306,0.1547;0.0492,0.3197,0.9462];
%% 目的:LCS坐标轴。即已知LCS内的三坐标轴在当前LCS中的坐标,求该三轴坐标在GCS中的坐标值
% 计算次序:先旋转,再平动
[PaxisX,PaxisY,PaxisZ] = multi_LCS(GCS_HJC,Rthigh_LCS);% 引用函数
AXIS = [PaxisX,PaxisY,PaxisZ];
plot_triaxisLCS(GCS_HJC,AXIS)% 绘制大腿LCS三轴方向
[PaxisX,PaxisY,PaxisZ] = multi_LCS(GCS_KJC,Rshank_LCS);% 引用函数
AXIS = [PaxisX,PaxisY,PaxisZ];
plot_triaxisLCS(GCS_KJC,AXIS)% 绘制小腿LCS三轴方向
plot_triaxisLCS([0;0;0],100*eye(3));% 绘制GCS三轴方向
%% 旋转视角,制作动画
tic
for i = 1:155
    title(sprintf('Knee joint at t = %1.2f seconds',toc));
    view(83+i,0);
    pause(0.005);
    movieVector(i) = getframe(figh);
end
for i = 1:25
    title(sprintf('Knee joint at t = %1.2f seconds',toc));
    view(83+155,i);
    pause(0.005);
    movieVector(i+155) = getframe(figh);
end
%% 保存视频
% 使用 VideoWriter 对象根据数组或 MATLAB 影片创建一个视频文件。v = VideoWriter(filename)
myWriter = VideoWriter('绘制身体节段及特定点LCS三坐标轴', 'MPEG-4');
% 创建 VideoWriter 对象,指定其属性,然后使用对象函数写入视频。
myWriter.FrameRate = 20;% FrameRate视频播放速率,即每秒帧数
open(myWriter);
% writeVideo向指定文件写入视频数据;writeVideo(OBJ,FRAME)
% FRAME is a structure typically returned by the GETFRAME function that contains two fields:cdata and colormap.
writeVideo(myWriter, movieVector);
close(myWriter);
%% 所用函数
% 函数plot_pointLCS用来将GCS当中的点有次序的连接成线
function plot_pointLCS(GCS_HJC,GCS_KJC,GCS_AJC)
A = [GCS_HJC,GCS_KJC,GCS_AJC];% 输入各点
X = A(1,:);Y = A(2,:);Z = A(3,:);
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
% 函数multi_LCS用来计算LCS三轴在GCS中的坐标
function [PaxisX,PaxisY,PaxisZ] = multi_LCS(pointGCS,Rotation)
%% AxisLCS是LCS坐标系下的三轴坐标值
AxisLCS = 100*eye(3);% LCS三坐标轴坐标方向向量
% 为了方便观察,在此增大坐标轴方向向量的模。
% 提取坐标轴方向向量
axisX_LCS = AxisLCS(:,1);
axisY_LCS = AxisLCS(:,2);
axisZ_LCS = AxisLCS(:,3);
%% 先通过Rotation旋转矩阵将点由LCS到GCS旋转
PaxisX = turn_LCS_GCS(Rotation,axisX_LCS);% 坐标轴旋转
PaxisY = turn_LCS_GCS(Rotation,axisY_LCS);
PaxisZ = turn_LCS_GCS(Rotation,axisZ_LCS);
%% 使用pointGCS构建平动向量
% pointGCS表示GCS到LCS的平动向量
% 这里要求的是LCS坐标到GCS坐标的平动
PaxisX = move_LCS_GCS(PaxisX,pointGCS);% 坐标轴平动
PaxisY = move_LCS_GCS(PaxisY,pointGCS);
PaxisZ = move_LCS_GCS(PaxisZ,pointGCS);
end
% LCS到GCS坐标点的旋转
function P_GCS = turn_LCS_GCS(Rotation,PLCS)
P_GCS = Rotation'*PLCS;
end
% LCS到GCS坐标点的平动
function p_GCS = move_LCS_GCS(P_LCS,O)
% O表示GCS到LCS的平动向量
p_GCS = P_LCS + O;% LCS坐标在GCS中的表示
end
% 绘制三轴坐标
function plot_triaxisLCS(pointLCS,AXIS)
Xaxis = AXIS(1,:);Yaxis = AXIS(2,:);Zaxis = AXIS(3,:);
% 注意,plot最少是两个点数据才能够连接成线
plot3([pointLCS(1),Xaxis(1)]',[pointLCS(2),Yaxis(1)]',[pointLCS(3),Zaxis(1)]',...
    'LineWidth',1.5,'Color',[0.85,0.33,0.10]);% 绘制X轴,橙红色
plot3([pointLCS(1),Xaxis(2)]',[pointLCS(2),Yaxis(2)]',[pointLCS(3),Zaxis(2)]',...
    'LineWidth',1.5,'Color',[0.47,0.67,0.19]);% 绘制Y轴,淡绿色
plot3([pointLCS(1),Xaxis(3)]',[pointLCS(2),Yaxis(3)]',[pointLCS(3),Zaxis(3)]',...
    'LineWidth',1.5,'Color',[0.00,0.45,0.74]);% 绘制Z轴,淡蓝色
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值