Add Metal support to Gazebo for macOS

🎉 New feature
Fixes #44
Fixes #960
Summary
This PR provides support for running Gazebo on macOS using the Metal graphics API.
For platforms other than macOS the default behaviour is unchanged and will use the OpenGL graphics API. On macOS the graphics API is set to Metal and only the ogre2 render engine is supported.
Details
ign command scripts
The ruby script has been updated to allow ign gazebo -g to be run on macOS. Because of macOS's rules about using fork the server and gui must be run in separate terminals.
C++ code
There are two changes to support Metal

src/rendering/RenderUtil.cc: if __APPLE__ is defined the render engine parameters are set to metal.
src/systems/sensors/Sensors.cc: the render engine initialisation is moved to Update so that it occurs on the main thread.

QML
Finally there are a number of small changes to QML files to address warnings and errors that show up up on macOS where we are using Qt 5.15.2_1. The are mostly to do with tool tip behaviour.
Test it
A document describing how to build Ignition for Metal support is here: https://github.com/srmainwaring/ign-rendering/wiki. The main changes to note are the dependencies are now:

https://github.com/ignitionrobotics/ign-rendering/tree/main
https://github.com/ignitionrobotics/ign-gui/pull/323

and the MinimalScene plugin element to override the default graphics interface in gui.config is now <graphics_api>metal</graphics_api>.
examples/worlds/shapes.sdf
Update the MinimalScene plugin element in ~/.ignition/gazebo/7/gui.config to include <graphics_api>metal</graphics_api>.
Run the server:
$ ign gazebo -v4 -s -r shapes.sdf

Run the client:
$ ign gazebo -v4 -g shapes.sdf

examples/worlds/camera_sensor.sdf
Two changes are required in camera_sensor.sdf:
<!-- Modify the sensors system plugin element to use the `ogre2` render engine -->
<plugin
  filename="ignition-gazebo-sensors-system"
  name="ignition::gazebo::systems::Sensors">
  <render_engine>ogre2</render_engine>
</plugin>

<!-- Modify the MinimalScene gui plugin element to use `ogre2` and the `metal` graphics API -->
<gui fullscreen="0">
  <plugin filename="MinimalScene" name="3D View">
    <ignition-gui>
      <title>3D View</title>
      <property type="bool" key="showTitleBar">false</property>
      <property type="string" key="state">docked</property>
    </ignition-gui>
    <engine>ogre2</engine>
    <scene>scene</scene>
    <ambient_light>0.4 0.4 0.4</ambient_light>
    <background_color>0.8 0.8 0.8</background_color>
    <camera_pose>-6 0 6 0 0.5 0</camera_pose>
    <graphics_api>metal</graphics_api>
</plugin>

Then rebuild with colcon (to install the change) and run as above substituting camera_sensor.sdf for shapes.sdf

Tests
These test are failing on macOS:
$ make test
...
The following tests FAILED:
	 49 - UNIT_ModelCommandAPI_TEST (SEGFAULT)
	 75 - INTEGRATION_buoyancy_engine (SEGFAULT)
	165 - INTEGRATION_touch_plugin (Subprocess aborted)
	171 - INTEGRATION_user_commands (SEGFAULT)

However INTEGRATION_buoyancy_engine and INTEGRATION_touch_plugin pass when run individually.
Code check
There are quite a few code check failures on macOS, however these don't seem to be connected to this PR.

% make codecheck
Built target cpplint
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/include/ignition/gazebo/Conversions.hh:631:7: error: Found a exit path from function with non-void return type that has missing return statement [missingReturn]
      Out::ConversionNotImplemented;
      ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/include/ignition/gazebo/components/Component.hh:115:0: information: Unmatched suppression: syntaxError [unmatchedSuppression]
      if constexpr (traits::IsSharedPtr<DataType>::value) // NOLINT
