URDFを定数倍拡大・縮小するコードを書きました。box,radisu,sphereの寸法や各種jointのxyzを線形倍、質量を3乗倍、慣性モーメントを5乗倍します。Pythonの標準ライブラリであるElementTreeを使っています。
import xml.etree.ElementTree as ET
##ここにサイズ比を書く
mag_rate = 10
##ここに入力ファイル名を書く
input_file = "input.urdf"
##ここに出力ファイル名を書く
output_file = "output.urdf"
#サイズ比の1乗だけ大きくなる要素
elems_and_keys_linear = {"origin":["xyz"],
"cylinder":["length","radius"],
"box":["size"],
"sphere":["radius"]
"mesh":["scale"]
}
#サイズ比の3乗大きくなる要素
elems_and_keys_cubic = {"mass":["value"]}
#サイズ比の5乗大きくなる要素
elems_and_keys_5pow ={"inertia":["ixx","ixy","ixz","iyy","iyz","izz"]}
tree = ET.parse(input_file)
root = tree.getroot()
# まずは線形要素
for k in elems_and_keys_linear.keys():
for el in root.findall(".//{}".format(k)):
for op in elems_and_keys_linear[k]:
vals = map(float,el.get(op).split())
el.set(op," ".join([str(val*mag_rate) for val in vals]))
#3乗要素
for k in elems_and_keys_cubic.keys():
for el in root.findall(".//{}".format(k)):
for op in elems_and_keys_cubic[k]:
vals = map(float,el.get(op).split())
el.set(op," ".join([str(val*(mag_rate**3)) for val in vals]))
#5乗要素
for k in elems_and_keys_5pow.keys():
for el in root.findall(".//{}".format(k)):
for op in elems_and_keys_5pow[k]:
vals = map(float,el.get(op).split())
el.set(op," ".join([str(val*(mag_rate**5)) for val in vals]))
newtree = ET.ElementTree(root)
newtree.write(output_file)