Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

iiwa in rviz and gazebo #44

Open
antonio1matos opened this issue Apr 26, 2024 · 0 comments
Open

iiwa in rviz and gazebo #44

antonio1matos opened this issue Apr 26, 2024 · 0 comments

Comments

@antonio1matos
Copy link

Hello,
I have this code that runs the iiwa in rviz with controllers:
import os
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription
from launch.conditions import IfCondition
from launch.substitutions import Command, FindExecutable, LaunchConfiguration, PathJoinSubstitution
from launch_ros.actions import Node
from launch_ros.substitutions import FindPackageShare
from ament_index_python.packages import get_package_share_directory
from launch_ros.actions import Node #permite iniciar nodes neste launch file
from launch.launch_description_sources import PythonLaunchDescriptionSource

from typing import Dict, List, Optional, Union

def generate_launch_description():
# Declare arguments
declared_arguments = []
declared_arguments.append(
DeclareLaunchArgument(
'description_package',
default_value='iiwa_description',
description='Description package with robot URDF/xacro files. Usually the argument
is not set, it enables use of a custom description.',
)
)
declared_arguments.append(
DeclareLaunchArgument(
'description_file',
default_value='iiwa.config.xacro',
description='URDF/XACRO description file with the robot.',
)
)
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. Expected format "/"',
)
)
declared_arguments.append(
DeclareLaunchArgument(
'namespace',
default_value='/',
description='Namespace of launched nodes, useful for multi-robot setup.
If changed than also the namespace in the controllers
configuration needs to be updated. Expected format "/".',
)
)
declared_arguments.append(
DeclareLaunchArgument(
'start_rviz',
default_value='true',
description='Start RViz2 automatically with this launch file.',
)
)
declared_arguments.append(
DeclareLaunchArgument(
'base_frame_file',
default_value='base_frame.yaml',
description='Configuration file of robot base frame wrt World.',
)
)
declared_arguments.append(
DeclareLaunchArgument(
'use_sim',
default_value='false',
description='Start robot in Gazebo simulation.',
)
)

# Initialize Arguments
description_package = LaunchConfiguration('description_package')
description_file = LaunchConfiguration('description_file')
prefix = LaunchConfiguration('prefix')
start_rviz = LaunchConfiguration('start_rviz')
base_frame_file = LaunchConfiguration('base_frame_file')
namespace = LaunchConfiguration('namespace')
use_sim = LaunchConfiguration('use_sim')

# Get URDF via xacro
robot_description_content = Command(
    [
        PathJoinSubstitution([FindExecutable(name='xacro')]),
        ' ',
        PathJoinSubstitution(
            [FindPackageShare(description_package), 'config', description_file]
        ),
        ' ',
        'prefix:=',
        prefix,
        ' ',
        'base_frame_file:=',
        base_frame_file,
        ' ',
        'description_package:=',
        description_package,
        ' ',
        'namespace:=',
        namespace,
    ]
)

robot_description = {'robot_description': robot_description_content}

# Get SRDF via xacro
robot_description_semantic_content = Command(
    [
        PathJoinSubstitution([FindExecutable(name="xacro")]),
        " ",
        PathJoinSubstitution(
            [FindPackageShare(description_package), "srdf", "iiwa.srdf.xacro"]
        ),
        " ",
        "name:=",
        "iiwa",
        " ",
        "prefix:=",
        prefix,
        " ",
        'description_package:=',
        description_package,
    ]
)

robot_description_semantic = {
    'robot_description_semantic': robot_description_semantic_content
}

# Get planning parameters
robot_description_planning_joint_limits = PathJoinSubstitution([
        FindPackageShare(description_package), "moveit2", "iiwa_joint_limits.yaml",
    ]
)

robot_description_planning_cartesian_limits = PathJoinSubstitution([
        FindPackageShare(description_package), "moveit2", "iiwa_cartesian_limits.yaml",
    ]
)

move_group_capabilities = {
    "capabilities": """pilz_industrial_motion_planner/MoveGroupSequenceAction \
        pilz_industrial_motion_planner/MoveGroupSequenceService"""
}

robot_description_kinematics = PathJoinSubstitution(
    [FindPackageShare(description_package), "moveit2", "kinematics.yaml"]
)

