0
$\begingroup$

I'm trying to view LiDAR data using the tutorials in the Gazebo Fortress documentation. However, the respective topic seems to only output the value "intensities: 1" and the lasr_frame which I have set in my SDF file doesn't show up in the tf2 tree and is not eligible as fixed frame in Rviz2. However, the aforementioned topic (/robot_model/scan) "can" be visualized in a LaserScan display (which doesn't really display anything), which causes the message

[INFO] [1719916767.735993855] [rviz]: Message Filter dropping message: frame 'robot_model/chassis/lidar' at time 116,800 for reason 'discarding message because the queue is full'

to appear in the terminal precisely every 0.1 seconds.

In Gazebo, when I activate the lidar visualization tool, I just see a 2D circle on my robot model (well, it was a semicircle before, but I switched the min and max angles to -pi and pi and now it's a circle) and, even though I'm not deactivating the option to see the LiDAR itself, when I switch to rays instead of triangle strips, that circle disappears. Regardless, I can see no lines or anything else... Also, I have the option to show non-hitting rays activated, but there are still no rays. I also have a wall model just in case, but still nothing.

These are my files currently:

launch_sim.launch.py:

import os

from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import ExecuteProcess, TimerAction
from launch.substitutions import PythonExpression
from launch_ros.actions import Node

def generate_launch_description():
    package_name='robot' #<--- CHANGE ME
    
    pkg_ros_gz_sim_demos = get_package_share_directory('ros_gz_sim_demos')
    pkg_ros_gz_sim = get_package_share_directory('ros_gz_sim')

    sdf_file  =  os.path.join(get_package_share_directory('robot'), 'description', 'robot_model', 'model.sdf')
    with open(sdf_file, 'r') as infp:
        robot_description = infp.read()
        

    gazebo = ExecuteProcess(
        cmd=['ign', 'gazebo', '/home/flamethrower/robot_ws/src/robot/worlds/my_world.sdf'],
        output='screen'
    )
    
    robot_state_publisher = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        name='robot_state_publisher',
        output='both',
        parameters=[
            {'use_sim_time': True},
            {'robot_description': robot_description},
        ]
    )

    spawn_entity = Node(package='ros_gz_sim', executable='create',
                    arguments=['-topic', 'robot_description',
                               '-entity', 'robot',
                               '-namespace', '/'],
                    output='screen',
                    parameters=[
                        {'use_sim_time': True},
                        {'robot_description': robot_description},
                    ])

    bridge = Node(
        package='ros_gz_bridge',
        executable='parameter_bridge',
        parameters=[{
            'config_file': os.path.join(get_package_share_directory('robot'), 'config', 'bridge.yaml'),
            'qos_overrides./tf_static.publisher.durability': 'transient_local',
        }],
        output='screen'
    )
    
    static_tf = Node(
    package='tf2_ros',
    executable='static_transform_publisher',
    arguments=['0', '0', '0', '0', '0', '0', 'robot_model/chassis', 'chassis'],
)

    return LaunchDescription([
        gazebo,
        bridge,
        robot_state_publisher,
        spawn_entity,
        static_tf
    ])

model.sdf:

<?xml version="1.0" ?>
<sdf version="1.8">
    <model name='robot_model' canonical_link='chassis'>
        <link name='chassis'>
            <pose relative_to='__model__'>0.175 0 0.715 0 0 0</pose>
            <inertial>
                <mass>1.14395</mass>
                <inertia>
                    <ixx>0.095329</ixx>
                    <ixy>0</ixy>
                    <ixz>0</ixz>
                    <iyy>0.381317</iyy>
                    <iyz>0</iyz>
                    <izz>0.476646</izz>
                </inertia>
            </inertial>
            <visual name='visual'>
                <geometry>
                    <box>
                        <size>0.35 0.35 1.4</size>
                    </box>
                </geometry>
                <material>
                    <ambient>0.5 0.5 0.5 1</ambient>
                    <diffuse>0.5 0.5 0.5 1</diffuse>
                    <specular>0.5 0.5 0.5 1</specular>
                </material>
            </visual>
            <collision name='collision'>
                <geometry>
                    <box>
                        <size>0350 0.35 1.4</size>
                    </box>
                </geometry>
            </collision>
            <sensor name='lidar' type='gpu_lidar'>"
                <pose relative_to='lidar_frame'>0 0 0 0 0 0</pose>
                <topic>/model/robot_model/scan</topic>
                <update_rate>10</update_rate>
                <ray>
                    <scan>
                        <horizontal>
                            <samples>360</samples>
                            <resolution>1</resolution>
                            <min_angle>-3.14159265</min_angle>
                            <max_angle>3.14159265</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.05</min>
                        <max>10.0</max>
                        <resolution>0.01</resolution>
                    </range>
                </ray>
                <always_on>1</always_on>
                <visualize>true</visualize>
            </sensor>
        </link>
        <link name='FL_wheel'>
            <pose relative_to="__model__">0.325 0.185 0.05 -1.5707 0 0</pose>
            <inertial>
                <mass>1</mass>
                <inertia>
                    <ixx>0.043333</ixx>
                    <ixy>0</ixy>
                    <ixz>0</ixz>
                    <iyy>0.043333</iyy>
                    <iyz>0</iyz>
                    <izz>0.08</izz>
                </inertia>
            </inertial>
            <visual name='visual'>
                <geometry>
                    <cylinder>
                        <radius>0.05</radius>
                        <length>0.02</length>
                    </cylinder>
                </geometry>
                <material>
                    <ambient>0.0 0.0 0.0 1</ambient>
                    <diffuse>0.0 0.0 0.0 1</diffuse>
                    <specular>0.0 0.0 0.0 1</specular>
                </material>
            </visual>
            <collision name='collision'>
                <geometry>
                    <cylinder>
                        <radius>0.05</radius>
                        <length>0.02</length>
                    </cylinder>
                </geometry>
            </collision>
        </link>
        <link name='FR_wheel'>
            <pose relative_to="__model__">0.325 -0.185 0.05 -1.5707 0 0</pose>
            <inertial>
                <mass>1</mass>
                <inertia>
                    <ixx>0.043333</ixx>
                    <ixy>0</ixy>
                    <ixz>0</ixz>
                    <iyy>0.043333</iyy>
                    <iyz>0</iyz>
                    <izz>0.08</izz>
                </inertia>
            </inertial>
            <visual name='visual'>
                <geometry>
                    <cylinder>
                        <radius>0.05</radius>
                        <length>0.02</length>
                    </cylinder>
                </geometry>
                <material>
                    <ambient>0.0 0.0 0.0 1</ambient>
                    <diffuse>0.0 0.0 0.0 1</diffuse>
                    <specular>0.0 0.0 0.0 1</specular>
                </material>
            </visual>
            <collision name='collision'>
                <geometry>
                    <cylinder>
                        <radius>0.05</radius>
                        <length>0.02</length>
                    </cylinder>
                </geometry>
            </collision>
        </link>
        <link name='RL_wheel'>
            <pose relative_to="__model__">0.025 0.185 0.05 -1.5707 0 0</pose>
            <inertial>
                <mass>1</mass>
                <inertia>
                    <ixx>0.043333</ixx>
                    <ixy>0</ixy>
                    <ixz>0</ixz>
                    <iyy>0.043333</iyy>
                    <iyz>0</iyz>
                    <izz>0.08</izz>
                </inertia>
            </inertial>
            <visual name='visual'>
                <geometry>
                    <cylinder>
                        <radius>0.05</radius>
                        <length>0.02</length>
                    </cylinder>
                </geometry>
                <material>
                    <ambient>0.0 0.0 0.0 1</ambient>
                    <diffuse>0.0 0.0 0.0 1</diffuse>
                    <specular>0.0 0.0 0.0 1</specular>
                </material>
            </visual>
            <collision name='collision'>
                <geometry>
                    <cylinder>
                        <radius>0.05</radius>
                        <length>0.02</length>
                    </cylinder>
                </geometry>
            </collision>
        </link>
        <link name='RR_wheel'>
            <pose relative_to="__model__">0.025 -0.185 0.05 -1.5707 0 0</pose>
            <inertial>
                <mass>1</mass>
                <inertia>
                    <ixx>0.043333</ixx>
                    <ixy>0</ixy>
                    <ixz>0</ixz>
                    <iyy>0.043333</iyy>
                    <iyz>0</iyz>
                    <izz>0.08</izz>
                </inertia>
            </inertial>
            <visual name='visual'>
                <geometry>
                    <cylinder>
                        <radius>0.05</radius>
                        <length>0.02</length>
                    </cylinder>
                </geometry>
                <material>
                    <ambient>0.0 0.0 0.0 1</ambient>
                    <diffuse>0.0 0.0 0.0 1</diffuse>
                    <specular>0.0 0.0 0.0 1</specular>
                </material>
            </visual>
            <collision name='collision'>
                <geometry>
                    <cylinder>
                        <radius>0.05</radius>
                        <length>0.02</length>
                    </cylinder>
                </geometry>
            </collision>
        </link>
        <joint name='FL_wheel_joint' type='revolute'>
            <pose relative_to='FL_wheel'/>
            <parent>chassis</parent>
            <child>FL_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>
        <joint name='FR_wheel_joint' type='revolute'>
            <pose relative_to='FR_wheel'/>
            <parent>chassis</parent>
            <child>FR_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>
        <joint name='RL_wheel_joint' type='revolute'>
            <pose relative_to='RL_wheel'/>
            <parent>chassis</parent>
            <child>RL_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>
        <joint name='RR_wheel_joint' type='revolute'>
            <pose relative_to='RR_wheel'/>
            <parent>chassis</parent>
            <child>RR_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>
        <frame name="lidar_frame" attached_to='chassis'>
            <pose>0 0 0.72 0 0 0</pose>
        </frame>
        <plugin filename="libignition-gazebo-diff-drive-system.so" name="ignition::gazebo::systems::DiffDrive">
            <num_wheel_pairs>2</num_wheel_pairs>
            <left_joint>FL_wheel_joint</left_joint>
            <left_joint>RL_wheel_joint</left_joint>
            <right_joint>FR_wheel_joint</right_joint>
            <right_joint>RR_wheel_joint</right_joint>
            <wheel_separation>0.35</wheel_separation>
            <wheel_radius>0.05</wheel_radius>
            <odom_publish_frequency>1</odom_publish_frequency>
            <max_linear_acceleration>1</max_linear_acceleration>
            <min_linear_acceleration>-1</min_linear_acceleration>
            <max_angular_acceleration>2</max_angular_acceleration>
            <min_angular_acceleration>-2</min_angular_acceleration>
            <max_linear_velocity>5</max_linear_velocity>
            <min_linear_velocity>-5</min_linear_velocity>
            <max_angular_velocity>5</max_angular_velocity>
            <min_angular_velocity>-5</min_angular_velocity>
            <topic>robot_model/cmd_vel</topic>
        </plugin>
        <plugin filename="libignition-gazebo-pose-publisher-system" name="ignition::gazebo::systems::PosePublisher">
            <publish_link_pose>true</publish_link_pose>
            <use_pose_vector_msg>true</use_pose_vector_msg>
            <static_publisher>true</static_publisher>
            <static_update_frequency>1</static_update_frequency>
        </plugin>
        <plugin filename="libignition-gazebo-joint-state-publisher-system" name="ignition::gazebo::systems::JointStatePublisher">
        </plugin>
        <plugin filename="libignition-gazebo-odometry-publisher-system" name="ignition::gazebo::systems::OdometryPublisher">
            <odom_frame>robot_model/odom</odom_frame>
            <robot_base_frame>robot_model</robot_base_frame>
        </plugin>
    </model>
</sdf>

my_world.sdf (this contains the sensor system plugin):

<?xml version="1.0" ?>
<sdf version="1.8">
    <world name="my_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="libignition-gazebo-physics-system.so"
            name="ignition::gazebo::systems::Physics">
        </plugin>
        <plugin
            filename="libignition-gazebo-user-commands-system.so"
            name="ignition::gazebo::systems::UserCommands">
        </plugin>
        <plugin
            filename="libignition-gazebo-scene-broadcaster-system.so"
            name="ignition::gazebo::systems::SceneBroadcaster">
        </plugin>
        <plugin filename="libignition-gazebo-imu-system.so" name="ignition::gazebo::systems::Imu">
        </plugin>
        <plugin filename="libignition-gazebo-sensors-system.so" name="ignition::gazebo::systems::Sensors">
            <render_engine>ogre</render_engine>
        </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>ogre</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/my_world/control</service>
                <stats_topic>/world/my_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/my_world/stats</topic>

            </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>

        <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>
        <include>
            <uri>model:///home/flamethrower/robot_ws/src/robot/description/test_models/wall</uri>
            <pose>0 3 0 0 0 0</pose>
        </include>
        <plugin filename="libignition-gazebo-triggered-publisher-system.so" name="ignition::gazebo::systems::TriggeredPublisher">
            <input type="ignition.msgs.Int32" topic="/keyboard/keypress">
                <match field="data">16777235</match>
            </input>
            <output type="ignition.msgs.Twist" topic="robot_model/cmd_vel">
                linear: {x: 0.5}, angular: {z: 0.0}
            </output>
        </plugin>
        <plugin filename="libignition-gazebo-triggered-publisher-system.so" name="ignition::gazebo::systems::TriggeredPublisher">
            <input type="ignition.msgs.Int32" topic="/keyboard/keypress">
                <match field="data">16777237</match>
            </input>
            <output type="ignition.msgs.Twist" topic="robot_model/cmd_vel">
                linear: {x: -0.5}, angular: {z: 0.0}
            </output>
        </plugin>
        <plugin filename="libignition-gazebo-triggered-publisher-system.so" name="ignition::gazebo::systems::TriggeredPublisher">
            <input type="ignition.msgs.Int32" topic="/keyboard/keypress">
                <match field="data">16777234</match>
            </input>
            <output type="ignition.msgs.Twist" topic="robot_model/cmd_vel">
                linear: {x: 0.0}, angular: {z: 0.5}
            </output>
        </plugin>
        <plugin filename="libignition-gazebo-triggered-publisher-system.so" name="ignition::gazebo::systems::TriggeredPublisher">
            <input type="ignition.msgs.Int32" topic="/keyboard/keypress">
                <match field="data">16777236</match>
            </input>
            <output type="ignition.msgs.Twist" topic="robot_model/cmd_vel">
                linear: {x: 0.0}, angular: {z: -0.5}
            </output>
        </plugin>
        <plugin filename="libignition-gazebo-triggered-publisher-system.so" name="ignition::gazebo::systems::TriggeredPublisher">
            <input type="ignition.msgs.Int32" topic="/keyboard/keypress">
                <match field="data">88</match>
            </input>
            <output type="ignition.msgs.Twist" topic="robot_model/cmd_vel">
                linear: {x: 0.0}, angular: {z: 0.0}
            </output>
        </plugin>
    </world>
</sdf>

bridge.yaml (the config file for the Gazebo-ROS2 bridge):

- ros_topic_name: "/robot_model/cmd_vel"
  gz_topic_name: "/model/robot_model/cmd_vel"
  ros_type_name: "geometry_msgs/msg/Twist"
  gz_type_name: "ignition.msgs.Twist"
  direction: ROS_TO_GZ
- ros_topic_name: "/clock"
  gz_topic_name: "clock"
  ros_type_name: "rosgraph_msgs/msg/Clock"
  gz_type_name: "ignition.msgs.Clock"
  direction: GZ_TO_ROS
- ros_topic_name: "/robot_model/odometry"
  gz_topic_name: "/model/robot_model/odometry"
  ros_type_name: "nav_msgs/msg/Odometry"
  gz_type_name: "ignition.msgs.Odometry"
  direction: GZ_TO_ROS
- ros_topic_name: "/robot_model/scan"
  gz_topic_name: "/model/robot_model/scan"
  ros_type_name: "sensor_msgs/msg/LaserScan"
  gz_type_name: "ignition.msgs.LaserScan"
  direction: GZ_TO_ROS
- ros_topic_name: "/joint_states"
  gz_topic_name: "/world/my_world/model/robot_model/joint_state"
  ros_type_name: "sensor_msgs/msg/JointState"
  gz_type_name: "gz.msgs.Model"
  direction: GZ_TO_ROS
- ros_topic_name: "/tf"
  gz_topic_name: "/model/robot_model/pose"
  ros_type_name: "tf2_msgs/msg/TFMessage"
  gz_type_name: "ignition.msgs.Pose_V"
  direction: GZ_TO_ROS
- ros_topic_name: "/tf_static"
  gz_topic_name: "/model/robot_model/pose_static"
  ros_type_name: "tf2_msgs/msg/TFMessage"
  gz_type_name: "ignition.msgs.Pose_V"
  direction: GZ_TO_ROS

Upon launching, I get these warnings:

[robot_state_publisher-3] [WARN] [1719912723.867820092] [sdformat_urdf]: SDFormat link [chassis] has a <sensor>, but URDF does not support this
[robot_state_publisher-3] [WARN] [1719912723.888339379] [kdl_parser]: The root link chassis has an inertia specified in the URDF, but KDL does not support a root link with an inertia.  As a workaround, you can add an extra dummy link to your URDF.

Also, these are my topic lists, in case they're relevant:

ign topic -l:

/clock
/gazebo/resource_paths
/gui/camera/pose
/gui/record_video/stats
/keyboard/keypress
/marker
/model/robot_model/cmd_vel
/model/robot_model/odometry
/model/robot_model/odometry_with_covariance
/model/robot_model/pose
/model/robot_model/pose_static
/model/robot_model/scan
/model/robot_model/scan/points
/model/robot_model/tf
/robot_model/cmd_vel
/sensors/marker
/stats
/world/my_world/clock
/world/my_world/dynamic_pose/info
/world/my_world/model/robot_model/joint_state
/world/my_world/pose/info
/world/my_world/scene/deletion
/world/my_world/scene/info
/world/my_world/state
/world/my_world/stats

ros2 topic list:

/clock
/joint_states
/parameter_events
/robot_description
/robot_model/cmd_vel
/robot_model/odometry
/robot_model/scan
/rosout
/tf
/tf_static

I really don't know what's wrong, as the topics seem to be fine, the structure for the sensor and frames is in accordance with the official tutorial and, even though I'm using Ogre instead of Ogre2 because I'm on a Raspberry pi 4B which doesn't support OpenGL 3.3, I don't think that should be a problem to visualize the LiDAR. And yes, I have activated the visualize lidar option in Gazebo.

EDIT: I've now realized that the frame lidar_frame doesn't exist because it isn't being published. This is likely the root cause of the problem, but I still don't know why it's happening or how to solve it.

By the way, I'm on Ubuntu 22.04 with ROS2 Humble and Gazebo Fortress.

$\endgroup$
2
  • $\begingroup$ Do you see the gazebo messages on your topic? Check them using ign topic -t /model/robot_model/scan/points -e or topic of your choice. For my simulation, I could see the ign messages but not on ros even though they were populated. The ros bridge was not working properly through the launch file. So, I had to create the bridge myself using ros2 run ros_gz_bridge parameter_bridge /model/robot_model/scan/points@sensor_msgs/msg/PointCloud2[ignition.msgs.PointCloudPacked --ros-args -r /model/robot_model/scan/points:=/model/robot_model/lidar You may skip the ros-args part to skip remapping. $\endgroup$ Commented Jul 2 at 15:24
  • $\begingroup$ That echo outputs an unchanging sequence of \000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200?\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200?\000\000\000\000\000\000\000\000\000\000\000\000" which doesn't change with my robot's position. Also, I tried to visualize the point cloud after running the bridge but still got the message filter error. I've also come to realize that the lidar_frame frame doesn't exist at all; it isn't being published. I'll update my question with this now. $\endgroup$ Commented Jul 2 at 15:59

0

Your Answer

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