Change the fitted parts

Recipes for the vehicle config. The concepts (slots, defaults, free placement) are explained in Configuring the BlueBoat; the full key list is in Configuration keys.

Start from a copy of the shipped config:

cp $(ros2 pkg prefix --share blueboat_description)/config/blueboat.yaml my_vehicle.yaml

and try it without rebuilding: ros2 launch blueboat_gazebo sim.launch.xml config_file:=$PWD/my_vehicle.yaml.

Fit the other propellers

parts:
  - {slot: motor_port, type: t200_prop_ccw}
  - {slot: motor_stbd, type: t200_prop_cw}

Leave the Ping2 kit off

parts:
  - {slot: ping_mount, type: none}

The bracket goes, and with it the Ping it carries: no sensor, no bridge entry, no frame.

Add the antenna mast or the payload bracket

parts:
  - {slot: mast, type: blueboat_antenna_mast}
  - {slot: payload, type: blueboat_payload_bracket}

Rename the Ping topics

parts:
  - {slot: ping, of: ping_mount, type: ping_singlebeam, topic: sonar}

gives /blueboat/sonar/range on both sides (the namespace follows the instance name, so a boat spawned as boat_b gets /boat_b/sonar/range); gz_topic / ros_topic set one side only, a base starting with a slash is used as given (topic: /sonar gives /sonar/range, whatever the instance), bridge: {...} passes native ros_gz_bridge keys through.

Add a part somewhere specific

parts:
  - {type: surveyor_multibeam, name: multibeam, xyz: "0.35 0 -0.08", rpy: "0 0 0"}
  - {type: ping_singlebeam, name: bow_ping, xyz: "0.5 0 -0.05"}   # a second Ping, free placed

xyz/rpy are relative to parent (default base_link). The second Ping gets its own sensor, frame bow_ping_beam and topic /blueboat/bow_ping/range.

Declare your own mount point

slots:
  - {of: base_link, name: camera, xyz: "0.45 0 0.2", rpy: "0 0 0", accepts: [surveyor_multibeam]}
parts:
  - {slot: camera, type: surveyor_multibeam, name: bow_sonar}

An ad hoc slot behaves like the parts’ own: it becomes the frame base_link_camera, accepts is checked, default is honored.

See what you got

ros2 run blueboat_gazebo configure_vehicle.py --config my_vehicle.yaml --out-dir /tmp/boat
grep assembly_part /tmp/boat/blueboat.urdf

Every fitted part, defaults included, is one <assembly_part> line.