^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/include/ignition/gazebo/components/Factory.hh:305:51: error: There is an unknown macro here somewhere. Configuration is required. If IGN_DEPRECATED is a macro then please configure it. [unknownMacro]
    public: std::unique_ptr<ComponentStorageBase> IGN_DEPRECATED(6) NewStorage(
                                                  ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/include/ignition/gazebo/components/Model.hh:70:26: style: Variable 'errors' is assigned a value that is never used. [unreadVariable]
      sdf::Errors errors = root.LoadSdfString(sdf);
                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/include/ignition/gazebo/detail/BaseView.hh:52:12: style: Consider using std::accumulate algorithm instead of a raw loop. [useStlAlgorithm]
      hash ^= i + 0x9e3779b9 + (hash << 6) + (hash >> 2);
           ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/include/ignition/gazebo/detail/ComponentStorageBase.hh:35:15: error: There is an unknown macro here somewhere. Configuration is required. If IGN_DEPRECATED is a macro then please configure it. [unknownMacro]
      public: IGN_DEPRECATED(6) ComponentStorageBase() = default;
              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/include/ignition/gazebo/detail/EntityComponentManager.hh:512:16: style: Variable 'viewLock' is assigned a value that is never used. [unreadVariable]
      viewLock = std::make_unique<std::lock_guard<std::mutex>>(*mutexPtr);
               ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/include/ignition/gazebo/detail/EntityComponentManager.hh:73:0: information: Unmatched suppression: syntaxError [unmatchedSuppression]
  if constexpr (std::is_same<DataType, double>::value)
^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/EntityComponentManager.cc:1730:31: performance: Searching before insertion is not necessary. [stlFindInsert]
          printedComps.insert(type);
                              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/EventManager_TEST.cc:75:23: performance: Function parameter '_val1' should be passed by const reference. [passedByValue]
      [&](std::string _val1, std::string _val2)
                      ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/EventManager_TEST.cc:75:42: performance: Function parameter '_val2' should be passed by const reference. [passedByValue]
      [&](std::string _val1, std::string _val2)
                                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/LevelManager.hh:83:15: style: Class 'LevelManager' has a constructor with 1 argument that is not explicit. [noExplicitConstructor]
      public: LevelManager(SimulationRunner *_runner, bool _useLevels = false);
              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/Model_TEST.cc:150:7: style: Consider using std::count_if algorithm instead of a raw loop. [useStlAlgorithm]
      foundLinks++;
      ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/Model_TEST.cc:211:7: style: Consider using std::count_if algorithm instead of a raw loop. [useStlAlgorithm]
      foundModels++;
      ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/SdfGenerator.cc:85:19: style: Consider using std::accumulate algorithm instead of a raw loop. [useStlAlgorithm]
          newPath /= segment;
                  ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/SdfGenerator_TEST.cc:218:17: style: Variable 'errors' is assigned a value that is never used. [unreadVariable]
    auto errors = this->root.Load(common::joinPaths(PROJECT_SOURCE_PATH,
                ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/SdfGenerator_TEST.cc:229:17: style: Variable 'errors' is assigned a value that is never used. [unreadVariable]
    auto errors = this->root.LoadSdfString(_worldSdf);
                ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/ServerConfig.cc:64:0: information: Unmatched suppression: passedByValue [unmatchedSuppression]
  public: PluginInfoPrivate(std::string _entityName,
^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/ServerConfig.cc:66:0: information: Unmatched suppression: passedByValue [unmatchedSuppression]
                            std::string _entityType,
^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/ServerConfig.cc:68:0: information: Unmatched suppression: passedByValue [unmatchedSuppression]
                            std::string _filename,
^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/ServerConfig.cc:70:0: information: Unmatched suppression: passedByValue [unmatchedSuppression]
                            std::string _name)
^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/ServerPrivate.cc:249:23: style: Variable 'recordTopicElem' is assigned a value that is never used. [unreadVariable]
      recordTopicElem = recordTopicElem->GetNextElement();
                      ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/SimulationRunner.cc:762:15: style: Variable 'sleepTime' is reassigned a value before the old one has been used. [redundantAssignment]
    sleepTime = std::max(0ns, this->prevUpdateRealTime +
              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/SimulationRunner.cc:759:15: note: sleepTime is assigned
    sleepTime = 0ns;
              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/SimulationRunner.cc:762:15: note: sleepTime is overwritten
    sleepTime = std::max(0ns, this->prevUpdateRealTime +
              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/Util.cc:543:10: style: Local variable 'validTopic' shadows outer function [shadowFunction]
    auto validTopic = transport::TopicUtils::AsValidTopic(topic);
         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/Util.cc:539:13: note: Shadowed declaration
std::string validTopic(const std::vector<std::string> &_topics)
            ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/Util.cc:543:10: note: Shadow variable
    auto validTopic = transport::TopicUtils::AsValidTopic(topic);
         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/Util.cc:474:17: style: Consider using std::accumulate algorithm instead of a raw loop. [useStlAlgorithm]
    sdfPathsStr += ':' + path;
                ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/Util.cc:480:17: style: Consider using std::accumulate algorithm instead of a raw loop. [useStlAlgorithm]
    ignPathsStr += ':' + path;
                ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/Util.cc:487:16: style: Consider using std::accumulate algorithm instead of a raw loop. [useStlAlgorithm]
    gzPathsStr += ':' + path;
               ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/banana_for_scale/BananaForScale.cc:100:17: style: Variable 'result' is assigned a value that is never used. [unreadVariable]
    auto result = this->dataPtr->fuelClient->DownloadModel(modelUri, localPath);
                ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/entity_tree/EntityTree.cc:489:22: style: Variable 'errTxt' is assigned a value that is never used. [unreadVariable]
      QString errTxt = QString::fromStdString("Invalid URI: " + meshStr +
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/component_inspector/ComponentInspector.cc:559:5: warning: Either the condition 'nullptr==item' is redundant or there is possible null pointer dereference: item. [nullPointerRedundantCheck]
    item->setData(QString::number(this->dataPtr->entity),
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/component_inspector/ComponentInspector.cc:562:17: note: Assuming that condition 'nullptr==item' is not redundant
    if (nullptr == item)
                ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/component_inspector/ComponentInspector.cc:559:5: note: Null pointer dereference
    item->setData(QString::number(this->dataPtr->entity),
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/entity_tree/EntityTree.hh:86:0: information: Unmatched suppression: unusedStructMember [unmatchedSuppression]
      Entity entity;
^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/entity_tree/EntityTree.hh:93:0: information: Unmatched suppression: unusedStructMember [unmatchedSuppression]
      Entity parentEntity;
^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/resource_spawner/ResourceSpawner.cc:336:21: style: Consider using std::copy algorithm instead of a raw loop. [useStlAlgorithm]
      fuelResources.push_back(resource);
                    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/resource_spawner/ResourceSpawner.cc:505:9: style: Consider using std::find_if algorithm instead of a raw loop. [useStlAlgorithm]
        {
        ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/spawn/Spawn.cc:332:34: style: Variable 'rootVis' is assigned a value that is never used. [unreadVariable]
    rendering::VisualPtr rootVis = this->scene->RootVisual();
                                 ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/scene3d/Scene3D.cc:990:36: style: Variable 'rootVis' is assigned a value that is never used. [unreadVariable]
      rendering::VisualPtr rootVis = scene->RootVisual();
                                   ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/network/PeerTracker.hh:134:23: style: Consider using std::transform algorithm instead of a raw loop. [useStlAlgorithm]
                  ret.push_back(it.first);
                      ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/visualization_capabilities/VisualizationCapabilities.cc:1232:29: warning: Possible null pointer dereference: workflow [nullPointer]
    std::string albedoMap = workflow->AlbedoMap();
                            ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/visualization_capabilities/VisualizationCapabilities.cc:1190:34: note: Assignment 'workflow=nullptr', assigned value is 0
    sdf::PbrWorkflow *workflow = nullptr;
                                 ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/visualization_capabilities/VisualizationCapabilities.cc:1193:9: note: Assuming condition is false
    if (metal)
        ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/visualization_capabilities/VisualizationCapabilities.cc:1232:29: note: Null pointer dereference
    std::string albedoMap = workflow->AlbedoMap();
                            ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/network/NetworkManagerPrimary.cc:121:11: style: Consider using std::any_of, std::all_of, std::none_of, or std::accumulate algorithm instead of a raw loop. [useStlAlgorithm]
    ready &= secondary.second->ready;
          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/network/PeerTracker.cc:113:7: style: Consider using std::count_if algorithm instead of a raw loop. [useStlAlgorithm]
      count++;
      ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/network/PeerTracker.cc:99:13: style: Variable 'lock' is assigned a value that is never used. [unreadVariable]
  auto lock = PeerLock(this->peersMutex);
            ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/network/PeerTracker.cc:106:13: style: Variable 'lock' is assigned a value that is never used. [unreadVariable]
  auto lock = PeerLock(this->peersMutex);
            ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/network/PeerTracker.cc:161:13: style: Variable 'lock' is assigned a value that is never used. [unreadVariable]
  auto lock = PeerLock(this->peersMutex);
            ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/network/PeerTracker.cc:208:13: style: Variable 'lock' is assigned a value that is never used. [unreadVariable]
  auto lock = PeerLock(this->peersMutex);
            ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/network/PeerTracker.cc:228:13: style: Variable 'lock' is assigned a value that is never used. [unreadVariable]
  auto lock = PeerLock(this->peersMutex);
            ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/battery_plugin/LinearBatteryPlugin.cc:562:18: style: Consider using std::accumulate algorithm instead of a raw loop. [useStlAlgorithm]
      totalpower += powerLoad.second;
                 ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/rendering/SceneManager.cc:1733:29: style: Variable 'key' is assigned a value that is never used. [unreadVariable]
      const std::string key = "particle_scatter_ratio";
                            ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/buoyancy/Buoyancy.cc:202:20: style: Variable 'centerOfBuoyancy' is assigned a value that is never used. [unreadVariable]
  centerOfBuoyancy = cov;
                   ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/hydrodynamics/Hydrodynamics.cc:344:12: style: Redundant initialization for 'stateDot'. The initialized value is overwritten before it is read. [redundantInitialization]
  stateDot = (state - this->dataPtr->prevState)/dt;
           ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/hydrodynamics/Hydrodynamics.cc:304:28: note: stateDot is initialized
  Eigen::VectorXd stateDot = Eigen::VectorXd(6);
                           ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/hydrodynamics/Hydrodynamics.cc:344:12: note: stateDot is overwritten
  stateDot = (state - this->dataPtr->prevState)/dt;
           ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/joint_controller/JointController.cc:205:20: style: The if condition is the same as the previous if condition [duplicateCondition]
  if (jointVelComp == nullptr)
                   ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/joint_controller/JointController.cc:200:20: note: First condition
  if (jointVelComp == nullptr)
                   ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/joint_controller/JointController.cc:205:20: note: Second condition
  if (jointVelComp == nullptr)
                   ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/lift_drag/LiftDrag.cc:440:6: style: Variable 'cm' is reassigned a value before the old one has been used. [redundantAssignment]
  cm = 0.0;
     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/lift_drag/LiftDrag.cc:436:8: note: cm is assigned
    cm = this->cma * alpha * cosSweepAngle;
       ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/lift_drag/LiftDrag.cc:440:6: note: cm is overwritten
  cm = 0.0;
     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/multicopter_control/Common.hh:101:34: warning: Found suspicious operator ',' [constStatement]
        -_vector.y(), _vector.x(), 0;
                                 ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/multicopter_control/Common.cc:263:41: style: Parameter '_val' can be declared with const [constParameter]
  auto applyNoise = [](Eigen::Vector3d &_val, const Eigen::Vector3d &_mean,
                                        ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/multicopter_motor_model/MulticopterMotorModel.cc:70:37: error: Found a exit path from function with non-void return type that has missing return statement [missingReturn]
      previousState(_initialState) {}
                                    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/particle_emitter/ParticleEmitter.hh:122:13: error: There is an unknown macro here somewhere. Configuration is required. If IGN_DEPRECATED is a macro then please configure it. [unknownMacro]
    public: IGN_DEPRECATED(6) ParticleEmitter();
            ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/optical_tactile_plugin/OpticalTactilePlugin.cc:657:7: style: Consider using std::any_of algorithm instead of a raw loop. [useStlAlgorithm]
      {
      ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/particle_emitter2/ParticleEmitter2.cc:165:23: style: Consider using std::accumulate algorithm instead of a raw loop. [useStlAlgorithm]
                topic = data.value(0);
                      ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/physics/EntityFeatureMap.hh:101:0: information: Unmatched suppression: syntaxError [unmatchedSuppression]
      if constexpr (!HasFeatureList<ToFeatureList>::value) // NOLINT
^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/thruster/Thruster.cc:293:13: style: Variable 'pose' is assigned a value that is never used. [unreadVariable]
  auto pose = worldPose(this->dataPtr->linkEntity, _ecm);
            ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/triggered_publisher/TriggeredPublisher.cc:317:15: warning: Either the condition 'nullptr==fieldMsgType' is redundant or there is possible null pointer dereference: fieldMsgType. [nullPointerRedundantCheck]
           << fieldMsgType->full_name() << "] does not have any fields\n";
              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/triggered_publisher/TriggeredPublisher.cc:313:15: note: Assuming that condition 'nullptr==fieldMsgType' is not redundant
  if (nullptr == fieldMsgType)
              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/triggered_publisher/TriggeredPublisher.cc:317:15: note: Null pointer dereference
           << fieldMsgType->full_name() << "] does not have any fields\n";
              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/velocity_control/VelocityControl.cc:370:5: style: Consider using std::find_if algorithm instead of a raw loop. [useStlAlgorithm]
    {
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/apply_joint_force_system.cc:110:36: error: Out of bounds access in expression 'jointForceCmd.back()' because 'jointForceCmd' is empty and 'back' may be non-zero. [containerOutOfBounds]
    if (std::abs(jointForceCmd.back() - testJointForce) < 1e-6)
                                   ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/ackermann_steering_system.cc:358:0: information: Unmatched suppression: knownConditionTrueFalse [unmatchedSuppression]
  for (; odomPosesCount < 5 && sleep < maxSleep; ++sleep) // NOLINT
^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/ackermann_steering_system.cc:409:0: information: Unmatched suppression: knownConditionTrueFalse [unmatchedSuppression]
  for (; odomPosesCount < 5 && sleep < maxSleep; ++sleep)
^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/helpers/EnvTestFixture.hh:55:29: warning: The class 'InternalFixture < InternalFixture < :: testing :: Test > >' defines member variable with name 'kFakeHome' also defined in its parent class 'InternalFixture < :: testing :: Test >'. [duplInheritedMember]
  public: const std::string kFakeHome = common::joinPaths(PROJECT_BINARY_PATH,
                            ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/helpers/EnvTestFixture.hh:55:29: note: Parent variable 'InternalFixture < :: testing :: Test >::kFakeHome'
  public: const std::string kFakeHome = common::joinPaths(PROJECT_BINARY_PATH,
                            ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/helpers/EnvTestFixture.hh:55:29: note: Derived variable 'InternalFixture < InternalFixture < :: testing :: Test > >::kFakeHome'
  public: const std::string kFakeHome = common::joinPaths(PROJECT_BINARY_PATH,
                            ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/helpers/EnvTestFixture.hh:59:23: warning: The class 'InternalFixture < InternalFixture < :: testing :: Test > >' defines member variable with name 'realHome' also defined in its parent class 'InternalFixture < :: testing :: Test >'. [duplInheritedMember]
  public: std::string realHome;
                      ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/helpers/EnvTestFixture.hh:59:23: note: Parent variable 'InternalFixture < :: testing :: Test >::realHome'
  public: std::string realHome;
                      ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/helpers/EnvTestFixture.hh:59:23: note: Derived variable 'InternalFixture < InternalFixture < :: testing :: Test > >::realHome'
  public: std::string realHome;
                      ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/camera_video_record_system.cc:69:7: style: Consider using std::any_of algorithm instead of a raw loop. [useStlAlgorithm]
      {
      ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/detachable_joint.cc:127:26: error: Out of bounds access in expression 'm1Poses.front()' because 'm1Poses' is empty and 'front' may be non-zero. [containerOutOfBounds]
  EXPECT_EQ(m1Poses.front(), m1Poses.back());
                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/detachable_joint.cc:127:42: error: Out of bounds access in expression 'm1Poses.back()' because 'm1Poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
  EXPECT_EQ(m1Poses.front(), m1Poses.back());
                                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/detachable_joint.cc:134:26: error: Out of bounds access in expression 'm2Poses.front()' because 'm2Poses' is empty and 'front' may be non-zero. [containerOutOfBounds]
  EXPECT_GT(m2Poses.front().Pos().Z() - m2Poses.back().Pos().Z(), expDist);
                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/detachable_joint.cc:134:53: error: Out of bounds access in expression 'm2Poses.back()' because 'm2Poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
  EXPECT_GT(m2Poses.front().Pos().Z() - m2Poses.back().Pos().Z(), expDist);
                                                    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/detachable_joint.cc:205:26: error: Out of bounds access in expression 'b1Poses.front()' because 'b1Poses' is empty and 'front' may be non-zero. [containerOutOfBounds]
  EXPECT_EQ(b1Poses.front(), b1Poses.back());
                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/detachable_joint.cc:205:42: error: Out of bounds access in expression 'b1Poses.back()' because 'b1Poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
  EXPECT_EQ(b1Poses.front(), b1Poses.back());
                                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/detachable_joint.cc:212:26: error: Out of bounds access in expression 'b2Poses.front()' because 'b2Poses' is empty and 'front' may be non-zero. [containerOutOfBounds]
  EXPECT_GT(b2Poses.front().Pos().Z() - b2Poses.back().Pos().Z(), expDist);
                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/detachable_joint.cc:212:53: error: Out of bounds access in expression 'b2Poses.back()' because 'b2Poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
  EXPECT_GT(b2Poses.front().Pos().Z() - b2Poses.back().Pos().Z(), expDist);
                                                    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/diff_drive_system.cc:504:0: information: Unmatched suppression: knownConditionTrueFalse [unmatchedSuppression]
  for (; odomPosesCount < 5 && sleep < maxSleep; ++sleep) // NOLINT
^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/diff_drive_system.cc:561:0: information: Unmatched suppression: knownConditionTrueFalse [unmatchedSuppression]
  for (; odomPosesCount < 5 && sleep < maxSleep; ++sleep)
^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/diff_drive_system.cc:621:0: information: Unmatched suppression: knownConditionTrueFalse [unmatchedSuppression]
  for (; odomPosesCount < 5 && sleep < maxSleep; ++sleep)
^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/diff_drive_system.cc:681:0: information: Unmatched suppression: knownConditionTrueFalse [unmatchedSuppression]
  for (; odomPosesCount < 5 && sleep < maxSleep; ++sleep)
^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/diff_drive_system.cc:742:0: information: Unmatched suppression: knownConditionTrueFalse [unmatchedSuppression]
  for (; odomPosesCount < 5 && sleep < maxSleep; ++sleep)
^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/components.cc:110:15: style: Variable 'comp12' is assigned a value that is never used. [unreadVariable]
  auto comp12 = components::Actor(data1);
              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/components.cc:111:14: style: Variable 'comp2' is assigned a value that is never used. [unreadVariable]
  auto comp2 = components::Actor(data2);
             ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/components.cc:425:15: style: Variable 'comp12' is assigned a value that is never used. [unreadVariable]
  auto comp12 = components::Geometry(data1);
              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/components.cc:426:14: style: Variable 'comp2' is assigned a value that is never used. [unreadVariable]
  auto comp2 = components::Geometry(data2);
             ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/components.cc:578:15: style: Variable 'comp12' is assigned a value that is never used. [unreadVariable]
  auto comp12 = components::JointAxis(data1);
              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/components.cc:579:14: style: Variable 'comp2' is assigned a value that is never used. [unreadVariable]
  auto comp2 = components::JointAxis(data2);
             ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/components.cc:883:15: style: Variable 'comp12' is assigned a value that is never used. [unreadVariable]
  auto comp12 = components::Light(data1);
              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/components.cc:884:14: style: Variable 'comp2' is assigned a value that is never used. [unreadVariable]
  auto comp2 = components::Light(data2);
             ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/components.cc:1167:14: style: Variable 'comp2' is assigned a value that is never used. [unreadVariable]
  auto comp2 = components::Material(data2);
             ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/components.cc:1429:15: style: Variable 'comp12' is assigned a value that is never used. [unreadVariable]
  auto comp12 = components::PerformerLevels({1, 2, 3});
              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/components.cc:1430:14: style: Variable 'comp2' is assigned a value that is never used. [unreadVariable]
  auto comp2 = components::PerformerLevels({4, 5});
             ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/components.cc:1455:15: style: Variable 'comp12' is assigned a value that is never used. [unreadVariable]
  auto comp12 = components::PhysicsEnginePlugin("engine-plugin");
              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/components.cc:1456:14: style: Variable 'comp2' is assigned a value that is never used. [unreadVariable]
  auto comp2 = components::PhysicsEnginePlugin("another-engine-plugin");
             ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/components.cc:1753:14: style: Variable 'comp2' is assigned a value that is never used. [unreadVariable]
  auto comp2 = components::ParticleEmitter(emitter2);
             ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/force_torque_system.cc:163:39: error: Out of bounds access in expression 'wrenches.back()' because 'wrenches' is empty and 'back' may be non-zero. [containerOutOfBounds]
    const auto &wrench = wrenches.back();
                                      ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/joint_controller_system.cc:136:29: style: Iterating over container 'angularVelocities' that is always empty. [knownEmptyContainer]
  for (const auto &angVel : angularVelocities)
                            ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/kinetic_energy_monitor_system.cc:66:32: style: Variable 'sensorName' is assigned a value that is never used. [unreadVariable]
  const std::string sensorName = "altimeter_sensor";
                               ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/logical_camera_system.cc:82:8: style: The scope of the variable 'topic1' can be reduced. [variableScope]
  auto topic1 = "world/logical_camera_sensor/model/logical_camera-1/link/"
       ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/log_system.cc:116:12: style: Consider using std::transform algorithm instead of a raw loop. [useStlAlgorithm]
    _paths.push_back(entry.path().string());
           ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/odometry_publisher.cc:388:0: information: Unmatched suppression: knownConditionTrueFalse [unmatchedSuppression]
    for (; odomPosesCount < 5 && sleep < maxSleep; ++sleep)
^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/save_world.cc:90:8: style: The scope of the variable 'modelStr' can be reduced. [variableScope]
  auto modelStr = R"(
       ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/physics_system.cc:2173:47: style: Checking if unsigned expression 'i' is less than zero. [unsignedLessThanZero]
  for (std::size_t i = iterOfContact + 300; i < wrenches.size(); ++i)
                                              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/touch_plugin.cc:96:37: style: Condition '!whiteTouched' is always true [knownConditionTrueFalse]
  for (int sleep = 0; sleep < 50 && !whiteTouched; ++sleep)
                                    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/touch_plugin.cc:92:18: note: Assignment 'whiteTouched=false', assigned value is 0
  whiteTouched = false;
                 ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/touch_plugin.cc:96:37: note: Condition '!whiteTouched' is always true
  for (int sleep = 0; sleep < 50 && !whiteTouched; ++sleep)
                                    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/touch_plugin.cc:176:37: style: Condition '!blueTouched' is always true [knownConditionTrueFalse]
  for (int sleep = 0; sleep < 50 && !blueTouched; ++sleep)
                                    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/touch_plugin.cc:173:17: note: Assignment 'blueTouched=false', assigned value is 0
  blueTouched = false;
                ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/touch_plugin.cc:176:37: note: Condition '!blueTouched' is always true
  for (int sleep = 0; sleep < 50 && !blueTouched; ++sleep)
                                    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:233:20: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_LT(poses[0].Pos().X(), poses[999].Pos().X());
                   ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:233:40: error: Out of bounds access in expression 'poses[999]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_LT(poses[0].Pos().X(), poses[999].Pos().X());
                                       ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:234:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Y(), poses[999].Pos().Y(), tol);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:234:42: error: Out of bounds access in expression 'poses[999]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Y(), poses[999].Pos().Y(), tol);
                                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:235:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Z(), poses[999].Pos().Z(), tol);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:235:42: error: Out of bounds access in expression 'poses[999]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Z(), poses[999].Pos().Z(), tol);
                                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:236:5: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses[0].Rot().X(), poses[999].Rot().X(), tol);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:236:5: error: Out of bounds access in expression 'poses[999]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses[0].Rot().X(), poses[999].Rot().X(), tol);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:237:5: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses[0].Rot().Y(), poses[999].Rot().Y(), tol);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:237:5: error: Out of bounds access in expression 'poses[999]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses[0].Rot().Y(), poses[999].Rot().Y(), tol);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:238:5: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses[0].Rot().Z(), poses[999].Rot().Z(), tol);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:238:5: error: Out of bounds access in expression 'poses[999]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses[0].Rot().Z(), poses[999].Rot().Z(), tol);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:241:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().X(), odomPoses[0].Pos().X() + 3.0, 3e-2);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:242:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Y(), odomPoses[0].Pos().Y(), 1e-2);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:243:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().X(), odomPoses.back().Pos().X() + 3, 1e-1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:244:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Y(), odomPoses.back().Pos().Y(), 1e-2);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:249:21: error: Out of bounds access in expression 'poses[999]' because 'poses' is empty. [containerOutOfBounds]
    double d = poses[999].Pos().Distance(poses[0].Pos());
                    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:249:47: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    double d = poses[999].Pos().Distance(poses[0].Pos());
                                              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:265:38: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    const auto startPose = poses.back();
                                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:273:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().X(), startPose.Pos().X() + linearSpeed, 0.1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:274:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Y(), startPose.Pos().Y(), 1e-1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:275:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Z(), startPose.Pos().Z(), 1e-2);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:276:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), startPose.Rot().Roll(), 1e-2);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:277:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:279:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Yaw(), startPose.Rot().Yaw(), 1e-1);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:283:39: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    const auto middlePose = poses.back();
                                      ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:293:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().X(), middlePose.Pos().X(), 1e-1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:294:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Y(), middlePose.Pos().Y(), 1e-1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:295:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Z(), middlePose.Pos().Z(), 1e-2);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:296:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), middlePose.Rot().Roll(), 1e-2);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:297:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:299:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Yaw(),
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:304:37: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    const auto lastPose = poses.back();
                                    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:311:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().X(), lastPose.Pos().X() + 0.4, 1e-1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:312:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Y(), lastPose.Pos().Y() + 0.15, 1e-1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:313:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Z(), lastPose.Pos().Z(), 1e-2);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:314:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), lastPose.Rot().Roll(), 1e-2);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:315:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Pitch(), lastPose.Rot().Pitch(), 1e-2);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:316:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:334:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().X(), beforeStairsPose.X() + 3.4, 0.15);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:335:25: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_LE(poses.back().Pos().Y(), 0.7);
                        ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:336:25: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_GT(poses.back().Pos().Z(), 0.6);
                        ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:337:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), 0.0, 1e-1);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:338:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Pitch(), -0.4, 1e-1);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:339:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:360:25: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_LT(poses.back().Pos().X(), -0.99);  // The driving is wild
                        ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:361:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Y(), 0, 0.5);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:362:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Z(), 0.0, 1e-1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:363:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), 0.0, 1e-1);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:364:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Pitch(), 0.0, 1e-1);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:366:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:388:25: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_GT(poses.back().Pos().X(), 3.5);
                        ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:389:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Y(), 2, 0.1);  // The driving is wild
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:390:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Z(), 0.0, 1e-1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:391:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), 0.0, 1e-1);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:392:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Pitch(), 0.0, 1e-1);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:394:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:405:25: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_LT(poses.back().Pos().X(), 1);
                        ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:406:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Y(), 2, 0.1);  // The driving is wild
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:407:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Z(), 0.0, 1e-1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:408:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), 0.0, 1e-1);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:409:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Pitch(), 0.0, 1e-1);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:411:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:437:15: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    poses.back().SetZ(beforeCylinderPose.Pos().Z());  // ignore Z offset
              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:438:26: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    verifyPose(poses.back(), beforeCylinderPose);
                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:530:34: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(0.125, poses.back().Pos().X(), 1e-1);
                                 ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:531:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Y(), poses.back().Pos().Y(), 1e-2);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:531:47: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Y(), poses.back().Pos().Y(), 1e-2);
                                              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:532:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Z(), poses.back().Pos().Z(), 1e-2);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:532:47: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Z(), poses.back().Pos().Z(), 1e-2);
                                              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:533:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), 0, 1e-3);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:534:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Pitch(), 0, 1e-3);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:535:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Yaw(), 0, 1e-3);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:542:32: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(0.5, poses.back().Pos().X(), 1e-1);
                               ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:543:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Y(), poses.back().Pos().Y(), 1e-2);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:543:47: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Y(), poses.back().Pos().Y(), 1e-2);
                                              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:544:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Z(), poses.back().Pos().Z(), 1e-2);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:544:47: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Z(), poses.back().Pos().Z(), 1e-2);
                                              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:545:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), 0, 1e-3);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:546:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Pitch(), 0, 1e-3);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:547:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Yaw(), 0, 1e-3);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:554:34: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(0.875, poses.back().Pos().X(), 1e-1);
                                 ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:555:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Y(), poses.back().Pos().Y(), 1e-2);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:555:47: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Y(), poses.back().Pos().Y(), 1e-2);
                                              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:556:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Z(), poses.back().Pos().Z(), 1e-2);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:556:47: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Z(), poses.back().Pos().Z(), 1e-2);
                                              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:557:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), 0, 1e-3);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:558:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Pitch(), 0, 1e-3);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:559:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Yaw(), 0, 1e-3);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/wind_effects.cc:69:11: style: Class 'LinkComponentRecorder < components :: WindMode >' has a constructor with 1 argument that is not explicit. [noExplicitConstructor]
  public: LinkComponentRecorder(std::string _linkName, bool _createComp = false)
          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/wind_effects.cc:69:11: style: Class 'LinkComponentRecorder < components :: WorldLinearAcceleration >' has a constructor with 1 argument that is not explicit. [noExplicitConstructor]
  public: LinkComponentRecorder(std::string _linkName, bool _createComp = false)
          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/wind_effects.cc:69:11: style: Class 'LinkComponentRecorder < components :: WorldLinearVelocity >' has a constructor with 1 argument that is not explicit. [noExplicitConstructor]
  public: LinkComponentRecorder(std::string _linkName, bool _createComp = false)
          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/include/ignition/gazebo/Conversions.hh:631:7: error: Found a exit path from function with non-void return type that has missing return statement [missingReturn]
      Out::ConversionNotImplemented;
      ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/include/ignition/gazebo/components/Factory.hh:305:51: error: There is an unknown macro here somewhere. Configuration is required. If IGN_DEPRECATED is a macro then please configure it. [unknownMacro]
    public: std::unique_ptr<ComponentStorageBase> IGN_DEPRECATED(6) NewStorage(
                                                  ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/include/ignition/gazebo/detail/ComponentStorageBase.hh:35:15: error: There is an unknown macro here somewhere. Configuration is required. If IGN_DEPRECATED is a macro then please configure it. [unknownMacro]
      public: IGN_DEPRECATED(6) ComponentStorageBase() = default;
              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/visualization_capabilities/VisualizationCapabilities.cc:1232:29: warning: Possible null pointer dereference: workflow [nullPointer]
    std::string albedoMap = workflow->AlbedoMap();
                            ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/visualization_capabilities/VisualizationCapabilities.cc:1190:34: note: Assignment 'workflow=nullptr', assigned value is 0
    sdf::PbrWorkflow *workflow = nullptr;
                                 ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/visualization_capabilities/VisualizationCapabilities.cc:1193:9: note: Assuming condition is false
    if (metal)
        ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/gui/plugins/visualization_capabilities/VisualizationCapabilities.cc:1232:29: note: Null pointer dereference
    std::string albedoMap = workflow->AlbedoMap();
                            ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/multicopter_motor_model/MulticopterMotorModel.cc:70:37: error: Found a exit path from function with non-void return type that has missing return statement [missingReturn]
      previousState(_initialState) {}
                                    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/src/systems/particle_emitter/ParticleEmitter.hh:122:13: error: There is an unknown macro here somewhere. Configuration is required. If IGN_DEPRECATED is a macro then please configure it. [unknownMacro]
    public: IGN_DEPRECATED(6) ParticleEmitter();
            ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/apply_joint_force_system.cc:110:36: error: Out of bounds access in expression 'jointForceCmd.back()' because 'jointForceCmd' is empty and 'back' may be non-zero. [containerOutOfBounds]
    if (std::abs(jointForceCmd.back() - testJointForce) < 1e-6)
                                   ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/detachable_joint.cc:127:26: error: Out of bounds access in expression 'm1Poses.front()' because 'm1Poses' is empty and 'front' may be non-zero. [containerOutOfBounds]
  EXPECT_EQ(m1Poses.front(), m1Poses.back());
                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/detachable_joint.cc:127:42: error: Out of bounds access in expression 'm1Poses.back()' because 'm1Poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
  EXPECT_EQ(m1Poses.front(), m1Poses.back());
                                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/detachable_joint.cc:134:26: error: Out of bounds access in expression 'm2Poses.front()' because 'm2Poses' is empty and 'front' may be non-zero. [containerOutOfBounds]
  EXPECT_GT(m2Poses.front().Pos().Z() - m2Poses.back().Pos().Z(), expDist);
                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/detachable_joint.cc:134:53: error: Out of bounds access in expression 'm2Poses.back()' because 'm2Poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
  EXPECT_GT(m2Poses.front().Pos().Z() - m2Poses.back().Pos().Z(), expDist);
                                                    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/detachable_joint.cc:205:26: error: Out of bounds access in expression 'b1Poses.front()' because 'b1Poses' is empty and 'front' may be non-zero. [containerOutOfBounds]
  EXPECT_EQ(b1Poses.front(), b1Poses.back());
                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/detachable_joint.cc:205:42: error: Out of bounds access in expression 'b1Poses.back()' because 'b1Poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
  EXPECT_EQ(b1Poses.front(), b1Poses.back());
                                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/detachable_joint.cc:212:26: error: Out of bounds access in expression 'b2Poses.front()' because 'b2Poses' is empty and 'front' may be non-zero. [containerOutOfBounds]
  EXPECT_GT(b2Poses.front().Pos().Z() - b2Poses.back().Pos().Z(), expDist);
                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/detachable_joint.cc:212:53: error: Out of bounds access in expression 'b2Poses.back()' because 'b2Poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
  EXPECT_GT(b2Poses.front().Pos().Z() - b2Poses.back().Pos().Z(), expDist);
                                                    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/force_torque_system.cc:163:39: error: Out of bounds access in expression 'wrenches.back()' because 'wrenches' is empty and 'back' may be non-zero. [containerOutOfBounds]
    const auto &wrench = wrenches.back();
                                      ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:233:20: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_LT(poses[0].Pos().X(), poses[999].Pos().X());
                   ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:233:40: error: Out of bounds access in expression 'poses[999]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_LT(poses[0].Pos().X(), poses[999].Pos().X());
                                       ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:234:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Y(), poses[999].Pos().Y(), tol);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:234:42: error: Out of bounds access in expression 'poses[999]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Y(), poses[999].Pos().Y(), tol);
                                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:235:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Z(), poses[999].Pos().Z(), tol);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:235:42: error: Out of bounds access in expression 'poses[999]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Z(), poses[999].Pos().Z(), tol);
                                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:236:5: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses[0].Rot().X(), poses[999].Rot().X(), tol);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:236:5: error: Out of bounds access in expression 'poses[999]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses[0].Rot().X(), poses[999].Rot().X(), tol);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:237:5: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses[0].Rot().Y(), poses[999].Rot().Y(), tol);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:237:5: error: Out of bounds access in expression 'poses[999]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses[0].Rot().Y(), poses[999].Rot().Y(), tol);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:238:5: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses[0].Rot().Z(), poses[999].Rot().Z(), tol);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:238:5: error: Out of bounds access in expression 'poses[999]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses[0].Rot().Z(), poses[999].Rot().Z(), tol);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:241:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().X(), odomPoses[0].Pos().X() + 3.0, 3e-2);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:242:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Y(), odomPoses[0].Pos().Y(), 1e-2);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:243:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().X(), odomPoses.back().Pos().X() + 3, 1e-1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:244:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Y(), odomPoses.back().Pos().Y(), 1e-2);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:249:21: error: Out of bounds access in expression 'poses[999]' because 'poses' is empty. [containerOutOfBounds]
    double d = poses[999].Pos().Distance(poses[0].Pos());
                    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:249:47: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    double d = poses[999].Pos().Distance(poses[0].Pos());
                                              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:265:38: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    const auto startPose = poses.back();
                                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:273:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().X(), startPose.Pos().X() + linearSpeed, 0.1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:274:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Y(), startPose.Pos().Y(), 1e-1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:275:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Z(), startPose.Pos().Z(), 1e-2);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:276:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), startPose.Rot().Roll(), 1e-2);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:277:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:279:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Yaw(), startPose.Rot().Yaw(), 1e-1);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:283:39: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    const auto middlePose = poses.back();
                                      ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:293:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().X(), middlePose.Pos().X(), 1e-1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:294:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Y(), middlePose.Pos().Y(), 1e-1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:295:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Z(), middlePose.Pos().Z(), 1e-2);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:296:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), middlePose.Rot().Roll(), 1e-2);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:297:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:299:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Yaw(),
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:304:37: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    const auto lastPose = poses.back();
                                    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:311:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().X(), lastPose.Pos().X() + 0.4, 1e-1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:312:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Y(), lastPose.Pos().Y() + 0.15, 1e-1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:313:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Z(), lastPose.Pos().Z(), 1e-2);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:314:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), lastPose.Rot().Roll(), 1e-2);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:315:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Pitch(), lastPose.Rot().Pitch(), 1e-2);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:316:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:334:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().X(), beforeStairsPose.X() + 3.4, 0.15);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:335:25: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_LE(poses.back().Pos().Y(), 0.7);
                        ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:336:25: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_GT(poses.back().Pos().Z(), 0.6);
                        ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:337:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), 0.0, 1e-1);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:338:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Pitch(), -0.4, 1e-1);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:339:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:360:25: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_LT(poses.back().Pos().X(), -0.99);  // The driving is wild
                        ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:361:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Y(), 0, 0.5);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:362:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Z(), 0.0, 1e-1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:363:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), 0.0, 1e-1);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:364:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Pitch(), 0.0, 1e-1);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:366:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:388:25: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_GT(poses.back().Pos().X(), 3.5);
                        ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:389:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Y(), 2, 0.1);  // The driving is wild
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:390:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Z(), 0.0, 1e-1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:391:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), 0.0, 1e-1);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:392:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Pitch(), 0.0, 1e-1);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:394:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:405:25: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_LT(poses.back().Pos().X(), 1);
                        ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:406:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Y(), 2, 0.1);  // The driving is wild
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:407:27: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses.back().Pos().Z(), 0.0, 1e-1);
                          ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:408:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), 0.0, 1e-1);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:409:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Pitch(), 0.0, 1e-1);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:411:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:437:15: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    poses.back().SetZ(beforeCylinderPose.Pos().Z());  // ignore Z offset
              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:438:26: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    verifyPose(poses.back(), beforeCylinderPose);
                         ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:530:34: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(0.125, poses.back().Pos().X(), 1e-1);
                                 ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:531:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Y(), poses.back().Pos().Y(), 1e-2);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:531:47: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Y(), poses.back().Pos().Y(), 1e-2);
                                              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:532:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Z(), poses.back().Pos().Z(), 1e-2);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:532:47: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Z(), poses.back().Pos().Z(), 1e-2);
                                              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:533:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), 0, 1e-3);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:534:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Pitch(), 0, 1e-3);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:535:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Yaw(), 0, 1e-3);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:542:32: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(0.5, poses.back().Pos().X(), 1e-1);
                               ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:543:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Y(), poses.back().Pos().Y(), 1e-2);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:543:47: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Y(), poses.back().Pos().Y(), 1e-2);
                                              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:544:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Z(), poses.back().Pos().Z(), 1e-2);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:544:47: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Z(), poses.back().Pos().Z(), 1e-2);
                                              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:545:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), 0, 1e-3);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:546:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Pitch(), 0, 1e-3);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:547:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Yaw(), 0, 1e-3);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:554:34: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(0.875, poses.back().Pos().X(), 1e-1);
                                 ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:555:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Y(), poses.back().Pos().Y(), 1e-2);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:555:47: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Y(), poses.back().Pos().Y(), 1e-2);
                                              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:556:22: error: Out of bounds access in expression 'poses[0]' because 'poses' is empty. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Z(), poses.back().Pos().Z(), 1e-2);
                     ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:556:47: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_NEAR(poses[0].Pos().Z(), poses.back().Pos().Z(), 1e-2);
                                              ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:557:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Roll(), 0, 1e-3);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:558:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Pitch(), 0, 1e-3);
    ^
