moveit2
The MoveIt Motion Planning Framework for ROS 2.
Loading...
Searching...
No Matches
servo_cpp_integration.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/test_config_panda.yaml")
23 .to_dict()
24 }
25
26 # This sets the update rate and planning group name for the acceleration limiting filter.
27 acceleration_filter_update_period = {"update_period": 0.01}
28 planning_group_name = {"planning_group_name": "panda_arm"}
29
30 # ros2_control using FakeSystem as hardware
31 ros2_controllers_path = os.path.join(
32 get_package_share_directory("moveit_resources_panda_moveit_config"),
33 "config",
34 "ros2_controllers.yaml",
35 )
36 ros2_control_node = launch_ros.actions.Node(
37 package="controller_manager",
38 executable="ros2_control_node",
39 parameters=[ros2_controllers_path],
40 remappings=[
41 ("/controller_manager/robot_description", "/robot_description"),
42 ],
43 output="screen",
44 )
45
46 joint_state_broadcaster_spawner = launch_ros.actions.Node(
47 package="controller_manager",
48 executable="spawner",
49 arguments=[
50 "joint_state_broadcaster",
51 "--controller-manager-timeout",
52 "300",
53 "--controller-manager",
54 "/controller_manager",
55 ],
56 )
57
58 panda_arm_controller_spawner = launch_ros.actions.Node(
59 package="controller_manager",
60 executable="spawner",
61 arguments=["panda_arm_controller", "-c", "/controller_manager"],
62 )
63
64 # Component nodes for tf and Servo
65 test_container = launch_ros.actions.ComposableNodeContainer(
66 name="servo_integration_tests_container",
67 namespace="/",
68 package="rclcpp_components",
69 executable="component_container_mt",
70 composable_node_descriptions=[
71 launch_ros.descriptions.ComposableNode(
72 package="robot_state_publisher",
73 plugin="robot_state_publisher::RobotStatePublisher",
74 name="robot_state_publisher",
75 parameters=[moveit_config.robot_description],
76 ),
77 launch_ros.descriptions.ComposableNode(
78 package="tf2_ros",
79 plugin="tf2_ros::StaticTransformBroadcasterNode",
80 name="static_tf2_broadcaster",
81 parameters=[{"child_frame_id": "/panda_link0", "frame_id": "/world"}],
82 ),
83 ],
84 output="screen",
85 )
86
87 servo_gtest = launch_ros.actions.Node(
88 executable=launch.substitutions.PathJoinSubstitution(
89 [
90 launch.substitutions.LaunchConfiguration("test_binary_dir"),
91 "moveit_servo_cpp_integration_test",
92 ]
93 ),
94 parameters=[
95 servo_params,
96 acceleration_filter_update_period,
97 planning_group_name,
98 moveit_config.robot_description,
99 moveit_config.robot_description_semantic,
100 moveit_config.robot_description_kinematics,
101 ],
102 output="screen",
103 )
104
105 return launch.LaunchDescription(
106 [
107 launch.actions.DeclareLaunchArgument(
108 name="test_binary_dir",
109 description="Binary directory of package "
110 "containing test executables",
111 ),
112 ros2_control_node,
113 joint_state_broadcaster_spawner,
114 panda_arm_controller_spawner,
115 test_container,
116 # Gate the gtest launch on panda_arm_controller_spawner exiting so
117 # controllers are guaranteed active before the test starts.
118 launch.actions.RegisterEventHandler(
119 OnProcessExit(
120 target_action=panda_arm_controller_spawner,
121 on_exit=[servo_gtest],
122 )
123 ),
124 launch_testing.actions.ReadyToTest(),
125 ]
126 ), {
127 "servo_gtest": servo_gtest,
128 }
129
130
131class TestGTestWaitForCompletion(unittest.TestCase):
132 # Waits for test to complete, then waits a bit to make sure result files are generated
133 def test_gtest_run_complete(self, servo_gtest):
134 self.proc_info.assertWaitForShutdown(servo_gtest, timeout=4000.0)
135
136
137@launch_testing.post_shutdown_test()
138class TestGTestProcessPostShutdown(unittest.TestCase):
139 # Checks if the test has been completed with acceptable exit codes (successful codes)
140 def test_gtest_pass(self, proc_info, servo_gtest):
141 launch_testing.asserts.assertExitCodes(proc_info, process=servo_gtest)