【以下教程示例适用于opensim4.1】
OpenSense – Kinematics with IMU Data

OpenSense是用于使用惯性测量单位inertial measurement unit(IMU)数据分析运动的新workflow。下面通过一个操作示例hands-on example描述如何使用该软件来计算和分析步态运动学
·什么是OpenSense?
·如何设置OpenSense工具
·运行OpenSense来计算步态运动学
·通过Matlab脚本自定义OpenSense工作流
·通过Python脚本运行OpenSense
·了解更多和未来的工作

一、什么是OpenSense?

OpenSense使用户能够基于惯性测量单位(IMU)数据来计算身体各部分的运动,如下图所示。以下文本和流程图总结了OpenSense工作流程。
OpenSense -运动学与IMU数据-编程知识网

(一)Inputs: OpenSim模型和IMU数据

首先,需要一个包括所专注的关节和自由度的OpenSim模型,用于研究步态下肢运动学lower-extremity kinematics during gait。从模型库中选择模型。如果只关注关节角度joint angles和其他运动量(例如,标准化的肌肉长度和拉长速度normalized muscle lengths and lengthening velocities),则无需将模型缩放到受试者的人体测量学。
必须输入来自一个或多个IMU传感器的坐标orientations。目前支持Xsens和APDM文件格式。可以创建自己的文件转换器file converter以支持任何其他IMU系统。目前,我们假设传感器融合和同步是通过供应商或第三方算法完成的。GitHub上还提供了几种开源传感器融合算法open-source sensor fusion algorithms。

(二)Registration and Calibration注册和校准

OpenSense提供了一个接口,用于将每个IMU传感器与OpenSim模型的主体部分(作为IMU框架)关联并注册。我们提供了一个基本的校准程序,在该程序中,IMU数据的第一步注册为模型的默认姿态。可以通过更改模型的默认坐标值来更改注册姿势。还可以使用Matlab,Python等编写自己的校准过程,以使用其他数据源(标记,测角仪等)优化模型的初始姿态以进行校准。

(三)Computing Inverse Kinematics计算逆运动学

逆运动学方法用于计算运动的每个时间步的一套关节角度,以最大程度地减少实验IMU坐标与模型的IMU框架之间的误差。然后可以将这些角度用作其他OpenSim工具和分析的输入,也可以在OpenSim GUI中可视化这些角度。
可通过命令行和脚本(Matlab或Python)使用OpenSense功能。可以在OpenSim GUI中加载,可视化和分析生成的模型和运动。将来,我们还将提供直接基于GUI的工具来运行基于IMU的运动学。
OpenSense -运动学与IMU数据-编程知识网

二、如何设置OpenSense工具

在Windows上执行OpenSense工作流程:
·Matlab脚本:要在Matlab中使用OpenSense,按照Matlab脚本设置说明进行操作。
·Python脚本:要在Python中使用OpenSense,遵循Python脚本设置说明
·命令行:要从命令行使用OpenSense,阅读 Command Line Utilities命令行实用程序的信息
与OpenSim一样,OpenSense工具使用XML设置文件来指定工作流程的详细信息。

三、运行OpenSense来计算步态运动学

已经设置了OpenSense后,通过一个实例展示该软件的使用,并使用来自下肢步态运动学研究的IMU实验数据进行操作。示例数据,模型,脚本和设置文件可在您的OpenSim资源目录[您的文档目录] / OpenSim / OpenSim 4.1 / Code / Matlab / OpenSenseExample下找到。

运行基于IMU的OpenSense运动学分析的基本步骤如下:
·第一步:收集和准备IMU数据
·第二步:将数据读入OpenSense
·第三步:校准OpenSim模型
·第四步:执行IMU传感器跟踪
·第五步:可视化IMU跟踪结果

下面我们将导入IMU传感器数据,校准我们的OpenSim模型,计算逆运动学,然后可视化结果。
OpenSense -运动学与IMU数据-编程知识网
在此示例中,我们使用Xsens传感器数据,除了读取数据之外,使用APDM传感器的所有步骤都是相同的。【如何导入APDM传感器数据】注意:此示例中的数据仅用于说明目的,并不用于研究目的。

第一步:收集和准备IMU数据Step One: Collect and Prepare IMU Data