/Users/rhys/Code/osrf/ign_fortress_ws/src/ign-gazebo/test/integration/tracked_vehicle_system.cc:559:5: error: Out of bounds access in expression 'poses.back()' because 'poses' is empty and 'back' may be non-zero. [containerOutOfBounds]
    EXPECT_ANGLE_NEAR(poses.back().Rot().Yaw(), 0, 1e-3);

Checklist

[x] Signed all commits for DCO
[ ] Added tests
[x] Added example and/or tutorial
[ ] Updated documentation (as needed)
[ ] Updated migration guide (as needed)
[ ] codecheck passed (See contributing)
[ ] All tests passed (See test coverage)
[ ] While waiting for a review on your PR, please help review another open pull request to support the maintainers

Note to maintainers: Remember to use Squash-Merge

hi @srmainwaring , I have merged this PR  on main branch,
shapes.sdf is work,

but some icons is missing while manipulate shape, should it shows colorful arrows?

camera_sensor.sdf is work too, but  1-refresh and 2-pause icons does not render.

sensors_demo.sdf does not work,  falling in infinite loop.

[Msg] Ignition Gazebo Server v7.0.0~pre1
[Msg] Loading SDF world file[/usr/local/Cellar/ignition-gazebo7/6.999.999~0~20220412/share/ignition/ignition-gazebo7/worlds/sensors_demo.sdf].
[Dbg] [Physics.cc:824] Loaded [ignition::physics::dartsim::Plugin] from library [/usr/local/Cellar/ignition-physics6/5.999.999~0~20220414/lib/ign-physics-6/engine-plugins/libignition-physics-dartsim-plugin.dylib]
[Dbg] [SystemManager.cc:49] Loaded system [ignition::gazebo::systems::Physics] for entity [1]
[Dbg] [Sensors.cc:455] Configuring Sensors system
[Dbg] [Sensors.cc:374] SensorsPrivate::Run
[Dbg] [SystemManager.cc:49] Loaded system [Loaded system [[Dbg] [Sensors.cc:354] ignition::gazebo::systems::SensorsSensorsPrivate::RenderThread started] for entity [
]]
Waiting for init
[Msg] Create service on [/world/lidar_sensor/create]
[Msg] Remove service on [/world/lidar_sensor/remove]
[Msg] Pose service on [/world/lidar_sensor/set_pose]
[Msg] Pose service on [/world/lidar_sensor/set_pose_vector]
[Msg] Light configuration service on [/world/lidar_sensor/light_config]
[Msg] Physics service on [/world/lidar_sensor/set_physics]
[Msg] SphericalCoordinates service on [/world/lidar_sensor/set_spherical_coordinates]
[Msg] Enable collision service on [/world/lidar_sensor/enable_collision]
[Msg] Disable collision service on [/world/lidar_sensor/disable_collision]
[Msg] Material service on [/world/lidar_sensor/visual_config]
[Msg] Material service on [/world/lidar_sensor/wheel_slip]
[Dbg] [SystemManager.cc:49] Loaded system [ignition::gazebo::systems::UserCommands] for entity [1]
[Dbg] [SystemManager.cc:49] Loaded system [ignition::gazebo::systems::SceneBroadcaster] for entity [1]
[Msg] Loaded level [3]
[Msg] Serving world controls on [/world/lidar_sensor/control], [/world/lidar_sensor/control/state] and [/world/lidar_sensor/playback/control]
[Msg] Serving GUI information on [/world/lidar_sensor/gui/info]
[Msg] World [lidar_sensor] initialized with [1ms] physics profile.
[Msg] Serving world SDF generation service on [/world/lidar_sensor/generate_world_sdf]
[Msg] Serving world names on [/gazebo/worlds]
[Msg] Resource path add service on [/gazebo/resource_paths/add].
[Msg] Resource path get service on [/gazebo/resource_paths/get].
[Msg] Resource paths published on [/gazebo/resource_paths].
[Msg] Server control service on [/server_control].
[Msg] Found no publishers on /stats, adding root stats topic
[Msg] Found no publishers on /clock, adding root clock topic
[Dbg] [SimulationRunner.cc:494] Creating PostUpdate worker threads: 3
[Dbg] [SimulationRunner.cc:505] Creating postupdate worker thread (0)
[Dbg] [SimulationRunner.cc:505] Creating postupdate worker thread (1)
[Dbg] [Sensors.cc:541] Initialization needed
[Msg] Loading plugin [ignition-rendering-ogre2]
[Dbg] [RenderUtil.cc:2536] Create scene [scene]
[Dbg] [Sensors.cc:577] Initialization needed
[Dbg] [Sensors.cc:234] Initializing render context
[Dbg] [Sensors.cc:253] Rendering Thread initialized
[Msg] Serving scene information on [/world/lidar_sensor/scene/info]
[Msg] Serving graph information on [/world/lidar_sensor/scene/graph]
[Msg] Serving full state on [/world/lidar_sensor/state]
[Msg] Serving full state (async) on [/world/lidar_sensor/state_async]
[Msg] Publishing scene information on [/world/lidar_sensor/scene/info]
[Msg] Publishing entity deletions on [/world/lidar_sensor/scene/deletion]
[Msg] Publishing state changes on [/world/lidar_sensor/state]
[Msg] Publishing pose messages on [/world/lidar_sensor/pose/info]
[Msg] Publishing dynamic pose messages on [/world/lidar_sensor/dynamic_pose/info]
[Dbg] [Sensors.cc:541] Initialization needed
[Dbg] [CameraSensor.cc:294] Camera images for [cameras_alone::link::cameras_alone] advertised on [camera_alone]
[Dbg] [CameraSensor.cc:589] Camera info for [cameras_alone::link::cameras_alone] advertised on [/camera_info]
[Dbg] [CameraSensor.cc:294] Camera images for [camera_with_lidar::link::camera] advertised on [camera]
[Dbg] [CameraSensor.cc:589] Camera info for [camera_with_lidar::link::camera] advertised on [/camera_info]
[Dbg] [DepthCameraSensor.cc:287] Depth images for [cameras_alone::link::depth_camera1] advertised on [depth_camera]
[Dbg] [CameraSensor.cc:589] Camera info for [cameras_alone::link::depth_camera1] advertised on [/camera_info]
[Dbg] [DepthCameraSensor.cc:304] Points for [cameras_alone::link::depth_camera1] advertised on [depth_camera/points]
[Dbg] [RgbdCameraSensor.cc:222] RGB images for [rgbd_camera::link::rgbd_camera] advertised on [rgbd_camera/image]
[Dbg] [RgbdCameraSensor.cc:236] Depth images for [rgbd_camera::link::rgbd_camera] advertised on [rgbd_camera/depth_image]
[Dbg] [RgbdCameraSensor.cc:250] Points for [rgbd_camera::link::rgbd_camera] advertised on [rgbd_camera/points]
[Dbg] [CameraSensor.cc:589] Camera info for [rgbd_camera::link::rgbd_camera] advertised on [rgbd_camera/camera_info]
[Dbg] [Lidar.cc:122] Laser scans for [camera_with_lidar::link::gpu_lidar] advertised on [lidar]
[Dbg] [GpuLidarSensor.cc:149] Lidar points for [camera_with_lidar::link::gpu_lidar] advertised on [lidar/points]
[Dbg] [ThermalCameraSensor.cc:223] Thermal images for [thermal_camera::link::thermal_camera] advertised on [thermal_camera]
[Dbg] [CameraSensor.cc:589] Camera info for [thermal_camera::link::thermal_camera] advertised on [/camera_info]
[Msg] Setting ambient temperature to 288.15 Kelvin and gradient to -0.0065 K/m. The resulting temperature range is: 0.750384 Kelvin.
[Dbg] [Sensors.cc:541] Initialization needed
[Dbg] [Sensors.cc:541] Initialization needed
[Dbg] [Sensors.cc:541] Initialization needed
[Dbg] [Sensors.cc:541] Initialization needed
[Dbg] [Sensors.cc:541] Initialization needed
[Dbg] [Sensors.cc:541] Initialization needed
...
infinite loop here !!!
so I pressed Ctrl+C
...

