Configure an installed vehicle

From a binary (deb) install nothing under /opt/ros should be edited, and there is no workspace to rebuild. The vehicle is still fully configurable: every artifact (URDF, composed Gazebo model, ros_gz bridge config) is generated from a config file on demand, by the same tools the build uses (writing the config: Change the fitted parts).

The launch does it for you

ros2 launch blueboat_gazebo sim.launch.xml config_file:=/path/my_vehicle.yaml
ros2 launch blueboat_description display.launch.xml config_file:=/path/my_vehicle.yaml

sim.launch.xml runs configure_vehicle.py into a per config directory under $ROS_HOME at start, spawns that model and starts the bridge on that config. The default (no argument) is the baked default vehicle.

Generate the artifacts yourself

For anything beyond the stock launch (your own world and launch files, a model to hand to somebody else):

ros2 run blueboat_gazebo configure_vehicle.py --config my_vehicle.yaml --out-dir ~/my_models/blueboat

writes blueboat.urdf, blueboat.gazebo.urdf (the copy the model merges, glTF visuals pre-rotated for Gazebo), model.sdf, model.config and ros_gz_bridge.yaml, plus vehicle.yaml, the config as used. Add --name <name> to generate an instance under another name (model name and topic namespace at once). The directory is a Gazebo model: with ~/my_models prepended to GZ_SIM_RESOURCE_PATH it is model://blueboat, shadowing the installed default, so a world can <include> it, or spawn it with ros2 run ros_gz_sim create -world <world> -file ~/my_models/blueboat/model.sdf -name blueboat -z 0.05. The model:// name is the directory’s name, so an instance generated with --name boat_b belongs in a directory called boat_b (~/my_models/boat_b) to be model://boat_b. Start the bridge on the generated config (ros2 run ros_gz_bridge parameter_bridge --ros-args -p config_file:=$HOME/my_models/blueboat/ros_gz_bridge.yaml) and robot_state_publisher on the generated URDF. The three files come from one resolution of the config, so they agree with each other.

Overlay workspace

The third option, for anything long lived: an overlay workspace that builds only blueboat_description with your edited config/blueboat.yaml on top of the installed packages. The build regenerates the URDF, the composed model and the bridge config consistently, and model://blueboat resolves to your overlay.