系列文章目录
前言
一、
dsubhasish09于2021年5月23日发表评论
在装配体中定义由多个零件组成的 link 时,单个零件质心处各自的惯性值(在使用相似性变换使其与关节坐标系平行后)会直接相加,从而得到净惯性矩阵,而不是先平移到(链接中所有零件组合的)净质心处再相加。这样得到的惯性矩阵是错误的。这个问题最近才发现,请尽早解决。
jespersmith 于 2021 年 7 月 29 日发表评论说 -
几年前我就注意到了这个问题,并在 bitbucket 上留下了问题报告。遗憾的是,我无法再调出这个报告,但这对于力控机器人来说是个问题。我们一直在手动更新惯性,并在创建模型时将其作为一个很好的审查步骤,因此它并不是一个真正的障碍。
还要注意的是,solidworks 输出的惯性张量与惯性矩阵的对角线外分量不同。
dsubhasish09于2021年7月29日发表评论
是的,我们也是这么做的,但要手动更改每个链接的惯性值非常麻烦,尤其是在链接数量较多的情况下。你们是否通过任何方式实现了自动化?
jespersmith 于 2021 年 7 月 29 日发表评论
我们有一个编辑 URDF 的简单用户界面,可以解析来自 solidworks 质量工具的数据(将数据复制到剪贴板)。我们刚刚重新开始开发,可能会考虑将其开源。
brawner 于 2021 年 11 月 22 日发表评论
很遗憾听到这个错误,因为我几乎只是使用 SW 的接口来计算 MOI。听起来这可能是上游的一个错误。
你们是否有代表性模型和 URDF 以帮助进行比较?
bbokser 于 2022 年 5 月 4 日发表评论
如果您愿意,我可以提供有代表性的模型。我非常希望不必每次生成 URDF 时都要手动校正数值。天知道这么多年来这让我头疼了多少次......
xwavex 于 2022 年 8 月 4 日发表评论
这听起来像是急需解决的问题
internetKevin0 评论于 2023 年 2 月 1 日 -
我想火上浇油。惯性计算不正确,需要尽快修复。我们的解决方法是在每个有两个以上部件或主体的链接中手动输入正确的惯性矩阵值。只有当每个链接只有一个主体时,导出程序才能正常工作。即使同一部件中有多个主体,如果它们的密度不同,惯性计算仍会出现偏差。
brawner 评论于 2023年2月1日
此代码已开源,欢迎随时提交 PR
luoye2333 于 Jun 3 - 发表评论
我们有一个编辑 URDF 的简单用户界面,可以解析来自 solidworks 质量工具的数据(将数据复制到剪贴板)。我们刚刚重新开始开发,可能会考虑将其开源。
我使用 chatgpt 在 python 中生成一个转换程序。使用时,将 solidworks 质量工具中的文本复制到代码中的 const 字符串。然后将输出文本复制到原始 urdf 文件中。欢迎使用。
python
# 原始字符串
raw_string = """
所选零部件 的质量属性
坐标系: BCS
质量 = 5439.19 克
体积 = 2525851.14 立方毫米
表面积 = 979087.02 平方毫米
重心 : ( 毫米 )
X = 0.00
Y = 1.10
Z = 7.33
惯性主轴和惯性主力矩: ( 克 * 平方毫米 )
由重心决定。
Ix = ( 0.00, -1.00, -0.01) Px = 45020646.47
Iy = ( 1.00, 0.00, 0.00) Py = 48410923.95
Iz = ( 0.00, -0.01, 1.00) Pz = 80241299.66
惯性张量: ( 克 * 平方毫米 )
由重心决定,并且对齐输出的坐标系。 (使用正张量记数法。)
Lxx = 48410923.95 Lxy = 1.36 Lxz = -0.97
Lyx = 1.36 Lyy = 45021610.36 Lyz = 184249.38
Lzx = -0.97 Lzy = 184249.38 Lzz = 80240335.77
惯性张量: ( 克 * 平方毫米 )
由输出座标系决定。 (使用正张量记数法。)
Ixx = 48709740.16 Ixy = 0.92 Ixz = -3.91
Iyx = 0.92 Iyy = 45313794.64 Iyz = 228269.22
Izx = -3.91 Izy = 228269.22 Izz = 80246967.70
"""
# 提取数值并除以10^9
mass = str(float(raw_string.split('质量 = ')[1].split()[0]) / 1e3)
cog_x = str(float(raw_string.split('X = ')[1].split()[0]) / 1e3)
cog_y = str(float(raw_string.split('Y = ')[1].split()[0]) / 1e3)
cog_z = str(float(raw_string.split('Z = ')[1].split()[0]) / 1e3)
ixx = str(float(raw_string.split('Lxx = ')[1].split()[0]) / 1e9)
ixy = str(-float(raw_string.split('Lxy = ')[1].split()[0]) / 1e9)
ixz = str(-float(raw_string.split('Lxz = ')[1].split()[0]) / 1e9)
iyy = str(float(raw_string.split('Lyy = ')[1].split()[0]) / 1e9)
iyz = str(-float(raw_string.split('Lyz = ')[1].split()[0]) / 1e9)
izz = str(float(raw_string.split('Lzz = ')[1].split()[0]) / 1e9)
# 输出格式
output_string = f"""
<inertial>
<origin
xyz="{cog_x} {cog_y} {cog_z}"
rpy="0 0 0" />
<mass
value="{mass}" />
<inertia
ixx="{ixx}"
ixy="{ixy}"
ixz="{ixz}"
iyy="{iyy}"
iyz="{iyz}"
izz="{izz}" />
</inertial>
"""
print(output_string)
jespersmith 于 Jun 19 - 发表评论
我们有一个编辑 URDF 的简单用户界面,可以解析来自 solidworks 质量工具的数据(将数据复制到剪贴板)。我们刚刚重新开始开发,可能会考虑将其开源。
我使用 chatgpt 在 python 中生成一个转换程序。使用时,将 solidworks 质量工具中的文本复制到代码中的 const 字符串。然后将输出文本复制到原始 urdf 文件中。请随意使用。
请注意,Solidworks 和 URDF 之间的非对角线项需要负值。
摘自我的个人文档
python
WARNING: SolidWorks shows the moments of inertia, URDF expects the inertia tensor matrix.
The inertia tensor matrix is defined below from the moments of inertia:
![afbeelding](https://github.com/ros/solidworks_urdf_exporter/assets/8227626/70b210a0-026c-4544-9933-1491e382c23c)
Pretty much, make the off-diagonal values negative when exporting.
luoye2333 于 Jun 21 发表评论
谢谢 jespersmith。您说得没错。我编辑了代码 #117(评论),并在 ixy ixz 和 iyz 中添加了减号"-"。
Hi,
I'm a student and I'm trying to export the urdf using the plugin. There are many parts that have an overridden mass in my robot model. I get wrong mass and moments of ineria and I am trying to correcting them manually.
I notice that the centre of gravity coordinates are obtained in a global coordinate system.
**System Information**
-
SolidWorks version and service pack: SolidWorks 2024
-
Version of exporter 16.1
**Describe the bug**