[Dbg] [Sensors.cc:541] Initialization needed
[Dbg] [Sensors.cc:541] Initialization needed
^C[Dbg] [SignalHandler.cc:141] Received signal[2].
[Dbg] [ServerPrivate.cc:110] Server received signal[2]
[Dbg] [Sensors.cc:382] SensorsPrivate::Stop
[Dbg] [Sensors.cc:368] SensorsPrivate::RenderThread stopped
[Dbg] [Sensors.cc:541] Initialization needed
[Dbg] [ign.cc:356] Shutting down ign-gazebo-server
[Dbg] [SimulationRunner.cc:521] [Dbg] [SimulationRunner.cc:521] [Dbg] [SimulationRunner.cc:521] Exiting postupdate worker thread (1Exiting postupdate worker thread ()0)0
)
)

[Dbg] [Sensors.cc:382] SensorsPrivate::Stop

but some icons is missing while manipulate shape, should it shows colorful arrows?

The issue with the Transform Control visuals is due to the QML gamma adjustment patch . The main branch in gz-gui uses a Qt extension QtGraphicalEffects, unfortunately it doesn't include Metal shaders so the patch I provided is a cheap and cheerful partial implementation. A full version would require reimplementing more of the Qt library - PR's welcome ;-).
I don't have the issue you're seeing with the icons for the play / pause or refresh on the Image Display.
The sensors_demo.sdf is working in my environment as this is the main test for the changes made for this PR. Can you provide some more info about your system so I can see what might be different. I've been running this PR on a MacBook Pro (2013) Big Sur 11.6.1 and a Mac Pro (2019) Big Sur 11.6.2.
I'm using main for all the dependent libraries except gz-gui where I have my gamma adjust branch checked out, and gz-gazebo where I have this branch checked out (not merged into main - although it's current so that shouldn't make a difference?)

