srmainwaring / asv_wave_sim

This package contains plugins that support the simulation of waves and surface vessels in Gazebo.
GNU General Public License v3.0
114 stars 31 forks source link

Optimise link level buoyancy #65

Closed srmainwaring closed 1 year ago

srmainwaring commented 1 year ago

This PR improves the link level buoyancy calculation by ensuring that the wave field is only sampled when links (or their contained collision meshes) are enabled by the hydrodynamics plugin.

Other changes

Tests

Run the graded_buoyancy_waves.sdf world and check messages:

% gz sim -v4 -s graded_buoyancy_waves.sdf
...
[Msg] Hydrodynamics: initialise physics
[Msg] Hydrodynamics: checking collision meshes for link [lighter_than_water::ball::body]
[Msg] Hydrodynamics: including collision [lighter_than_water::ball::body::body_collision]
[Msg] Type:       SPHERE
[Msg] Radius:     0.2
[Msg] MeshName:   ball.body.body_collision.sphere
[Msg] Vertex:     81
[Msg] Hydrodynamics: links:  1, meshes: 1, collisions: 1
[Msg] Hydrodynamics: initialising link [lighter_than_water::ball::body]
[Msg] Hydrodynamics: link has [1] collision meshes
[Msg] Hydrodynamics: link world pose: 0 0 0 0 0 0
[Msg] Hydrodynamics: link world CoM pose: 0 0 0 0 0 0
[Msg] Hydrodynamics: set water patch size: 20
[Msg] Hydrodynamics: done initialise physics
[Msg] Hydrodynamics: initialise physics
[Msg] Hydrodynamics: checking collision meshes for link [lighter_than_water::box::body]
[Msg] Hydrodynamics: including collision [lighter_than_water::box::body::body_collision]
[Msg] Type:       BOX
[Msg] Size:       1 1 1
[Msg] MeshName:   box.body.body_collision.box
[Msg] Vertex:     24
[Msg] Hydrodynamics: links:  1, meshes: 1, collisions: 1
[Msg] Hydrodynamics: initialising link [lighter_than_water::box::body]
[Msg] Hydrodynamics: link has [1] collision meshes
[Msg] Hydrodynamics: link world pose: 3 3 0 0.3 0.2 0.1
[Msg] Hydrodynamics: link world CoM pose: 3 3 0 0.3 0.2 0.1
[Msg] Hydrodynamics: set water patch size: 20
[Msg] Hydrodynamics: done initialise physics
[Msg] Hydrodynamics: initialise physics
[Msg] Hydrodynamics: checking collision meshes for link [balloon_lighter_than_air::body]
[Msg] Hydrodynamics: including collision [balloon_lighter_than_air::body::body_collision]
[Msg] Type:       SPHERE
[Msg] Radius:     0.2
[Msg] MeshName:   balloon_lighter_than_air.body.body_collision.sphere
[Msg] Vertex:     81
[Msg] Hydrodynamics: links:  1, meshes: 1, collisions: 1
[Msg] Hydrodynamics: initialising link [balloon_lighter_than_air::body]
[Msg] Hydrodynamics: link has [1] collision meshes
[Msg] Hydrodynamics: link world pose: 0 -3 -0.1 0 0 0
[Msg] Hydrodynamics: link world CoM pose: 0 -3 -0.1 0 0 0
[Msg] Hydrodynamics: set water patch size: 20
[Msg] Hydrodynamics: done initialise physics
[Msg] Hydrodynamics: initialise physics
[Msg] Hydrodynamics: checking collision meshes for link [box_neutral_buoyancy::body]
[Msg] Hydrodynamics: including collision [box_neutral_buoyancy::body::body_collision]
[Msg] Type:       BOX
[Msg] Size:       1 1 1
[Msg] MeshName:   box_neutral_buoyancy.body.body_collision.box
[Msg] Vertex:     24
[Msg] Hydrodynamics: links:  1, meshes: 1, collisions: 1
[Msg] Hydrodynamics: initialising link [box_neutral_buoyancy::body]
[Msg] Hydrodynamics: link has [1] collision meshes
[Msg] Hydrodynamics: link world pose: 0 3 -3 0 0 0
[Msg] Hydrodynamics: link world CoM pose: 0 3 -3.1 0 0 0
[Msg] Hydrodynamics: set water patch size: 20
[Msg] Hydrodynamics: done initialise physics
[Msg] Hydrodynamics: initialise physics
[Msg] Hydrodynamics: checking collision meshes for link [box_neutral_buoyancy_collision_offset::body]
[Msg] Hydrodynamics: including collision [box_neutral_buoyancy_collision_offset::body::buoyancy_volume]
[Msg] Type:       BOX
[Msg] Size:       1 1 1
[Msg] MeshName:   box_neutral_buoyancy_collision_offset.body.buoyancy_volume.box
[Msg] Vertex:     24
[Msg] Hydrodynamics: links:  1, meshes: 1, collisions: 1
[Msg] Hydrodynamics: initialising link [box_neutral_buoyancy_collision_offset::body]
[Msg] Hydrodynamics: link has [1] collision meshes
[Msg] Hydrodynamics: link world pose: -3 3 2 0 0 0
[Msg] Hydrodynamics: link world CoM pose: -3 3 -3.1 0 0 0
[Msg] Hydrodynamics: set water patch size: 20
[Msg] Hydrodynamics: done initialise physics
[Msg] Hydrodynamics: initialise physics
[Msg] Hydrodynamics: checking collision meshes for link [multi_collision_neutral_buoyancy::body]
[Msg] Hydrodynamics: skipping collision [multi_collision_neutral_buoyancy::body::collision_1]
[Msg] Hydrodynamics: including collision [multi_collision_neutral_buoyancy::body::collision_2]
[Msg] Type:       BOX
[Msg] Size:       1 1 0.5
[Msg] MeshName:   multi_collision_neutral_buoyancy.body.collision_2.box
[Msg] Vertex:     24
[Msg] Hydrodynamics: links:  1, meshes: 1, collisions: 1
[Msg] Hydrodynamics: initialising link [multi_collision_neutral_buoyancy::body]
[Msg] Hydrodynamics: link has [1] collision meshes
[Msg] Hydrodynamics: link world pose: 3 3 -3 0 0 0
[Msg] Hydrodynamics: link world CoM pose: 3 3 -3.1 0 0 0
[Msg] Hydrodynamics: set water patch size: 20
[Msg] Hydrodynamics: done initialise physics
[Msg] Hydrodynamics: initialise physics
[Msg] Hydrodynamics: checking collision meshes for link [box_negative_buoyancy::body]
[Msg] Hydrodynamics: including collision [box_negative_buoyancy::body::body_collision]
[Msg] Type:       BOX
[Msg] Size:       1 1 1
[Msg] MeshName:   box_negative_buoyancy.body.body_collision.box
[Msg] Vertex:     24
[Msg] Hydrodynamics: links:  1, meshes: 1, collisions: 1
[Msg] Hydrodynamics: initialising link [box_negative_buoyancy::body]
[Msg] Hydrodynamics: link has [1] collision meshes
[Msg] Hydrodynamics: link world pose: -3 -3 0 0 0 0
[Msg] Hydrodynamics: link world CoM pose: -3 -3 -0.1 0 0 0
[Msg] Hydrodynamics: set water patch size: 20
[Msg] Hydrodynamics: done initialise physics

Application

Run MBARI wave buoy simulation at RTF > 1 by restricting the buoyancy forces to the main buoy link.

https://user-images.githubusercontent.com/24916364/188275612-7e029cc6-cb30-44ad-b26d-052072916c2f.mov