moveit2
The MoveIt Motion Planning Framework for ROS 2.
Loading...
Searching...
No Matches
test_controllers.cpp
Go to the documentation of this file.
1/*********************************************************************
2 * Software License Agreement (BSD License)
3 *
4 * Copyright (c) 2022, Metro Robots
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
17 * * Neither the name of Metro Robots nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
33 *********************************************************************/
34
35/* Author: David V. Lu!! */
40
46
48{
49protected:
50 void SetUp() override
51 {
52 MoveItSetupTest::SetUp();
53 config_data_->registerType("moveit_controllers", "moveit_setup::controllers::MoveItControllersConfig");
54 config_data_->registerType("ros2_controllers", "moveit_setup::controllers::ROS2ControllersConfig");
55 config_data_->registerType("modified_urdf", "moveit_setup::ModifiedUrdfConfig");
56 config_data_->registerType("control_xacro", "moveit_setup::controllers::ControlXacroConfig");
57 }
58};
59
61{
62 config_data_->preloadWithFullConfig("moveit_resources_fanuc_moveit_config");
63 auto ros2_controllers_config = config_data_->get<ROS2ControllersConfig>("ros2_controllers");
64 const std::vector<ControllerInfo>& controllers = ros2_controllers_config->getControllers();
65 ASSERT_EQ(1u, controllers.size());
66 const ControllerInfo& ci = controllers[0];
67 EXPECT_EQ("fanuc_controller", ci.name_);
68 EXPECT_EQ("joint_trajectory_controller/JointTrajectoryController", ci.type_);
69 EXPECT_EQ(6u, ci.joints_.size());
70
71 auto moveit_controllers_config = config_data_->get<MoveItControllersConfig>("moveit_controllers");
72 const std::vector<ControllerInfo>& mcontrollers = moveit_controllers_config->getControllers();
73 ASSERT_EQ(1u, mcontrollers.size());
74 const ControllerInfo& mci = mcontrollers[0];
75 EXPECT_EQ("fanuc_controller", mci.name_);
76 EXPECT_EQ("FollowJointTrajectory", mci.type_);
77 EXPECT_EQ(6u, mci.joints_.size());
78}
79
81{
82 config_data_->preloadWithFullConfig("moveit_resources_panda_moveit_config");
83 auto ros2_controllers_config = config_data_->get<ROS2ControllersConfig>("ros2_controllers");
84 const std::vector<ControllerInfo>& controllers = ros2_controllers_config->getControllers();
85 ASSERT_EQ(2u, controllers.size());
86
87 int offset = controllers[0].name_ == "panda_arm_controller" ? 0 : 1;
88 const ControllerInfo& ci1 = controllers[offset];
89 EXPECT_EQ("panda_arm_controller", ci1.name_);
90 EXPECT_EQ("joint_trajectory_controller/JointTrajectoryController", ci1.type_);
91 EXPECT_EQ(7u, ci1.joints_.size());
92
93 const ControllerInfo& ci2 = controllers[1 - offset];
94 EXPECT_EQ("panda_hand_controller", ci2.name_);
95 // Humble/Iron use position_controllers/GripperActionController; Jazzy and
96 // newer use parallel_gripper_action_controller/GripperActionController.
97 // Accept either so the test is distro-agnostic.
98 EXPECT_TRUE(ci2.type_ == "position_controllers/GripperActionController" ||
99 ci2.type_ == "parallel_gripper_action_controller/GripperActionController")
100 << "Unexpected gripper controller type: " << ci2.type_;
101 EXPECT_EQ(1u, ci2.joints_.size());
102
103 /*
104 TODO(dlu): Re-enable when moveit_resources 2.0.5 is available on the build farm
105
106 auto moveit_controllers_config = config_data_->get<MoveItControllersConfig>("moveit_controllers");
107 const std::vector<ControllerInfo>& mcontrollers = moveit_controllers_config->getControllers();
108 ASSERT_EQ(1u, mcontrollers.size());
109 const ControllerInfo& mci1 = mcontrollers[offset];
110 EXPECT_EQ("panda_arm_controller", mci1.name_);
111 EXPECT_EQ("FollowJointTrajectory", mci1.type_);
112 EXPECT_EQ(7u, mci1.joints_.size());
113 */
114}
115
117{
118 config_data_->preloadWithFullConfig("moveit_resources_fanuc_moveit_config");
119 config_data_->get<moveit_setup::controllers::ControlXacroConfig>("control_xacro")->loadFromDescription();
120 generateFiles<ROS2ControllersConfig>("ros2_controllers");
121 generateFiles<MoveItControllersConfig>("moveit_controllers");
122
123 std::filesystem::path original_config = getSharePath("moveit_resources_fanuc_moveit_config");
124 for (const std::string relative_path : { "config/moveit_controllers.yaml", "config/ros2_controllers.yaml" })
125 {
126 expectYamlEquivalence(output_dir_ / relative_path, original_config / relative_path);
127 }
128}
129
130// Fanuc has no gripper, so OutputFanuc doesn't exercise the gripper branch of
131// ros2_controllers.yaml generation. Panda has a GripperActionController, which
132// must be written with the singular `joint` key (not the `joints` list). A full
133// YAML equivalence check isn't possible here because the panda gripper config
134// carries extra parameters (effort/velocity interfaces) the Setup Assistant does
135// not generate, so assert on the gripper parameter shape directly.
136TEST_F(ControllersTest, OutputPandaGripperUsesSingularJoint)
137{
138 config_data_->preloadWithFullConfig("moveit_resources_panda_moveit_config");
139 config_data_->get<moveit_setup::controllers::ControlXacroConfig>("control_xacro")->loadFromDescription();
140 generateFiles<ROS2ControllersConfig>("ros2_controllers");
141
142 YAML::Node generated = YAML::LoadFile(output_dir_ / "config/ros2_controllers.yaml");
143 ASSERT_TRUE(generated["panda_hand_controller"]) << "generated config missing panda_hand_controller";
144 const YAML::Node params = generated["panda_hand_controller"]["ros__parameters"];
145 ASSERT_TRUE(params) << "panda_hand_controller missing ros__parameters";
146 EXPECT_TRUE(params["joint"]) << "gripper controller must emit the singular 'joint' parameter";
147 EXPECT_FALSE(params["joints"]) << "gripper controller must not emit the 'joints' list";
148}
149
150TEST_F(ControllersTest, AddDefaultControllers)
151{
152 // only preload urdf and srdf
153 auto config_dir = getSharePath("moveit_resources_panda_moveit_config");
154 YAML::Node settings = YAML::LoadFile(config_dir / ".setup_assistant")["moveit_setup_assistant_config"];
155 config_data_->get<moveit_setup::URDFConfig>("urdf")->loadPrevious(config_dir, settings["URDF"]);
156 auto srdf_config = config_data_->get<moveit_setup::SRDFConfig>("srdf");
157 srdf_config->loadPrevious(config_dir, settings["SRDF"]);
158
159 auto ros2_controllers_config = config_data_->get<ROS2ControllersConfig>("ros2_controllers");
160
161 // Initially no controllers
162 EXPECT_EQ(ros2_controllers_config->getControllers().size(), 0u);
163
164 // Run the setup step
166 initializeStep(setup_step);
167
168 // Adding default controllers, a controller for each planning group
169 setup_step.addDefaultControllers();
170
171 // Number of the planning groups defined in the model srdf
172 size_t group_count = srdf_config->getGroups().size();
173
174 // Test that addDefaultControllers() did actually add a controller for the new_group
175 EXPECT_EQ(ros2_controllers_config->getControllers().size(), group_count);
176}
177
178int main(int argc, char** argv)
179{
180 testing::InitGoogleTest(&argc, argv);
181 rclcpp::init(argc, argv);
182 return RUN_ALL_TESTS();
183}
void SetUp() override
Test environment with DataWarehouse setup and help for generating files in a temp dir.
moveit_setup::DataWarehousePtr config_data_
void loadPrevious(const std::filesystem::path &package_path, const YAML::Node &node) override
Loads the configuration from an existing MoveIt configuration.
std::vector< ControllerInfo > & getControllers()
Gets controllers_ vector.
std::filesystem::path getSharePath(const std::string &package_name)
Return a path for the given package's share folder.
Definition utilities.hpp:70
void expectYamlEquivalence(const YAML::Node &generated, const YAML::Node &reference, const std::filesystem::path &generated_path, const std::string &yaml_namespace="")
TEST_F(ControllersTest, ParseFanuc)
std::filesystem::path getSharePath(const std::string &package_name)
Return a path for the given package's share folder.
Definition utilities.hpp:70
int main(int argc, char **argv)
void expectYamlEquivalence(const YAML::Node &generated, const YAML::Node &reference, const std::filesystem::path &generated_path, const std::string &yaml_namespace="")