From 3dccecbe1df905d8063060cb624a2b87df291f79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20=C5=A0togl?= Date: Mon, 17 Oct 2022 06:05:39 +0200 Subject: [PATCH] Use word 'mock' instead of 'fake' in the nomenclature of ros2_control templates. (#77) * Use 'mock' instead of 'fake' in the nomenclature. * Update joint_state_controller name to broadcaster. * Add launch files for starting simulators. --- .github/workflows/ci-lint.yml | 2 +- scripts/setup-robot-bringup.bash | 11 +- .../package/_append_to_README_ROS_Intro.md | 2 +- templates/robot_description/robot.urdf.xacro | 37 +++- .../robot_macro.ros2_control.xacro | 54 +++-- templates/ros2_control/append_to_README.md | 14 +- .../hardware/robot_hardware_interface.cpp | 4 +- templates/ros2_control/robot_controllers.yaml | 4 +- .../ros2_control/robot_ros2_control.launch.py | 86 +++++--- .../robot_ros2_control_sim.launch.py | 199 ++++++++++++++++++ ...test_forward_position_controller.launch.py | 2 +- .../test_goal_publishers_config.yaml | 18 +- ...test_joint_trajectory_controller.launch.py | 2 +- 13 files changed, 363 insertions(+), 72 deletions(-) create mode 100644 templates/ros2_control/robot_ros2_control_sim.launch.py diff --git a/.github/workflows/ci-lint.yml b/.github/workflows/ci-lint.yml index 16d6f6af..ddd72cb6 100644 --- a/.github/workflows/ci-lint.yml +++ b/.github/workflows/ci-lint.yml @@ -14,7 +14,7 @@ jobs: arguments: [""] include: - linter: copyright - arguments: "--exclude conf.py test_robot_description.launch.py view_robot.launch.py robot_ros2_control.launch.py test_forward_position_controller.launch.py test_joint_trajectory_controller.launch.py" + arguments: "--exclude conf.py test_robot_description.launch.py view_robot.launch.py robot_ros2_control.launch.py robot_ros2_control_sim.launch.py test_forward_position_controller.launch.py test_joint_trajectory_controller.launch.py" steps: - uses: actions/checkout@v2 - uses: ros-tooling/setup-ros@master diff --git a/scripts/setup-robot-bringup.bash b/scripts/setup-robot-bringup.bash index ee7c697a..5a1059a0 100755 --- a/scripts/setup-robot-bringup.bash +++ b/scripts/setup-robot-bringup.bash @@ -70,14 +70,15 @@ cp -n $ROS2_CONTROL_TEMPLATES/test_goal_publishers_config.yaml $ROBOT_FPC_PUB_YA # Copy launch files ROBOT_LAUNCH="launch/${ROBOT_NAME}.launch.py" -TEST_PUB_LAUNCH="launch/test_forward_position_controller.launch.py" -TEST_JTC_PUB_LAUNCH="launch/test_joint_trajectory_controller.launch.py" +TEST_FWD_POS_CTRL_LAUNCH="launch/test_forward_position_controller.launch.py" +TEST_JTC_LAUNCH="launch/test_joint_trajectory_controller.launch.py" cp -n $ROS2_CONTROL_TEMPLATES/robot_ros2_control.launch.py ${ROBOT_LAUNCH} -cp -n $ROS2_CONTROL_TEMPLATES/test_forward_position_controller.launch.py $TEST_PUB_LAUNCH +cp -n $ROS2_CONTROL_TEMPLATES/test_forward_position_controller.launch.py $TEST_FWD_POS_CTRL_LAUNCH +cp -n $ROS2_CONTROL_TEMPLATES/test_joint_trajectory_controller.launch.py $TEST_JTC_LAUNCH # sed all needed files -FILES_TO_SED=($ROBOT_LAUNCH $TEST_PUB_LAUNCH) +FILES_TO_SED=($ROBOT_LAUNCH $TEST_FWD_POS_CTRL_LAUNCH $TEST_JTC_LAUNCH) for SED_FILE in "${FILES_TO_SED[@]}"; do sed -i "s/\\\$PKG_NAME\\\$/${PKG_NAME}/g" $SED_FILE @@ -87,7 +88,7 @@ for SED_FILE in "${FILES_TO_SED[@]}"; do done # package.xml: Add dependencies if they not exist -DEP_PKGS=("xacro" "rviz2" "robot_state_publisher" "joint_trajectory_controller" "joint_state_controller" "forward_command_controller" "controller_manager" "$DESCR_PKG_NAME") +DEP_PKGS=("xacro" "rviz2" "ros2_controllers_test_nodes" "robot_state_publisher" "joint_trajectory_controller" "joint_state_broadcaster" "forward_command_controller" "controller_manager" "$DESCR_PKG_NAME") for DEP_PKG in "${DEP_PKGS[@]}"; do if `grep -q $DEP_PKG package.xml`; then diff --git a/templates/package/_append_to_README_ROS_Intro.md b/templates/package/_append_to_README_ROS_Intro.md index 6b9f95ff..b7385447 100644 --- a/templates/package/_append_to_README_ROS_Intro.md +++ b/templates/package/_append_to_README_ROS_Intro.md @@ -82,7 +82,7 @@ These instructions assume you are running Ubuntu 20.04: Sometimes packages do not list all their dependencies so `rosdep` will not install everything. If you are getting missing dependency errors, try manually install the following packages: ``` - sudo apt install ros2-foxy-forward_command_controller ros2-foxy-joint_state_controller ros2-foxy-joint_trajectory_controller ros2-foxy-xacro + sudo apt install ros2-foxy-forward_command_controller ros2-foxy-joint_state_broadcaster ros2-foxy-joint_trajectory_controller ros2-foxy-xacro ``` ### Configure and Build Workspace: diff --git a/templates/robot_description/robot.urdf.xacro b/templates/robot_description/robot.urdf.xacro index 256948ca..bfc0f13b 100644 --- a/templates/robot_description/robot.urdf.xacro +++ b/templates/robot_description/robot.urdf.xacro @@ -2,10 +2,14 @@ - - + + + + + + @@ -21,7 +25,32 @@ + use_mock_hardware="$(arg use_mock_hardware)" + mock_sensor_commands="$(arg mock_sensor_commands)" + sim_gazebo_classic="$(arg sim_gazebo_classic)" + sim_gazebo="$(arg sim_gazebo)"/> + + + + + + + + $(arg simulation_controllers) + + + + + + + + + + + $(arg simulation_controllers) + $(arg prefix)controller_manager + + + diff --git a/templates/robot_description/robot_macro.ros2_control.xacro b/templates/robot_description/robot_macro.ros2_control.xacro index 9aaf2e11..2e0001ca 100644 --- a/templates/robot_description/robot_macro.ros2_control.xacro +++ b/templates/robot_description/robot_macro.ros2_control.xacro @@ -1,16 +1,28 @@ - + - - fake_components/GenericSystem - ${fake_sensor_commands} - 0.0 + + mock_components/GenericSystem + ${mock_sensor_commands} - + + gazebo_ros2_control/GazeboSystem + + + ign_ros2_control/IgnitionSystem + + robot_hardware_inteface/RobotHardwareInteface @@ -19,60 +31,66 @@ -1 1 - + + 0.0 + - 0.0 -1 1 - + + 0.0 + - 0.0 -1 1 - + + 0.0 + - 0.0 -1 1 - + + 0.0 + - 0.0 -1 1 - + + 0.0 + - 0.0 -1 1 - + + 0.0 + - 0.0 diff --git a/templates/ros2_control/append_to_README.md b/templates/ros2_control/append_to_README.md index f3aff54b..07e52701 100644 --- a/templates/ros2_control/append_to_README.md +++ b/templates/ros2_control/append_to_README.md @@ -62,9 +62,9 @@ The sections below describe their usage. ### Joint State Controller Joint state Controllers provides output of robot's internal states to `/joint_states` and `/dynamic_joint_states` ROS2-topics. -In a new terminal with sourced ROS2 environment load, configure and start `joint_state_controller`: +In a new terminal with sourced ROS2 environment load, configure and start `joint_state_broadcaster`: ``` - ros2 control load_start_controller joint_state_controller + ros2 control load_start_controller joint_state_broadcaster ``` Check if controller is loaded properly: ``` @@ -72,7 +72,7 @@ Check if controller is loaded properly: ``` You should get similar response to: ``` - joint_state_controller[joint_state_controller/JointStateController] active + joint_state_broadcaster[joint_state_broadcaster/JointStateController] active ``` Now you should also see your robot represented correctly in the `rviz2`. @@ -89,7 +89,7 @@ Now you should also see your robot represented correctly in the `rviz2`. ``` You should get the response: ``` - joint_state_controller[joint_state_controller/JointStateController] active + joint_state_broadcaster[joint_state_broadcaster/JointStateController] active forward__controller[forward_command_controller/ForwardCommandController] inactive ``` @@ -103,7 +103,7 @@ Now you should also see your robot represented correctly in the `rviz2`. ``` You should get `active` in the response: ``` - joint_state_controller[joint_state_controller/JointStateController] active + joint_state_broadcaster[joint_state_broadcaster/JointStateController] active forward__controller[forward_command_controller/ForwardCommandController] active ``` @@ -138,7 +138,7 @@ Now you should also see your robot represented correctly in the `rviz2`. ``` You should get `active` in the response: ``` - joint_state_controller[joint_state_controller/JointStateController] active + joint_state_broadcaster[joint_state_broadcaster/JointStateController] active forward__controller[forward_command_controller/ForwardCommandController] inactive ``` @@ -152,7 +152,7 @@ Now you should also see your robot represented correctly in the `rviz2`. ``` You should get `active` in the response: ``` - joint_state_controller[joint_state_controller/JointStateController] active + joint_state_broadcaster[joint_state_broadcaster/JointStateController] active joint_trajectory_controller[joint_trajectory_controller/JointTrajectoryController] active ``` diff --git a/templates/ros2_control/hardware/robot_hardware_interface.cpp b/templates/ros2_control/hardware/robot_hardware_interface.cpp index 1750e959..359d5954 100644 --- a/templates/ros2_control/hardware/robot_hardware_interface.cpp +++ b/templates/ros2_control/hardware/robot_hardware_interface.cpp @@ -38,7 +38,7 @@ hardware_interface::CallbackReturn DummyClassName::on_init( std::vector DummyClassName::export_state_interfaces() { std::vector state_interfaces; - for (uint i = 0; i < info_.joints.size(); i++) { + for (size_t i = 0; i < info_.joints.size(); ++i) { state_interfaces.emplace_back(hardware_interface::StateInterface( // TODO(anyone): insert correct interfaces info_.joints[i].name, hardware_interface::HW_IF_POSITION, &hw_states_[i])); @@ -50,7 +50,7 @@ std::vector DummyClassName::export_state_int std::vector DummyClassName::export_command_interfaces() { std::vector command_interfaces; - for (uint i = 0; i < info_.joints.size(); i++) { + for (size_t i = 0; i < info_.joints.size(); ++i) { command_interfaces.emplace_back(hardware_interface::CommandInterface( // TODO(anyone): insert correct interfaces info_.joints[i].name, hardware_interface::HW_IF_POSITION, &hw_commands_[i])); diff --git a/templates/ros2_control/robot_controllers.yaml b/templates/ros2_control/robot_controllers.yaml index c26bffb3..07f002b4 100644 --- a/templates/ros2_control/robot_controllers.yaml +++ b/templates/ros2_control/robot_controllers.yaml @@ -2,8 +2,8 @@ controller_manager: ros__parameters: update_rate: 100 # Hz - joint_state_controller: - type: joint_state_controller/JointStateController + joint_state_broadcaster: + type: joint_state_broadcaster/JointStateBroadcaster forward_position_controller: # delete entry if controller is not applicable type: forward_command_controller/ForwardCommandController diff --git a/templates/ros2_control/robot_ros2_control.launch.py b/templates/ros2_control/robot_ros2_control.launch.py index 00e0b472..3a29e9c9 100644 --- a/templates/ros2_control/robot_ros2_control.launch.py +++ b/templates/ros2_control/robot_ros2_control.launch.py @@ -1,7 +1,12 @@ # $LICENSE$ from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument +from launch.actions import ( + DeclareLaunchArgument, + RegisterEventHandler, + TimerAction, +) +from launch.event_handlers import OnProcessExit, OnProcessStart from launch.substitutions import Command, FindExecutable, LaunchConfiguration, PathJoinSubstitution from launch_ros.actions import Node from launch_ros.substitutions import FindPackageShare @@ -51,23 +56,24 @@ def generate_launch_description(): ) declared_arguments.append( DeclareLaunchArgument( - "use_fake_hardware", + "use_mock_hardware", default_value="true", description="Start robot with fake hardware mirroring command to its states.", ) ) declared_arguments.append( DeclareLaunchArgument( - "fake_sensor_commands", + "mock_sensor_commands", default_value="false", description="Enable fake command interfaces for sensors used for simple simulations. \ - Used only if 'use_fake_hardware' parameter is true.", + Used only if 'use_mock_hardware' parameter is true.", ) ) declared_arguments.append( DeclareLaunchArgument( "robot_controller", default_value="forward_position_controller", + choices=["forward_position_controller", "joint_trajectory_controller"], description="Robot controller to start.", ) ) @@ -78,8 +84,8 @@ def generate_launch_description(): description_package = LaunchConfiguration("description_package") description_file = LaunchConfiguration("description_file") prefix = LaunchConfiguration("prefix") - use_fake_hardware = LaunchConfiguration("use_fake_hardware") - fake_sensor_commands = LaunchConfiguration("fake_sensor_commands") + use_mock_hardware = LaunchConfiguration("use_mock_hardware") + mock_sensor_commands = LaunchConfiguration("mock_sensor_commands") robot_controller = LaunchConfiguration("robot_controller") # Get URDF via xacro @@ -88,17 +94,17 @@ def generate_launch_description(): PathJoinSubstitution([FindExecutable(name="xacro")]), " ", PathJoinSubstitution( - [FindPackageShare(description_package), "description", description_file] + [FindPackageShare(description_package), "urdf", description_file] ), " ", "prefix:=", prefix, " ", - "use_fake_hardware:=", - use_fake_hardware, + "use_mock_hardware:=", + use_mock_hardware, " ", - "fake_sensor_commands:=", - fake_sensor_commands, + "mock_sensor_commands:=", + mock_sensor_commands, " ", ] ) @@ -115,11 +121,8 @@ def generate_launch_description(): control_node = Node( package="controller_manager", executable="ros2_control_node", + output="both", parameters=[robot_description, robot_controllers], - output={ - "stdout": "screen", - "stderr": "screen", - }, ) robot_state_pub_node = Node( package="robot_state_publisher", @@ -135,25 +138,60 @@ def generate_launch_description(): arguments=["-d", rviz_config_file], ) - joint_state_controller_spawner = Node( + joint_state_broadcaster_spawner = Node( package="controller_manager", - executable="spawner.py", - arguments=["joint_state_controller", "--controller-manager", "/controller_manager"], + executable="spawner", + arguments=["joint_state_broadcaster", "--controller-manager", "/controller_manager"], ) - robot_controller_spawner = Node( - package="controller_manager", - executable="spawner.py", - arguments=[robot_controller, "-c", "/controller_manager"], + robot_controllers = [robot_controller] + robot_controller_spawners = [] + for controller in robot_controllers: + robot_controller_spawners += [ + Node( + package="controller_manager", + executable="spawner", + arguments=[controller, "-c", "/controller_manager"], + ) + ] + + # Delay loading and activation of `joint_state_broadcaster` after start of ros2_control_node + delay_joint_state_broadcaster_spawner_after_ros2_control_node = RegisterEventHandler( + event_handler=OnProcessStart( + target_action=control_node, + on_start=[ + TimerAction( + period=3.0, + actions=[joint_state_broadcaster_spawner], + ), + ], + ) ) + # Delay loading and activation of robot_controller after `joint_state_broadcaster` + delay_robot_controller_spawners_after_joint_state_broadcaster_spawner = [] + for controller in robot_controller_spawners: + delay_robot_controller_spawners_after_joint_state_broadcaster_spawner += [ + RegisterEventHandler( + event_handler=OnProcessExit( + target_action=joint_state_broadcaster_spawner, + on_exit=[ + TimerAction( + period=3.0, + actions=[controller], + ), + ], + ) + ) + ] + return LaunchDescription( declared_arguments + [ control_node, robot_state_pub_node, rviz_node, - joint_state_controller_spawner, - robot_controller_spawner, + delay_joint_state_broadcaster_spawner_after_ros2_control_node, ] + + delay_robot_controller_spawners_after_joint_state_broadcaster_spawner ) diff --git a/templates/ros2_control/robot_ros2_control_sim.launch.py b/templates/ros2_control/robot_ros2_control_sim.launch.py new file mode 100644 index 00000000..3af8dd21 --- /dev/null +++ b/templates/ros2_control/robot_ros2_control_sim.launch.py @@ -0,0 +1,199 @@ +# $LICENSE$ + +from launch import LaunchDescription +from launch.actions import ( + DeclareLaunchArgument, + IncludeLaunchDescription, + RegisterEventHandler, + TimerAction, +) +from launch.event_handlers import OnProcessExit, OnProcessStart +from launch.launch_description_sources import PythonLaunchDescriptionSource +from launch.substitutions import Command, FindExecutable, LaunchConfiguration, PathJoinSubstitution +from launch_ros.actions import Node +from launch_ros.substitutions import FindPackageShare + + +def generate_launch_description(): + # Declare arguments + declared_arguments = [] + declared_arguments.append( + DeclareLaunchArgument( + "runtime_config_package", + default_value="$RUNTIME_CONFIG_PKG_NAME$", + description='Package with the controller\'s configuration in "config" folder. \ + Usually the argument is not set, it enables use of a custom setup.', + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "controllers_file", + default_value="$ROBOT_NAME$_controllers.yaml", + description="YAML file with the controllers configuration.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "description_package", + default_value="$DESCR_PKG_NAME$", + 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="$ROBOT_NAME$.urdf.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.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "robot_controller", + default_value="forward_position_controller", + choices=["forward_position_controller", "joint_trajectory_controller"], + description="Robot controller to start.", + ) + ) + + # Initialize Arguments + runtime_config_package = LaunchConfiguration("runtime_config_package") + controllers_file = LaunchConfiguration("controllers_file") + description_package = LaunchConfiguration("description_package") + description_file = LaunchConfiguration("description_file") + prefix = LaunchConfiguration("prefix") + robot_controller = LaunchConfiguration("robot_controller") + + robot_controllers = PathJoinSubstitution( + [FindPackageShare(runtime_config_package), "config", controllers_file] + ) + + rviz_config_file = PathJoinSubstitution( + [FindPackageShare(description_package), "rviz", "$ROBOT_NAME$.rviz"] + ) + + # Get URDF via xacro + robot_description_content = Command( + [ + PathJoinSubstitution([FindExecutable(name="xacro")]), + " ", + PathJoinSubstitution( + [FindPackageShare(description_package), "urdf", description_file] + ), + " ", + "prefix:=", + prefix, + " ", + "use_mock_hardware:=false", + " ", + "mock_sensor_commands:=false", + " ", + "sim_gazebo_classic:=false", + " ", + "sim_gazebo:=true", + " ", + "simulation_controllers:=", + robot_controllers, + " ", + ] + ) + robot_description = {"robot_description": robot_description_content} + + robot_state_pub_node = Node( + package="robot_state_publisher", + executable="robot_state_publisher", + output="both", + parameters=[robot_description], + ) + rviz_node = Node( + package="rviz2", + executable="rviz2", + name="rviz2", + output="log", + arguments=["-d", rviz_config_file], + ) + + # Gazebo nodes + gazebo = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + [FindPackageShare("ros_ign_gazebo"), "/launch", "/ign_gazebo.launch.py"] + ), + launch_arguments={"ign_args": " -r -v 3 empty.sdf"}.items(), + ) + + # Spawn robot + gazebo_spawn_robot = Node( + package="ros_ign_gazebo", + executable="create", + name="spawn_rrbot", + arguments=["-name", "$ROBOT_NAME$", "-topic", "robot_description"], + output="screen", + ) + + joint_state_broadcaster_spawner = Node( + package="controller_manager", + executable="spawner", + arguments=["joint_state_broadcaster", "--controller-manager", "/controller_manager"], + ) + + robot_controllers = [robot_controller] + robot_controller_spawners = [] + for controller in robot_controllers: + robot_controller_spawners += [ + Node( + package="controller_manager", + executable="spawner", + arguments=[controller, "-c", "/controller_manager"], + ) + ] + + # Delay loading and activation of `joint_state_broadcaster` after start of ros2_control_node + delay_joint_state_broadcaster_spawner_after_ros2_control_node = RegisterEventHandler( + event_handler=OnProcessStart( + target_action=gazebo_spawn_robot, + on_start=[ + TimerAction( + period=3.0, + actions=[joint_state_broadcaster_spawner], + ), + ], + ) + ) + + # Delay loading and activation of robot_controller after `joint_state_broadcaster` + delay_robot_controller_spawners_after_joint_state_broadcaster_spawner = [] + for controller in robot_controller_spawners: + delay_robot_controller_spawners_after_joint_state_broadcaster_spawner += [ + RegisterEventHandler( + event_handler=OnProcessExit( + target_action=joint_state_broadcaster_spawner, + on_exit=[ + TimerAction( + period=3.0, + actions=[controller], + ), + ], + ) + ) + ] + + return LaunchDescription( + declared_arguments + + [ + gazebo, + gazebo_spawn_robot, + robot_state_pub_node, + rviz_node, + delay_joint_state_broadcaster_spawner_after_ros2_control_node, + ] + + delay_robot_controller_spawners_after_joint_state_broadcaster_spawner + ) diff --git a/templates/ros2_control/test_forward_position_controller.launch.py b/templates/ros2_control/test_forward_position_controller.launch.py index 21e233e8..78dda344 100644 --- a/templates/ros2_control/test_forward_position_controller.launch.py +++ b/templates/ros2_control/test_forward_position_controller.launch.py @@ -15,7 +15,7 @@ def generate_launch_description(): return LaunchDescription( [ Node( - package="ros2_control_test_nodes", + package="ros2_controllers_test_nodes", executable="publisher_forward_position_controller", name="publisher_forward_position_controller", parameters=[position_goals], diff --git a/templates/ros2_control/test_goal_publishers_config.yaml b/templates/ros2_control/test_goal_publishers_config.yaml index 444c1958..7a1e278c 100644 --- a/templates/ros2_control/test_goal_publishers_config.yaml +++ b/templates/ros2_control/test_goal_publishers_config.yaml @@ -6,9 +6,9 @@ publisher_forward_position_controller: goal_names: ["pos1", "pos2", "pos3", "pos4"] pos1: [0.785, 0.785, 0.785, 0.785, 0.785, 0.785] - pos2: [0, 0, 0, 0, 0, 0] + pos2: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] pos3: [-0.785, -0.785, -0.785, -0.785, -0.785, -0.785] - pos4: [0, 0, 0, 0, 0, 0] + pos4: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] publisher_joint_trajectory_controller: @@ -16,12 +16,18 @@ publisher_joint_trajectory_controller: controller_name: "joint_trajectory_controller" wait_sec_between_publish: 6 + repeat_the_same_goal: 1 # useful to simulate continuous inputs + goal_time_from_start: 3.0 goal_names: ["pos1", "pos2", "pos3", "pos4"] - pos1: [0.785, 0.785, 0.785, 0.785, 0.785, 0.785] - pos2: [0, 0, 0, 0, 0, 0] - pos3: [-0.785, -0.785, -0.785, -0.785, -0.785, -0.785] - pos4: [0, 0, 0, 0, 0, 0] + pos1: + positions: [0.785, 0.785, 0.785, 0.785, 0.785, 0.785] + pos2: + positions: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + pos3: + positions: [-0.785, -0.785, -0.785, -0.785, -0.785, -0.785] + pos4: + positions: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] joints: - joint1 diff --git a/templates/ros2_control/test_joint_trajectory_controller.launch.py b/templates/ros2_control/test_joint_trajectory_controller.launch.py index 80fbb706..54d9006c 100644 --- a/templates/ros2_control/test_joint_trajectory_controller.launch.py +++ b/templates/ros2_control/test_joint_trajectory_controller.launch.py @@ -15,7 +15,7 @@ def generate_launch_description(): return LaunchDescription( [ Node( - package="ros2_control_test_nodes", + package="ros2_controllers_test_nodes", executable="publisher_joint_trajectory_controller", name="publisher_joint_trajectory_controller", parameters=[position_goals],