

Matlab code to calculate the AFO moment relatively to the tibia reference frame.
The input file is a csv file containing the xyx coordinates of knee, ankle joint centres, and of the markers on the AFO cluster, and malleoli, and the output from the strain gauges converted in Nm.

%--------------------------------------------------------------------------
% Analysis of strain gauges                                      
%--------------------------------------------------------------------------
close all;clear all;clc
% INPUT FROM CSV file --------------------------------------------------------
InputFile = csvread('test.csv');                                 % csv input file
Time = InputFile(:,2);
LKJCI = InputFile(:,3:5);
LAJCI = InputFile(:,6:8);
AFO1I = InputFile(:,9:11);
AFO2I = InputFile(:,12:14);
AFO3I = InputFile(:,15:17);
AFO4I = InputFile(:,18:20);
LLMALI = InputFile(:,21:23);
LMMALI = InputFile(:,24:26);
PIN34 = InputFile(:,27);
%-------------------------------------------------------------------------


% START -------------------------------------------------------------------
SizeTime = length(Time);
%adjust the input from Vicon to match ISB convention for xyz axis definition

LKJC=zeros(SizeTime,3);
LKJC(:,1)=LKJCI(:,1);
LKJC(:,2)=LKJCI(:,3);
LKJC(:,3)=-LKJCI(:,2);

LAJC=zeros(SizeTime,3);
LAJC(:,1)=LAJCI(:,1);
LAJC(:,2)=LAJCI(:,3);
LAJC(:,3)=-LAJCI(:,2);

AFO1=zeros(SizeTime,3);
AFO1(:,1)=AFO1I(:,1);
AFO1(:,2)=AFO1I(:,3);
AFO1(:,3)=-AFO1I(:,2);

AFO2=zeros(SizeTime,3);
AFO2(:,1)=AFO2I(:,1);
AFO2(:,2)=AFO2I(:,3);
AFO2(:,3)=-AFO2I(:,2);

AFO3=zeros(SizeTime,3);
AFO3(:,1)=AFO3I(:,1);
AFO3(:,2)=AFO3I(:,3);
AFO3(:,3)=-AFO3I(:,2);

AFO4=zeros(SizeTime,3);
AFO4(:,1)=AFO4I(:,1);
AFO4(:,2)=AFO4I(:,3);
AFO4(:,3)=-AFO4I(:,2);

LLMAL=zeros(SizeTime,3);
LLMAL(:,1)=LLMALI(:,1);
LLMAL(:,2)=LLMALI(:,3);
LLMAL(:,3)=-LLMALI(:,2);

LMMAL=zeros(SizeTime,3);
LMMAL(:,1)=LMMALI(:,1);
LMMAL(:,2)=LMMALI(:,3);
LMMAL(:,3)=-LMMALI(:,2);

jSG = zeros(3,SizeTime);
iSG = zeros(3,SizeTime);
kSG = zeros(3,SizeTime);
OSG = zeros(3,SizeTime);
jTI = zeros(3,SizeTime);
iTI = zeros(3,SizeTime);
kTI = zeros(3,SizeTime);
OTI = zeros(3,SizeTime);
MOMgl = zeros(3,SizeTime);
MOMti = zeros(3,SizeTime);
%GLOBAL REFERENCE FRAME ---------------------------------------------------
iGL = zeros(3,SizeTime);
jGL = zeros(3,SizeTime);
kGL = zeros(3,SizeTime);
ONE = ones(1,SizeTime);
DCMsg_gl = zeros(3,3,SizeTime);
DCMti_glT = zeros(3,3,SizeTime);
iGL(1,:) = ONE(1,:);
jGL(2,:) = ONE(1,:);
kGL(3,:) = ONE(1,:);
for it =1:SizeTime
% STRAIN GAUGES REFERENCE FRAME -------------------------------------------    
    A(:,1) = AFO1(it,:)';
    B(:,1) = AFO2(it,:)';
    C(:,1) = AFO3(it,:)';
    D(:,1) = AFO4(it,:)';
    djSG = (A-C)./norm(A-C);
    diSG = cross(A-C,B-D)./norm(cross(A-C,B-D));
    dkSG = cross(diSG,djSG);
    jSG(:,it) = djSG;
    iSG(:,it) = diSG;
    kSG(:,it) = dkSG;
    OSG(:,it) = (A+C)/2;
    DCMsg_gl(1,1,it) = dot(iGL(:,it),iSG(:,it));
    DCMsg_gl(1,2,it) = dot(iGL(:,it),jSG(:,it));
    DCMsg_gl(1,3,it) = dot(iGL(:,it),kSG(:,it));
    DCMsg_gl(2,1,it) = dot(jGL(:,it),iSG(:,it));
    DCMsg_gl(2,2,it) = dot(jGL(:,it),jSG(:,it));
    DCMsg_gl(2,3,it) = dot(jGL(:,it),kSG(:,it));
    DCMsg_gl(3,1,it) = dot(kGL(:,it),iSG(:,it));
    DCMsg_gl(3,2,it) = dot(kGL(:,it),jSG(:,it));
    DCMsg_gl(3,3,it) = dot(kGL(:,it),kSG(:,it));
% LEFT TIBIA REFERENCE FRAME ----------------------------------------------
    A(:,1) = LKJC(it,:)';
    B(:,1) = LLMAL(it,:)';
    C(:,1) = LAJC(it,:)';
    D(:,1) = LMMAL(it,:)';
    djTI = (A-C)./norm(A-C);
    diTI = cross(A-C,B-D)./norm(cross(A-C,B-D));
    dkTI = cross(diTI,djTI);
    jTI(:,it) = djTI;
    iTI(:,it) = diTI;
    kTI(:,it) = dkTI;
    OTI(:,it) = C;
    DCMti_glT(1,1,it) = dot(iGL(:,it),iTI(:,it));
    DCMti_glT(2,1,it) = dot(iGL(:,it),jTI(:,it));
    DCMti_glT(3,1,it) = dot(iGL(:,it),kTI(:,it));
    DCMti_glT(1,2,it) = dot(jGL(:,it),iTI(:,it));
    DCMti_glT(2,2,it) = dot(jGL(:,it),jTI(:,it));
    DCMti_glT(3,2,it) = dot(jGL(:,it),kTI(:,it));
    DCMti_glT(1,3,it) = dot(kGL(:,it),iTI(:,it));
    DCMti_glT(2,3,it) = dot(kGL(:,it),jTI(:,it));
    DCMti_glT(3,3,it) = dot(kGL(:,it),kTI(:,it));
% MOMENT FROM STRAIN GAUGES ----------------------------------------------- 
    MOMgl(:,it) = PIN34(it,1)*jSG(:,it);
    momgl(:,1) = MOMgl(:,it);
	ROT(:,:) = DCMti_glT(:,:,it);
    MOMti(:,it) = ROT*momgl;
end

col=MOMti(:,:)';