diff --git a/examples/worlds/thermal_camera.sdf b/examples/worlds/thermal_camera.sdf
index c8498d3cc2..3e2230f099 100644
--- a/examples/worlds/thermal_camera.sdf
+++ b/examples/worlds/thermal_camera.sdf
@@ -1,6 +1,6 @@
@@ -121,7 +121,14 @@
- 310
+ 300
+
+ 0.1
@@ -157,7 +164,7 @@
- 0 0 0.5 0 0 0
+ -1 1 0.5 0 0 0
@@ -192,93 +199,7 @@
- 200.0
-
-
-
-
-
-
- 0 1.5 0.5 0 0 0
-
-
-
- 3
- 0
- 0
- 3
- 0
- 3
-
- 3.0
-
-
-
-
- 0.5
-
-
-
-
-
-
-
- 0.5
-
-
-
- 0 0 1 1
- 0 0 1 1
- 0 0 1 1
-
-
- 600.0
-
-
-
-
-
-
- 0 -1.5 0.5 0 0 0
-
-
-
- 2
- 0
- 0
- 2
- 0
- 2
-
- 2.0
-
-
-
-
- 0.5
- 1.0
-
-
-
-
-
-
-
- 0.5
- 1.0
-
-
-
- 0 1 0 1
- 0 1 0 1
- 0 1 0 1
-
-
- 400.0
+ 285.0
@@ -323,5 +244,23 @@
true
+
+ 1 0 0 0 0 1.570796
+ rescue_randy
+ https://fuel.ignitionrobotics.org/1.0/OpenRobotics/models/Rescue Randy
+
+
+
+ 2.25 .5 .1 0 0 1.570796
+ phone
+ https://fuel.ignitionrobotics.org/1.0/OpenRobotics/models/Samsung J8 Black
+
+
+
+ 2.25 -.5 .1 0 0 1.570796
+ backpack
+ https://fuel.ignitionrobotics.org/1.0/OpenRobotics/models/Backpack
+
+
diff --git a/include/ignition/gazebo/components/TemperatureRange.hh b/include/ignition/gazebo/components/TemperatureRange.hh
new file mode 100644
index 0000000000..99e4a26151
--- /dev/null
+++ b/include/ignition/gazebo/components/TemperatureRange.hh
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2021 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef IGNITION_GAZEBO_COMPONENTS_TEMPERATURERANGE_HH_
+#define IGNITION_GAZEBO_COMPONENTS_TEMPERATURERANGE_HH_
+
+#include
+#include
+
+#include
+
+#include
+#include
+#include
+
+namespace ignition
+{
+namespace gazebo
+{
+// Inline bracket to help doxygen filtering.
+inline namespace IGNITION_GAZEBO_VERSION_NAMESPACE {
+namespace components
+{
+ /// \brief Data structure to hold a temperature range, in kelvin
+ struct TemperatureRangeInfo
+ {
+ /// \brief The minimum temperature (kelvin)
+ math::Temperature min;
+ /// \brief The maximum temperature (kelvin)
+ math::Temperature max;
+
+ public: bool operator==(const TemperatureRangeInfo &_info) const
+ {
+ return (this->min == _info.min) &&
+ (this->max == _info.max);
+ }
+
+ public: bool operator!=(const TemperatureRangeInfo &_info) const
+ {
+ return !(*this == _info);
+ }
+ };
+}
+
+namespace serializers
+{
+ /// \brief Serializer for components::TemperatureRangeInfo object
+ class TemperatureRangeInfoSerializer
+ {
+ /// \brief Serialization for components::TemperatureRangeInfo
+ /// \param[out] _out Output stream
+ /// \param[in] _info Object for the stream
+ /// \return The stream
+ public: static std::ostream &Serialize(std::ostream &_out,
+ const components::TemperatureRangeInfo &_info)
+ {
+ _out << _info.min << " " << _info.max;
+ return _out;
+ }
+
+ /// \brief Deserialization for components::TemperatureRangeInfo
+ /// \param[in] _in Input stream
+ /// \param[out] _info The object to populate
+ /// \return The stream
+ public: static std::istream &Deserialize(std::istream &_in,
+ components::TemperatureRangeInfo &_info)
+ {
+ _in >> _info.min >> _info.max;
+ return _in;
+ }
+ };
+}
+
+namespace components
+{
+ /// \brief A component that stores a temperature range in kelvin
+ using TemperatureRange = Component;
+ IGN_GAZEBO_REGISTER_COMPONENT("ign_gazebo_components.TemperatureRange",
+ TemperatureRange)
+}
+}
+}
+}
+
+#endif
diff --git a/src/rendering/RenderUtil.cc b/src/rendering/RenderUtil.cc
index acf90e1347..5243a7a31b 100644
--- a/src/rendering/RenderUtil.cc
+++ b/src/rendering/RenderUtil.cc
@@ -16,7 +16,10 @@
*/
#include