59 auto utils = py::module::import(
"moveit.utils");
61 py::class_<moveit_cpp::MoveItCpp, std::shared_ptr<moveit_cpp::MoveItCpp>>(m,
"MoveItPy", R
"(
62 The MoveItPy class is the main interface to the MoveIt Python API. It is a wrapper around the MoveIt C++ API.
65 .def(py::init([](const std::string& node_name,
const std::string& name_space,
66 const std::vector<std::string>& launch_params_filepaths,
const py::object& config_dict,
67 bool provide_planning_service,
68 const std::optional<std::map<std::string, std::string>>& remappings) {
72 std::vector<std::string> launch_arguments;
73 if (!config_dict.is(py::none()))
75 auto utils = py::module::import(
"moveit.utils");
77 std::string params_filepath =
78 utils.attr(
"create_params_file_from_dict")(config_dict, node_name).cast<std::string>();
79 launch_arguments = {
"--ros-args",
"--params-file", params_filepath };
81 else if (!launch_params_filepaths.empty())
83 launch_arguments = {
"--ros-args" };
84 for (
const auto& launch_params_filepath : launch_params_filepaths)
86 launch_arguments.push_back(
"--params-file");
87 launch_arguments.push_back(launch_params_filepath);
91 if (remappings.has_value())
93 for (
const auto& [key, value] : *remappings)
95 std::string argument = key;
96 argument.append(
":=").append(value);
97 launch_arguments.push_back(
"--remap");
98 launch_arguments.push_back(std::move(argument));
105 std::vector<const char*> chars;
106 chars.reserve(launch_arguments.size());
107 for (
const auto& arg : launch_arguments)
109 chars.push_back(arg.c_str());
112 rclcpp::init(launch_arguments.size(), chars.data());
113 RCLCPP_INFO(
getLogger(),
"Initialize rclcpp");
117 RCLCPP_INFO(
getLogger(),
"Initialize node parameters");
118 rclcpp::NodeOptions node_options;
119 node_options.allow_undeclared_parameters(
true)
120 .automatically_declare_parameters_from_overrides(
true)
121 .arguments(launch_arguments);
123 RCLCPP_INFO(
getLogger(),
"Initialize node and executor");
124 rclcpp::Node::SharedPtr node = rclcpp::Node::make_shared(node_name, name_space, node_options);
125 std::shared_ptr<rclcpp::executors::SingleThreadedExecutor> executor =
126 std::make_shared<rclcpp::executors::SingleThreadedExecutor>();
128 RCLCPP_INFO(
getLogger(),
"Spin separate thread");
129 auto spin_node = [node, executor]() {
130 executor->add_node(node);
133 std::thread execution_thread(spin_node);
134 execution_thread.detach();
142 std::shared_ptr<moveit_cpp::MoveItCpp> moveit_cpp_ptr(
new moveit_cpp::MoveItCpp(node), custom_deleter);
144 if (provide_planning_service)
146 moveit_cpp_ptr->getPlanningSceneMonitorNonConst()->providePlanningSceneService();
149 return moveit_cpp_ptr;
151 py::arg(
"node_name") =
"moveit_py", py::arg(
"name_space") =
"",
152 py::arg(
"launch_params_filepaths") =
153 utils.attr(
"get_launch_params_filepaths")().cast<std::vector<std::string>>(),
154 py::arg(
"config_dict") = py::none(), py::arg(
"provide_planning_service") =
true,
155 py::arg(
"remappings") = py::none(), py::return_value_policy::take_ownership,
157 Initialize moveit_cpp node and the planning scene service.
160 py::overload_cast<
const robot_trajectory::RobotTrajectoryPtr&,
const std::vector<std::string>&>(
162 py::arg(
"robot_trajectory"), py::arg(
"controllers"), py::call_guard<py::gil_scoped_release>(),
164 Execute a trajectory (planning group is inferred from robot trajectory object).
167 py::arg(
"planning_component_name"), py::return_value_policy::take_ownership,
169 Creates a planning component instance.
171 planning_component_name (str): The name of the planning component.
173 :py:class:`moveit_py.planning.PlanningComponent`: A planning component instance corresponding to the provided plan component name.
177 "shutdown", [](std::shared_ptr<moveit_cpp::MoveItCpp>& ) { rclcpp::shutdown(); },
179 Shutdown the moveit_cpp node.