收集数据并将其转换为可以读入OpenSim并使用OpenSense工作流程进行处理的格式。
1、您必须将传感器放置在您的主体上,通常每个跟踪段per tracked segment都带有一个传感器。对于每个IMU传感器都要进行追踪。
2、然后,收集对象处于已知姿势情况下的矫正数据(即,指定或记录每个关节角度)。必须跟踪校准姿势的时间标记timestamp(s)。OpenSense将使用校准数据将IMU注册到OpenSim模型。校准数据收集过程中受试者的姿势必须尽可能与模型定义的(可编辑)默认姿势匹配。可以使用诸如测角仪之类的简单测量设备来为每个对象标准化一个简单的静态姿势。
3、允许执行朝向修正heading correction,在校准阶段帮助模型在三维空间中定位。要进行heading correction,需要指定一个基本IMU(例如骨盆)和该IMU的朝向(即哪个轴指向前)。因此,要执行朝向校正,还需要基本IMU及其朝向。
4、使用相同的IMU位置收集感兴趣的运动(例如步态)。
5、对数据进行预处理。IMU传感器系统(例如Xsens和APDM)通常提供执行传感器融合sensor fusion,时间同步time syncing和对丢失数据进行数据插值 data interpolation的功能。当前版本的OpenSense假定已经执行了此预处理,并且你输入的是经过处理的旋转矩阵。
OpenSense -运动学与IMU数据-编程知识网
八个传感器放置位置如下

· 将IMU放在躯干Trunk,骨盆Pelvis以及左右大腿Thighs,小腿Shanks和双脚Feet上。
·要注意哪个传感器ID号对应受试者的哪个身体部分。Xsens传感器有名称,粗体部分不同,如:MT_012005D6_009-001_ 00B42279。该实例中传感器MT_012005D6_009-001_00B421E6被附接到骨盆。
·在我们的示例中,校准姿势是臀部,膝盖和脚踝处于(或接近)0度的中性姿势。在数据收集的第一步中,对象处于校准姿势calibration pose。
·我们将骨盆用作基础IMU。对于骨盆IMU,z轴在校准中指向前方。
·我们使用Xsens软件输出四元数以用于校准和步态数据。

第二步:将IMU数据转换为OpenSim格式Step Two: Convert IMU Data into OpenSim Format

收集并预处理数据后,必须将其转换为OpenSim的文件格式,并将其与一个OpenSim模型关联。来自IMU的数据可以采用多种格式:具有编号传感器名称的单个文件Step Five: Visualize the Results of IMU Tracking (例如APDM)或具有传感器特定编号的多个文件 multiple files with sensor-specific numbering(例如Xsens)。导入后,OpenSim将为orientations创建一个单一的时间同步存储的.sto文件,将旋转矩阵转换为四元数。
在此示例中,我们将使用来自Xsens系统的数据,该数据已经过预处理(例如,已执行时间同步和传感器融合),并已导出为Xsens文本格式。您可以在IMUData文件夹中找到此数据。每个Xsens传感器都由一个带有内部传感器数据历史记录的文本(.txt)文件表示。
要读取数据,首先需要创建一个文件,该文件使OpenSense知道哪个传感器与模型中的哪个人体节段相关联。在我们的示例中,该文件称为myIMUMappings.xml。您可以在任何文本编辑器中打开和编辑此文件。在此设置/ XML文件中,指定以下信息:

·<trial_prefix> 这是给定运动试验的所有.txt文件的公共前缀。示例前缀为“MT_012005D6_ 009-001”

· 在<trial_prefix>之后查找字符串以标识特定的传感器文件。示例中第一个传感器使用前缀“_00B42268”

·<name_in_model> 是OpenSim模型中传感器的对应名称。示例中第一个传感器与模型的躯干部分相关联。

An example setup file:
OpenSense -运动学与IMU数据-编程知识网
每个IMU传感器在OpenSim模型中均表示为一个框架,是正交XYZ坐标系。当您读入数据时,OpenSense将在模型中找到适当的IMU框架(基于映射XML文件),或者创建一个IMU框架(如果尚不存在)。OpenSense使用命名约定,将传感器命名为 _imu。例如,OpenSim模型的右股骨主体名为femur_r,因此IMU传感器必须称为femur_r_imu。
然后,IMU reader会创建一个包含每个传感器的方向数据的存储文件,其中存储文件中的每一列都是根据相应OpenSim模型中的Frame命名的。要读入数据,根据访问OpenSense工作流程的方式使用以下步骤:

Matlab命令从IMU传感器数据创建方向文件an orientations file

启动Matlab并将OpenSimExampleFiles文件夹设置为您的工作目录working directory。输入以下代码以读取IMU传感器数据。

% Import the OpenSim libraries
import org.opensim.modeling.*;

% Create an xsensDataReader and supply the settings file that maps IMUs to your model
xsensSettings = XsensDataReaderSettings(‘myIMUMappings.xml’); %
xsensReader = XsensDataReader(xsensSettings);

