Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Metal support to Gazebo for macOS #1225

Merged

Conversation

srmainwaring
Copy link
Contributor

@srmainwaring srmainwaring commented Dec 1, 2021

🎉 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:

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

gazebo_metal_shapes

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

gazebo_metal_camera_sensor

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

  • Signed all commits for DCO
  • Added tests
  • 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

@srmainwaring srmainwaring marked this pull request as draft December 1, 2021 16:01
@github-actions github-actions bot added the 🌱 garden Ignition Garden label Dec 1, 2021
@chapulina chapulina added macOS macOS support needs upstream release Blocked by a release of an upstream library labels Dec 2, 2021
@srmainwaring srmainwaring marked this pull request as ready for review December 5, 2021 18:36
src/cmd/cmdgazebo.rb.in Outdated Show resolved Hide resolved
@chapulina chapulina added GUI Gazebo's graphical interface (not pure Ignition GUI) rendering Involves Ignition Rendering sensors Sensors and sensor data labels Mar 12, 2022
@chapulina chapulina removed the needs upstream release Blocked by a release of an upstream library label Apr 4, 2022
@xlla
Copy link

xlla commented May 23, 2022

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

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

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

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

@srmainwaring
Copy link
Contributor Author

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?)

@xlla
Copy link

xlla commented May 24, 2022

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 to 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.

@srmainwaring
Copy link
Contributor Author

@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.

@mjcarroll
Copy link
Contributor

@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: osrf/homebrew-simulation#1956 and a PR in flight here: gazebosim/gz-rendering#553

@srmainwaring
Copy link
Contributor Author

srmainwaring commented Jul 21, 2022

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.

Update

@mjcarroll this looks ok against OGRE2.3 with the minor change to one of the .program scripts I've suggested in #553 (using the homebrew ogre2.3 formula available in osrf/homebrew simulation master).

@chapulina chapulina added the bug Something isn't working label Jul 23, 2022
@chapulina chapulina changed the base branch from main to gz-sim7 August 10, 2022 18:20
@iche033
Copy link
Contributor

iche033 commented Aug 23, 2022

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 ogre2.2: patches for M1 arm processors osrf/homebrew-simulation#1823 (comment)
  • 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.

Copy link
Contributor

@iche033 iche033 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just one minor comment on changing ign gazebo to gz sim, otherwise looks good to me.

src/cmd/cmdsim.rb.in Outdated Show resolved Hide resolved
@srmainwaring
Copy link
Contributor Author

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 942da23 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?

@iche033
Copy link
Contributor

iche033 commented Aug 24, 2022

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.

Update ign command script
- Remove server only setting for macOS

Enable the sensors server plugin to run on macOS
- Initialise the render engine for sensors on the main thread
- Platform specific OpenGL context code must be moved elsewhere.
- Ensure the active OpenGL context is associated with the render thread post initialisation

Enable the Gazebo GUI to run on macOS
- Move the RenderThread object to the render thread at the same time as a the OpenGL context

Reinstate render synchronisation
- Reinstate Ignition / QML serial rendering IgnRenderer::Render.
- Allow IgnRenderer::Render to accept a nullptr so it can be called without render sync from the main thread before the render thread is started.

Update QML
- Add missing properties for tooltopDelay

Configure the Qt scene graph to use the Metal backend
- Force the gazebo application to use the Metal backend for the Qt scene graph
- Move Metal scene graph backend to ign::gui::Application

Modify sensors to use Metal
- Set the render system parameter to use Metal

Default to Metal on macOS, otherwise use OpenGL
- Add preprocessor checks to use the Metal graphics API for __APPLE__

Signed-off-by: Rhys Mainwaring <rhys.mainwaring@me.com>
…ent in one terminal

Signed-off-by: Rhys Mainwaring <rhys.mainwaring@me.com>
- Add #ifdef to ensure sensors are initialised on the main thread for macOS

Signed-off-by: Rhys Mainwaring <rhys.mainwaring@me.com>
Signed-off-by: Rhys Mainwaring <rhys.mainwaring@me.com>
@srmainwaring
Copy link
Contributor Author

@iche033 - updated with requested changes and rebased.

Copy link
Contributor

@chapulina chapulina left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, just a small note about the bounding box camera

src/systems/sensors/Sensors.cc Outdated Show resolved Hide resolved
Signed-off-by: Rhys Mainwaring <rhys.mainwaring@me.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working 🌱 garden Ignition Garden GUI Gazebo's graphical interface (not pure Ignition GUI) macOS macOS support rendering Involves Ignition Rendering sensors Sensors and sensor data
Projects
Archived in project
Development

Successfully merging this pull request may close these issues.

7 participants