# Copyright 2023, Junjia LIU, jjliu@mae.cuhk.edu.hk
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import numpy as np
from rofunc.devices.xsens.src.load_mvnx import load_mvnx
from rofunc.utils.oslab.path import get_rofunc_path
from rofunc.utils.logger.beauty_logger import beauty_print
[docs]def get_human_params(mvnx_file, human_mass, human_height):
human_params = {}
# -- Link base --
# - Pelvis -
# joints
pelvis_data = mvnx_file.file_data['segments']['elements']['Pelvis']
human_params['jL5S1'] = pelvis_data['points_mvn']['jL5S1']
human_params['jLeftHip'] = pelvis_data['points_mvn']['jLeftHip']
human_params['jRightHip'] = pelvis_data['points_mvn']['jRightHip']
# box size
pLeftASI = pelvis_data['points_mvn']['pLeftASI']
pRightASI = pelvis_data['points_mvn']['pRightASI']
pSacrum = pelvis_data['points_mvn']['pSacrum']
pelvis_x = pLeftASI[0] - pSacrum[0]
pelvis_y = pLeftASI[1] - pRightASI[1]
pelvis_z = human_params['jL5S1'][2] - human_params['jRightHip'][2]
human_params['pelvisBox'] = [pelvis_x, pelvis_y, pelvis_z]
# box origin
originWrtRightUpperCorner = 0.5 * np.array([-pelvis_x, pelvis_y, -pelvis_z]) # wrt pRightUpperCorner
human_params['pelvisBoxOrigin'] = np.array(
[pRightASI[0], pRightASI[1], human_params['jL5S1'][2]]) + originWrtRightUpperCorner # wrt pHipOrigin
# mass and inertia
human_params['pelvisMass'] = 0.08 * human_mass
human_params['pelvisIxx'] = human_params['pelvisMass'] / 12.0 * (pelvis_y ** 2 + pelvis_z ** 2)
human_params['pelvisIyy'] = human_params['pelvisMass'] / 12.0 * (pelvis_x ** 2 + pelvis_z ** 2)
human_params['pelvisIzz'] = human_params['pelvisMass'] / 12.0 * (pelvis_x ** 2 + pelvis_y ** 2)
# markers
human_params['pHipOrigin'] = pelvis_data['points_mvn']['pHipOrigin']
human_params['pRightASI'] = pelvis_data['points_mvn']['pRightASI']
human_params['pLeftASI'] = pelvis_data['points_mvn']['pLeftASI']
human_params['pRightCSI'] = pelvis_data['points_mvn']['pRightCSI']
human_params['pLeftCSI'] = pelvis_data['points_mvn']['pLeftCSI']
human_params['pRightIschialTub'] = pelvis_data['points_mvn']['pRightIschialTub']
human_params['pLeftIschialTub'] = pelvis_data['points_mvn']['pLeftIschialTub']
human_params['pSacrum'] = pelvis_data['points_mvn']['pSacrum']
# -- Chain links 2~7 --
# - L5 -
# joints
l5_data = mvnx_file.file_data['segments']['elements']['L5']
human_params['jL4L3'] = l5_data['points_mvn']['jL4L3']
# box size
L5_x = pelvis_x
L5_y = human_params['jLeftHip'][1] - human_params['jRightHip'][1]
L5_z = human_params['jL4L3'][2]
human_params['L5Box'] = [L5_x, L5_y, L5_z]
# box origin
human_params['L5BoxOrigin'] = 0.5 * np.array([0, 0, L5_z]) # wrt jL5S1
# mass and inertia
human_params['L5Mass'] = 0.102 * human_mass
human_params['L5Ixx'] = human_params['L5Mass'] / 12.0 * (L5_y ** 2 + L5_z ** 2)
human_params['L5Iyy'] = human_params['L5Mass'] / 12.0 * (L5_x ** 2 + L5_z ** 2)
human_params['L5Izz'] = human_params['L5Mass'] / 12.0 * (L5_x ** 2 + L5_y ** 2)
# markers
human_params['pL5SpinalProcess'] = l5_data['points_mvn']['pL5SpinalProcess']
# - L3 -
# joints
l3_data = mvnx_file.file_data['segments']['elements']['L3']
human_params['jL1T12'] = l3_data['points_mvn']['jL1T12']
# box size
L3_x = pelvis_x
L3_y = L5_y
L3_z = human_params['jL1T12'][2]
human_params['L3Box'] = [L3_x, L3_y, L3_z]
# box origin
human_params['L3BoxOrigin'] = 0.5 * np.array([0, 0, L3_z]) # wrt jL4L3
# mass and inertia
human_params['L3Mass'] = 0.102 * human_mass
human_params['L3Ixx'] = human_params['L3Mass'] / 12.0 * (L3_y ** 2 + L3_z ** 2)
human_params['L3Iyy'] = human_params['L3Mass'] / 12.0 * (L3_x ** 2 + L3_z ** 2)
human_params['L3Izz'] = human_params['L3Mass'] / 12.0 * (L3_x ** 2 + L3_y ** 2)
# markers
human_params['pL3SpinalProcess'] = l3_data['points_mvn']['pL3SpinalProcess']
# - T12 -
# joints
t12_data = mvnx_file.file_data['segments']['elements']['T12']
human_params['jT9T8'] = t12_data['points_mvn']['jT9T8']
# box size
T12_x = pelvis_x
T12_y = L5_y
T12_z = human_params['jT9T8'][2]
human_params['T12Box'] = [T12_x, T12_y, T12_z]
# box origin
human_params['T12BoxOrigin'] = 0.5 * np.array([0, 0, T12_z]) # wrt jL1T12
# mass and inertia
human_params['T12Mass'] = 0.102 * human_mass
human_params['T12Ixx'] = human_params['T12Mass'] / 12.0 * (T12_y ** 2 + T12_z ** 2)
human_params['T12Iyy'] = human_params['T12Mass'] / 12.0 * (T12_x ** 2 + T12_z ** 2)
human_params['T12Izz'] = human_params['T12Mass'] / 12.0 * (T12_x ** 2 + T12_y ** 2)
# markers
human_params['pT12SpinalProcess'] = t12_data['points_mvn']['pT12SpinalProcess']
# - T8 -
# joints
t8_data = mvnx_file.file_data['segments']['elements']['T8']
human_params['jT1C7'] = t8_data['points_mvn']['jT1C7']
human_params['jRightT4Shoulder'] = t8_data['points_mvn']['jRightT4Shoulder']
human_params['jLeftT4Shoulder'] = t8_data['points_mvn']['jLeftT4Shoulder']
# box size
neck_data = mvnx_file.file_data['segments']['elements']['Neck']
pC7SpinalProcess = neck_data['points_mvn']['pC7SpinalProcess']
pPX = t8_data['points_mvn']['pPX']
T8_x = pPX[0] - pC7SpinalProcess[0]
T8_y = human_params['jLeftT4Shoulder'][1] - human_params['jRightT4Shoulder'][1]
T8_z = human_params['jT1C7'][2]
human_params['T8Box'] = [T8_x, T8_y, T8_z]
# box origin
human_params['T8BoxOrigin'] = 0.5 * np.array([0, 0, T8_z]) # wrt jT9T8
# mass and inertia
human_params['T8Mass'] = 0.04 * human_mass
human_params['T8Ixx'] = human_params['T8Mass'] / 12.0 * (T8_y ** 2 + T8_z ** 2)
human_params['T8Iyy'] = human_params['T8Mass'] / 12.0 * (T8_x ** 2 + T8_z ** 2)
human_params['T8Izz'] = human_params['T8Mass'] / 12.0 * (T8_x ** 2 + T8_y ** 2)
# markers
human_params['pPX'] = t8_data['points_mvn']['pPX']
human_params['pIJ'] = t8_data['points_mvn']['pIJ']
human_params['pC7SpinalProcess'] = neck_data['points_mvn']['pC7SpinalProcess'] # TODO: check
human_params['pT8SpinalProcess'] = t8_data['points_mvn']['pT8SpinalProcess']
human_params['pT4SpinalProcess'] = t8_data['points_mvn']['pT4SpinalProcess']
# - Neck -
# joints
neck_data = mvnx_file.file_data['segments']['elements']['Neck']
human_params['jC1Head'] = neck_data['points_mvn']['jC1Head']
# box size
pC7SpinalProcess = neck_data['points_mvn']['pC7SpinalProcess']
human_params['neck_x'] = np.abs(pC7SpinalProcess[0])
human_params['neck_z'] = human_params['jC1Head'][2]
# box origin
human_params['neckBoxOrigin'] = 0.5 * np.array([0, 0, human_params['neck_z']]) # wrt jT1C7
# mass and inertia
human_params['neckMass'] = 0.012 * human_mass
human_params['neckIxx'] = human_params['neckMass'] / 12.0 * (
3 * human_params['neck_x'] ** 2 + human_params['neck_z'] ** 2)
human_params['neckIyy'] = human_params['neckMass'] / 12.0 * (
3 * human_params['neck_x'] ** 2 + human_params['neck_z'] ** 2)
human_params['neckIzz'] = human_params['neckMass'] / 2.0 * (human_params['neck_x'] ** 2)
# - Head -
# box size
head_data = mvnx_file.file_data['segments']['elements']['Head']
pTopHead = head_data['points_mvn']['pTopOfHead']
human_params['head_z'] = np.abs(pTopHead[2])
# box origin
human_params['headBoxOrigin'] = 0.5 * np.array([0, 0, human_params['head_z']]) # wrt C1Head
# mass and inertia
human_params['headMass'] = 0.036 * human_mass
human_params['headIxx'] = 2 * human_params['headMass'] / 5.0 * ((human_params['head_z'] / 2.) ** 2)
human_params['headIyy'] = 2 * human_params['headMass'] / 5.0 * ((human_params['head_z'] / 2.) ** 2)
human_params['headIzz'] = 2 * human_params['headMass'] / 5.0 * ((human_params['head_z'] / 2.) ** 2)
# markers
human_params['pTopOfHead'] = head_data['points_mvn']['pTopOfHead']
human_params['pRightAuricularis'] = head_data['points_mvn']['pRightAuricularis']
human_params['pLeftAuricularis'] = head_data['points_mvn']['pLeftAuricularis']
human_params['pBackOfHead'] = head_data['points_mvn']['pBackOfHead']
# -- Chain links 8~11 --
# - Right shoulder -
# joints
right_shoulder_data = mvnx_file.file_data['segments']['elements']['RightShoulder']
human_params['jRightShoulder'] = right_shoulder_data['points_mvn']['jRightShoulder']
# box size
pRightAcromion = right_shoulder_data['points_mvn']['pRightAcromion']
human_params['rightSho_y'] = np.abs(human_params['jRightShoulder'][1])
human_params['rightSho_z'] = np.abs(pRightAcromion[2]) # TODO: assumption
# box origin
human_params['rightShoulderBoxOrigin'] = 0.5 * np.array([0, -human_params['rightSho_y'], 0]) # wrt jRightT4Shoulder
# mass and inertia
human_params['rightShoulderMass'] = 0.031 * human_mass
human_params['rightShoulderIxx'] = human_params['rightShoulderMass'] / 12. * (
human_params['rightSho_y'] ** 2 + 3 * (human_params['rightSho_z'] / 2) ** 2)
human_params['rightShoulderIyy'] = human_params['rightShoulderMass'] / 2. * ((human_params['rightSho_z'] / 2) ** 2)
human_params['rightShoulderIzz'] = human_params['rightShoulderMass'] / 12. * (
human_params['rightSho_y'] ** 2 + 3 * (human_params['rightSho_z'] / 2) ** 2)
# markers
human_params['pRightAcromion'] = right_shoulder_data['points_mvn']['pRightAcromion']
# - Right upper arm -
# joints
right_upper_arm_data = mvnx_file.file_data['segments']['elements']['RightUpperArm']
human_params['jRightElbow'] = right_upper_arm_data['points_mvn']['jRightElbow']
# box size
pRightArmLatEp = right_upper_arm_data['points_mvn']['pRightArmLatEpicondyle']
pRightArmMedEp = right_upper_arm_data['points_mvn']['pRightArmMedEpicondyle']
human_params['rightUpperArm_y'] = np.abs(human_params['jRightElbow'][1])
human_params['rightUpperArm_z'] = pRightArmLatEp[2] - pRightArmMedEp[2]
# box origin
human_params['rightUpperArmBoxOrigin'] = 0.5 * np.array(
[0, -human_params['rightUpperArm_y'], 0]) # wrt jRightShoulder
# mass and inertia
human_params['rightUpperArmMass'] = 0.030 * human_mass
human_params['rightUpperArmIxx'] = human_params['rightUpperArmMass'] / 12. * (
human_params['rightUpperArm_y'] ** 2 + 3 * (human_params['rightUpperArm_z'] / 2) ** 2)
human_params['rightUpperArmIyy'] = human_params['rightUpperArmMass'] / 2. * (
(human_params['rightUpperArm_z'] / 2) ** 2)
human_params['rightUpperArmIzz'] = human_params['rightUpperArmMass'] / 12. * (
human_params['rightUpperArm_y'] ** 2 + 3 * (human_params['rightUpperArm_z'] / 2) ** 2)
# markers
human_params['pRightArmLatEpicondyle'] = right_upper_arm_data['points_mvn']['pRightArmLatEpicondyle']
human_params['pRightArmMedEpicondyle'] = right_upper_arm_data['points_mvn']['pRightArmMedEpicondyle']
# - Right forearm -
# joints
right_forearm_data = mvnx_file.file_data['segments']['elements']['RightForeArm']
human_params['jRightWrist'] = right_forearm_data['points_mvn']['jRightWrist']
human_params['jRightWrist'][1] = human_params['jRightWrist'][1]
# box size
human_params['rightForeArm_y'] = np.abs(human_params['jRightWrist'][1])
human_params['rightForeArm_z'] = 2 / 3 * human_params['rightUpperArm_z'] # assumption
# box origin
human_params['rightForeArmBoxOrigin'] = 0.5 * np.array([0, -human_params['rightForeArm_y'], 0]) # wrt jRightElbow
# mass and inertia
human_params['rightForeArmMass'] = 0.020 * human_mass
human_params['rightForeArmIxx'] = human_params['rightForeArmMass'] / 12. * (
human_params['rightForeArm_y'] ** 2 + 3 * (human_params['rightForeArm_z'] / 2) ** 2)
human_params['rightForeArmIyy'] = human_params['rightForeArmMass'] / 2. * (
(human_params['rightForeArm_z'] / 2) ** 2)
human_params['rightForeArmIzz'] = human_params['rightForeArmMass'] / 12. * (
human_params['rightForeArm_y'] ** 2 + 3 * (human_params['rightForeArm_z'] / 2) ** 2)
# markers
human_params['pRightUlnarStyloid'] = right_forearm_data['points_mvn']['pRightUlnarStyloid']
human_params['pRightRadialStyloid'] = right_forearm_data['points_mvn']['pRightRadialStyloid']
human_params['pRightOlecranon'] = right_forearm_data['points_mvn']['pRightOlecranon']
# - Right hand -
# box size
right_hand_data = mvnx_file.file_data['segments']['elements']['RightHand']
pTopHand = right_hand_data['points_mvn']['pRightTopOfHand']
rightHand_y = np.abs(pTopHand[1])
rightHand_x = 2 / 3 * rightHand_y # assumption
rightHand_z = human_params['rightForeArm_z'] # assumption
human_params['rightHandBox'] = np.array([rightHand_x, rightHand_y, rightHand_z])
# box origin
human_params['rightHandBoxOrigin'] = 0.5 * np.array([0, -rightHand_y, 0]) # wrt jRightWrist
# mass and inertia
human_params['rightHandMass'] = 0.006 * human_mass
human_params['rightHandIxx'] = human_params['rightHandMass'] / 12. * (rightHand_y ** 2 + rightHand_z ** 2)
human_params['rightHandIyy'] = human_params['rightHandMass'] / 12. * (rightHand_x ** 2 + rightHand_z ** 2)
human_params['rightHandIzz'] = human_params['rightHandMass'] / 12. * (rightHand_x ** 2 + rightHand_y ** 2)
# markers
human_params['pRightTopOfHand'] = right_hand_data['points_mvn']['pRightTopOfHand']
human_params['pRightPinky'] = right_hand_data['points_mvn']['pRightPinky']
human_params['pRightBallHand'] = right_hand_data['points_mvn']['pRightBallHand']
# -- Chain links 12~15 --
# - Left shoulder -
# joints
left_shoulder_data = mvnx_file.file_data['segments']['elements']['LeftShoulder']
human_params['jLeftShoulder'] = left_shoulder_data['points_mvn']['jLeftShoulder']
# box size
pLeftAcromion = left_shoulder_data['points_mvn']['pLeftAcromion']
human_params['leftSho_y'] = np.abs(human_params['jLeftShoulder'][1])
human_params['leftSho_z'] = np.abs(pLeftAcromion[2]) # assumption
# box origin
human_params['leftShoulderBoxOrigin'] = 0.5 * np.array([0, human_params['leftSho_y'], 0]) # wrt jLeftT4Shoulder
# mass and inertia
human_params['leftShoulderMass'] = 0.031 * human_mass
human_params['leftShoulderIxx'] = human_params['leftShoulderMass'] / 12. * (
human_params['leftSho_y'] ** 2 + 3 * (human_params['leftSho_z'] / 2) ** 2)
human_params['leftShoulderIyy'] = human_params['leftShoulderMass'] / 2. * ((human_params['leftSho_z'] / 2) ** 2)
human_params['leftShoulderIzz'] = human_params['leftShoulderMass'] / 12. * (
human_params['leftSho_y'] ** 2 + 3 * (human_params['leftSho_z'] / 2) ** 2)
# markers
human_params['pLeftAcromion'] = left_shoulder_data['points_mvn']['pLeftAcromion']
# - Left upper arm -
# joints
left_upper_arm_data = mvnx_file.file_data['segments']['elements']['LeftUpperArm']
human_params['jLeftElbow'] = left_upper_arm_data['points_mvn']['jLeftElbow']
# box size
pLeftArmLatEp = left_upper_arm_data['points_mvn']['pLeftArmLatEpicondyle']
pLeftArmMedEp = left_upper_arm_data['points_mvn']['pLeftArmMedEpicondyle']
human_params['leftUpperArm_y'] = np.abs(human_params['jLeftElbow'][1])
human_params['leftUpperArm_z'] = pLeftArmLatEp[2] - pLeftArmMedEp[2]
# box origin
human_params['leftUpperArmBoxOrigin'] = 0.5 * np.array([0, human_params['leftUpperArm_y'], 0]) # wrt jLeftShoulder
# mass and inertia
human_params['leftUpperArmMass'] = 0.030 * human_mass
human_params['leftUpperArmIxx'] = human_params['leftUpperArmMass'] / 12. * (
human_params['leftUpperArm_y'] ** 2 + 3 * (human_params['leftUpperArm_z'] / 2) ** 2)
human_params['leftUpperArmIyy'] = human_params['leftUpperArmMass'] / 2. * (
(human_params['leftUpperArm_z'] / 2) ** 2)
human_params['leftUpperArmIzz'] = human_params['leftUpperArmMass'] / 12. * (
human_params['leftUpperArm_y'] ** 2 + 3 * (human_params['leftUpperArm_z'] / 2) ** 2)
# markers
human_params['pLeftArmLatEpicondyle'] = left_upper_arm_data['points_mvn']['pLeftArmLatEpicondyle']
human_params['pLeftArmMedEpicondyle'] = left_upper_arm_data['points_mvn']['pLeftArmMedEpicondyle']
# - Left foreArm -
# joints
left_forearm_data = mvnx_file.file_data['segments']['elements']['LeftForeArm']
human_params['jLeftWrist'] = left_forearm_data['points_mvn']['jLeftWrist']
# box size
human_params['leftForeArm_y'] = np.abs(human_params['jLeftWrist'][1])
human_params['leftForeArm_z'] = 2 / 3 * human_params['leftUpperArm_z'] # assumption
# box origin
human_params['leftForeArmBoxOrigin'] = 0.5 * np.array([0, human_params['leftForeArm_y'], 0]) # wrt jLeftElbow
# mass and inertia
human_params['leftForeArmMass'] = 0.020 * human_mass
human_params['leftForeArmIxx'] = human_params['leftForeArmMass'] / 12. * (
human_params['leftForeArm_y'] ** 2 + 3 * (human_params['leftForeArm_z'] / 2) ** 2)
human_params['leftForeArmIyy'] = human_params['leftForeArmMass'] / 2. * ((human_params['leftForeArm_z'] / 2) ** 2)
human_params['leftForeArmIzz'] = human_params['leftForeArmMass'] / 12. * (
human_params['leftForeArm_y'] ** 2 + 3 * (human_params['leftForeArm_z'] / 2) ** 2)
# markers
human_params['pLeftUlnarStyloid'] = left_forearm_data['points_mvn']['pLeftUlnarStyloid']
human_params['pLeftRadialStyloid'] = left_forearm_data['points_mvn']['pLeftRadialStyloid']
human_params['pLeftOlecranon'] = left_forearm_data['points_mvn']['pLeftOlecranon']
# - Left hand -
# box size
left_hand_data = mvnx_file.file_data['segments']['elements']['LeftHand']
pTopHand = left_hand_data['points_mvn']['pLeftTopOfHand']
leftHand_y = np.abs(pTopHand[1])
leftHand_x = 2 / 3 * leftHand_y # assumption
leftHand_z = human_params['leftForeArm_z'] # assumption
human_params['leftHandBox'] = np.array([leftHand_x, leftHand_y, leftHand_z])
# box origin
human_params['leftHandBoxOrigin'] = 0.5 * np.array([0, leftHand_y, 0]) # wrt jLeftWrist
# mass and inertia
human_params['leftHandMass'] = 0.006 * human_mass
human_params['leftHandIxx'] = human_params['leftHandMass'] / 12. * (leftHand_y ** 2 + leftHand_z ** 2)
human_params['leftHandIyy'] = human_params['leftHandMass'] / 12. * (leftHand_x ** 2 + leftHand_z ** 2)
human_params['leftHandIzz'] = human_params['leftHandMass'] / 12. * (leftHand_x ** 2 + leftHand_y ** 2)
# markers
human_params['pLeftTopOfHand'] = left_hand_data['points_mvn']['pLeftTopOfHand']
human_params['pLeftPinky'] = left_hand_data['points_mvn']['pLeftPinky']
human_params['pLeftBallHand'] = left_hand_data['points_mvn']['pLeftBallHand']
# -- Chain links 16~19 --
# - Right Upper Leg -
# joints
right_upper_leg_data = mvnx_file.file_data['segments']['elements']['RightUpperLeg']
human_params['jRightKnee'] = right_upper_leg_data['points_mvn']['jRightKnee']
# box size
pRightTro = right_upper_leg_data['points_mvn']['pRightGreaterTrochanter']
pRightKneeUL = right_upper_leg_data['points_mvn']['pRightKneeMedEpicondyle']
human_params['rightUpperLeg_x'] = pRightKneeUL[1] - pRightTro[1]
human_params['rightUpperLeg_z'] = np.abs(human_params['jRightKnee'][2])
# box origin
human_params['rightUpperLegBoxOrigin'] = 0.5 * np.array([0, 0, -human_params['rightUpperLeg_z']]) # wrt jRightHip
# mass and inertia
human_params['rightUpperLegMass'] = 0.125 * human_mass
human_params['rightUpperLegIxx'] = human_params['rightUpperLegMass'] / 12. * (
3 * (human_params['rightUpperLeg_x'] / 2) ** 2 + human_params['rightUpperLeg_z'] ** 2)
human_params['rightUpperLegIyy'] = human_params['rightUpperLegMass'] / 12. * (
3 * (human_params['rightUpperLeg_x'] / 2) ** 2 + human_params['rightUpperLeg_z'] ** 2)
human_params['rightUpperLegIzz'] = human_params['rightUpperLegMass'] / 2. * (
(human_params['rightUpperLeg_x'] / 2) ** 2)
# markers
human_params['pRightGreaterTrochanter'] = right_upper_leg_data['points_mvn']['pRightGreaterTrochanter']
human_params['pRightPatella'] = right_upper_leg_data['points_mvn']['pRightPatella']
# - Right Lower Leg -
# joints
right_lower_leg_data = mvnx_file.file_data['segments']['elements']['RightLowerLeg']
human_params['jRightAnkle'] = right_lower_leg_data['points_mvn']['jRightAnkle']
# box size
pRightKneeLatLL = right_upper_leg_data['points_mvn']['pRightKneeLatEpicondyle'] # TODO: check if correct
pRightKneeMedLL = right_upper_leg_data['points_mvn']['pRightKneeMedEpicondyle']
human_params['rightLowerLeg_x'] = pRightKneeMedLL[1] - pRightKneeLatLL[1]
human_params['rightLowerLeg_z'] = np.abs(human_params['jRightAnkle'][2])
# box origin
human_params['rightLowerLegBoxOrigin'] = 0.5 * np.array([0, 0, -human_params['rightLowerLeg_z']]) # wrt jRightKnee
# mass and inertia
human_params['rightLowerLegMass'] = 0.0365 * human_mass
human_params['rightLowerLegIxx'] = human_params['rightLowerLegMass'] / 12. * (
3 * (human_params['rightLowerLeg_x'] / 2) ** 2 + human_params['rightLowerLeg_z'] ** 2)
human_params['rightLowerLegIyy'] = human_params['rightLowerLegMass'] / 12. * (
3 * (human_params['rightLowerLeg_x'] / 2) ** 2 + human_params['rightLowerLeg_z'] ** 2)
human_params['rightLowerLegIzz'] = human_params['rightLowerLegMass'] / 2. * (
(human_params['rightLowerLeg_x'] / 2) ** 2)
# markers
human_params['pRightKneeLatEpicondyle'] = right_upper_leg_data['points_mvn']['pRightKneeLatEpicondyle']
human_params['pRightKneeMedEpicondyle'] = right_upper_leg_data['points_mvn']['pRightKneeMedEpicondyle']
human_params['pRightLatMalleolus'] = right_lower_leg_data['points_mvn']['pRightLatMalleolus']
human_params['pRightMedMalleolus'] = right_lower_leg_data['points_mvn']['pRightMedMalleolus']
human_params['pRightTibialTub'] = right_lower_leg_data['points_mvn']['pRightTibialTub']
# - Right Foot -
# joints
right_foot_data = mvnx_file.file_data['segments']['elements']['RightFoot']
human_params['jRightBallFoot'] = right_foot_data['points_mvn']['jRightBallFoot']
# box size
pRightHeel = right_foot_data['points_mvn']['pRightHeelFoot']
rightFoot_x = human_params['jRightBallFoot'][0] - pRightHeel[0]
rightFoot_y = human_params['rightLowerLeg_x']
rightFoot_z = np.abs(pRightHeel[2])
human_params['rightFootBox'] = np.array([rightFoot_x, rightFoot_y, rightFoot_z])
# box origin
originWrtRightHeel = 0.5 * np.array([rightFoot_x, 0, rightFoot_z]) # wrt pRightHeelFoot
human_params['rightFootBoxOrigin'] = pRightHeel + originWrtRightHeel # wrt jRightAnkle TODO: check
# mass and inertia
human_params['rightFootMass'] = 0.0130 * human_mass
human_params['rightFootIxx'] = human_params['rightFootMass'] / 12. * (rightFoot_y ** 2 + rightFoot_z ** 2)
human_params['rightFootIyy'] = human_params['rightFootMass'] / 12. * (rightFoot_x ** 2 + rightFoot_z ** 2)
human_params['rightFootIzz'] = human_params['rightFootMass'] / 12. * (rightFoot_x ** 2 + rightFoot_y ** 2)
# markers
human_params['pRightHeelFoot'] = right_foot_data['points_mvn']['pRightHeelFoot']
human_params['pRightFirstMetatarsal'] = right_foot_data['points_mvn']['pRightFirstMetatarsal']
human_params['pRightFifthMetatarsal'] = right_foot_data['points_mvn']['pRightFifthMetatarsal']
human_params['pRightPivotFoot'] = right_foot_data['points_mvn']['pRightPivotFoot']
human_params['pRightHeelCenter'] = right_foot_data['points_mvn']['pRightHeelCenter']
# - Right Toe -
# box size
right_toe_data = mvnx_file.file_data['segments']['elements']['RightToe']
pRightToe = right_toe_data['points_mvn']['pRightToe']
rightToe_x = np.abs(pRightToe[0])
rightToe_y = rightFoot_y
rightToe_z = np.abs(pRightToe[2])
human_params['rightToeBox'] = np.array([rightToe_x, rightToe_y, rightToe_z])
# box origin
human_params['rightToeBoxOrigin'] = 0.5 * np.array([rightToe_x, 0, 0]) # wrt jRightKnee
# mass and inertia
human_params['rightToeMass'] = 0.0015 * human_mass
human_params['rightToeIxx'] = human_params['rightToeMass'] / 12. * (rightToe_y ** 2 + rightToe_z ** 2)
human_params['rightToeIyy'] = human_params['rightToeMass'] / 12. * (rightToe_x ** 2 + rightToe_z ** 2)
human_params['rightToeIzz'] = human_params['rightToeMass'] / 12. * (rightToe_x ** 2 + rightToe_y ** 2)
# markers
human_params['pRightToe'] = right_toe_data['points_mvn']['pRightToe']
# -- Chain links 20~23 --
# - Left Upper Leg -
# joints
left_upper_leg_data = mvnx_file.file_data['segments']['elements']['LeftUpperLeg']
human_params['jLeftKnee'] = left_upper_leg_data['points_mvn']['jLeftKnee']
# box size
pLeftTro = left_upper_leg_data['points_mvn']['pLeftGreaterTrochanter']
pLeftKneeUL = left_upper_leg_data['points_mvn']['pLeftKneeMedEpicondyle']
human_params['leftUpperLeg_x'] = np.abs(pLeftKneeUL[1] - pLeftTro[1])
human_params['leftUpperLeg_z'] = np.abs(human_params['jLeftKnee'][2])
# box origin
human_params['leftUpperLegBoxOrigin'] = 0.5 * np.array([0, 0, -human_params['leftUpperLeg_z']]) # wrt jLeftHip
# mass and inertia
human_params['leftUpperLegMass'] = 0.125 * human_mass
human_params['leftUpperLegIxx'] = human_params['leftUpperLegMass'] / 12. * (
3 * (human_params['leftUpperLeg_x'] / 2) ** 2 + human_params['leftUpperLeg_z'] ** 2)
human_params['leftUpperLegIyy'] = human_params['leftUpperLegMass'] / 12. * (
3 * (human_params['leftUpperLeg_x'] / 2) ** 2 + human_params['leftUpperLeg_z'] ** 2)
human_params['leftUpperLegIzz'] = human_params['leftUpperLegMass'] / 2. * (
(human_params['leftUpperLeg_x'] / 2) ** 2)
# markers
human_params['pLeftGreaterTrochanter'] = left_upper_leg_data['points_mvn']['pLeftGreaterTrochanter']
human_params['pLeftPatella'] = left_upper_leg_data['points_mvn']['pLeftPatella']
# - Left Lower Leg -
# joints
left_lower_leg_data = mvnx_file.file_data['segments']['elements']['LeftLowerLeg']
human_params['jLeftAnkle'] = left_lower_leg_data['points_mvn']['jLeftAnkle']
# box size
pLeftKneeLatLL = left_upper_leg_data['points_mvn']['pLeftKneeLatEpicondyle'] # TODO: check if this is correct
pLeftKneeMedLL = left_upper_leg_data['points_mvn']['pLeftKneeMedEpicondyle']
human_params['leftLowerLeg_x'] = np.abs(pLeftKneeMedLL[1] - pLeftKneeLatLL[1])
human_params['leftLowerLeg_z'] = np.abs(human_params['jLeftAnkle'][2])
# box origin
human_params['leftLowerLegBoxOrigin'] = 0.5 * np.array([0, 0, -human_params['leftLowerLeg_z']]) # wrt jLeftKnee
# mass and inertia
human_params['leftLowerLegMass'] = 0.0365 * human_mass
human_params['leftLowerLegIxx'] = human_params['leftLowerLegMass'] / 12. * (
3 * (human_params['leftLowerLeg_x'] / 2) ** 2 + human_params['leftLowerLeg_z'] ** 2)
human_params['leftLowerLegIyy'] = human_params['leftLowerLegMass'] / 12. * (
3 * (human_params['leftLowerLeg_x'] / 2) ** 2 + human_params['leftLowerLeg_z'] ** 2)
human_params['leftLowerLegIzz'] = human_params['leftLowerLegMass'] / 2. * (
(human_params['leftLowerLeg_x'] / 2) ** 2)
# markers
human_params['pLeftKneeLatEpicondyle'] = left_upper_leg_data['points_mvn']['pLeftKneeLatEpicondyle'] # TODO
human_params['pLeftKneeMedEpicondyle'] = left_upper_leg_data['points_mvn']['pLeftKneeMedEpicondyle']
human_params['pLeftLatMalleolus'] = left_lower_leg_data['points_mvn']['pLeftLatMalleolus']
human_params['pLeftMedMalleolus'] = left_lower_leg_data['points_mvn']['pLeftMedMalleolus']
human_params['pLeftTibialTub'] = left_lower_leg_data['points_mvn']['pLeftTibialTub']
# - Left Foot -
# joints
left_foot_data = mvnx_file.file_data['segments']['elements']['LeftFoot']
human_params['jLeftBallFoot'] = left_foot_data['points_mvn']['jLeftBallFoot']
# box size
pLeftHeel = left_foot_data['points_mvn']['pLeftHeelFoot']
leftFoot_x = human_params['jLeftBallFoot'][0] - pLeftHeel[0]
leftFoot_y = human_params['leftLowerLeg_x']
leftFoot_z = np.abs(pLeftHeel[2])
human_params['leftFootBox'] = np.array([leftFoot_x, leftFoot_y, leftFoot_z])
# box origin
originWrtLeftHeel = 0.5 * np.array([leftFoot_x, 0, leftFoot_z]) # wrt pLeftHeelFoot
human_params['leftFootBoxOrigin'] = pLeftHeel + originWrtLeftHeel # wrt jLeftAnkle TODO: check
# mass and inertia
human_params['leftFootMass'] = 0.0130 * human_mass
human_params['leftFootIxx'] = human_params['leftFootMass'] / 12. * (leftFoot_y ** 2 + leftFoot_z ** 2)
human_params['leftFootIyy'] = human_params['leftFootMass'] / 12. * (leftFoot_x ** 2 + leftFoot_z ** 2)
human_params['leftFootIzz'] = human_params['leftFootMass'] / 12. * (leftFoot_x ** 2 + leftFoot_y ** 2)
# markers
human_params['pLeftHeelFoot'] = left_foot_data['points_mvn']['pLeftHeelFoot']
human_params['pLeftFirstMetatarsal'] = left_foot_data['points_mvn']['pLeftFirstMetatarsal']
human_params['pLeftFifthMetatarsal'] = left_foot_data['points_mvn']['pLeftFifthMetatarsal']
human_params['pLeftPivotFoot'] = left_foot_data['points_mvn']['pLeftPivotFoot']
human_params['pLeftHeelCenter'] = left_foot_data['points_mvn']['pLeftHeelCenter']
# - Left Toe -
# box size
left_toe_data = mvnx_file.file_data['segments']['elements']['LeftToe']
pLeftToe = left_toe_data['points_mvn']['pLeftToe']
leftToe_x = np.abs(pLeftToe[0])
leftToe_y = rightFoot_y
leftToe_z = np.abs(pLeftToe[2])
human_params['leftToeBox'] = np.array([leftToe_x, leftToe_y, leftToe_z])
# box origin
human_params['leftToeBoxOrigin'] = 0.5 * np.array([leftToe_x, 0, 0]) # wrt jLeftKnee
# mass and inertia
human_params['leftToeMass'] = 0.0015 * human_mass
human_params['leftToeIxx'] = human_params['leftToeMass'] / 12. * (leftToe_y ** 2 + leftToe_z ** 2)
human_params['leftToeIyy'] = human_params['leftToeMass'] / 12. * (leftToe_x ** 2 + leftToe_z ** 2)
human_params['leftToeIzz'] = human_params['leftToeMass'] / 12. * (leftToe_x ** 2 + leftToe_y ** 2)
# markers
human_params['pLeftToe'] = left_toe_data['points_mvn']['pLeftToe']
return human_params
[docs]def xsens2urdf(mvnx_path, save_dir=None, human_mass=70, human_height=183):
if mvnx_path.endswith('.mvnx'):
mvnx_file = load_mvnx(mvnx_path)
else:
raise Exception('Wrong file type, only support .mvnx')
actor_name = mvnx_file.file_data['meta_data']['name']
human_params = get_human_params(mvnx_file, human_mass, human_height)
# Query Table
query_table = {'PELVIS_BOX_ORIGIN': human_params['pelvisBoxOrigin'],
'PELVIS_COM_ORIGIN': human_params['pelvisBoxOrigin'],
'PELVIS_BOX_SIZE': human_params['pelvisBox'],
'PELVISMASS': human_params['pelvisMass'],
'PELVISINERTIAIXX': human_params['pelvisIxx'],
'PELVISINERTIAIYY': human_params['pelvisIyy'],
'PELVISINERTIAIZZ': human_params['pelvisIzz'],
'jL5S1_ORIGIN': human_params['jL5S1'],
'jLeftHip_ORIGIN': human_params['jLeftHip'],
'jRightHip_ORIGIN': human_params['jRightHip'],
'L5_BOX_ORIGIN': human_params['L5BoxOrigin'],
'L5_COM_ORIGIN': human_params['L5BoxOrigin'],
'L5_BOX_SIZE': human_params['L5Box'],
'L5MASS': human_params['L5Mass'],
'L5INERTIAIXX': human_params['L5Ixx'],
'L5INERTIAIYY': human_params['L5Iyy'],
'L5INERTIAIZZ': human_params['L5Izz'],
'jL4L3_ORIGIN': human_params['jL4L3'],
'L3_BOX_ORIGIN': human_params['L3BoxOrigin'],
'L3_COM_ORIGIN': human_params['L3BoxOrigin'],
'L3_BOX_SIZE': human_params['L3Box'],
'L3MASS': human_params['L3Mass'],
'L3INERTIAIXX': human_params['L3Ixx'],
'L3INERTIAIYY': human_params['L3Iyy'],
'L3INERTIAIZZ': human_params['L3Izz'],
'jL1T12_ORIGIN': human_params['jL1T12'],
'T12_BOX_ORIGIN': human_params['T12BoxOrigin'],
'T12_COM_ORIGIN': human_params['T12BoxOrigin'],
'T12_BOX_SIZE': human_params['T12Box'],
'T12MASS': human_params['T12Mass'],
'T12INERTIAIXX': human_params['T12Ixx'],
'T12INERTIAIYY': human_params['T12Iyy'],
'T12INERTIAIZZ': human_params['T12Izz'],
'jT9T8_ORIGIN': human_params['jT9T8'],
'T8_BOX_ORIGIN': human_params['T8BoxOrigin'],
'T8_COM_ORIGIN': human_params['T8BoxOrigin'],
'T8_BOX_SIZE': human_params['T8Box'],
'T8MASS': human_params['T8Mass'],
'T8INERTIAIXX': human_params['T8Ixx'],
'T8INERTIAIYY': human_params['T8Iyy'],
'T8INERTIAIZZ': human_params['T8Izz'],
'jT1C7_ORIGIN': human_params['jT1C7'],
'jRightC7Shoulder_ORIGIN': human_params['jRightT4Shoulder'],
'jLeftC7Shoulder_ORIGIN': human_params['jLeftT4Shoulder'],
'NECK_BOX_ORIGIN': human_params['neckBoxOrigin'],
'NECK_COM_ORIGIN': human_params['neckBoxOrigin'],
'NECKHEIGHT': human_params['neck_z'],
'NECKRADIUS': 0.5 * human_params['neck_x'],
'NECKMASS': human_params['neckMass'],
'NECKINERTIAIXX': human_params['neckIxx'],
'NECKINERTIAIYY': human_params['neckIyy'],
'NECKINERTIAIZZ': human_params['neckIzz'],
'jC1Head_ORIGIN': human_params['jC1Head'],
'HEAD_BOX_ORIGIN': human_params['headBoxOrigin'],
'HEAD_COM_ORIGIN': human_params['headBoxOrigin'],
'HEADRADIUS': 0.5 * human_params['head_z'],
'HEADMASS': human_params['headMass'],
'HEADINERTIAIXX': human_params['headIxx'],
'HEADINERTIAIYY': human_params['headIyy'],
'HEADINERTIAIZZ': human_params['headIzz'],
'RIGHTSHOULDER_BOX_ORIGIN': human_params['rightShoulderBoxOrigin'],
'RIGHTSHOULDER_COM_ORIGIN': human_params['rightShoulderBoxOrigin'],
'RIGHTSHOULDERHEIGHT': human_params['rightSho_y'],
'RIGHTSHOULDERRADIUS': 0.5 * human_params['rightSho_z'],
'RIGHTSHOULDERMASS': human_params['rightShoulderMass'],
'RIGHTSHOULDERINERTIAIXX': human_params['rightShoulderIxx'],
'RIGHTSHOULDERINERTIAIYY': human_params['rightShoulderIyy'],
'RIGHTSHOULDERINERTIAIZZ': human_params['rightShoulderIzz'],
'jRightShoulder_ORIGIN': human_params['jRightShoulder'],
'RIGHTUPPERARM_BOX_ORIGIN': human_params['rightUpperArmBoxOrigin'],
'RIGHTUPPERARM_COM_ORIGIN': human_params['rightUpperArmBoxOrigin'],
'RIGHTUPPERARMHEIGHT': human_params['rightUpperArm_y'],
'RIGHTUPPERARMRADIUS': 0.5 * human_params['rightUpperArm_z'],
'RIGHTUPPERARMMASS': human_params['rightUpperArmMass'],
'RIGHTUPPERARMINERTIAIXX': human_params['rightUpperArmIxx'],
'RIGHTUPPERARMINERTIAIYY': human_params['rightUpperArmIyy'],
'RIGHTUPPERARMINERTIAIZZ': human_params['rightUpperArmIzz'],
'jRightElbow_ORIGIN': human_params['jRightElbow'],
'RIGHTFOREARM_BOX_ORIGIN': human_params['rightForeArmBoxOrigin'],
'RIGHTFOREARM_COM_ORIGIN': human_params['rightForeArmBoxOrigin'],
'RIGHTFOREARMHEIGHT': human_params['rightForeArm_y'],
'RIGHTFOREARMRADIUS': 0.5 * human_params['rightForeArm_z'],
'RIGHTFOREARMMASS': human_params['rightForeArmMass'],
'RIGHTFOREARMINERTIAIXX': human_params['rightForeArmIxx'],
'RIGHTFOREARMINERTIAIYY': human_params['rightForeArmIyy'],
'RIGHTFOREARMINERTIAIZZ': human_params['rightForeArmIzz'],
'jRightWrist_ORIGIN': human_params['jRightWrist'],
'RIGHTHAND_BOX_ORIGIN': human_params['rightHandBoxOrigin'],
'RIGHTHAND_COM_ORIGIN': human_params['rightHandBoxOrigin'],
'RIGHTHAND_BOX_SIZE': human_params['rightHandBox'],
'RIGHTHANDMASS': human_params['rightHandMass'],
'RIGHTHANDINERTIAIXX': human_params['rightHandIxx'],
'RIGHTHANDINERTIAIYY': human_params['rightHandIyy'],
'RIGHTHANDINERTIAIZZ': human_params['rightHandIzz'],
'LEFTSHOULDER_BOX_ORIGIN': human_params['leftShoulderBoxOrigin'],
'LEFTSHOULDER_COM_ORIGIN': human_params['leftShoulderBoxOrigin'],
'LEFTSHOULDERHEIGHT': human_params['leftSho_y'],
'LEFTSHOULDERRADIUS': 0.5 * human_params['leftSho_z'],
'LEFTSHOULDERMASS': human_params['leftShoulderMass'],
'LEFTSHOULDERINERTIAIXX': human_params['leftShoulderIxx'],
'LEFTSHOULDERINERTIAIYY': human_params['leftShoulderIyy'],
'LEFTSHOULDERINERTIAIZZ': human_params['leftShoulderIzz'],
'jLeftShoulder_ORIGIN': human_params['jLeftShoulder'],
'LEFTUPPERARM_BOX_ORIGIN': human_params['leftUpperArmBoxOrigin'],
'LEFTUPPERARM_COM_ORIGIN': human_params['leftUpperArmBoxOrigin'],
'LEFTUPPERARMHEIGHT': human_params['leftUpperArm_y'],
'LEFTUPPERARMRADIUS': 0.5 * human_params['leftUpperArm_z'],
'LEFTUPPERARMMASS': human_params['leftUpperArmMass'],
'LEFTUPPERARMINERTIAIXX': human_params['leftUpperArmIxx'],
'LEFTUPPERARMINERTIAIYY': human_params['leftUpperArmIyy'],
'LEFTUPPERARMINERTIAIZZ': human_params['leftUpperArmIzz'],
'jLeftElbow_ORIGIN': human_params['jLeftElbow'],
'LEFTFOREARM_BOX_ORIGIN': human_params['leftForeArmBoxOrigin'],
'LEFTFOREARM_COM_ORIGIN': human_params['leftForeArmBoxOrigin'],
'LEFTFOREARMHEIGHT': human_params['leftForeArm_y'],
'LEFTFOREARMRADIUS': 0.5 * human_params['leftForeArm_z'],
'LEFTFOREARMMASS': human_params['leftForeArmMass'],
'LEFTFOREARMINERTIAIXX': human_params['leftForeArmIxx'],
'LEFTFOREARMINERTIAIYY': human_params['leftForeArmIyy'],
'LEFTFOREARMINERTIAIZZ': human_params['leftForeArmIzz'],
'jLeftWrist_ORIGIN': human_params['jLeftWrist'],
'LEFTHAND_BOX_ORIGIN': human_params['leftHandBoxOrigin'],
'LEFTHAND_COM_ORIGIN': human_params['leftHandBoxOrigin'],
'LEFTHAND_BOX_SIZE': human_params['leftHandBox'],
'LEFTHANDMASS': human_params['leftHandMass'],
'LEFTHANDINERTIAIXX': human_params['leftHandIxx'],
'LEFTHANDINERTIAIYY': human_params['leftHandIyy'],
'LEFTHANDINERTIAIZZ': human_params['leftHandIzz'],
'RIGHTUPPERLEG_BOX_ORIGIN': human_params['rightUpperLegBoxOrigin'],
'RIGHTUPPERLEG_COM_ORIGIN': human_params['rightUpperLegBoxOrigin'],
'RIGHTUPPERLEGHEIGHT': human_params['rightUpperLeg_z'],
'RIGHTUPPERLEGRADIUS': 0.5 * human_params['rightUpperLeg_x'],
'RIGHTUPPERLEGMASS': human_params['rightUpperLegMass'],
'RIGHTUPPERLEGINERTIAIXX': human_params['rightUpperLegIxx'],
'RIGHTUPPERLEGINERTIAIYY': human_params['rightUpperLegIyy'],
'RIGHTUPPERLEGINERTIAIZZ': human_params['rightUpperLegIzz'],
'jRightKnee_ORIGIN': human_params['jRightKnee'],
'RIGHTLOWERLEG_BOX_ORIGIN': human_params['rightLowerLegBoxOrigin'],
'RIGHTLOWERLEG_COM_ORIGIN': human_params['rightLowerLegBoxOrigin'],
'RIGHTLOWERLEGHEIGHT': human_params['rightLowerLeg_z'],
'RIGHTLOWERLEGRADIUS': 0.5 * human_params['rightLowerLeg_x'],
'RIGHTLOWERLEGMASS': human_params['rightLowerLegMass'],
'RIGHTLOWERLEGINERTIAIXX': human_params['rightLowerLegIxx'],
'RIGHTLOWERLEGINERTIAIYY': human_params['rightLowerLegIyy'],
'RIGHTLOWERLEGINERTIAIZZ': human_params['rightLowerLegIzz'],
'jRightAnkle_ORIGIN': human_params['jRightAnkle'],
'RIGHTFOOT_BOX_ORIGIN': human_params['rightFootBoxOrigin'],
'RIGHTFOOT_COM_ORIGIN': human_params['rightFootBoxOrigin'],
'RIGHTFOOT_BOX_SIZE': human_params['rightFootBox'],
'RIGHTFOOTMASS': human_params['rightFootMass'],
'RIGHTFOOTINERTIAIXX': human_params['rightFootIxx'],
'RIGHTFOOTINERTIAIYY': human_params['rightFootIyy'],
'RIGHTFOOTINERTIAIZZ': human_params['rightFootIzz'],
'jRightBallFoot_ORIGIN': human_params['jRightBallFoot'],
'RIGHTTOE_BOX_ORIGIN': human_params['rightToeBoxOrigin'],
'RIGHTTOE_COM_ORIGIN': human_params['rightToeBoxOrigin'],
'RIGHTTOE_BOX_SIZE': human_params['rightToeBox'],
'RIGHTTOEMASS': human_params['rightToeMass'],
'RIGHTTOEINERTIAIXX': human_params['rightToeIxx'],
'RIGHTTOEINERTIAIYY': human_params['rightToeIyy'],
'RIGHTTOEINERTIAIZZ': human_params['rightToeIzz'],
'LEFTUPPERLEG_BOX_ORIGIN': human_params['leftUpperLegBoxOrigin'],
'LEFTUPPERLEG_COM_ORIGIN': human_params['leftUpperLegBoxOrigin'],
'LEFTUPPERLEGHEIGHT': human_params['leftUpperLeg_z'],
'LEFTUPPERLEGRADIUS': 0.5 * human_params['leftUpperLeg_x'],
'LEFTUPPERLEGMASS': human_params['leftUpperLegMass'],
'LEFTUPPERLEGINERTIAIXX': human_params['leftUpperLegIxx'],
'LEFTUPPERLEGINERTIAIYY': human_params['leftUpperLegIyy'],
'LEFTUPPERLEGINERTIAIZZ': human_params['leftUpperLegIzz'],
'jLeftKnee_ORIGIN': human_params['jLeftKnee'],
'LEFTLOWERLEG_BOX_ORIGIN': human_params['leftLowerLegBoxOrigin'],
'LEFTLOWERLEG_COM_ORIGIN': human_params['leftLowerLegBoxOrigin'],
'LEFTLOWERLEGHEIGHT': human_params['leftLowerLeg_z'],
'LEFTLOWERLEGRADIUS': 0.5 * human_params['leftLowerLeg_x'],
'LEFTLOWERLEGMASS': human_params['leftLowerLegMass'],
'LEFTLOWERLEGINERTIAIXX': human_params['leftLowerLegIxx'],
'LEFTLOWERLEGINERTIAIYY': human_params['leftLowerLegIyy'],
'LEFTLOWERLEGINERTIAIZZ': human_params['leftLowerLegIzz'],
'jLeftAnkle_ORIGIN': human_params['jLeftAnkle'],
'LEFTFOOT_BOX_ORIGIN': human_params['leftFootBoxOrigin'],
'LEFTFOOT_COM_ORIGIN': human_params['leftFootBoxOrigin'],
'LEFTFOOT_BOX_SIZE': human_params['leftFootBox'],
'LEFTFOOTMASS': human_params['leftFootMass'],
'LEFTFOOTINERTIAIXX': human_params['leftFootIxx'],
'LEFTFOOTINERTIAIYY': human_params['leftFootIyy'],
'LEFTFOOTINERTIAIZZ': human_params['leftFootIzz'],
'jLeftBallFoot_ORIGIN': human_params['jLeftBallFoot'],
'LEFTTOE_BOX_ORIGIN': human_params['leftToeBoxOrigin'],
'LEFTTOE_COM_ORIGIN': human_params['leftToeBoxOrigin'],
'LEFTTOE_BOX_SIZE': human_params['leftToeBox'],
'LEFTTOEMASS': human_params['leftToeMass'],
'LEFTTOEINERTIAIXX': human_params['leftToeIxx'],
'LEFTTOEINERTIAIYY': human_params['leftToeIyy'],
'LEFTTOEINERTIAIZZ': human_params['leftToeIzz'],
}
# Open template urdf
rofunc_path = get_rofunc_path()
human_urdf_dir = os.path.join(rofunc_path, 'simulator/assets/urdf/human')
urdf_template_path = os.path.join(human_urdf_dir, 'human_xsenstemplate_48dof_zxy.urdf')
with open(urdf_template_path, 'r') as f:
urdf_template = f.read()
for search_text, replace_text in query_table.items():
replace_text = np.array(replace_text)
if isinstance(replace_text, np.ndarray):
replace_text = np.array2string(replace_text, separator=' ').replace('[', '').replace(']', '')
else:
replace_text = str(replace_text)
urdf_template = urdf_template.replace(search_text, str(replace_text))
fakemass = 0
fakein = 0
urdf_template = urdf_template.replace('FAKEMASS', str(fakemass))
urdf_template = urdf_template.replace('FAKEIN', str(fakein))
if save_dir is None:
save_dir = human_urdf_dir
with open(os.path.join(save_dir, '{}.urdf'.format(actor_name)), 'w') as f:
f.write(urdf_template)
beauty_print('Generated human urdf file for {} at {}'.format(actor_name, os.path.join(save_dir, '{}.urdf'.format(
actor_name))))
return mvnx_file