-
Notifications
You must be signed in to change notification settings - Fork 112
Description
After #1077, SDFormat v1.10 introduced <fluid_added_mass> to the link's <inertial>. However, the corresponding support to set this property from a URDF file has not been created. This issue aims to discuss potential solution paths.
Desired behavior
An URDF with a <gazebo> tag defining the fluid added mass for the link
<?xml version="1.0" ?>
<robot name="added_mass_example">
<link name="base_link">
<inertial name="inertial">
<origin xyz="1 2 3" rpy="-0.1 0.2 -0.3"/>
<mass value="1"/>
<inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1"/>
</inertial>
</link>
<gazebo reference="base_link">
<fluid_added_mass>
<xx>1</xx>
<xy>0</xy>
<xz>0</xz>
<xp>0</xp>
<xq>0</xq>
<xr>0</xr>
<yy>1</yy>
<yz>0</yz>
<yp>0</yp>
<yq>0</yq>
<yr>0</yr>
<zz>1</zz>
<zp>0</zp>
<zq>0</zq>
<zr>0</zr>
<pp>1</pp>
<pq>0</pq>
<pr>0</pr>
<qq>1</qq>
<qr>0</qr>
<rr>1</rr>
</fluid_added_mass>
</gazebo>
</robot>Should generate a corresponding SDF as follows:
<sdf version='1.11'>
<model name='added_mass_example'>
<link name='base_link'>
<inertial>
<pose>1 2 3 -0.099999999999999992 0.20000000000000001 -0.29999999999999999</pose>
<mass>1</mass>
<inertia>
<ixx>1</ixx>
<ixy>0</ixy>
<ixz>0</ixz>
<iyy>1</iyy>
<iyz>0</iyz>
<izz>1</izz>
</inertia>
<fluid_added_mass>
<xx>1</xx>
<xy>0</xy>
<xz>0</xz>
<xp>0</xp>
<xq>0</xq>
<xr>0</xr>
<yy>1</yy>
<yz>0</yz>
<yp>0</yp>
<yq>0</yq>
<yr>0</yr>
<zz>1</zz>
<zp>0</zp>
<zq>0</zq>
<zr>0</zr>
<pp>1</pp>
<pq>0</pq>
<pr>0</pr>
<qq>1</qq>
<qr>0</qr>
<rr>1</rr>
</fluid_added_mass>
</inertial>
</link>
</model>
</sdf>Alternatives considered
Within a <gazebo reference="link_name"> tag:
-
Handle
<fluid_added_mass>as other link-specific properties, such asmu1andmu2, and place it directly into<inertial>where it belongs since a link is always supposed to have one, and only one, inertial element. This is the expected behavior shown in the previous section. -
Handle the entire
<inertial>block similarly to<visual>/<collision>, i.e.: the content of the element will be inserted into eachinertial(expected only one) of theSDFormatlink. This is described below by using existing behavior for the<visual>element to insert the fluid added mass content into a link's visual element.
Original "test.urdf" example using "visual" capabilities
<robot name="added_mass_example">
<link name="base_link">
<inertial name="inertial">
<mass value="1"/>
<inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1"/>
</inertial>
<visual>
<geometry>
<box size="1.0 1.0 1.0"/>
</geometry>
</visual>
</link>
<gazebo reference="base_link">
<visual>
<fluid_added_mass>
<xx>1</xx>
<xy>0</xy>
<xz>0</xz>
<xp>0</xp>
<xq>0</xq>
<xr>0</xr>
<yy>1</yy>
<yz>0</yz>
<yp>0</yp>
<yq>0</yq>
<yr>0</yr>
<zz>1</zz>
<zp>0</zp>
<zq>0</zq>
<zr>0</zr>
<pp>1</pp>
<pq>0</pq>
<pr>0</pr>
<qq>1</qq>
<qr>0</qr>
<rr>1</rr>
</fluid_added_mass>
</visual>
</gazebo>
</robot>SDF result, inserting the desired fluid added mass into "visual". Behavior to be replicated for "inertial"
$ gz sdf -p test.urdf
Warning [Utils.cc:132] [/sdf/model[@name="added_mass_example"]/link[@name="base_link"]/visual[@name="base_link_visual"]/fluid_added_mass:/home/ksim_harmonic/dev/ksim_harmonic/sdformat/test.urdf:L0]: XML Element[fluid_added_mass], child of element[visual], not defined in SDF. Copying[fluid_added_mass] as children of [visual].
<sdf version='1.11'>
<model name='added_mass_example'>
<link name='base_link'>
<inertial>
<pose>0 0 0 0 0 0</pose>
<mass>1</mass>
<inertia>
<ixx>1</ixx>
<ixy>0</ixy>
<ixz>0</ixz>
<iyy>1</iyy>
<iyz>0</iyz>
<izz>1</izz>
</inertia>
</inertial>
<visual name='base_link_visual'>
<pose>0 0 0 0 0 0</pose>
<geometry>
<box>
<size>1 1 1</size>
</box>
</geometry>
<fluid_added_mass>
<xx>1</xx>
<xy>0</xy>
<xz>0</xz>
<xp>0</xp>
<xq>0</xq>
<xr>0</xr>
<yy>1</yy>
<yz>0</yz>
<yp>0</yp>
<yq>0</yq>
<yr>0</yr>
<zz>1</zz>
<zp>0</zp>
<zq>0</zq>
<zr>0</zr>
<pp>1</pp>
<pq>0</pq>
<pr>0</pr>
<qq>1</qq>
<qr>0</qr>
<rr>1</rr>
</fluid_added_mass>
</visual>
</link>Implementation suggestion
As the URDF specification does not define fluid added mass matrix, this inertial property is only necessary for Gazebo and the CreateInertial method would be kept the same.
Line 2970 in f360776
| void CreateInertial(tinyxml2::XMLElement *_elem, |
Depending on the preferred alternative, update ParseSDFExtension to either include <fluid_added_mass> directly into SDF <inertial> or change the whole inertial behavior to be such as <<visual> which might require the creation of a InsertSDFExtensionInertial similar to InsertSDFExtensionCollision and InsertSDFExtensionVisual.
Line 1273 in f360776
| void URDF2SDF::ParseSDFExtension(tinyxml2::XMLDocument &_urdfXml) |
Additional context
If there is a clear solution path which would best fit the package design, I would be more than happy to contribute with a PR.
Metadata
Metadata
Assignees
Labels
Type
Projects
Status