% Read the quaternion data and write it to a STO file for in OpenSense workflow
tables = xsensReader.read(‘IMUData/’);
quaternionTable = xsensReader.getOrientationsTable(tables);
STOFileAdapterQuaternion.write(quaternionTable, [char(xsensSettings.get_trial_prefix()) ‘_orientations.sto’]);

从IMU传感器数据创建方向文件的命令行工具

第三步:校准OpenSim模型Step Three: Calibrate an OpenSim Model

下一步是将IMU根据OpenSim模型进行校准。OpenSense校准步骤采用一个OpenSim模型和IMU校准数据,并找到IMU框架相对于OpenSim主体段的初始方向(即偏移)。我们提供了用于校准的基本算法,或者您也可以通过开发自己的算法(使用C ++或通过脚本)来计算默认姿态和/或IMU传感器的变换来创建自己的校准方法。
要校准模型,首先需要一个存储有关模型信息的设置文件setup file,方向文件orientations file以及在校准过程中要使用的一些设置。示例中该文件称为myIMUPlacer_Setup.xml。可以在任何文本编辑器中打开和编辑此文件。在此设置/ XML文件中,指定以下信息:

·<model_file> 要使用OpenSense的校准,必须在校准步骤中提供一个OpenSim模型。示例中,我们使用的是Rajagopal(2015)模型。如上所述,在读取数据时,您的模型应附有与第二步中指定的name_in_model相对应的IMU框架,如果您使用我们假定的命名约定( _imu),只要有对应的主体段具有匹配的校准步骤会将IMU框架添加到模型中。
OpenSense校准假定校准数据中对象的姿势与模型的默认姿势匹配。示例中,校准姿势是骨盆,臀部,膝盖和脚踝处于自然位置,因此我们无需对模型的默认姿势进行任何调整。如果使用其他姿势,则可以通过脚本或XML在OpenSim GUI中编辑输入的姿势(请参阅坐标控件和姿势 Coordinate Controls and Poses以了解如何通过OpenSim GUI编辑默认姿势)。

·<orientation_file_for_calibration> 接下来,您必须提供校准数据。OpenSense假定第一个时间点对应于校准姿势。如果您尝试在除第一时间行以外的某个时间执行校准姿势的试验,则必须编辑方向文件(或制作一个新文件)以便其中的第一时间行最适用于校准姿势。

·<sensor_to_opensim_rotations> 您还必须提供将IMU全局坐标系(通常Z向上,Y在左侧)转换为OpenSim全局坐标系(Y向上,Z在右侧)所需的旋转。
可以指定可选参数,使OpenSense能够校正或调整IMU数据与OpenSim模型的朝向(正向)的总体差异。通常,OpenSim模型在初始姿势中朝向地面坐标系的正X方向,但是基本IMU(例如,在骨盆或躯干上)可以具有任何初始朝向。要执行朝向校正,需要更新以下设置:

·<base_imu_label> 在提供的方向数据中标识基本IMU的标签。默认值是未提供base_imu_label,因此将不执行朝向校正。

·<base_heading_axis> 这是基本IMU的轴,代表其朝向。轴可以是 “x”,“-x”,“y”,“-y”,“z”或“-z”。

An example setup file:
OpenSense -运动学与IMU数据-编程知识网
OpenSense将计算两个姿势之间的角度偏移,并使用它旋转所有方向数据,以使基本IMU的朝向沿着OpenSim地面参考系的X轴(与模型相同)定向。示例中,将pelvis_imu设置为基本IMU,并且z是与其朝向对应的基本IMU的轴。如果未提供<base_imu_label>或<base_heading_axis>,则不会执行航向校正。

·<output_model_file> 校准步骤的输出是已校准的模型,其中每个IMU都注册到OpenSim模型。此设置可以指定输出模型文件名。

下图显示了我们的示例对象,在骨盆,躯干,大腿,小腿和脚部分上带有IMU,并且与匹配姿势相对应的OpenSim模型。
OpenSense -运动学与IMU数据-编程知识网
使用Matlab命令在OpenSense中校准模型
% Setup and run the IMUPlacer tool, with model visualization set to true
myIMUPlacer = IMUPlacer(‘myIMUPlacer_Setup.xml’);
myIMUPlacer.run(true);

% Write the calibrated model to file
myIMUPlacer.getCalibratedModel().print(‘Rajagopal_2015_calibrated.osim’);

用于在OpenSense中校准模型的命令行工具

OpenSense -运动学与IMU数据-编程知识网
出现一个可视化器窗口,显示已校准的模型。模型的姿势由模型的默认姿势确定,并且不会从一个校准更改为下一个校准(除非您编辑模型的默认姿势)。变化的是连接到每个主体的传感器的方向。您可以放大位于每个主体组件对象模型(Component Object Model)COM处的橙色小砖块表示的传感器。 注意:选中后,可以使用ctrl-Q键盘快捷键关闭可视化程序窗口。
OpenSense -运动学与IMU数据-编程知识网
您将看到每个IMU的校准偏移的打印输出。这是模型主体与IMU传感器之间的转换。
若要继续校准,并将校准后的模型print到文件中,选择可视化器窗口,然后按任意键继续。
校准模型将写入文件,并添加后缀(即,如果输入模型文件名为model.osim,则输出校准模型文件将命名为model_calibrated.osim)。

第四步:执行IMU传感器跟踪Step Four: Perform IMU Sensor Tracking

到这里,已经读入数据并校准了模型,则可以使用OpenSense的逆运动学来跟踪来自IMU传感器的方向数据。“逆运动学”步骤可在每个时间步中找到模型的姿态,以最小二乘的方式将来自IMU传感器的方向数据与已校准模型上IMU框架之间的差异最小化。计算的运动学取决于校准的模型和传感器数据。因此,要执行方向数据的反向运动学跟踪,需要(i)校准模型(.osim),(ii)方向文件 an orientations(作为四元数)和(iii)反向运动学设置文件(.xml)。使用我们在上一节中生成的校准模型,跟踪在第二步中读取的步行方向数据。
在文本编辑器(例如Notepad ++,SublimeText,Atom或Matlab)中,打开myIMUIK_ Setup.xml文件。设置文件存储了一些属性,这些属性告诉OpenSense如何运行逆运动学仿真。在安装文件中指定:

·<time_range> 逆运动学跟踪的时间范围(以秒为单位)。示例中使用7.25-15秒之间数据。

·<sensor_to_opensim_rotations> 将 rotation(旋转矩阵?)从IMU全局坐标系(通常为Z向上,Y向左)转换为OpenSim全局坐标系(Y向上,Z向右)。

·<model_file_name> 跟踪中要使用的校准模型文件(.osim)的名称/路径。示例中使用Rajagopal_2015_calibrated.osim文件,它是第三步的输出。

·<orientations_file_name> 被追踪的传感器框架方向(作为四元数)的.sto文件的名称/路径。示例中使用第二步中创建的MT_012005D6_009-001_orientations.sto。

·<results_directory> 将结果打印到文件的目录。

An example setup file:
OpenSense -运动学与IMU数据-编程知识网
现在,保留这些设置不变。可以在你的workflow中复制和编辑此设置文件。

Matlab commands to perform inverse kinematics

Matlab命令执行逆运动学

在Matlab中执行以下代码,以使用IMU数据运行逆运动学。
% Setup and run the IMU IK tool with visualization set to true.
imuIK = IMUInverseKinematicsTool(‘myIMUIK_Setup.xml’);
imuIK.run(true);
命令行工具执行逆运动学

第五步:可视化IMU跟踪结果Step Five: Visualize the Results of IMU Tracking

可以使用OpenSim应用程序(GUI)可视化器查看和绘制模拟结果。您还可以使用OpenSim的绘图仪来绘制运动学图,或使用其他OpenSim管道工具执行进一步的分析。(注意:如果要生成肌肉驱动的模拟,通常需要缩放模型并提供地面反作用力ground reaction forces。)

1、查看逆运动学结果 view the Inverse Kinematics results:

·打开OpenSim 4.1应用程序。
·打开模型:calibrated_Rajagopal_2015.osim
·加载您在第四步中创建的运动:IKResults / ik_MT_012005D6_009-001_orientations.mot。
由于IMU无法跟踪全局平移,只能跟踪相对方向,因此该模型似乎围绕单个位置旋转。
OpenSense -运动学与IMU数据-编程知识网

2、绘制OpenSense运动学plot the OpenSense Kinematics

·Tools-Plot
·Y-Quantity-Load File-IKResults/MT_012005D6_009-001_orientations.sto
·hip_flexion_r, knee_angle_r, & ankle_angle_r coordinates.
·X-Quantity-Time-Add
OpenSense -运动学与IMU数据-编程知识网

四、Customizing the OpenSense Workflow via Matlab Scripting 通过Matlab脚本自定义OpenSense工作流

上述步骤以简化的方式在Matlab脚本环境中运行了OpenSense。Matlab界面提供了其他工具来自定义工作流程。

Example Matlab scripts to compute gait kinematics实例Matlab脚本来计算步态运动学

1、Matlab scripting to create an orientations file from IMU sensor data Matlab脚本从IMU传感器数据创建方向文件

