0
$\begingroup$

I am using Ignition Gazebo Citadel to simulate a differential drive robot, like https://gazebosim.org/docs/citadel/sensors. I am adding a thermal camera to the model (https://gazebosim.org/api/sensors/4.0/thermalcameraigngazebo.html). However, when the gpu_lidar sensor is included, the thermal camera cannot sense any of the objects, it only outputs the ambient temperature of the world. If I comment out the lidar sensor in the .sdf, I can visualize the thermal camera output of objects just fine. It's only when the lidar is included that the issue arises. I tried subscribing to /thermal_camera and that is how I know it is producing measurements, but only of the world temperature when lidar is enabled. I would think these sensors should act independently, but I am new to Gazebo, so any insight into how they may be affecting each other is much appreciated. Here is the code I am using:

<?xml version="1.0" ?>
<sdf version="1.7">
    <world name="sensor_world">
        <physics name="1ms" type="ignored">
            <max_step_size>0.001</max_step_size>
            <real_time_factor>1.0</real_time_factor>
        </physics>
        <plugin
            filename="ignition-gazebo-physics-system"
            name="ignition::gazebo::systems::Physics">
        </plugin>
        <plugin
            filename="ignition-gazebo-user-commands-system"
            name="ignition::gazebo::systems::UserCommands">
        </plugin>
        <plugin
            filename="ignition-gazebo-scene-broadcaster-system"
            name="ignition::gazebo::systems::SceneBroadcaster">
        </plugin>
        <plugin filename="ignition-gazebo-imu-system"
                name="ignition::gazebo::systems::Imu">
        </plugin>
        <plugin filename="ignition-gazebo-sensors-system"
                name="ignition::gazebo::systems::Sensors">
            <render_engine>ogre2</render_engine>
        </plugin>
        <plugin filename="ignition-gazebo-contact-system"
                name="ignition::gazebo::systems::Contact">
        </plugin>
        <gui fullscreen="0">

            <!-- 3D scene -->
            <plugin filename="GzScene3D" 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>
            </plugin>

            <!-- World control -->
            <plugin filename="WorldControl" name="World control">
                <ignition-gui>
                <title>World control</title>
                <property type="bool" key="showTitleBar">false</property>
                <property type="bool" key="resizable">false</property>
                <property type="double" key="height">72</property>
                <property type="double" key="width">121</property>
                <property type="double" key="z">1</property>

                <property type="string" key="state">floating</property>
                <anchors target="3D View">
                    <line own="left" target="left"/>
                    <line own="bottom" target="bottom"/>
                </anchors>
                </ignition-gui>

                <play_pause>true</play_pause>
                <step>true</step>
                <start_paused>true</start_paused>
                <service>/world/sensor_world/control</service>
                <stats_topic>/world/sensor_world/stats</stats_topic>
            </plugin>

            <!-- World statistics -->
            <plugin filename="WorldStats" name="World stats">
                <ignition-gui>
                <title>World stats</title>
                <property type="bool" key="showTitleBar">false</property>
                <property type="bool" key="resizable">false</property>
                <property type="double" key="height">110</property>
                <property type="double" key="width">290</property>
                <property type="double" key="z">1</property>

                <property type="string" key="state">floating</property>
                <anchors target="3D View">
                    <line own="right" target="right"/>
                    <line own="bottom" target="bottom"/>
                </anchors>
                </ignition-gui>

                <sim_time>true</sim_time>
                <real_time>true</real_time>
                <real_time_factor>true</real_time_factor>
                <iterations>true</iterations>
                <topic>/world/sensor_world/stats</topic>

            </plugin>
            
             <plugin filename="ImageDisplay" name="Image Display">
                          <ignition-gui>
                            <title>Thermal camera</title>
                            <property key="state" type="string">floating</property>
                            <property type="double" key="width">350</property>
                            <property type="double" key="height">315</property>
                          </ignition-gui>
                          <topic>thermal_camera</topic>
                          <topic_picker>false</topic_picker>
                        </plugin>
                  

            <!-- Entity tree -->
            <plugin filename="EntityTree" name="Entity tree">
            </plugin>

            <!-- KeyPublisher plugin-->
            <plugin filename="KeyPublisher" name="Key Publisher"/>

        </gui>

        <light type="directional" name="sun">
            <cast_shadows>true</cast_shadows>
            <pose>0 0 10 0 0 0</pose>
            <diffuse>0.8 0.8 0.8 1</diffuse>
            <specular>0.2 0.2 0.2 1</specular>
            <attenuation>
                <range>1000</range>
                <constant>0.9</constant>
                <linear>0.01</linear>
                <quadratic>0.001</quadratic>
            </attenuation>
            <direction>-0.5 0.1 -0.9</direction>
        </light>
        
        <atmosphere type="adiabatic">
        <temperature>310</temperature>
        </atmosphere>

        <model name="ground_plane">
            <static>true</static>
            <link name="link">
                <collision name="collision">
                <geometry>
                    <plane>
                    <normal>0 0 1</normal>
                    </plane>
                </geometry>
                </collision>
                <visual name="visual">
                <geometry>
                    <plane>
                    <normal>0 0 1</normal>
                    <size>100 100</size>
                    </plane>
                </geometry>
                <material>
                    <ambient>0.8 0.8 0.8 1</ambient>
                    <diffuse>0.8 0.8 0.8 1</diffuse>
                    <specular>0.8 0.8 0.8 1</specular>
                </material>
                </visual>
            </link>
        </model>

        <model name='vehicle_blue' canonical_link='chassis'>
            <pose relative_to=world>0 0 0 0 0 0</pose>   <!--the pose is relative to the world by default-->

            <frame name="lidar_frame" attached_to='chassis'>
                <pose>0.8 0 0.5 0 0 0</pose>
            </frame>

            <link name='chassis'>   
                <pose relative_to='__model__'>0.5 0 0.4 0 0 0</pose> 
                <inertial> <!--inertial properties of the link mass, inertia matix-->
                    <mass>1.14395</mass>
                    <inertia>
                        <ixx>0.126164</ixx>
                        <ixy>0</ixy>
                        <ixz>0</ixz>
                        <iyy>0.416519</iyy>
                        <iyz>0</iyz>
                        <izz>0.481014</izz>
                    </inertia>
                </inertial>
                <visual name='visual'>
                    <geometry>
                        <box>
                            <size>2.0 1.0 0.5</size> <!--question: this size is in meter-->
                        </box>
                    </geometry>
                    <!--let's add color to our link-->
                    <material>
                        <ambient>0.0 0.0 1.0 1</ambient>
                        <diffuse>0.0 0.0 1.0 1</diffuse>
                        <specular>0.0 0.0 1.0 1</specular>
                    </material>
                    <plugin
                                            filename="ignition-gazebo-thermal-system"
                                            name="ignition::gazebo::systems::Thermal">
                                            <temperature>100.0</temperature>
                                        </plugin>
                </visual>
                <collision name='collision'> <!--todo: describe why we need the collision-->
                    <geometry>
                        <box>
                            <size>2.0 1.0 0.5</size>
                        </box>
                    </geometry>
                </collision>
                <sensor name="imu_sensor" type="imu">
                    <always_on>1</always_on>
                    <update_rate>1</update_rate>
                    <visualize>true</visualize>
                    <topic>imu</topic>
                </sensor>
                <comment>
                <sensor name='gpu_lidar' type='gpu_lidar'>"
                    <pose relative_to='lidar_frame'>0 0 0 0 0 0</pose>
                    <topic>lidar</topic>
                    <update_rate>10</update_rate>
                    <ray>
                    <scan>
                        <horizontal>
                        <samples>640</samples>
                        <resolution>1</resolution>
                        <min_angle>-1.396263</min_angle>
                        <max_angle>1.396263</max_angle>
                        </horizontal>
                        <vertical>
                        <samples>1</samples>
                        <resolution>0.01</resolution>
                        <min_angle>0</min_angle>
                        <max_angle>0</max_angle>
                        </vertical>
                    </scan>
                    <range>
                        <min>0.08</min>
                        <max>10.0</max>
                        <resolution>0.01</resolution>
                    </range>
                    </ray>
                    <alwaysOn>1</alwaysOn>
                    <visualize>true</visualize>
                </sensor>
                </comment>
            </link>

            <!--let's build the left wheel-->
            <link name='left_wheel'> 
                <pose relative_to="chassis">-0.5 0.6 0 -1.5707 0 0</pose> <!--angles are in radian-->
                <inertial>
                    <mass>2</mass>
                    <inertia>
                        <ixx>0.145833</ixx>
                        <ixy>0</ixy>
                        <ixz>0</ixz>
                        <iyy>0.145833</iyy>
                        <iyz>0</iyz>
                        <izz>0.125</izz>
                    </inertia>
                </inertial>
                <visual name='visual'>
                    <geometry>
                        <cylinder>
                            <radius>0.4</radius> 
                            <length>0.2</length>
                        </cylinder>
                    </geometry>
                    <material>
                        <ambient>1.0 0.0 0.0 1</ambient>
                        <diffuse>1.0 0.0 0.0 1</diffuse>
                        <specular>1.0 0.0 0.0 1</specular>
                    </material>
                </visual>
                <collision name='collision'>
                    <geometry>
                        <cylinder>
                            <radius>0.4</radius>
                            <length>0.2</length>
                        </cylinder>
                    </geometry>
                </collision>
            </link>

            <!--copy and paste for right wheel but change position-->
            <link name='right_wheel'>
                <pose relative_to="chassis">-0.5 -0.6 0 -1.5707 0 0</pose> <!--angles are in radian-->
                <inertial>
                    <mass>1</mass>
                    <inertia>
                        <ixx>0.145833</ixx>
                        <ixy>0</ixy>
                        <ixz>0</ixz>
                        <iyy>0.145833</iyy>
                        <iyz>0</iyz>
                        <izz>0.125</izz>
                    </inertia>
                </inertial>
                <visual name='visual'>
                    <geometry>
                        <cylinder>
                            <radius>0.4</radius>
                            <length>0.2</length>
                        </cylinder>
                    </geometry>
                    <material>
                        <ambient>1.0 0.0 0.0 1</ambient>
                        <diffuse>1.0 0.0 0.0 1</diffuse>
                        <specular>1.0 0.0 0.0 1</specular>
                    </material>
                </visual>
                <collision name='collision'>
                    <geometry>
                        <cylinder>
                            <radius>0.4</radius>
                            <length>0.2</length>
                        </cylinder>
                    </geometry>
                </collision>
            </link>

            <frame name="caster_frame" attached_to='chassis'>
                <pose>0.8 0 -0.2 0 0 0</pose>
            </frame>

            <!--caster wheel-->
            <link name='caster'>
                <pose relative_to='caster_frame'/>
                <inertial>
                    <mass>1</mass>
                    <inertia>
                        <ixx>0.1</ixx>
                        <ixy>0</ixy>
                        <ixz>0</ixz>
                        <iyy>0.1</iyy>
                        <iyz>0</iyz>
                        <izz>0.1</izz>
                    </inertia>
                </inertial>
                <visual name='visual'>
                    <geometry>
                        <sphere>
                            <radius>0.2</radius>
                        </sphere>
                    </geometry>
                    <material>
                        <ambient>0.0 1 0.0 1</ambient>
                        <diffuse>0.0 1 0.0 1 1</diffuse>
                        <specular>0.0 1 0.0 1</specular>
                    </material>
                </visual>
                <collision name='collision'>
                    <geometry>
                        <sphere>
                            <radius>0.2</radius>
                        </sphere>
                    </geometry>
                </collision>
            </link>

            <!--connecting these links together using joints-->
            <joint name='left_wheel_joint' type='revolute'> <!--continous joint is not supported yet-->
                <pose relative_to='left_wheel'/>
                <parent>chassis</parent>
                <child>left_wheel</child>
                <axis>
                    <xyz expressed_in='__model__'>0 1 0</xyz> <!--can be descired to any frame or even arbitrary frames-->
                    <limit>
                        <lower>-1.79769e+308</lower>    <!--negative infinity-->
                        <upper>1.79769e+308</upper>     <!--positive infinity-->
                    </limit>
                </axis>
            </joint>

            <joint name='right_wheel_joint' type='revolute'>
                <pose relative_to='right_wheel'/>
                <parent>chassis</parent>
                <child>right_wheel</child>
                <axis>
                    <xyz expressed_in='__model__'>0 1 0</xyz>
                    <limit>
                        <lower>-1.79769e+308</lower>    <!--negative infinity-->
                        <upper>1.79769e+308</upper>     <!--positive infinity-->
                    </limit>
                </axis>
            </joint>

            <!--different type of joints ball joint--> <!--defult value is the child-->
            <joint name='caster_wheel' type='ball'>
                <parent>chassis</parent>
                <child>caster</child>
            </joint>

            <!--diff drive plugin-->
            <plugin
                filename="ignition-gazebo-diff-drive-system"
                name="ignition::gazebo::systems::DiffDrive">
                <left_joint>left_wheel_joint</left_joint>
                <right_joint>right_wheel_joint</right_joint>
                <wheel_separation>1.2</wheel_separation>
                <wheel_radius>0.4</wheel_radius>
                <odom_publish_frequency>1</odom_publish_frequency>
                <topic>cmd_vel</topic>
            </plugin>
        </model>

                <!-- Thermal camera --> 
                <model name="thermal_camera">
                <pose>4.5 0 0.5 0.0 0.0 3.14</pose>
                <link name="link">
                    <pose>0.05 0.05 0.05 0 0 0</pose>
                    <collision name="collision">
                        <geometry>
                          <box>
                            <size>0.1 0.1 0.1</size>
                          </box>
                        </geometry>
                    </collision>
                    <visual name="visual">
                        <geometry>
                          <box>
                            <size>0.1 0.1 0.1</size>
                          </box>
                        </geometry>
                    </visual>
                    <sensor name="thermal_camera" type="thermal">
                        <camera>
                          <horizontal_fov>1.047</horizontal_fov>
                          <image>
                            <width>320</width>
                            <height>240</height>
                          </image>
                          <clip>
                            <near>0.1</near>
                            <far>100</far>
                          </clip>
                        </camera>
                        <always_on>1</always_on>
                        <update_rate>30</update_rate>
                        <visualize>true</visualize>
                        <topic>thermal_camera</topic>
                    </sensor>
                </link>
                <static>true</static>
            </model>

    </world>
</sdf>

The output should look like this, but if you uncomment the lidar, the camera output will be all black. Output without lidar sensor

$\endgroup$

1 Answer 1

1
$\begingroup$

https://github.com/gazebosim/gz-sim/issues/920. My issue was related to this. I was using UTM with hardware acceleration for Gazebo Citadel. It was causing render issues between the thermal camera and lidar plugins. As of now, it doesn't look like there is a reliable way of using Gazebo Citadel (or the newer versions) in a virtual machine.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.