moveit2
The MoveIt Motion Planning Framework for ROS 2.
Loading...
Searching...
No Matches
servo_utils.test.py
Go to the documentation of this file.
1import os
2import launch
3from launch.event_handlers import OnProcessExit
4import unittest
5import launch_ros
6import launch_testing
7from ament_index_python.packages import get_package_share_directory
8from moveit_configs_utils import MoveItConfigsBuilder
9from launch_param_builder import ParameterBuilder
10
11
13 moveit_config = (
14 MoveItConfigsBuilder("moveit_resources_panda")
15 .robot_description(file_path="config/panda.urdf.xacro")
16 .to_moveit_configs()
17 )
18
19 # Get parameters for the Servo node
20 servo_params = {
21 "moveit_servo_test": ParameterBuilder("moveit_servo")
22 .yaml("config/panda_simulated_config.yaml")
23 .to_dict()
24 }
25
26 # This filter parameter should be >1. Increase it for greater smoothing but slower motion.
27 low_pass_filter_coeff = {"butterworth_filter_coeff": 1.5}
28
29 # ros2_control using FakeSystem as hardware
30 ros2_controllers_path = os.path.join(
31 get_package_share_directory("moveit_resources_panda_moveit_config"),
32 "config",
33 "ros2_controllers.yaml",
34 )
35 ros2_control_node = launch_ros.actions.Node(
36 package="controller_manager",
37 executable="ros2_control_node",
38 parameters=[ros2_controllers_path],
39 remappings=[
40 ("/controller_manager/robot_description", "/robot_description"),
41 ],
42 output="screen",
43 )
44
45 joint_state_broadcaster_spawner = launch_ros.actions.Node(
46 package="controller_manager",
47 executable="spawner",
48 arguments=[
49 "joint_state_broadcaster",
50 "--controller-manager-timeout",
51 "300",
52 "--controller-manager",
53 "/controller_manager",
54 ],
55 )
56
57 panda_arm_controller_spawner = launch_ros.actions.Node(
58 package="controller_manager",
59 executable="spawner",
60 arguments=["panda_arm_controller", "-c", "/controller_manager"],
61 )
62
63 # Component nodes for tf and Servo
64 test_container = launch_ros.actions.ComposableNodeContainer(
65 name="servo_utils_tests_container",
66 namespace="/",
67 package="rclcpp_components",
68 executable="component_container_mt",
69 composable_node_descriptions=[
70 launch_ros.descriptions.ComposableNode(
71 package="robot_state_publisher",
72 plugin="robot_state_publisher::RobotStatePublisher",
73 name="robot_state_publisher",
74 parameters=[moveit_config.robot_description],
75 ),
76 launch_ros.descriptions.ComposableNode(
77 package="tf2_ros",
78 plugin="tf2_ros::StaticTransformBroadcasterNode",
79 name="static_tf2_broadcaster",
80 parameters=[{"/child_frame_id": "panda_link0", "/frame_id": "world"}],
81 ),
82 ],
83 output="screen",
84 )
85
86 servo_gtest = launch_ros.actions.Node(
87 executable=launch.substitutions.PathJoinSubstitution(
88 [
89 launch.substitutions.LaunchConfiguration("test_binary_dir"),
90 "moveit_servo_utils_test",
91 ]
92 ),
93 parameters=[
94 servo_params,
95 low_pass_filter_coeff,
96 moveit_config.robot_description,
97 moveit_config.robot_description_semantic,
98 moveit_config.robot_description_kinematics,
99 ],
100 output="screen",
101 )
102
103 return launch.LaunchDescription(
104 [
105 launch.actions.DeclareLaunchArgument(
106 name="test_binary_dir",
107 description="Binary directory of package "
108 "containing test executables",
109 ),
110 ros2_control_node,
111 joint_state_broadcaster_spawner,
112 panda_arm_controller_spawner,
113 test_container,
114 # Gate the gtest launch on the last spawner exiting (== controller
115 # activated). The prior fixed TimerAction raced controller
116 # activation under load and caused this family to flake.
117 launch.actions.RegisterEventHandler(
118 OnProcessExit(
119 target_action=panda_arm_controller_spawner,
120 on_exit=[servo_gtest],
121 )
122 ),
123 launch_testing.actions.ReadyToTest(),
124 ]
125 ), {
126 "servo_gtest": servo_gtest,
127 }
128
129
130class TestGTestWaitForCompletion(unittest.TestCase):
131 # Waits for test to complete, then waits a bit to make sure result files are generated
132 def test_gtest_run_complete(self, servo_gtest):
133 self.proc_info.assertWaitForShutdown(servo_gtest, timeout=4000.0)
134
135
136@launch_testing.post_shutdown_test()
137class TestGTestProcessPostShutdown(unittest.TestCase):
138 # Checks if the test has been completed with acceptable exit codes (successful codes)
139 def test_gtest_pass(self, proc_info, servo_gtest):
140 launch_testing.asserts.assertExitCodes(proc_info, process=servo_gtest)
test_gtest_pass(self, proc_info, servo_gtest)