From c2d0402e3bb72cc894d9af66faa0c7501c783c38 Mon Sep 17 00:00:00 2001 From: Wiktor Bajor Date: Sun, 18 Aug 2024 12:27:06 +0200 Subject: [PATCH] Migrate demo to use modern gazebo --- .../grasp_service_parameters.py | 106 +-- .../launch/gazebo.launch.py | 48 -- .../manipulator_simulation_bringup.launch.py | 64 +- .../manipulator_simulation/setup.py | 2 +- .../worlds/default_world.sdf | 701 ++++++++++++++++++ .../worlds/default_world.world | 35 - .../urdf/ros2_control.xacro | 5 +- 7 files changed, 804 insertions(+), 157 deletions(-) delete mode 100644 ros2_grasp_service_demo/manipulator_simulation/launch/gazebo.launch.py create mode 100644 ros2_grasp_service_demo/manipulator_simulation/worlds/default_world.sdf delete mode 100644 ros2_grasp_service_demo/manipulator_simulation/worlds/default_world.world diff --git a/ros2_grasp_service/ros2_grasp_service/grasp_service_parameters.py b/ros2_grasp_service/ros2_grasp_service/grasp_service_parameters.py index ae2a17f..b045daf 100644 --- a/ros2_grasp_service/ros2_grasp_service/grasp_service_parameters.py +++ b/ros2_grasp_service/ros2_grasp_service/grasp_service_parameters.py @@ -1,3 +1,5 @@ +# flake8: noqa + # auto-generated DO NOT EDIT from rcl_interfaces.msg import ParameterDescriptor @@ -35,6 +37,7 @@ class __MapPositionsToTargetList: def add_entry(self, name): if not hasattr(self, name): setattr(self, name, self.__map_type()) + return getattr(self, name) def get_entry(self, name): return getattr(self, name) @@ -51,6 +54,7 @@ class __MapPositionsToHomeList: def add_entry(self, name): if not hasattr(self, name): setattr(self, name, self.__map_type()) + return getattr(self, name) def get_entry(self, name): return getattr(self, name) @@ -85,10 +89,11 @@ def refresh_dynamic_parameters(self): # TODO remove any destroyed dynamic parameters # declare any new dynamic parameters - for value in updated_params.positions_to_target_list: - updated_params.positions_to_target.add_entry(value) - entry = updated_params.positions_to_target.get_entry(value) - param_name = f"{self.prefix_}positions_to_target.{value}.positions" + + for value_1 in updated_params.positions_to_target_list: + updated_params.positions_to_target.add_entry(value_1) + entry = updated_params.positions_to_target.get_entry(value_1) + param_name = f"{self.prefix_}positions_to_target.{value_1}.positions" if not self.node_.has_parameter(self.prefix_ + param_name): descriptor = ParameterDescriptor( description="List of joints value for given position.", read_only=False @@ -107,10 +112,11 @@ def refresh_dynamic_parameters(self): + validation_result, ) entry.positions = param.value - for value in updated_params.positions_to_target_list: - updated_params.positions_to_target.add_entry(value) - entry = updated_params.positions_to_target.get_entry(value) - param_name = f"{self.prefix_}positions_to_target.{value}.time_to_target" + + for value_1 in updated_params.positions_to_target_list: + updated_params.positions_to_target.add_entry(value_1) + entry = updated_params.positions_to_target.get_entry(value_1) + param_name = f"{self.prefix_}positions_to_target.{value_1}.time_to_target" if not self.node_.has_parameter(self.prefix_ + param_name): descriptor = ParameterDescriptor(description="Time for given position", read_only=False) descriptor.integer_range.append(IntegerRange()) @@ -130,10 +136,11 @@ def refresh_dynamic_parameters(self): + validation_result, ) entry.time_to_target = param.value - for value in updated_params.positions_to_home_list: - updated_params.positions_to_home.add_entry(value) - entry = updated_params.positions_to_home.get_entry(value) - param_name = f"{self.prefix_}positions_to_home.{value}.positions" + + for value_1 in updated_params.positions_to_home_list: + updated_params.positions_to_home.add_entry(value_1) + entry = updated_params.positions_to_home.get_entry(value_1) + param_name = f"{self.prefix_}positions_to_home.{value_1}.positions" if not self.node_.has_parameter(self.prefix_ + param_name): descriptor = ParameterDescriptor( description="List of joints value for given position.", read_only=False @@ -152,10 +159,11 @@ def refresh_dynamic_parameters(self): + validation_result, ) entry.positions = param.value - for value in updated_params.positions_to_home_list: - updated_params.positions_to_home.add_entry(value) - entry = updated_params.positions_to_home.get_entry(value) - param_name = f"{self.prefix_}positions_to_home.{value}.time_to_target" + + for value_1 in updated_params.positions_to_home_list: + updated_params.positions_to_home.add_entry(value_1) + entry = updated_params.positions_to_home.get_entry(value_1) + param_name = f"{self.prefix_}positions_to_home.{value_1}.time_to_target" if not self.node_.has_parameter(self.prefix_ + param_name): descriptor = ParameterDescriptor(description="Time for given position", read_only=False) descriptor.integer_range.append(IntegerRange()) @@ -241,42 +249,44 @@ def update(self, parameters): # update dynamic parameters for param in parameters: - for value in updated_params.positions_to_target_list: - param_name = f"{self.prefix_}positions_to_target.{value}.positions" + for value_1 in updated_params.positions_to_target_list: + param_name = f"{self.prefix_}positions_to_target{value_1}.positions" if param.name == param_name: validation_result = ParameterValidators.size_gt(param, 0) if validation_result: return SetParametersResult(successful=False, reason=validation_result) - updated_params.positions_to_target.positions_to_target_list_map[value].positions = param.value + + updated_params.positions_to_target.get_entry(value_1).positions = param.value self.logger_.debug(param.name + ": " + param.type_.name + " = " + str(param.value)) - for value in updated_params.positions_to_target_list: - param_name = f"{self.prefix_}positions_to_target.{value}.time_to_target" + for value_1 in updated_params.positions_to_target_list: + param_name = f"{self.prefix_}positions_to_target{value_1}.time_to_target" if param.name == param_name: validation_result = ParameterValidators.gt(param, 0) if validation_result: return SetParametersResult(successful=False, reason=validation_result) - updated_params.positions_to_target.positions_to_target_list_map[value].time_to_target = ( - param.value - ) + + updated_params.positions_to_target.get_entry(value_1).time_to_target = param.value self.logger_.debug(param.name + ": " + param.type_.name + " = " + str(param.value)) - for value in updated_params.positions_to_home_list: - param_name = f"{self.prefix_}positions_to_home.{value}.positions" + for value_1 in updated_params.positions_to_home_list: + param_name = f"{self.prefix_}positions_to_home{value_1}.positions" if param.name == param_name: validation_result = ParameterValidators.size_gt(param, 0) if validation_result: return SetParametersResult(successful=False, reason=validation_result) - updated_params.positions_to_home.positions_to_home_list_map[value].positions = param.value + + updated_params.positions_to_home.get_entry(value_1).positions = param.value self.logger_.debug(param.name + ": " + param.type_.name + " = " + str(param.value)) - for value in updated_params.positions_to_home_list: - param_name = f"{self.prefix_}positions_to_home.{value}.time_to_target" + for value_1 in updated_params.positions_to_home_list: + param_name = f"{self.prefix_}positions_to_home{value_1}.time_to_target" if param.name == param_name: validation_result = ParameterValidators.gt(param, 0) if validation_result: return SetParametersResult(successful=False, reason=validation_result) - updated_params.positions_to_home.positions_to_home_list_map[value].time_to_target = param.value + + updated_params.positions_to_home.get_entry(value_1).time_to_target = param.value self.logger_.debug(param.name + ": " + param.type_.name + " = " + str(param.value)) updated_params.stamp_ = self.clock_.now() @@ -432,10 +442,11 @@ def declare_params(self): updated_params.gripper_open = param.value # declare and set all dynamic parameters - for value in updated_params.positions_to_target_list: - updated_params.positions_to_target.add_entry(value) - entry = updated_params.positions_to_target.get_entry(value) - param_name = f"{self.prefix_}positions_to_target.{value}.positions" + + for value_1 in updated_params.positions_to_target_list: + updated_params.positions_to_target.add_entry(value_1) + entry = updated_params.positions_to_target.get_entry(value_1) + param_name = f"{self.prefix_}positions_to_target.{value_1}.positions" if not self.node_.has_parameter(self.prefix_ + param_name): descriptor = ParameterDescriptor( description="List of joints value for given position.", read_only=False @@ -454,10 +465,11 @@ def declare_params(self): + validation_result, ) entry.positions = param.value - for value in updated_params.positions_to_target_list: - updated_params.positions_to_target.add_entry(value) - entry = updated_params.positions_to_target.get_entry(value) - param_name = f"{self.prefix_}positions_to_target.{value}.time_to_target" + + for value_1 in updated_params.positions_to_target_list: + updated_params.positions_to_target.add_entry(value_1) + entry = updated_params.positions_to_target.get_entry(value_1) + param_name = f"{self.prefix_}positions_to_target.{value_1}.time_to_target" if not self.node_.has_parameter(self.prefix_ + param_name): descriptor = ParameterDescriptor(description="Time for given position", read_only=False) descriptor.integer_range.append(IntegerRange()) @@ -477,10 +489,11 @@ def declare_params(self): + validation_result, ) entry.time_to_target = param.value - for value in updated_params.positions_to_home_list: - updated_params.positions_to_home.add_entry(value) - entry = updated_params.positions_to_home.get_entry(value) - param_name = f"{self.prefix_}positions_to_home.{value}.positions" + + for value_1 in updated_params.positions_to_home_list: + updated_params.positions_to_home.add_entry(value_1) + entry = updated_params.positions_to_home.get_entry(value_1) + param_name = f"{self.prefix_}positions_to_home.{value_1}.positions" if not self.node_.has_parameter(self.prefix_ + param_name): descriptor = ParameterDescriptor( description="List of joints value for given position.", read_only=False @@ -499,10 +512,11 @@ def declare_params(self): + validation_result, ) entry.positions = param.value - for value in updated_params.positions_to_home_list: - updated_params.positions_to_home.add_entry(value) - entry = updated_params.positions_to_home.get_entry(value) - param_name = f"{self.prefix_}positions_to_home.{value}.time_to_target" + + for value_1 in updated_params.positions_to_home_list: + updated_params.positions_to_home.add_entry(value_1) + entry = updated_params.positions_to_home.get_entry(value_1) + param_name = f"{self.prefix_}positions_to_home.{value_1}.time_to_target" if not self.node_.has_parameter(self.prefix_ + param_name): descriptor = ParameterDescriptor(description="Time for given position", read_only=False) descriptor.integer_range.append(IntegerRange()) diff --git a/ros2_grasp_service_demo/manipulator_simulation/launch/gazebo.launch.py b/ros2_grasp_service_demo/manipulator_simulation/launch/gazebo.launch.py deleted file mode 100644 index 07869bf..0000000 --- a/ros2_grasp_service_demo/manipulator_simulation/launch/gazebo.launch.py +++ /dev/null @@ -1,48 +0,0 @@ -import os -from ament_index_python.packages import get_package_share_directory -from launch import LaunchDescription -from launch.substitutions import LaunchConfiguration, PathJoinSubstitution -from launch.actions import IncludeLaunchDescription, DeclareLaunchArgument -from launch.launch_description_sources import PythonLaunchDescriptionSource -from launch.conditions import IfCondition - - -def generate_launch_description(): - os.environ["GAZEBO_MODEL_PATH"] = os.path.join(get_package_share_directory("manipulator_simulation"), "models") - manipulator_simulation_package = get_package_share_directory("manipulator_simulation") - gazebo_ros_package_dir = get_package_share_directory("gazebo_ros") - - return LaunchDescription( - [ - DeclareLaunchArgument( - name="world", - default_value="default_world.world", - description="Name of the world model file to load in ariadna_simulation_bringup/worlds", - ), - DeclareLaunchArgument(name="gui", default_value="true", description='Set to "false" to run headless.'), - DeclareLaunchArgument( - name="verbose", - default_value="false", - description='Set to "true" to run verbose logging.', - ), - DeclareLaunchArgument( - name="server", - default_value="true", - description='Set to "false" not to run gzserver.', - ), - IncludeLaunchDescription( - PythonLaunchDescriptionSource([os.path.join(gazebo_ros_package_dir, "launch", "gzserver.launch.py")]), - launch_arguments={ - "world": PathJoinSubstitution( - [manipulator_simulation_package, "worlds", LaunchConfiguration("world")] - ), - "verbose": LaunchConfiguration("verbose"), - }.items(), - condition=IfCondition(LaunchConfiguration("server")), - ), - IncludeLaunchDescription( - PythonLaunchDescriptionSource([os.path.join(gazebo_ros_package_dir, "launch", "gzclient.launch.py")]), - condition=IfCondition(LaunchConfiguration("gui")), - ), - ] - ) diff --git a/ros2_grasp_service_demo/manipulator_simulation/launch/manipulator_simulation_bringup.launch.py b/ros2_grasp_service_demo/manipulator_simulation/launch/manipulator_simulation_bringup.launch.py index 7a7ab62..79a7157 100644 --- a/ros2_grasp_service_demo/manipulator_simulation/launch/manipulator_simulation_bringup.launch.py +++ b/ros2_grasp_service_demo/manipulator_simulation/launch/manipulator_simulation_bringup.launch.py @@ -4,45 +4,59 @@ from launch.actions import IncludeLaunchDescription, DeclareLaunchArgument from launch.launch_description_sources import PythonLaunchDescriptionSource from launch_ros.actions import Node +from launch.substitutions import LaunchConfiguration def generate_launch_description(): - manipulator_simulation = get_package_share_directory("manipulator_simulation") - - manipulator_spawner = Node( - package="gazebo_ros", - executable="spawn_entity.py", - arguments=["-entity", "manipulator", "-topic", "robot_description"], - output="screen", - emulate_tty=True, - ) - open_manipulator_bringup = IncludeLaunchDescription( PythonLaunchDescriptionSource( [ get_package_share_directory("open_manipulator_bringup"), "/launch/open_manipulator_bringup.launch.py", ] + ) + ) + + world_argument = DeclareLaunchArgument( + "world", + default_value=os.path.join( + get_package_share_directory("manipulator_simulation"), "worlds", "default_world.sdf" ), + description="Robot controller to start.", + ) + + gazebo = IncludeLaunchDescription( + os.path.join(get_package_share_directory("ros_gz_sim"), "launch", "gz_sim.launch.py"), + launch_arguments=[ + ( + "gz_args", + ["-r -v 4 ", LaunchConfiguration("world"), " --physics-engine gz-physics-bullet-featherstone-plugin"], + ) + ], + ) + + ign_bridge = Node( + package="ros_gz_bridge", + executable="parameter_bridge", + name="gz_bridge", + arguments=["/clock" + "@rosgraph_msgs/msg/Clock" + "[ignition.msgs.Clock"], + output="screen", + ) + + gazebo_spawn_robot = Node( + package="ros_gz_sim", + executable="create", + name="spawn_manipulator", + arguments=["-name", "manipulator", "-topic", "robot_description"], + output="screen", ) return LaunchDescription( [ - DeclareLaunchArgument( - name="world", - default_value=os.path.join(manipulator_simulation, "worlds", "default_world.world"), - description="Full path to the world model file to load", - ), - DeclareLaunchArgument(name="gui", default_value="true", description='Set to "false" to run headless.'), - DeclareLaunchArgument( - name="server", - default_value="true", - description='Set to "false" not to run gzserver.', - ), - IncludeLaunchDescription( - PythonLaunchDescriptionSource([manipulator_simulation, "/launch/gazebo.launch.py"]) - ), - manipulator_spawner, + world_argument, + gazebo, + ign_bridge, + gazebo_spawn_robot, open_manipulator_bringup, ] ) diff --git a/ros2_grasp_service_demo/manipulator_simulation/setup.py b/ros2_grasp_service_demo/manipulator_simulation/setup.py index a3cbe1d..6115a32 100644 --- a/ros2_grasp_service_demo/manipulator_simulation/setup.py +++ b/ros2_grasp_service_demo/manipulator_simulation/setup.py @@ -12,7 +12,7 @@ ("share/ament_index/resource_index/packages", ["resource/" + package_name]), ("share/" + package_name, ["package.xml"]), (os.path.join("share", package_name, "launch"), glob("launch/*.py")), - (os.path.join("share", package_name, "worlds"), glob("worlds/*.world")), + (os.path.join("share", package_name, "worlds"), glob("worlds/*.sdf")), ( os.path.join("share", package_name, "models/ground_plane"), glob("models/ground_plane/model.sdf"), diff --git a/ros2_grasp_service_demo/manipulator_simulation/worlds/default_world.sdf b/ros2_grasp_service_demo/manipulator_simulation/worlds/default_world.sdf new file mode 100644 index 0000000..6b01308 --- /dev/null +++ b/ros2_grasp_service_demo/manipulator_simulation/worlds/default_world.sdf @@ -0,0 +1,701 @@ + + + + 0.01 + 1 + 1000 + + + + + + 1 1 1 1 + 0.300000012 0.699999988 0.899999976 1 + false + true + + 0 0 -9.8000000000000007 + 5.5644999999999998e-06 2.2875799999999999e-05 -4.2388400000000002e-05 + + + true + + + + + 0 0 1 + 1 1 + + + + + + + + + + + 0 0 0 0 0 0 + + 0 0 0 0 0 0 + 1 + + 1 + 0 + 0 + 1 + 0 + 1 + + + false + + 0 0 0 0 0 0 + false + + + https://fuel.ignitionrobotics.org/1.0/OpenRobotics/models/Depot + Depot + 7.1900899999999996 1.09982 0 0 0 0 + + + true + 7.1900899999999996 1.09982 0 0 0 0 + + 0 0 0 0 0 0 + + 0 -7.6128999999999998 4.5 0 0 0 + + + 30.167000000000002 0.080000000000000002 9 + + + + + + + + + + + + 0 7.2874999999999996 4.5 0 0 0 + + + 30.167000000000002 0.080000000000000002 9 + + + + + + + + + + + + -15 0 4.5 0 0 0 + + + 0.080000000000000002 15.359999999999999 9 + + + + + + + + + + + + 15 0 4.5 0 0 0 + + + 0.080000000000000002 15.359999999999999 9 + + + + + + + + + + + + 0.22267999999999999 -4.7267999999999999 0.68506 0 0 0 + + + 1.288 1.4219999999999999 1.288 + + + + + + + + + + + + 3.1726999999999999 -4.7267999999999999 0.68506 0 0 0 + + + 1.288 1.4219999999999999 1.288 + + + + + + + + + + + + 5.95268 -4.7267999999999999 0.68506 0 0 0 + + + 1.288 1.4219999999999999 1.288 + + + + + + + + + + + + 8.5588700000000006 -4.7267999999999999 0.68506 0 0 0 + + + 1.288 1.4219999999999999 1.288 + + + + + + + + + + + + 11.326000000000001 -4.7267999999999999 0.68506 0 0 0 + + + 1.288 1.4219999999999999 1.288 + + + + + + + + + + + + 0.22267999999999999 -2.3744800000000001 0.68506 0 0 0 + + + 1.288 1.4219999999999999 1.288 + + + + + + + + + + + + 3.1726999999999999 -2.3744800000000001 0.68506 0 0 0 + + + 1.288 1.4219999999999999 1.288 + + + + + + + + + + + + 5.95268 -2.3744800000000001 0.68506 0 0 0 + + + 1.288 1.4219999999999999 1.288 + + + + + + + + + + + + 8.5588700000000006 -2.3744800000000001 0.68506 0 0 0 + + + 1.288 1.4219999999999999 1.288 + + + + + + + + + + + + 11.326000000000001 -2.3744800000000001 0.68506 0 0 0 + + + 1.288 1.4219999999999999 1.288 + + + + + + + + + + + + -1.2267999999999999 4.1557000000000004 0.68506 0 0 -1.0279989300000001 + + + 1.288 1.4219999999999999 1.288 + + + + + + + + + + + + -7.5401999999999996 3.6151 1 0 0 0 + + + 0.46500000000000002 0.46500000000000002 2 + + + + + + + + + + + + 7.4574999999999996 3.6151 1 0 0 0 + + + 0.46500000000000002 0.46500000000000002 2 + + + + + + + + + + + + -7.5401999999999996 -3.8856999999999999 1 0 0 0 + + + 0.46500000000000002 0.46500000000000002 2 + + + + + + + + + + + + 7.4574999999999996 -3.8856999999999999 1 0 0 0 + + + 0.46500000000000002 0.46500000000000002 2 + + + + + + + + + + + + -0.61439999999999995 -2.3889999999999998 0.41837999999999997 0 0 0 + + + 0.36299999999999999 0.44 0.71899999999999997 + + + + + + + + + + + + -1.6004 4.8224999999999998 0.41837999999999997 0 0 0 + + + 0.36299999999999999 0.24399999999999999 0.71899999999999997 + + + + + + + + + + + + 13.018000000000001 3.1652 0.25 0 0 0 + + + 1.2989999999999999 0.59999999999999998 0.5 + + + + + + + + + + + + 1.4661999999999999 -0.017559000000000002 0.5 0 0 0 + + + 0.029999999999999999 + 1 + + + + + + + + + + + + 2.6482999999999999 -0.017559000000000002 0.5 0 0 0 + + + 0.029999999999999999 + 1 + + + + + + + + + + + + 5.3247 -0.017559000000000002 0.5 0 0 0 + + + 0.029999999999999999 + 1 + + + + + + + + + + + + 6.5063000000000004 -0.017559000000000002 0.5 0 0 0 + + + 0.029999999999999999 + 1 + + + + + + + + + + + + 9.0757999999999992 -0.017559000000000002 0.5 0 0 0 + + + 0.029999999999999999 + 1 + + + + + + + + + + + + 10.257999999999999 -0.017559000000000002 0.5 0 0 0 + + + 0.029999999999999999 + 1 + + + + + + + + + + + + 1.4661999999999999 2.5663999999999998 0.5 0 0 0 + + + 0.029999999999999999 + 1 + + + + + + + + + + + + 2.6482999999999999 2.5663999999999998 0.5 0 0 0 + + + 0.029999999999999999 + 1 + + + + + + + + + + + + 5.3247 2.5663999999999998 0.5 0 0 0 + + + 0.029999999999999999 + 1 + + + + + + + + + + + + 6.5063000000000004 2.5663999999999998 0.5 0 0 0 + + + 0.029999999999999999 + 1 + + + + + + + + + + + + 9.0757999999999992 2.5663999999999998 0.5 0 0 0 + + + 0.029999999999999999 + 1 + + + + + + + + + + + + 10.257999999999999 2.5663999999999998 0.5 0 0 0 + + + 0.029999999999999999 + 1 + + + + + + + + + + + + 1.4661999999999999 5.1497000000000002 0.5 0 0 0 + + + 0.029999999999999999 + 1 + + + + + + + + + + + + 2.6482999999999999 5.1497000000000002 0.5 0 0 0 + + + 0.029999999999999999 + 1 + + + + + + + + + + + + 5.3247 5.1497000000000002 0.5 0 0 0 + + + 0.029999999999999999 + 1 + + + + + + + + + + + + 6.5063000000000004 5.1497000000000002 0.5 0 0 0 + + + 0.029999999999999999 + 1 + + + + + + + + + + + + 9.0757999999999992 5.1497000000000002 0.5 0 0 0 + + + 0.029999999999999999 + 1 + + + + + + + + + + + + 10.257999999999999 5.1497000000000002 0.5 0 0 0 + + + 0.029999999999999999 + 1 + + + + + + + + + + + + 0 0 0 0 0 0 + 1 + + 1 + 0 + 0 + 1 + 0 + 1 + + + false + + false + + + diff --git a/ros2_grasp_service_demo/manipulator_simulation/worlds/default_world.world b/ros2_grasp_service_demo/manipulator_simulation/worlds/default_world.world deleted file mode 100644 index 10cdf3f..0000000 --- a/ros2_grasp_service_demo/manipulator_simulation/worlds/default_world.world +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - -2.0 0.0 3.0 0.0 0.8 0.0 - - - - 3.0 - model://ground_plane - - - 3.0 - model://asphalt_plane - - - model://sun - - - - 1.0 - model://big_box - big_box_0 - -7.0 -2.0 0.0 0 0 0 - - - - 1.0 - model://big_box - big_box_1 - -2.0 -2.0 0.0 0 0 0 - - - diff --git a/ros2_grasp_service_demo/open_manipulator/open_manipulator_description/urdf/ros2_control.xacro b/ros2_grasp_service_demo/open_manipulator/open_manipulator_description/urdf/ros2_control.xacro index 4731419..596acc3 100644 --- a/ros2_grasp_service_demo/open_manipulator/open_manipulator_description/urdf/ros2_control.xacro +++ b/ros2_grasp_service_demo/open_manipulator/open_manipulator_description/urdf/ros2_control.xacro @@ -2,7 +2,7 @@ - + $(find open_manipulator_control)/config/controllers.yaml @@ -19,7 +19,7 @@ - gazebo_ros2_control/GazeboSystem + gz_ros2_control/GazeboSimSystem @@ -34,6 +34,7 @@ gripper 1 +