可以通过Matlab脚本界面将IMU数据读入OpenSense。我们仍将使用myIMUMappings.xml文件来定义从IMU传感器到OpenSim模型的映射。脚本接口的一个特性是,可以读取IMU加速度、磁力计和陀螺仪数据,并将其导出到文件中到文件中。
·启动Matlab并导航到OpenSenseExample 文件夹。
·打开并运行OpenSense_IMUDataConverter.m脚本。
·运行脚本。生成一个方向文件 MT_012005D6_009-001_orientations.sto以及_acceleration,_magnetometer和_gyro 数据文件。

2、Matlab scripting for calibration使用Matlab脚本进行校准

脚本界面类似于命令行。需要操作者提供模型名称,方向文件,以及基本的IMU名称和朝向(the model names, the orientations file, and, optionally, the base IMU name and heading)。还可以指定是否要可视化校准后的模型。
要执行校准,在Matlab中运行OpenSense_CalibrateModel.m脚本。将打开一个可视化窗口,显示已校准的模型以及已写入文件的已校准的模型。

3、Matlab scripting to run inverse kinematics利用Matlab脚本运行逆运动学

OpenSense的IMUInverseKinematicsTool的脚本接口使操作者可以更好地控制逆运动学特性。特别是,可以可视化逆运动学跟踪。
要执行逆运动学,请在Matlab中打开并运行文件OpenSense_OrientationTracking.m脚本。将打开一个可视化器窗口,显示模型对IMU方向的运动跟踪。方向跟踪的结果将被写入IKResults目录。结果可以在OpenSim GUI中绘制,类似于上面所做的。

五、通过Python脚本运行OpenSense Running OpenSense via Python Scripting

您可以通过Python脚本环境运行OpenSense。Python接口提供了额外的工具来定制工作流,还允许实时可视化逆运动学工具的结果visualize in real-time。

实例Python脚本计算步态运动学
用Python运行示例中的工作流的脚本。步骤与上面描述的Matlab指令是并行的。可以在OpenSim资源目录中找到这些文件。

六、了解更多和未来的工作

通常,APDM将试验输出为.h5文件和.csv ASCII文本文件(以逗号分隔,按传感器顺序分组)。OpenSense APDM Reader只能读取CSV文件类型。
要读取APDM CSV文件,必须创建一个将APDM .csv文件中的列标签与OpenSim模型主体段相关联的文件。可以在任何文本编辑器中打开和编辑此文件。在此设置/ XML文件中,指定以下信息:
·一个字符串,用于标识APDM传感器文件中的特定列。示例中第一个传感器使用列名称“Trunk”。
·<name_in_model> OpenSim模型中传感器的相应名称。第一个传感器与模型的torso_imu段相关。
下载示例 APDM设置文件 APDM Settings file 和相应的示例APDM传感器数据APDM sensor data。可以在任何文本编辑器中打开和编辑此文件。设置文件的片段如下所示:
OpenSense -运动学与IMU数据-编程知识网
Matlab commands to create an orientations file from APDM IMU sensor data
Matlab命令从APDM IMU传感器数据创建方向文件

启动Matlab并将包含APDM文件的文件夹设置为工作目录。输入以下代码,更改工作流程的试用名称和myIMUMappings.xml文件名。

% Import the OpenSim libraries
import org.opensim.modeling.*;

% Define the trial name
trialName = ‘exampleAPDM_Data.csv’;

% Create an APDMDataReader and supply the settings file that maps IMUs to your model
apdmSettings = APDMDataReaderSettings(‘exampleAPDM_Settings.xml’);
myAPDMDataReader = APDMDataReader(apdmSettings);

% Read the quaternion data and write it to a STO file for use in OpenSense workflow
tables = myAPDMDataReader.read( trialName );
quaternionTable = myAPDMDataReader.getOrientationsTable(tables);
STOFileAdapterQuaternion.write(quaternionTable, strrep(trialName,’.csv’, ‘_orientations.sto’) );

要使用OpenSense APDM命令行工具读取APDM数据并导出.sto文件以用于OpenSense,使用以下调用:

opensense -ReadAPDM exampleAPDM_Data.csv exampleAPDM_Settings.xml

未来的工作

当前版本的OpenSense是将基于IMU的生物力学引入研究界的第一步。计划在将来的版本中增加一些其他增强功能和新功能,例如:

·直接支持其他IMU传感器
·更高级的校准和接口方法,以更好地支持用户开发自己的校准协议
·直接在OpenSim应用程序(GUI)中支持OpenSense逆运动学
·轻松可视化数据和调试结果的工具(例如,传感器是否已注册到正确的身体部位?)