Skip to content

Robot Model Visualization

Moby Description Package

The moby_description package includes the model files (URDF) for use with RViz and Gazebo simulator.

├── moby_description
    ├── urdf
    ├── launch
    ├── rviz_config
    ├── meshes
    └──  ...

Robot Model

  • URDF (The Universal Robotic Description Format): an XML-format file describing the kinematic and dynamic elements of the robot.
  • Xacro: an XML macro language that constructs shorter and more readable XML files by using macros that expand to larger XML expressions.

In the urdf folder of the moby_description package, There's a config folder which contains all config for Moby models (MobyRP and MobyRP_V3) The other xacro files read the config files and build the description of the robot.

The diagram below show the relationship of the files

joint_limits ────────┐
kinematics ──────────┤
physical_parameters ─┤
visual_parameters ───┤
        moby_common ─┤
  moby_transmission ─┤
          materials ─┴─ moby_macro─moby.urdf

For more information about urdf and xacro, please visit * ROS2 Humble build model tutorial

Launching RViz

Moby models can be visualized with RViz2. launch file is a file for launching a number of ROS nodes at the same time. The following command is used to launch the robot description and visualization for the Moby robot model in ROS2.

ros2 launch moby_description moby_display.launch.py moby_type:=moby_rp

By specifying the moby_type as "moby_rp", the launch file will load the appropriate configuration files and launch the necessary nodes to display the robot in a visualization tool like RViz.

Now you should see windows launched.

by tweaking the joint position value of joint_states_publisher, the position of the Indy robot and Moby wheels in RViz can be changed.

Launch File

The code below is moby_display.launch.py, from the command above.

#!/usr/bin/python3
#-*- coding: utf-8 -*-

from launch_ros.actions import Node
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch_ros.substitutions import FindPackageShare
from launch.substitutions import Command, FindExecutable, LaunchConfiguration, PathJoinSubstitution

def generate_launch_description():
    # Declare arguments
    declared_arguments = []

    declared_arguments.append(
        DeclareLaunchArgument(
            "name",
            default_value="moby"
        )
    )

    declared_arguments.append(
        DeclareLaunchArgument(
            "moby_type",
            default_value="moby_rp",
            description="Type of Moby robot.",
            choices=["moby_rp", "moby_rp_v3"]
        )
    )

    declared_arguments.append(
        DeclareLaunchArgument(
            "prefix",
            default_value='""',
            description="Prefix of the joint names, useful for \
            multi-robot setup. If changed than also joint names in the controllers configuration \
            have to be updated."
        )
    )

    # Initialize Arguments
    name = LaunchConfiguration("name")
    moby_type = LaunchConfiguration("moby_type")
    prefix = LaunchConfiguration("prefix")

    description_package = FindPackageShare('moby_description')

    robot_description_content = Command(
        [
            PathJoinSubstitution([FindExecutable(name="xacro")]),
            " ",
            PathJoinSubstitution([description_package, "urdf", 'moby.urdf.xacro']),
            " ",
            "name:=",
            name,
            " ",
            "moby_type:=",
            moby_type,
            " ",
            "prefix:=",
            prefix
        ]
    )

    robot_description = {"robot_description": robot_description_content}

    rviz_config_file = PathJoinSubstitution(
        [description_package, "rviz_config", "moby.rviz"]
    )

    robot_state_publisher_node = Node(
        package="robot_state_publisher",
        executable="robot_state_publisher",
        output="screen",
        parameters=[robot_description]
    )

    joint_state_publisher_gui_node = Node(
        package='joint_state_publisher_gui',
        executable='joint_state_publisher_gui'
    )

    rviz_node = Node(
        package="rviz2",
        executable="rviz2",
        name="rviz2",
        output="log",
        arguments=["-d", rviz_config_file]
    )

    nodes = [
        joint_state_publisher_gui_node,
        robot_state_publisher_node,
        rviz_node,
    ]

    return LaunchDescription(declared_arguments + nodes)
  • robot_description: Reads moby.urdf.xacro also, it is parameters for joint_state_publisher node.

  • joint_state_publisher: publishes the joint positions of robot_description, with /joint_states topic.

  • robot_state_publisher: subscribes /joint_states topic, and publishes transform of each link.

  • rviz : launches RViz node, loading rviz configuration file (moby_description/rviz_config/moby.rviz). Subscribes tf published by robot_state_publisher node, and visualizes them.