A full version would require reimplementing more of the Qt library
I see, at least the function is work.

I thought those icons miss is related font or encoding.
At first, I'v just want to install gazebo and cooperate with ros. but the brew version ignition-gazebo6 did not work,  then I installed ignition-gazebo7, it still did not work, until I found your excellent PRs to support gazebo on macOS.
I'v build from source only for ogre2.2 / rendering / gui / gazebo7, and keep other libs in brew version.
my macOS version is 10.13.6,  it have nVidia gtx1060 GPU card installed, so I have to stick on high sierra,  the good thing is I can run some CUDA related lib, tensorflow, opencv.

hi @srmainwaring ,
I have build all dependency libs from ignition-cmake to ignition-sensors base on branch main, then rebuild upper libs from ogre2.2 to gazebo,  but got same issue, the sensors just falling in infinite loop.
Then I compared my gazebo branch with yours carefully,  finally I found the reason:
at src/systems/sensors/Sensors.cc#L569
I miss a left bracket while do copy and paste in the past,  then I delete the unnecessary right bracket at  #Line575 while encounter build errors.
now it works! thank your help !

Rebased PR on main to resolve conflicts.

Rebased PR on main to resolve conflicts.

I'm happy to help test this. I've been working with gazebo classic on my M1 Mac now and would be nice to upgrade to latest and greatest. Do the instructions on your wiki still hold with the latest changes? Tried them a few days ago but I seems to run into naming conflicts, I guess because of the the ign to gz rename.