planning_pipelines_config = PathJoinSubstitution([
        FindPackageShare(description_package), "moveit2", "planning_pipelines_config.yaml",
    ]
)

ompl_planning_config = PathJoinSubstitution([
        FindPackageShare(description_package), "moveit2", "ompl_planning.yaml",
    ]
)

moveit_controllers = PathJoinSubstitution(
    [FindPackageShare(description_package),
        "moveit2", "iiwa_moveit_controller_config.yaml"]
)

trajectory_execution = {
    "moveit_manage_controllers": True,
    "trajectory_execution.allowed_execution_duration_scaling": 1.2,
    "trajectory_execution.allowed_goal_duration_margin": 0.5,
    "trajectory_execution.allowed_start_tolerance": 0.01,
}

planning_scene_monitor_parameters = {
    "publish_planning_scene": True,
    "publish_geometry_updates": True,
    "publish_state_updates": True,
    "publish_transforms_updates": True,
}

move_group_node = Node(
    package="moveit_ros_move_group",
    executable="move_group",
    namespace=namespace,
    output="screen",
    parameters=[
        robot_description,
        robot_description_semantic,
        robot_description_kinematics,
        robot_description_planning_cartesian_limits,
        robot_description_planning_joint_limits,
        planning_pipelines_config,
        ompl_planning_config,
        trajectory_execution,
        moveit_controllers,
        planning_scene_monitor_parameters,
        move_group_capabilities,
        {"use_sim_time": use_sim},
    ],
)

 #RViz
rviz_config_file = (
    get_package_share_directory("miar_robot") + "/launch/miar1.rviz"
)

rviz_node = Node(
    package='rviz2',
    executable='rviz2',
    name='rviz2',
    output='log',
    arguments=['-d', rviz_config_file],
    parameters=[
        robot_description,
        robot_description_semantic,
        robot_description_planning_cartesian_limits,
        robot_description_planning_joint_limits,
        robot_description_kinematics,
        planning_pipelines_config,
        ompl_planning_config,
    ],
    condition=IfCondition(start_rviz),
)

# Static TF
static_tf = Node(                                    #Um ros node que publica a transformação estática entre os sistemas de coordenas world e panda_link0
    package="tf2_ros",
    executable="static_transform_publisher",
    name="static_transform_publisher",
    output="log",
    arguments=["0.0", "0.0", "0.0", "0.0", "0.0", "0.0", "world", "link_0"],           #coordenadas de translação (os 3 primeiros 0); coordenadas de rotação os 3 segundos zeros;world é o nome de sistemas de coordenadas global ou de referencia; (panda_link0 no caso do robot panda) link_0 é o sistema de coordenadas que está sendo transformado em relação ao sistema de coordenadas de referencia "world"
)

    # Publish TF
robot_state_publisher = Node(
    package="robot_state_publisher",
    executable="robot_state_publisher",
    name="robot_state_publisher",
    output="both",
    parameters=[robot_description],
)

    # ros2_control using FakeSystem as hardware
ros2_controllers_path = os.path.join(
    get_package_share_directory("iiwa_description"),
    "config",
    "iiwa_controllers.yaml",
)
ros2_control_node = Node(
package="controller_manager",
executable="ros2_control_node",
parameters=[robot_description, ros2_controllers_path],
output="both",
)

joint_state_broadcaster_spawner = Node(
    package="controller_manager",
    executable="spawner",
    arguments=[
        "joint_state_broadcaster",
        "--controller-manager-timeout",
        "300",
        "--controller-manager",
        "/controller_manager",
    ],
)    

arm_controller_spawner = Node(
    package="controller_manager",
    executable="spawner",
    arguments=["iiwa_arm_controller", "-c", "/controller_manager"],
)




nodes = [
    move_group_node,
    rviz_node,
    static_tf,
    robot_state_publisher,
    ros2_control_node,
    joint_state_broadcaster_spawner,
    arm_controller_spawner,
]

return LaunchDescription(declared_arguments + nodes)

The code works fine. I'm able to launch the robot in the rviz and generate trajectories. DO you know what i have to add to this code for the robot be able to be seen also working in gazebo??

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant