ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question
0

/odom topic doesn't work on ROS2

asked 2022-12-17 17:02:05 -0500

andi gravatar image

Hey all! I'm having some problems with Gazebo. I'm using ROS2 foxy on UBUNTU 20.04.5 LTS with Gazebo installed via ros-foxy-gazebo. I made an URDF model on a differential drive robot, with a launch file to run gazebo and spawn the robot. Even though, when launching the file, it appears on the terminal that the diff_drive is advertising the /odom and publishing the tf between odom frame and base_link, i cannot find the frame odom in RVIZ2. Moreover, when echoing the /odom topic i have no results. Finally, in the view_frames the odom frame doesn't appear. I guess that i did the correct launch file with the diff_drive control plugin and the good parameters. Here below the files. Launch file:

import os

from ament_index_python.packages import get_package_share_directory


from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource

from launch_ros.actions import Node


def generate_launch_description():

    # Include the robot_state_publisher launch file, provided by our own package. Force sim time to be enabled
    # !!! MAKE SURE YOU SET THE PACKAGE NAME CORRECTLY !!!

    package_name = 'package_test'  # <--- CHANGE ME

    rsp = IncludeLaunchDescription(
        PythonLaunchDescriptionSource([os.path.join(
            get_package_share_directory(
                package_name), 'launch', 'rsp.launch.py'
        )]), launch_arguments={'use_sim_time': 'true'}.items()
    )
# Include the Gazebo launch file, provided by the gazebo_ros package
gazebo = IncludeLaunchDescription(
    PythonLaunchDescriptionSource([os.path.join(
        get_package_share_directory('gazebo_ros'), 'launch', 'gazebo.launch.py')]),
)

# Run the spawner node from the gazebo_ros package. The entity name doesn't really matter if you only have a single robot.
spawn_entity = Node(package='gazebo_ros', executable='spawn_entity.py',
                    arguments=['-topic', 'robot_description',
                               '-entity', 'my_bot'],
                    output='screen')

# Launch them all!
return LaunchDescription([
    rsp,
    gazebo,
    spawn_entity,
])

Gazebo plugin:

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro"  name="robot">

   <gazebo>
        <plugin name="diff_drive" filename="libgazebo_ros_diff_drive.so">
            <!-- Wheel info-->
            <left_joint>left_wheel_joint</left_joint>
            <right_joint>right_wheel_joint</right_joint>
            <wheel_separation>0.35</wheel_separation>
            <wheel_diameter>0.1</wheel_diameter>

            <!-- Limits-->
            <max_wheel_torque>200</max_wheel_torque>
            <max_wheel_acceleration>10.0</max_wheel_acceleration>

            <!-- Output-->
            <odometry_frame>odom</odometry_frame>
            <robot_base_frame>base_link</robot_base_frame>

            <publish_odom>true</publish_odom> 
            <publish_odom_tf>true</publish_odom_tf> 
            <publish_wheel_tf>true</publish_wheel_tf> 

        </plugin>


     </gazebo>

</robot>

URDF file:

<robot <a="" href="http://xmlns:xacro="http://www.ros.org/wiki/xacro">xmlns:xacro="http://www.ros.org/wiki/..." ><="" p=""> </robot>

<xacro:include filename="inertial_macros.xacro"/>

<material name="white">
    <color rgba="1 1 1 1" />
</material>

<material name="orange">
    <color rgba="1 0.3 0.1 1"/>
</material>

<material name="blue">
    <color rgba="0.2 0.2 1 1"/>
</material>

<material name="black">
    <color rgba="0 0 0 1"/>
</material>

<!-- BASE LINK -->

<link name="base_link">

</link>


<!-- CHASSIS LINK -->

<joint name="chassis_joint" type="fixed">
    <parent link="base_link"/>
    <child link="chassis"/>
    <origin xyz="-0.1 0 0"/>
</joint>

<link name="chassis">
    <visual>
        <origin xyz="0.15 0 0.075"/>
        <geometry>
            <box size="0.3 0.3 0.15"/>
        </geometry>
        <material name="white"/>
    </visual>
    <collision>
        <origin xyz="0.15 0 0.075"/>
        <geometry>
            <box size="0.3 ...
(more)
edit retag flag offensive close merge delete

1 Answer

Sort by ยป oldest newest most voted
0

answered 2022-12-19 06:27:34 -0500

I checked your code and can't find the errror, but you can try this other way to do the same, maybe it help you find your error:

1) Instead of using xacro file, you can create a URDF file from this XACRO file:

ros2 run xacro xacro {name_you_want}.xacro > {name_you_want}.urdf

2) Now you have an automatic URDF file created from XACRO file, if it fails on the process, maybe it tells you where the error is on the XACRO file.

3) From that URDF file you can create your gazebo model using this:

gz sdf -p {name_you_want}.urdf > ../{folder_you_want_to_keep_model}/{name_you_want}.sdf

4) Open gazebo from terminal using

gazebo

5) Import the model you created in step (4). Save the world

6) In your launch file, access your automated URDF file and gazebo world:

import os
from ament_index_python.packages import get_package_share_directory
from launch.substitutions import LaunchConfiguration
from launch.actions import DeclareLaunchArgument
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions.execute_process import ExecuteProcess

#=====================================
#             VARIABLES
#=====================================
pkg_name = 'package_test' # your package name
urdf_folder = 'description' # I saw on your code your xacro file is in a folder named description
model_name = 'robot.urdf' # The urdf created automatically by xacro conversion command. This is inside description folder
world_folder = 'world_folder_name'
world_name = 'robot_world'

#=====================================
#             LAUNCH CODE
#=====================================
def generate_launch_description():

    use_sim_time = LaunchConfiguration('use_sim_time', default='true')
    urdf_file = os.path.join(get_package_share_directory(pkg_name),urdf_folder, model_name)
    world_file = os.path.join(get_package_share_directory(pkg_name), world_folder, world_name)

    return LaunchDescription([
        DeclareLaunchArgument(
            'use_sim_time',
            default_value='false',
            description='Use simulation (Gazebo) clock if true'),

        # --------- ROBOT STATE PUBLISHER ----------
        Node(
            package="robot_state_publisher",
            executable="robot_state_publisher",
            name="robot_state_publisher",
            parameters=[{' use_sim_time': use_sim_time}],
            arguments=[urdf_file],
            ),

        # ------- Gazebo --------------
        ExecuteProcess(
                    name='START-GAZEBO-SERVER',
                    cmd=['gzserver',
                        '-s', 'libgazebo_ros_init.so',
                        '-s', 'libgazebo_ros_factory.so',
                        world_file]),

        ExecuteProcess(name='START-GAZEBO-CLIENT', cmd=['gzclient'])

    ])

Hope it helps.

edit flag offensive delete link more

Question Tools

1 follower

Stats

Asked: 2022-12-17 17:02:05 -0500

Seen: 486 times

Last updated: Dec 19 '22