@spark404 help with testing would be great thank you.

Do the instructions on your wiki still hold with the latest changes?

They do need updating. All the changes are now in the main branches of the other libraries, however there are a couple of tweaks to gz-rendering and gz-gui that improve the experience. I've just brought these up to date with the naming changes:

https://github.com/srmainwaring/ign-rendering/tree/ign-rendering7-metal disables the depth bias scaling when using Metal

https://github.com/srmainwaring/ign-gui/tree/feature/gz-gui7-minimalscene-gamma adds a gamma adjustment to correct for the effects of the Qt renderer.

@srmainwaring Thanks for the updated instructions, I managed to get the guy running with the shapes.sdf.
What I did is take the latest garden collection and replace the gz-sim reference with a reference to your branch. So I built it for now without the additional improvements. The regular build instructions work for the garden release, so that's easy to work with.
I'll do some more testing when I can, but for now I encountered the following issue: When resizing the gui window or closing the guy window it breaks with the following stack trace:
Stack trace (most recent call last):
#10   Object "QtCore", at 0x10994bfab, in QObject::~QObject() + 1799
#9    Object "QtCore", at 0x10994c26b, in QObjectPrivate::deleteChildren() + 287
#8    Object "libignition-gazebo7-gui.7.0.0~pre1.", at 0x104501233, in gz::sim::v7::GuiRunner::~GuiRunner() + 51
#7    Object "libignition-gazebo7-gui.7.0.0~pre1.", at 0x1045630d7, in void gz::utils::detail::DefaultDelete<gz::sim::v7::GuiRunner::Implementation>(gz::sim::v7::GuiRunner::Implementation*) + 15
#6    Object "libignition-gazebo7-gui.7.0.0~pre1.", at 0x1045630d7, in void gz::utils::detail::DefaultDelete<gz::sim::v7::GuiRunner::Implementation>(gz::sim::v7::GuiRunner::Implementation*) + 15
#5    Object "libsystem_platform.dylib", at 0x18f02b4a3, in _sigtramp + 55
#4    Object "libignition-tools2-backward.dylib", at 0x1007a977b, in backward::SignalHandling::sig_handler(int, __siginfo*, void*) + 39
#3    Object "libignition-tools2-backward.dylib", at 0x1007a9a1b, in backward::SignalHandling::handleSignal(int, __siginfo*, void*) + 99
#2    Object "libignition-tools2-backward.dylib", at 0x1007a9b33, in backward::StackTraceImpl<backward::system_tag::darwin_tag>::load_from(void*, unsigned long, void*, void*) + 59
#1    Object "libignition-tools2-backward.dylib", at 0x1007a9c93, in backward::StackTraceImpl<backward::system_tag::darwin_tag>::load_here(unsigned long, void*, void*) + 123
#0    Object "libignition-tools2-backward.dylib", at 0x1007ab62b, in unsigned long backward::details::unwind<backward::StackTraceImpl<backward::system_tag::darwin_tag>::callback>(backward::StackTraceImpl<backward::system_tag::darwin_tag>::callback, unsigned long) + 39

I don't have time to dig into to it right now, but maybe this rings bell already.

Rebased on main to resolve conflicts (namespace migration).

@spark404 I don't see the error you are observing when resizing windows. There are a number of QML warnings concerning binding loops when resizing, but the application does not crash.
I am using my own build of ogre-next (same hash as the osrf brew build) so I can debug the rendering libraries however I would not expect this to cause the error. Do you see the problem for all example worlds? When using ogre instead of ogre2 as the render engine?

@ahcorde and @iche033 - appreciate you are busy with getting Garden locked down before the code freeze, but wondered if there is anything I can help with to get this PR accepted for the release? It would be great to have macOS GUI support included in the initial drop.

@ahcorde and @iche033 - appreciate you are busy with getting Garden locked down before the code freeze, but wondered if there is anything I can help with to get this PR accepted for the release? It would be great to have macOS GUI support included in the initial drop.

@srmainwaring any chance you could test this against OGRE2.3?  I have a bottle in progress here: https://github.com/osrf/homebrew-simulation/pull/1956 and a PR in flight here: https://github.com/gazebosim/gz-rendering/pull/553

any chance you could test this against OGRE2.3

@mjcarroll sure, I'll take a look. I did have Metal running against an earlier version of the ogre2.3 PR so I'll bring those builds up to date.

I came back to this PR and tested this after merging with gz-sim7. It's working for me on Ubuntu Focal and macOS.
Here are some general notes on testing gz-sim on macOS. All these issues are minor and not caused by this PR.

I had to build with ogre2.3 with -DCMAKE_MACOSX_RPATH=FALSE for gz sim to load the ogre libraries. I also had to do this with ogre2.2 as mentioned in this https://github.com/osrf/homebrew-simulation/pull/1823#issuecomment-1051613767
I think there is no anti-aliasing. I recall this being discussed before.
Mouse clicking in minimal scene sometimes causes camera to jump. I've seen this on ubuntu as well but seems to happen more often on macOs.

I came back to this PR and tested this after merging with gz-sim7

Thanks @iche033. I'm running a rebased version of this PR against gz-sim / ogre2.3. I can force push a rebase against https://github.com/gazebosim/gz-sim/commit/942da23c4ebad390fd430aa342e318cb7951f6b9 if that makes things cleaner?
Other notes:
Some residual glitches on macOS in addition to those mentioned above - again not major and not connected to this PR.

On macOS the gamma correction is not working in gz-gui, there's a patch but it needs more work before its ready for review.
There may be some residual z-order issues with Metal - I had to modify the isReverseDepth check in gz-rendering to prevent some objects appearing to sink into a ground plane. It's not ABI changing so can go in as follow up PR if needed.
I think anti-aliasing does work, just the accepted values may be different from OpenGL / Ubuntu? Not sure if there is a way to override this from the MinimalScene plugin xml? Could be a good addition later if not.

Mouse clicking in minimal scene sometimes causes camera to jump. I've seen this on ubuntu as well but seems to happen more often on macOs.

Could that be connected to the z-order issue mentioned above?

Thanks for dropping the notes on macOS issues. I'll create a ticket to track them

I can force push a rebase against 942da23 if that makes things cleaner?

that works for me.

I think anti-aliasing does work, just the accepted values may be different from OpenGL / Ubuntu?

I see, I haven't tried setting other values. I should give that a try.

Could that be connected to the z-order issue mentioned above?

I tested mouse clicking and camera movement in gz-rendering examples and that worked fine. It could be mouse events issue in our gui.

@iche033 - updated with requested changes and rebased.